EC-CUBE セキュリティチェックリスト


*内容は随時アップデートしています。ぜひストックしてください。*

----

この資料は、[公式に発表されたセキュリティチェックリスト](https://www.ec-cube.net/news/detail.php?news_id=349)の補足です。

- [【初心者向け】EC-CUBEを安全運用・セキュリティ対策講座 | EC-CUBE名古屋 vol.74](https://ec-cube-nagoya.doorkeeper.jp/events/102910) にて詳細をお話ししました。
- [2〜4系のセキュリティについて！ EC-CUBE東京ユーザグループ開発者向け勉強会2月](https://eccube-tokyoug.connpass.com/event/164486/) にて詳細お話ししました。
- [EC-CUBEオフィシャルサイトにセキュリティチェックの特設ページができました](https://www.ec-cube.net/info/security/)
- [2.11〜2.13系向けのセキュリティチェックモジュールがリリースされました](https://www.ec-cube.net/products/detail.php?product_id=2017)

----

## ※マークは最優先でチェックすること

----

## 2系

----

### ※ data 以下のファイル、フォルダが公開されていないか

EC-CUBEのURL直下(例: https://example.com/path/to/ec-cube/data など)に data フォルダが公開されていないかご確認ください。

もしくは、 EC-CUBEの URL と同階層(例: https://example.com/path/to/ec-cube の場合 https://example.com/path/to/data) に data フォルダが公開されていないかご確認ください。

**data/Smarty/templates/default/site_frame.tpl** などにアクセスし、ファイルの中身が表示されないことをご確認ください。

----

#### data 以下のファイルの中身が表示されてしまった場合

data フォルダに .htaccess というファイル名で、以下の内容を保存してください。

```
order allow,deny
deny from all
```

保存した後、ファイルの中身が表示されないことをご確認ください。
それでも表示されてしまう場合は、 [こちらのプロフィール](https://qiita.com/nanasess) にある SNS や、メールアドレス宛までお気軽にご連絡ください。

----

### install 以下のファイル、フォルダが存在するか

EC-CUBEのURL直下(例: https://example.com/path/to/ec-cube/install など)に install フォルダが存在するかご確認ください。

----

#### install フォルダが存在する場合

通常の運用では使用しないプログラムが含まれています。
install フォルダを削除してください。

----

### test 以下のファイル、フォルダが存在するか

EC-CUBEのURL直下(例: https://example.com/path/to/ec-cube/test など)に test フォルダが存在するかご確認ください。

----

#### test フォルダが存在する場合

通常の運用では使用しないプログラムが含まれています。
test フォルダを削除してください。

----

### tests 以下のファイル、フォルダが公開されていないか

EC-CUBEのURL直下(例: https://example.com/path/to/ec-cube/tests など)に tests フォルダが存在するかご確認ください。

----

#### tests フォルダが存在する場合

通常の運用では使用しないプログラムが含まれています。
tests フォルダを削除してください。

----

### 管理画面の URL を変更した際に、標準の admin フォルダが残存していないか

管理画面の URL を標準の admin から変更した場合、 admin フォルダが残っていないことをご確認ください。

----

#### admin フォルダが残っている場合

使用しなくなったプログラムが含まれています。 admin を削除してください。

----

### composer.jsonなど、開発用のファイルが存在するか

EC-CUBEのURL直下(例: https://example.com/path/to/ec-cube/composer.json など)に以下のファイルが存在するかご確認ください。

- build.xml
- phpunit.xml.dist
- Gruntfile.js
- composer.json
- composer.lock
- package.json
- package-lock.json

----

#### 開発用のファイルが存在する場合

通常の運用では使用しないプログラムが含まれています。
開発用のファイルを削除してください。

----

## 3系

----

### ※ app が公開されていないか

EC-CUBEのURL直下(例: https://example.com/path/to/ec-cube/app など)に app フォルダが公開されていないかご確認ください。

**app/console** などにアクセスし、ファイルの中身が表示されないことをご確認ください。

----

### ※ app 以下のファイルが公開されている場合


app フォルダに .htaccess というファイル名で、以下の内容を保存してください。

```
order allow,deny
deny from all
```

保存した後、ファイルの中身が表示されないことをご確認ください
それでも表示されてしまう場合は、 [こちらのプロフィール](https://qiita.com/nanasess) にある SNS や、メールアドレス宛までお気軽にご連絡ください。

----

### ※ vendor が公開されていないか

EC-CUBEのURL直下(例: https://example.com/path/to/ec-cube/vendor など)に vendor フォルダが公開されていないかご確認ください。

**vendor/symfony/config/README.md** などにアクセスし、ファイルの中身が表示されないことをご確認ください。

### ※ vendor 以下のファイルが公開されている場合


vendor フォルダに .htaccess というファイル名で、以下の内容を保存してください。

```
order allow,deny
deny from all
```

保存した後、ファイルの中身が表示されないことをご確認ください
それでも表示されてしまう場合は、 [こちらのプロフィール](https://qiita.com/nanasess) にある SNS や、メールアドレス宛までお気軽にご連絡ください。

----

### install.php が存在するか

EC-CUBEのURL直下(例: https://example.com/path/to/ec-cube/install.php など)に install.php が存在するかご確認ください。

----

#### install.php が存在する場合

通常の運用では使用しないプログラムが含まれています。
install.php を削除してください。

----

### composer.jsonなど、開発用のファイルが存在するか

EC-CUBEのURL直下(例: https://example.com/path/to/ec-cube/eccube_install.php など)に以下のファイルが存在するかご確認ください。

- eccube_install.php
- eccube_install.sh
- composer.json
- composer.lock
- phpunit.xml.dist
- web.config.sample

----

#### 開発用のファイルが存在する場合

EC-CUBE をインストールしたフォルダの .htaccess ファイルに以下の内容を追加し、保存してください。

```
<FilesMatch "^composer|^COPYING|^\.env|^eccube_install|^Procfile|^app\.json|^gulpfile\.js|^package\.json|^package-lock\.json|web\.config|^Dockerfile|\.(ini|lock|dist|git|sh|bak|swp|env|twig|yml|yaml|dockerignore)$">
    order allow,deny
    deny from all
</FilesMatch>
```

保存した後、 開発用が表示されないことをご確認ください。
それでも表示されてしまう場合は、 [こちらのプロフィール](https://qiita.com/nanasess) にある SNS や、メールアドレス宛までお気軽にご連絡ください。


### tests 以下のファイル、フォルダが公開されていないか

EC-CUBEのURL直下(例: https://example.com/path/to/ec-cube/tests など)に tests フォルダが存在するかご確認ください。

----

#### tests フォルダが存在する場合

通常の運用では使用しないプログラムが含まれています。
tests フォルダを削除してください。

----

### index_dev.php が存在するか

EC-CUBEのURL直下(例: https://example.com/path/to/ec-cube/index_dev.php など)に index_dev.php が存在するかご確認ください。

----

#### index_dev.php が存在する場合

開発用途で使用するプログラムが含まれています。
本番環境では、 index_dev.php を削除してください。


----

## 4系

----

### ※ var が公開されていないか

EC-CUBEのURL直下(例: https://example.com/path/to/ec-cube/var など)に var フォルダが公開されていないかご確認ください。

**var/cache/prod/annotations.map** などにアクセスし、ファイルの中身が表示されないことをご確認ください。

----

### ※ var 以下のファイルが公開されている場合


var フォルダに .htaccess というファイル名で、以下の内容を保存してください。

```
order allow,deny
deny from all
```

保存した後、ファイルの中身が表示されないことをご確認ください。
それでも表示されてしまう場合は、 [こちらのプロフィール](https://qiita.com/nanasess) にある SNS や、メールアドレス宛までお気軽にご連絡ください。

----

### ※ .env が公開されていないか

EC-CUBEのURL直下(例: https://example.com/path/to/ec-cube/.env など)に .env ファイルが公開されていないか、ファイルの中身が表示されないことをご確認ください。

----

#### .env ファイルの中身が表示されてしまう場合

EC-CUBE をインストールしたフォルダの .htaccess ファイルに以下の内容を追加し、保存してください。

```
<FilesMatch "^composer|^COPYING|^\.env|^\.maintenance|^Procfile|^app\.json|^gulpfile\.js|^package\.json|^package-lock\.json|web\.config|^Dockerfile|\.(ini|lock|dist|git|sh|bak|swp|env|twig|yml|yaml|dockerignore)$">
    order allow,deny
    deny from all
</FilesMatch>
```

保存した後、 .env ファイルの中身が表示されないことをご確認ください。
それでも表示されてしまう場合は、 [こちらのプロフィール](https://qiita.com/nanasess) にある SNS や、メールアドレス宛までお気軽にご連絡ください。

----

### codeception が公開されていないか

EC-CUBEのURL直下(例: https://example.com/path/to/ec-cube/codeception など)に codeception フォルダが存在するかご確認ください。

----

#### codeception フォルダが存在する場合

通常の運用では使用しないプログラムが含まれています。
codeception フォルダを削除してください。

----

### 開発(dev)モードになっていないか

.env ファイルや、 .htaccess ファイルに設定されている `APP_ENV` の値が **dev** になっていないかご確認ください。

----

#### APP_ENV=dev になっている場合

開発用途で使用する設定になっています。
本番環境では、 `APP_ENV` を **prod** に設定してください。

----

### composer.jsonなど、開発用のファイルが存在するか

EC-CUBEのURL直下(例: https://example.com/path/to/ec-cube/composer.json など)に以下のファイルが存在するかご確認ください。

- Dockerfile
- composer.json
- composer.lock
- gulpfile.js
- package-lock.json
- package.json
- symfony.lock
- web.config

----

#### 開発用のファイルが存在する場合

基本的に、上記 .env の中身が表示されない状態であれば、これら開発用のファイルも表示されないようになっています。
万が一表示されてしまう場合は、 EC-CUBE をインストールしたフォルダの .htaccess ファイルに以下の内容を追加し、保存してください。

```
<FilesMatch "^composer|^COPYING|^\.env|^\.maintenance|^Procfile|^app\.json|^gulpfile\.js|^package\.json|^package-lock\.json|web\.config|^Dockerfile|\.(ini|lock|dist|git|sh|bak|swp|env|twig|yml|yaml|dockerignore)$">
    order allow,deny
    deny from all
</FilesMatch>
```

保存した後、 開発用ファイルの中身が表示されないことをご確認ください。
それでも表示されてしまう場合は、 [こちらのプロフィール](https://qiita.com/nanasess) にある SNS や、メールアドレス宛までお気軽にご連絡ください。

----

## 全バージョン共通

----

### SSLが導入されているか

EC-CUBE に https:// からの URL でアクセスできるかご確認ください

----

#### https:// からの URL でアクセスできない場合

常時SSLの導入をご検討ください。
導入方法がわからない場合は、 [こちらのプロフィール](https://qiita.com/nanasess) にある SNS や、メールアドレス宛までお気軽にご連絡ください。


----

### 公表された脆弱性が修正されているか

[EC-CUBE脆弱性リスト](https://www.ec-cube.net/info/weakness/) にアクセスし、**対象バージョン** のフォームにご利用の EC-CUBE のバージョンを入力し、脆弱性対応が済んでいるかご確認ください。

ご利用の EC-CUBE のバージョンは、管理画面のトップページでご確認可能です。

修正方法がよくわからない場合は、[こちらのプロフィール](https://qiita.com/nanasess) にある SNS や、メールアドレス宛までお気軽にご連絡ください。

----

### 管理画面のユーザーID/パスワードが推測されやすいものになっていないか

以下のような例に該当する場合は、推測されにくいユーザーID/パスワードに変更しましょう

- ユーザーIDとパスワードが同じ
- ユーザーIDが admin など推測されやすいもの
- パスワードが8文字以下
- パスワードが数字のみ、英字のみ

古いバージョンの EC-CUBE では、ユーザーIDに記号が使用できない場合があります。
修正方法がわからない場合は、[こちらのプロフィール](https://qiita.com/nanasess) にある SNS や、メールアドレス宛までお気軽にご連絡ください。

----

### 管理画面が推測しやすい URL になっていないか

管理画面の URL が admin など推測しやすい URL になっていないことをご確認ください。
2.11 以降のバージョンでは、 管理画面から admin 以外に変更可能です。
また、 IP アドレスの制限などもセキュリティの強化には有効ですので、併わせてご検討ください。

----

### パーミッション777のファイル、フォルダが存在しないか

パーミッションが 777 となっているファイル、フォルダが存在しないことをご確認ください

----

#### パーミッション777のファイル、フォルダが存在する場合

ファイルは 604、 フォルダは 705 など、ご利用のサーバーでの適切なパーミッションに変更してください。

テンプレートや、画像フォルダなど、Webサーバーから書き込みが必要な場合は、ファイル: 606、フォルダ: 707など、書き込み許可が必要な場合があります。
この場合は、セキュリティのリスクが向上しますのでご注意ください。

----

### パーミッション666のファイルが存在しないか

パーミッションが 666 となっているファイルが存在しないことをご確認ください

----

#### パーミッション666のファイルが存在する場合

ファイルは 604 など、ご利用のサーバーでの適切なパーミッションに変更してください。

テンプレートなど、Webサーバーから書き込みが必要な場合は、606 など、書き込み許可が必要な場合があります。
この場合は、セキュリティのリスクが向上しますのでご注意ください。

----

### API が有効になっていないか

2系の場合は、EC-CUBEのURL直下(例: https://example.com/path/to/ec-cube/api など)にアクセスし、**ページが見つかりません** もしくは、 **API機能が無効です。** と表示されることをご確認ください。
「API機能が無効です。」と表示する場合でも、完全に削除してしまった方が安全です。
**html/api フォルダを完全に削除してください。**

3系の場合は、 EC-CUBEのURL直下(例: https://example.com/path/to/ec-cube/api/v0/product など)にアクセスし、 **ページが見つかりません** と表示されることをご確認ください。

----

#### API が有効になっている場合

適切にアクセス制限がかかっているかご確認ください。
よくわからない場合は、[こちらのプロフィール](https://qiita.com/nanasess) にある SNS や、メールアドレス宛までお気軽にご連絡ください。

----

### html を別のフォルダ名(www, public_html など)に変更されていないか

サーバーによっては、 EC-CUBE 標準の公開フォルダである html が使用できない場合があります。
html 以外のフォルダ名に変更されている場合は、前出の2系、3系、4系のチェックリストを今一度ご確認ください。

----

### user_data 以下に CSV ファイルが存在しないか

user_data フォルダ以下に CSV ファイルが存在しないかご確認ください。
存在する場合は削除してください。

----

### upload 以下に CSV ファイルが存在しないか

upload フォルダ以下に CSV ファイルが存在しないかご確認ください。
存在する場合は削除してください。

----

### 他の CMS と同居している場合, バージョン(本体, プラグイン)は最新か

WordPress など、他の CMS を同時にインストールしている場合、最新バージョンが導入されているかご確認ください。
最新バージョンでは無い場合は、最新バージョンにバージョンアップしてください。

----

### 他のフリーCGIを使用していないか

フリーで配布されている CGI を使用していないかご確認ください。
EC-CUBEは機密情報を扱いますので、フリーで配布されている CGI との同時利用はおすすめしません。

----

### 独自テンプレートでエスケープ漏れなど無いか

テンプレートを独自にカスタマイズされている場合、フォームの **input** タグなどにエスケープ漏れが無いかご確認ください。

特に2系の場合は、 **value** 属性に **h** が付与されていることをご確認ください。

```smarty
<!-- value に h が付与されているのを確認 -->
<input type="text" name="<!--{$key1}-->" value="<!--{$arrForm[$key1].value|h}-->"  />
```

----

### 独自カスタマイズ, プラグインで eval を使用している箇所は無いか

独自カスタマイズ、プラグインのソースを検索し、 eval 関数を使用している箇所は無いかご確認ください。

eval 関数の使用は推奨しません。
よくわからない場合は、[こちらのプロフィール](https://qiita.com/nanasess) にある SNS や、メールアドレス宛までお気軽にご連絡ください。

----

### 独自カスタマイズ, プラグインで serialize/unserialize を使用している箇所は無いか

独自カスタマイズ、プラグインのソースを検索し、 serialize/unserialize 関数を使用している箇所は無いかご確認ください。

serialize/unserialize 関数の使用は推奨しません。
よくわからない場合は、[こちらのプロフィール](https://qiita.com/nanasess) にある SNS や、メールアドレス宛までお気軽にご連絡ください。

----

### 独自カスタマイズ, プラグインで SQL を実行する際, プレースホルダを使用しているか

独自カスタマイズ、プラグインのソースを検索し、適切にプレースホルダを使用しているかご確認ください。

以下のように変数を直接 SQL に渡している場合は要注意です

```php
$sql = "SELECT * FROM dtb_products WHERE product_id = '".$product_id."';";
```

## ここに書いてあることがよくわからない場合は

[こちらのプロフィール](https://qiita.com/nanasess) にある SNS や、メールアドレス宛までお気軽にご連絡ください。

## こちらもあわせてご覧ください

- [公式の注意喚起](https://www.ec-cube.net/news/detail.php?news_id=348)
- [公式の対策資料](https://www.ec-cube.net/user_data/news/201905/security_notice.pdf?ver=2019122402)

----

# 参考

## パーミッション修正方法

### 666 のファイルを検索

```
find . -type f -perm 666
```

### 604 に変更

```
find . -type f -perm 666 -print0 | xargs -0 chmod 604
```

### 777 のディレクトリを検索

```
find . -type d -perm 777
```

### 705 に変更

```
find . -type d -perm 777 -print0 | xargs -0 chmod 705`
```

----

## TODO

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">あと、セキュリティの面から言うと、デザイン管理画面は使わない方がいいです。<br>Webサーバーの権限で、テンプレートに書き込み許可されているのはリスクになりえます。<br>VPS やクラウドをお使いの方は、 デザイン管理画面を使用できなくしてしまって、Webサーバーから書き込めないようにした方が安全</p>&mdash; 🍣大河内健太郎🕊💉 (@nanasess) <a href="https://twitter.com/nanasess/status/1215116263124434944?ref_src=twsrc%5Etfw">January 9, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">公式から出ているチェックリストに、<br><br>&gt; 購入確認画面等に覚えのない JavaScript が設置されていないか<br><br>ってあるけど、 jQuery に偽装したファイルが設置されていたこともあります。<br>難読化されていて、プロでも一見見分けがつきません。<br>不安な方はお気軽にご相談ください<a href="https://t.co/YAzZJkfGX4">https://t.co/YAzZJkfGX4</a></p>&mdash; 🍣大河内健太郎🕊💉 (@nanasess) <a href="https://twitter.com/nanasess/status/1215137750145359872?ref_src=twsrc%5Etfw">January 9, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">tpl ファイルを Webサーバーからは読み取り専用のパーミッション(604)にして、デザイン管理画面を使わない運用にするのも効果あると思います。<br>この場合、テンプレートの修正は FTP や SSH など Webサーバーとは別のユーザー権限で行います</p>&mdash; 🍣大河内健太郎🕊💉 (@nanasess) <a href="https://twitter.com/nanasess/status/1216896908993523712?ref_src=twsrc%5Etfw">January 14, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">WordPress など、他の CMS と同居している場合は、2系に関わらず3系、4系でも注意が必要です。<br>今後、イタチごっこになり標的が変わる可能性があります。</p>&mdash; 🍣大河内健太郎🕊💉 (@nanasess) <a href="https://twitter.com/nanasess/status/1216897688312012800?ref_src=twsrc%5Etfw">January 14, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>