こんにちは。なおとです。
セキュリティリスクもやっと5つ目で折り返しです。
全部完走しないと5つの大罪ってね、ありゃ、7つの大罪が正解でしたか、あいた〜。
最近APIのセキュリティについての学習を始めました。
とっかかりとして、OWASPのAPI Security Risks Top 10を1つずつ読んでとても簡単に説明し、感想の端くれを述べていくことにしました。
OWASPとは、セキュリティに関する情報共有及び普及啓発を目的としたオープンソース・ソフトウェアコミュニティです。
API Security Risks Top 10とはOWASPが発表している、Web APIにおける10大セキュリティ懸念事項みたいです。
今回はTop 10の4つ目「Broken Function Level Authorization」を見ていきます。
Broken Function Level Authorizationとは
Broken Function Level Authorizationとは、攻撃者が、権限を持たない一般ユーザーとしてアクセスすべきではない、管理者用等のAPIエンドポイントにアクセスできてしまう状態を指します。
脆弱性の原因
以下の事項を考慮していない場合、Broken Function Level Authorizationが発生する可能性が高いと言えます。
- 一般ユーザーが管理用エンドポイントにアクセス可能か?
- ユーザーがHTTPメソッドを変更するだけで、本来なら行えない操作を実行できるか?(削除等)
- ある権限グループに属するユーザーが、エンドポイントとパラメータを推測することで、別グループのユーザーのみに公開されるべき操作を実行できるか?
これらを考慮する上で、URLのパスの見た目だけでそれが一般ユーザー用もしくは管理ユーザー用のものであると決めつけるのは良くないことです。
/api/users
配下のパスに管理ユーザーのみがアクセスできるエンドポイントが存在する可能性も多々あるということです。
具体例
管理者に招待されたユーザーのみが参加できるアプリケーションでは、招待用メール中のリンクにアクセスし、GET /api/invites/{invite_guid}
のリクエストを送信することでユーザー新規登録ができるとします。
このGETリクエストのレスポンスには、ユーザーのemail(メールアドレス)及びrole(役割)が含まれます。
以上の情報から、攻撃者は招待送信用のエンドポイントをPOST /api/invites/new
と推測し、以下のパラメータと共にアクセスしたとします。
{
email: 'attacker@example.com',
role: 'admin'
}
もしこのエンドポイントが実際に
- 管理者ユーザーのみが実行できる、「招待を送信する」ためのものである
- 一般ユーザーでも実行できてしまう脆弱性がある
の2つを満たす場合、攻撃者に、管理ユーザーとしての招待用のメールが送信されてしまいます。
そうすると、攻撃者は、システム全体へのアクセス権限を手に入れることができてしまいます。
対策
アプリケーションが、全ての関数実行以前に、認証および権限をチェックするモジュールを持つと良いです。
そして、多くの場合、そのモジュールはアプリケーションコードの1つの外部のシステムやサービスによって提供されるのが良いとされているようです。
さらに、全ての管理用コントローラがユーザーのグループまたはロールに基づいた権限チェックを実装したコントローラを継承していると管理しやすいです。
以上を簡単なUnrestricted Resource Consumptionについての説明とさせていただきます。
技術的な感想
私がよく使用しているRuby on Railsでは、Ruby製の認証系gemである「Devise」を用い、コントローラを権限用のディレクトリ(/admin
や/public
)に分けて、各ディレクトリの親コントローラでユーザーの権限、認証チェックを行う方針を取っていますが、その方針が誤りではないと確認できたことが、今回の収穫でした。
基本的なセキュリティ問題なので、自身の開発中では気をつける前提で、チームのコードをレビューする際にもしっかりと指摘していきたいと思いました。
最後に
基礎が大事であると再確認できた回でした。
この記事の説明は本当に簡単に行っています。
しっかり学びたい方は是非公式の文章を読んでみてください。
最後まで読んでいただき、ありがとうございました。