全体的なセキュリティ対策やセキュリティ対策の基本的概念の話が続いたので、個々の脆弱性に対応するための効果的な方法を紹介します。前提知識なく、個々の脆弱性に対応するには、個々の脆弱性全て知る必要があります。
リスクの識別
脆弱性対策を行う場合、まずリスクを識別する必要があります。今回は前提知識無しとして個別の脆弱性に対応するので、一つ一つのリスクを知る必要があります。
リスクの知り方
リスクを自分で見つけ出すのはとても大変です。脆弱性発生の原理から攻撃方法と対策を考える必要があります。既存のカタログやデータベースを使用すると効率的です。これから紹介するCWE、CAPECは米政府の関連団体であるMITRE社によって管理されています。
CVE
CWE、CAPECの前にCVEを紹介しておきます。CVEは聞いた事があることが多いと思います。CVEとはCommon Vulnerability and Exposureの頭文字で”共通脆弱性識別子”などと訳されています。個別のソフトウェアの脆弱性がデータベース化されています。これもMITRE社が管理しています。
CVEの登録には具体的な脆弱性の説明とそれに対する対応を記述して登録を行います。しかし、残念ながらその具体的内容は一般に公開されていません。公開されている情報はほんの一部です。一部ですが利用してるソフトウェアに既知の脆弱性が含まれているか確認するには便利です。
CVEデータベースを直接検索するのは大変です。Secuniaなどのサイトを利用すると良いでしょう。プロダクト/バージョン別のCVE脆弱性を検索できます。
CVEは運用管理にだけ役立つ物だつだけではありません。開発者が利用している言語/フレームワーク/ライブラリの脆弱性を知る(これも必須条件!)には役立ちます。しかし、自分でセキュアなコードを書くことにはあまり役立ちません。この為にはCWEとCAPECが役立ちます。
CWE
CWEというセキュリティ用語を聞いた事がある方は多いと思います。CWEとはCommon Weakness Enumerationの頭文字で日本語では”共通脆弱性タイプ”と訳されることが多いようです。CWEは共通の脆弱性がリストアップされていてカタログ化されています。
「CWEがあればOK!」と言いたいところですが、CWEには現時点で719の共通脆弱性が登録されています。自分が開発するシステムに関連する物だけを一通り理解するだけでも結構大変でしょう。サンプルコードなどもありますが、自分の言語や環境に適合しているとは限りません。無い物もあります。環境に合わせた解釈が必要です。”共通脆弱性タイプ”なのでこれは仕方ありません。脆弱性は1つでも攻撃できてはなりません。全て確実に理解する必要があります。※
※ 私はこれを回避したい、と考えているので基本的な考え方を先ず習得する方が良いと考えています。
とは言っても数が多すぎるのでCWE/SANS TOP 25も用意されています。700以上の脆弱性の中からのトップ25なのでこれだけで十分とは到底言えません。最低ラインとしてマスターしておくべきです。CWE/SANS TOP 25と類似したトップ脆弱性のリストにOWASP TOP 10があります。こちらも合わせてマスターしておきましょう。
個別具体的な対策を一つ一つ知りセキュアなコードを書くためには、少なくとも自分の環境に合わせ、CWEを一通り理解する必要があります。個別に対応するなら仕方ありません。一つ一つマスターしましょう。
CAPEC
CWEは個々の脆弱性が発生する原因部分に焦点を当てています。このため、どのような攻撃が行われるのか解りずらい構成になっています。MITRE社の方も解りやすい攻撃パターンのカタログが必要と考えたようです。CAPEC(Common Attack Pattern Enumeration and Classification – 共通攻撃パターンタイプと分類)が用意されています。
CAPECは開発者が個別の攻撃パターンと対策の概要を知るにはとても良い資料です。しかし、あまり広く認知されているとは思えないことが残念です。しかし、これもCWE程ではないですが数が多いです。CAPECには今現在で463※の攻撃パターンが登録されています。
※ オブソリートの9つを除くと454です。
CAPECは脆弱性の全体像を知るためにはCWEより解りやすいことは、Webサイトを見れば一目瞭然です。CAPEC VIEW: Mechanisms of Attackでは”攻撃の仕組み”で攻撃パターンを分類して見れます。
脅威別のCAPEC VIEW: WASC Threat Classification 2.0ではより開発者に身近なビューだと思います。
しかし、残念ながら攻撃パターンは33しかカバーしていません。
リスクへの対応
リスクを識別できたら対応方法です。幸いなことにCWEにもCAPECにも対応方法は記載されています。CWEにはコード例なども載っています。しかし、自分が利用中の環境とは異る場合が多いでしょう。自分の環境用に”解釈”/”翻訳”して利用すればOKです。
個別対策で漏れ無く対応するのはかなり大変
コーディングを行う上で発生する個別の脆弱性に効率良く対応するにはCWEとCAPECが役立つことがわかると思います。CWEとCAPECは、CWEで700以上、CAPECで450以上と、かなり細かく脆弱性と攻撃パターンをカタログ化(マニュアル化)しています。しかし、マニュアル化した場合の問題として
- マニュアルに書いてあることだけする(応用しない)
- マニュアルの量が多いとそもそも読まれない(漏れ)
- マニュアルに記載されていない物もある(漏れ)
- マニュアルに記載されている環境と自分の環境が異る(応用力が必要)
などの問題が発生します。特定の言語用ではないのでC/C++などのメモリ管理をプログラマが行わなければならない言語用の物も含まれます。しっかり読んだとしても、マニュアルが前提としている基礎知識が無かった場合、誤って”関係ない項目”と認識してしまったり、正しく理解することは難しいでしょう。
マニュアルも必要ですが、もっと大きな基本方針を知る基礎知識が重要です。基礎知識があればマニュアルを隅々まで暗記していなくても、適切な対応がとれることは多くあります。マニュアルの背景にある考えも理解しやすくなり、応用もできます。
結局どうすべき? – 多層防御
◯◯脆弱性に対する個別対策”だけ”では、効率的に防御することは現実的に不可能です。
CWEやCAPECを全て読むと、個別対策”だけ”でなく全体的な対策をするように書かれていると分かります。ソフトウェアなら無数の脆弱性に対応/対策可能な入力データのバリデーションをできる限り上流の入力処理で行い、多層防御として下流の入力/ロジック/出力で対策すると良い、となります。
多層防御を効率的に行うには、セキュリティ対策の基本である”境界防御”の概念が必要になります。モグラ叩き的に手当たり次第に”脆弱性”とされるモノを潰すのではなく、”信頼境界”での”境界防御”が漏れ無く行われていることを保障することによって、個々の脆弱性に対しても網羅的に対応/対策できるようになります。
まとめ
一つ一つの脆弱性を知って対策するには網羅性が必要です。コーディング上の一つ一つの脆弱性対策を覚えて対策するにはCWEとCAPECは最適な資料の1つです。
一つ一つの脆弱性を全て理解し対策することは重要です。しかし、自分の環境に合わせた脆弱性対策集を作り終えた頃には一つ一つの対策を知るより、防御的/セキュアプログラミングの基礎知識を理解し、必要に応じて個別対策を探す方が楽であり漏れが少なくなる、と解ると思います。
とても便利なCWEとCAPECですが、使い方を間違えると「SQLインジェクション対策はプリペアードクエリ”だけ”を使えば良い」といった誤り※もしてしまいがちです。このようなケースも基礎知識を持っていれば防げます。
※ 一般論としてプリペアードクエリだけ使う、はセキュリティ対策として十分条件ではありません。
このブログでも結構いろいろなインジェクション対策や他のセキュリティ対策を書いてきましたが、とても全てを網羅しているとは言えません。基本的な知識※を習得しないと全体的な網羅性が必要なセキュリティ対策を、理想的な形で行うことは困難だと思います。
※ 例えばCERT TOP 10セキュアコーディングプラクティスや防御的プログラミング
参考: