EC-CUBEなどに実装されているスロットリング機能が脆弱性診断に与える影響

EC-CUBEのようなWebアプリケーションには、サーバーの負荷抑制や不正利用の防止のため、スロットリングという機能が実装されていることがあります。この機能が有効なサイトに脆弱性診断を行うと、診断結果に影響を与える場合があります。

ここではスロットリングや脆弱性診断の仕組みを紐解き、どう対策すべきかを解説します。

## スロットリングとは？

プログラミングにおいてスロットリングとは、一定時間あたりの処理数を制限する仕組みを指します。Webアプリケーションの場合、スロットリングは利用者やIPアドレスごとに処理数を制限することがほとんどです。こうすることで大多数の利用者への影響を避けつつ、大量に処理を行う一部の利用者だけ制限することができます。

### スロットリング機能がない場合

一部の利用者が大量の処理を実行すると、他の利用者が処理できなくなってしまいます。

![Qiita1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422105/169ffbb8-bf59-a095-85f7-a039be206ed6.png)

### スロットリング機能がある場合

大量のリクエストを送信する利用者の処理のみをブロックすることで、他の利用者が快適に使えるようになります。

![Qiita2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422105/d44a464d-2f65-86e2-fd8e-12092b3bb69c.png)


## 脆弱性診断の仕組み

一方、Webアプリケーションの脆弱性診断では、脆弱性を見つけるために大量のリクエストを送信します。

##### 脆弱性診断のイメージ
![Qiita3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422105/0a4643be-e0f0-f78d-8480-6140e06be8f0.png)

これって何かに似ていませんか？そう、スロットリングの説明に出てきた大量に処理を行う利用者と同じです。

##### スロットリングが有効なサイトに対する脆弱性診断のイメージ
![Qiita4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422105/eacb942f-57d4-f2a8-20b8-a5cf3cf78992.png)

スロットリング機能が有効なサーバーに脆弱性診断を行うと、診断用のリクエストをサーバーがブロックしてしまいます。
これでは脆弱性診断で見つけるべき脆弱性を見つけらません。

## 対策方法

スロットリングの影響を受けずに脆弱性診断を行うには、アプリケーションでの対策と脆弱性診断ツールでの対策がそれぞれ考えられます。

### アプリケーションでの対策

アプリケーションで対策する場合は、一時的にスロットリング機能を無効化するか、スロットリングが発生する条件を緩和します。
診断後、設定を元に戻すことを忘れないでください。

#### EC-CUBEの場合

EC-CUBEの場合、以下のようなスロットリング設定が用意されており、本番環境では最初から有効になっています。
この設定を変更し、スロットリングの条件を緩和する方法を説明します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422105/e6279cbc-338e-bbde-5cf3-60bfbf7ba2ed.png)

参照元：https://doc4.ec-cube.net/customize_throttling

##### 1.services.yamlを作成する

```
{% EC-CUBEインストール先 %}/app/config/eccube/packages/prod/eccube_rate_limiter.yaml
```
を
```
{% EC-CUBEインストール先 %}/app/Customize/Resource/config/services.yaml
```
にコピーします。

##### 2. limitの値を変更。

`services.yaml` 内の `limit` の値を、 `9999` など巨大な値に設定します。


##### 3. スロットリングの設定を確認する

新規会員登録画面など、スロットリングが有効なページに何度もアクセスし、スロットリングの設定が変更されていることを確認してください。
設定が不要になったら、 `services.yaml` を削除して、元の状態に戻してください。

<details>

**<summary>EC-CUBE 4.3.0での実際の設定例はこちら。（クリックして展開）</summary>**

```yaml:services.yml
eccube:
    rate_limiter:
        forgot:
            # route: forgot
            # method: [ 'POST' ]
            # type: ip
            limit: 9999
            interval: '30 minutes'
        entry: # 存在しているメールアドレスの確認を防止するためのスロットリング
            # route: entry
            # method: [ 'POST' ]
            # type: ip
            limit: 9999
            interval: '30 minutes'
        entry_complete: # 不正な会員登録を防止するためのスロットリング
            # route: entry
            # method: [ 'POST' ]
            # params:
            #     mode: complete
            # type: ip
            limit: 9999
            interval: '30 minutes'
        mypage_change:
            # route: mypage_change
            # method: [ 'POST' ]
            # type: user
            limit: 9999
            interval: '30 minutes'
        mypage_delivery_new:
            # route: mypage_delivery_new
            # method: [ 'POST' ]
            # type: user
            limit: 9999
            interval: '30 minutes'
        mypage_delivery_edit:
            # route: mypage_delivery_edit
            # method: [ 'POST' ]
            # type: user
            limit: 9999
            interval: '30 minutes'
        mypage_delivery_delete:
            # route: mypage_delivery_delete
            # method: [ 'DELETE' ]
            # type: user
            limit: 9999
            interval: '30 minutes'
        shopping_shipping_multiple_edit_customer:
            # route: shopping_shipping_multiple_edit
            # method: [ 'POST' ]
            # type: user
            limit: 9999
            interval: '30 minutes'
        shopping_shipping_edit_customer:
            # route: shopping_shipping_edit
            # method: [ 'POST' ]
            # type: user
            limit: 9999
            interval: '30 minutes'
        contact:
            # route: contact
            # method: [ 'POST' ]
            # params:
            #     mode: complete
            # type: ip
            limit: 9999
            interval: '30 minutes'
        shopping_confirm_ip:
            # route: ~
            limit: 9999
            interval: '30 minutes'
        shopping_confirm_customer:
            # route: ~
            limit: 9999
            interval: '30 minutes'
        shopping_checkout_ip:
            # route: ~
            limit: 9999
            interval: '30 minutes'
        shopping_checkout_customer:
            # route: ~
            limit: 9999
            interval: '30 minutes'
        admin_two_factor_auth:
            # route: admin_two_factor_auth
            # method: [ 'POST' ]
            # type: user
            limit: 9999
            interval: '30 minutes'

```

</details>

### 脆弱性診断ツールでの対策

アプリケーションでの対策が難しい場合、脆弱性診断ツールで送信するリクエストの送信頻度を減らします。例えばAeyeScanの場合、 `スキャン基本オプション -> スキャン速度` という設定項目でリクエストの送信頻度を減らすことができます。ただし、診断時間は増加するので注意してください。

![ec-cube](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422105/0d143ef8-306b-dc72-acbc-c6ad2b1bfa25.png)

各設定での送信頻度はおおよそ以下の通りです。


| 設定値 | 送信頻度 |
|:--|:--|
| ゆっくり | 10リクエスト/秒 |
| 標準 | 20リクエスト/秒 |
| 高速 | 30リクエスト/秒 |
| 1ブラウザ | 3リクエスト/秒 |

先ほどのEC-CUBEのように不正利用対策も兼ねている場合、脆弱性診断ツール側だけの設定では不十分な場合もあります。アプリケーション側でスロットリングを無効化できる場合はそちらを設定してください。


## まとめ

スロットリング機能は、負荷抑制や不正利用の防止といったサイトの安全性を高めるために重要な機能です。しかし、脆弱性診断中にスロットリングが有効だと見つかるはずの脆弱性を見つけられず、結果的にサイトの安全性が下がってしまうこともあります。脆弱性診断中はスロットリング機能を無効化することをご検討ください。

株式会社エーアイセキュリティラボ では、AeyeScan というSaaS型のWebアプリケーション脆弱性診断プラットフォームを開発しています。かんたんに高精度なWeb診断を実施することができることから、Webアプリ診断の内製化ツールとして多くの企業様にご活用いただいております。

AeyeScanの詳細はこちら: https://www.aeyescan.jp