Webアプリケーションのアクセス制御をテストする

## 概要

本記事では架空のブログサービスを例に、下記のようなアクセス制御(認可)の欠陥を発見するためのテストを作る流れを説明する。

アクセス制御の欠陥

- ログインしてないのに機能を使えてしまった
- 一般ユーザが管理機能を使えてしまった
- 他のユーザの秘密情報を閲覧・変更できてしまった

テストを作るまでの流れ

1. ユースケースをもとにロール、リソース、操作を列挙する
2. アクセス制御マトリクスを作る
3. テストを設計する


## ユースケースからユーザ・ロール、リソース、操作を抽出

アクセス制御をテストするには、まず「誰が」「何を」「どう」できる(許可)・できない(不許可)を明確にする必要がある。

1. 誰が：ユーザ・ロール
2. 何を：リソース
3. どう：操作

これらはユースケースやユーザーストーリーから抜き出せる。ブログサービスには次のようなユースケースがあるとすると、

- 登録済みユーザは、自己紹介を作成できる
- 登録済みユーザは、記事を投稿・更新・削除できる
- 登録済みユーザは、記事にコメントできる
- 記事とコメントはだれでも参照できる
- サービス管理者は不適切なプロフィールを変更できる
- サービス管理者は不適切な記事・コメントを削除できる

下記のユーザ・ロール、リソース、操作が列挙できる。

- ユーザ・ロール
  1. 匿名ユーザ（だれでも）
  2. 登録済みユーザ
  3. サービス管理者
- リソース
  1. プロフィール
  2. 記事
  3. コメント
- 操作
  1. 投稿（作成）
  2. 参照
  3. 更新
  4. 削除

ここで抽出した ユーザ・ロール、リソース、操作 を組み合わせて、できる・できないを明確にしていく。

## アクセス制御マトリクスを作る

アクセス制御マトリクスは、誰が(ユーザ・ロール)、何に（リソース）、何をできるか（操作）を表で表したもの。subject-object-activity matrix と呼ぶこともある。

アクセス制御マトリクスを作るには、列にユーザ・ロール、行にリソース、セルに可能な操作を書く。（行列は逆でも良い）
![2020-05-10-23-39-20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118451/8c03f9ed-9ced-93a8-2c1b-8f9b97f12deb.png)
**表1：アクセス制御マトリクスの例**

表1は*できること*は明確だが、**できないこと**が暗黙のままである。そこで操作をヘッダに入れてセルを○×にすると、できること・できないことがより明確になる。
![2020-05-10-23-19-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118451/f0e25372-b28a-f75c-d8f5-53a866712e28.png)
**表2：操作をヘッダに入れたアクセス制御マトリクス**

表2にはまだ曖昧さ（※2）が残っている。これはロールとリソースを具体的なユーザに分解すると排除できる。
![2020-05-10-23-18-53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118451/4eddd9ea-4b20-f2ba-5a21-ff1bfd37f0a0.png)
**表3：ロールをユーザに分解したアクセス制御マトリクス**

このような曖昧さが少ないアクセス制御マトリクスができれば、テストケースは容易に作れるようになる。

## テスト手法

アクセス制御マトリクスを使ってできるテスト手法を3つ挙げる。

### アクセス制御ルールのレビュー

アクセス制御マトリクスと要件との一貫性を確認する。

例えば、自分の記事に書かれた他人のコメントは消せなくていいんだっけ？のようなユースケースの列挙漏れ（または設計ミス）を発見できるかもしれない。

### コードインスペクション

マトリクスに従ったアクセス制御(認可)を実装できているかをレビューする。コードインスペクションで検出できる欠陥は動的テストでも検出できるが、コードインスペクションのほうが早期に実行できるという利点がある。

マトリクスのセル1つ毎にコードを追いかけても良いし、下記のような観点でレビューすることもできる。

