OWASPのプロアクティブコントロールTOP10

(Last Updated On: 2018年8月4日)

もう十年以上前に書いた本でプロアクティブなセキュリティ対策が重要と書いていたと思います。OWASPプロアクティブコントロールTOP10を紹介します。

1: Parameterize Queries
2: Encode Data
3: Validate All Inputs
4: Implement Appropriate Access Controls
5: Establish Identity and Authentication Controls
6: Protect Data and Privacy
7: Implement Logging, Error Handling and Intrusion Detection
8: Leverage Security Features of Frameworks and Security Libraries
9: Include Security-Specific Requirements
10: Design and Architect Security In

1番は主にSQLインジェクションを念頭に置いていると思われます。SQLインジェクションは簡単かつ完全に防御できる脆弱性ですがなくなりません。未だに結構多いので妥当なところでしょう。1番、2番、3番で完全に防御できます。

参考:セキュアコーディングのベストプラクティスは以下が参考になります。

CERT Top 10 Secure Coding Practices

OWASP Secure Coding Practices – Quick Reference Guide

 

1: Parameterize Queries

1番のクエリをパラメータ化する、という対策はSQLインジェクションに限らず有効です。型あり言語から型が弱い言語を使うようになったプログラマや初心者は数値型データは数字だから、などと必要なエスケープ処理を省略してしまうことが日常的に起きています。

 

2: Encode Data

2番の”Encode Data”とはデータが命令として解釈されないよう、エスケープすることを意味します。エンコード(Encode)よりはエスケープ(Escape)の方が英語的にも日本語的にも、より明確にセキュリティ対策であることを表せるのでエスケープの方が良いと思います。しかし、エンコードをエスケープの意味で利用することも多いです。ここでEncodeを利用しているのはOWASPのセキュリティライブラリがEncodeクラスとして実装されていることが主な理由だと思われます。

 

3: Validate All Inputs

3番が入力バリデーションです。CWE/SANS TOP 25で実質的な最も重要なセキュリティ対策としているのが入力バリデーションですが、OWASPでは3番になっています。普通のWeb開発環境ではバッファーオーバーフローに対するリスクはあまり大きくない、との判断でしょう。入力バリデーションは「未知」の脆弱性への対策として、「侵入検知」の対策として非常に重要です。

参考: OWASP Secure Coding Practicesでは一番目です。

 

4: Implement Appropriate Access Controls

4番はアクセス制御です。アクセス制御は基本的にはホワイトリスト方式で行います。必要なアクセス制御が行われていないことはよくあります。フレームワークを利用すればロールベースのアクセス制御を簡単に行えます。

 

5: Establish Identity and Authentication Controls

5番は認証制御です。認証はセキュリティ対策の根幹であり、認証が危険である場合は致命的です。しかし、正しく実装できていないケースもあります。パスワード認証は不完全な認証方法ですが、まだまだ一般的に利用されています。安全にパスワードを保存することは勿論、せめてcrackなどのパスワード解析ツールを利用したり、過去に利用したパスワードの利用を制限する、などの対策が必要です。パスワードは理由なく利用可能な文字や長さを制限してはなりません。

 

6: Protect Data and Privacy

6番はデータとプライバシーの防御です。安全なデータの取り扱いはセキュリティ対策の基本です。適切な暗号化を行う。例えば、HTTPSとHSTSを利用する、CSPを採用してJavaScriptとHTMLを分離する、などがあります。

 

7: Implement Logging, Error Handling and Intrusion Detection

7番はログの取得、エラー処理、侵入検知です。システムを攻撃者から守る為には、攻撃を検知しなければなりません。その為に必要なエラー処理を行い、ログを記録しなければなりません。攻撃を的確に検知できれば、攻撃を防止することも可能です。今時のWebクライアントはクライアント側でも入力バリデーションしています。サーバー側での入力バリデーションエラーは100%攻撃です。

 

8: Leverage Security Features of Frameworks and Security Libraries

8番はフレームワークやセキュリティライブラリの活用です。これらを活用する時に重要な事は「制限」を知る事です。フレームワークやセキュリティライブラリを使っていれば「自動的に完璧なセキュリティ」を実現する物ではありません。例外や制限があります。これらをよく理解した上で活用しなければなりません。

 

9: Include Security-Specific Requirements

9番はセキュリティ要件です。アプリケーションを作る場合、アプリケーションの機能的なセキュリティ要件は勿論、アプリケーション機能以外のセキュリティ要件も決めておくべきです。アプリケーション機能以外のセキュリティ要件とはSQLクエリの実行の仕方、JavaScriptの利用方法などです。

 

10: Design and Architect Security In

10番はセキュリティを考えたデザインとアーキテクチャです。アプリケーション機能的/非機能的なセキュリティ要件をデフォルトでセキュアな状態で取り扱う、クライアントからの入力は全て信用できないデータとして取り扱うなどがあります。

 

まとめ

プロアクティブセキュリティ対策の要は「入力バリデーション」です。私がプロアクティブセキュリティ対策のリストを作るなら一番には入力バリデーションを持って来ると思います。2番は7番目のエラー処理と侵入検知でしょう。

穴が空いているので塞ぐ、というパッチワーク的なセキュリティ対策では攻撃を効果的に防止できません。攻撃者の先回りをして、攻撃者が困る対策を採用しプロアクティブなセキュリティ対策を心がける、これだけでもアプリケーションが堅牢になります。

参考:

投稿者: yohgaki