|観点|説明|欠陥の例|
|:--|:--|:--|
|縦方向の権限昇格|ロールに基づいたアクセス制御が実装されていること|登録済みユーザが管理者機能を使えてしまう|
|横方向の権限昇格|ユーザに基づいたアクセス制御が実装されていること|登録済みユーザAがBのプロフィールを変更できでしまう|
|アクセス制御の回避|すべてのアクセスはアクセス制御ロジックを経由すること|あるリソースへの（またはあるロールからの）アクセスはアクセス制御を経由しない|
**表4：アクセス制御に関するコードレビューの観点**
![2020-05-12-01-30-39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118451/1369eff7-09c2-a6c7-0c94-ff3a41e8d08b.png)
**図1：縦(Vertical)と横(Horizontal)の権限昇格**

### Web(API)テスト

図3のアクセス制御マトリクスからテストケース一覧を作る。1つのセルが1つのテストケースになる。すべてのテストを実行することでアクセス制御の妥当性を検証できる。
![2020-05-11-00-39-26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118451/65fc0192-720a-411b-37f0-6395e143205e.png)
**表4：アクセス制御マトリクスをもとに作成したテストケース一覧**

もしテスト対象が API であれば、ログインユーザは Authorization ヘッダ、リソースは　URI、操作は HTTP メソッド、のようになる。
![2020-05-11-00-39-40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118451/5635af82-4031-3c7f-6934-5dbd1c42bbcc.png)
**表5：アクセス制御マトリクスをもとに作成したテストケース一覧(API版)**

## Next Step

アクセス制御マトリクスに基づいたテストを実行することで、アプリケーションに実装したアクセス制御とそのルールの妥当性を検証できるようになった。ただしこのテストではWebアプリケーションを経由しないアクセスは検証できない点に注意。

例えばAWSにデプロイしたWebアプリケーションをテストする場合、下記の赤線の経路は検証される。
![2020-05-09-21-18-46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118451/4435450e-4f18-6c87-2235-7c279524422c.png)
**図2：Webアプリケーションの構成例（構成に深い意味はない）**

しかし次のような攻撃経路を想定したセキュリティの検証にはならない。
![2020-05-09-21-21-28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118451/c4417571-0d0b-544d-69a2-f08949bdfde5.png)
**図3：Webアプリケーションを経由しないリソースへのアクセス**

また、上図以外に下記のような攻撃経路も考えられる。

- キャッシュ (CDN) からの情報漏洩
- 不正ログインされたリモート管理サービス経由での情報改ざん・漏洩
- エラーログからの情報漏洩

このようなWebアプリケーションを経由しないリソースへのアクセスの制御は、別のテストで検証する必要がある。

その他、 CWE を参照して認可に関するよくあるエラーも把握しておくとよい。⇒ [CWE CATEGORY: Authorization Errors](https://cwe.mitre.org/data/definitions/1212.html)

## まとめ

アクセス制御マトリクスをもとにテストを作成する流れを紹介した。

- ユースケースを列挙する
- ユースケースからユーザ・ロール、リソース、操作を抽出
- アクセス制御マトリクスを作る
- テストを設計する（レビュー、Web・APIテスト）

ただしこのテストでは Web アプリケーションを経由しないアクセスの欠陥は検出できない点に注意。

## 補足

アクセス制御マトリクスはテストじゃなくて設計のフェーズで作るものでは？⇒そのとおり。

## 参考

- [CWE-639: Authorization Bypass Through User-Controlled Key: https://cwe.mitre.org/data/definitions/639.html](https://cwe.mitre.org/data/definitions/639.html)

- [CWE CATEGORY: Authorization Errors: https://cwe.mitre.org/data/definitions/1212.html](https://cwe.mitre.org/data/definitions/1212.html)

- [OWASP Cheat Sheets - Authorization Testing Automation: https://cheatsheetseries.owasp.org/cheatsheets/Authorization_Testing_Automation.html](https://cheatsheetseries.owasp.org/cheatsheets/Authorization_Testing_Automation.html)