なぜPHPアプリにセキュリティホールが多いのか?

第45回 入力バリデーションはセキュリティ対策

この記事を読むのに必要な時間:およそ 8 分

「入力バリデーションはセキュリティ対策である」は世界の常識です。少なくとも大多数の世界のセキュリティ専門家は「入力バリデーションはセキュリティ対策」は常識だと考えています。

もちろん入力バリデーション対策がすべてであるわけではなく,ほかのセキュリティ対策も重要ですが,入力バリデーションが最も重要な対策の1つである,と考えている人は沢山います。

入力のバリデーションはすべてのプログラムに必須の保護機能です。一部に「入力バリデーションはセキュリティ対策ではない」とする声もあるようですが,入力バリデーションは間違いなくセキュリティ対策です。入力バリデーションはセキュリティ対策ではない,とする考え方は,混乱を招くだけです。

入力バリデーションをセキュリティ対策としているのは筆者のみではありません。世界的に利用されているセキュリティ標準でも,入力バリデーションを非常に有効なセキュリティ対策としてとらえられています。

今回は入力のバリデーションが何故セキュリティ対策であるか考えてみます。

“バグ”“脆弱性”“セキュリティホール”

セキュリティ対策は,コードのみではなく施設のセキュリティ対策からバックアップ方法やその保管方法,要員のトレーニング,社員や関連業者との契約内容のセキュリティ対策など,多岐に渡ります。ここではコーディングにおけるバグと脆弱性とセキュリティホールの関係を解説します。

入力バリデーションが論理的にセキュリティ対策であることは,バグと脆弱性の関係から明らかです。

バグ:
意図しないプログラムの動作。コードの問題でなく設計の問題である場合もある。
脆弱性:
バグの中でセキュリティ維持に悪影響を与える可能性があるバグ※1)。
セキュリティホール:
脆弱性の中で実際にダメージを与えるバグ※2)。

図1 バグと脆弱性とセキュリティホールの関係

図1 バグと脆弱性とセキュリティホールの関係

入力のバリデーションは,バグも脆弱性もセキュリティホールも減らすための対策です。

入力バリデーションが脆弱性・セキュリティホールには効果がなく,バグを修正する効果しかないのであれば「セキュリティ対策ではない」と言うことも可能でしょう。実際バリデーションだけではそのような効果しか得られないケースもありますが,それ以上に入力バリデーションが脆弱性・セキュリティホールを防いだり緩和したりするケースは沢山あります。

「セキュリティ対策はバグ対策である」と言えますが,反対の「バグ対策はセキュリティ対策にならない」は成り立ちません。論理的にはすべてのバグをなくせば脆弱性もセキュリティホールも自動的になくなります。従ってバグを起こさないための対策だからセキュリティ対策ではないと定義することは間違いであると言えます。

セキュリティ対策標準であるPCI DSSとISOでは入力バリデーションがどのように定義されているか確認してみましょう。

※1
ISO13335-1では「脅威によって影響を受け得る資産又は資産グループの弱さ」と定義されています。
※2
標準規格などで「セキュリティホール」は用語として明確に定義されていませんが,一般に実際に攻撃可能な脆弱性がセキュリティホールと呼ばれることが多いです。

PCI DSS(OWASP/SANS)

PCI DSS(Payment Company Industry Data Security Standard)とは,カード会社がカード決済をコンピュータ上で行っている企業に求めているセキュリティ標準です。大手ではこの標準に従わないとカード決済ができなくなるため,導入が進んでいます。PCI DSSの目標は明確で「カードデータを守る」ことです。目標が絞られているため比較的分かりやすく簡潔な標準になっています。このため,カード決済を行うシステム以外への適用を検討している企業も多いようです。

PCI DSSでは「必要ないデータは保存しない」「セキュリティパッチは1ヶ月以内に適用する」など,様々なセキュリティ対策を要求しています。それらの対策の1つにコードレビュー(ソースコードのセキュリティ検査)があります。PCI DSSの6.5には以下のような記述があります。

6.5 Develop applications based on secure coding guidelines. Prevent common coding vulnerabilities in software development processes, to include the following:

Note: The vulnerabilities listed at 6.5.1 through 6.5.9 were current with industry best practices when this version of PCI DSS was published. However, as industry best practices for vulnerability management are updated (for example, the OWASP Guide, SANS CWE Top 25, CERT Secure Coding, etc.), the current best practices must be used for these requirements.

筆者による訳(※現在,日本語版を選択しても英語版となるため)

6.5 セキュアガイドラインに従ったアプリケーション開発を行わなければならない。以下のソフトウェア開発における一般的なコーディングにおける脆弱性を防ぐできである。

備考:6.5.1から6.5.9に記載された脆弱性対策はPCI DSSが公開された時点でのベストプラクティスである。しかし,ベストプラクティスは脆弱性対策とともに更新される(例:OWASPガイド,SANS CWE Top 25,CERTセキュアコーディング,など)。これらの要求事項に適合させるためには現在のベストプラクティスを利用しなければならない。

※強調は筆者による

PCI DSSでは,OWASPガイド,SANS CWE Top 25(正式名称:CWE/SANS TOP 25 Most Dangerous Software Errors,以下SANS Top 25),CERTセキュアコーディングなどに従ったコードのセキュリティ検査を求めています。

OWASPガイド

OWASP(Open Web Application Security Project)はPCI DSS策定に深く関わっていることでよく知られています。OWASPのコードレビューガイド Ver 1.1の入力バリデーションの部分には,このように記載されています。

Input validation is one of the most effective application security technical controls. It can mitigate numerous vulnerabilities (but not all). Input validation is more than checking form field values.

訳:入力バリデーションは最も効果的なアプリケーションセキュリティ制御技術の1つです。入力バリデーションは(すべてではないが)おびただしい数の脆弱性の影響を緩和することができます。入力バリデーションはフィールド値をチェックするだけではありません。

入力バリデーションは最も効果的なアプリケーションセキュリティ制御技術の1つと,OWASPガイドでも入力バリデーションをセキュリティ対策の重要な機能だと位置づけていることが分かります。

SANS Top 25

SANSはセキュリティのトレーニング,セキュリティ専門家の認証やセキュリティ研究を行っている機関です。ITセキュリティの教育と研究を共同で行う機関として1989年に設立されました。CWE IDを管理しているMITRE社と協力関係にあることでも知られており、MITRE社のサイトでもSANS Top 25は公開されています

PCI DSSで参照されているSANS Top 25の中で「Monster Mitigations」(適切な翻訳を思いつきませんが,翻訳するなら「恐ろしく効果的な対策」くらいでしょうか)として挙げられている効果的な対策の第一番目が入力バリデーションです。

IDDescription
M1Establish and maintain control over all of your inputs.
M2Establish and maintain control over all of your outputs.
M3Lock down your environment.
M4Assume that external components can be subverted, and your code can be read by anyone.
M5Use industry-accepted security features instead of inventing your own.
GP1 (general)Use libraries and frameworks that make it easier to avoid introducing weaknesses.
GP2 (general)Integrate security into the entire software development lifecycle.
GP3 (general)Use a broad mix of methods to comprehensively find and prevent weaknesses.
GP4 (general)Allow locked-down clients to interact with your software.

ここでも入力バリデーションは非常に重要なセキュリティ対策の第一番目として取り上げられています。

2009年のSANS Top 25CWE/SANS最も危険なプログラミングエラーTOP 25:日本語版)では,第一位として不適切な入力バリデーションのCWE-20が上げられていました。

CWE-20: 不適切な入力の妥当性チェック

これは,健全なソフトウェアが犠牲となる原因の第一位であるため,所定の基準に従った入力を条件付けておかないと,自ら災難を招くことになる。

詳細: http://cwe.mitre.org/top25/#CWE-20

※強調は筆者による

SANSでも入力バリデーションを非常に重要なセキュリティ対策であるとしていることがわかります。

CERTセキュアコーディング

CERTセキュアコーディングはC/C++/Javaのコーディング指針として非常に参考になる文書です。しかし,項目ごとのコーディング指針であるため順位などはないので,どのように記載されているかは省略します。

著者プロフィール

大垣靖男(おおがきやすお)

University of Denver卒。同校にてコンピュータサイエンスとビジネスを学ぶ。株式会社シーエーシーを経て,エレクトロニック・サービス・イニシアチブ有限会社を設立。
オープンソース製品は比較的古くから利用し,Linuxは0.9xのころから利用している。オープンソースシステム開発への参加はエレクトロニック・サービス・イニシアチブ設立後から。PHPプロジェクトでは,PostgreSQLモジュールのメンテナンスを担当している。

URLhttp://blog.ohgaki.net/

著書

コメント

  • 追加です

    見落としていましたが、以下の修正も提案いたします。


    入力バリデーションは間違いなくセキュリティ対策**に重要**です


    言うまでもありませんが、提案した「に重要」の部分は、「に必須」や「に有効」など、他の文言にも置換可能です。

    そもそもこの記事は、『一部に「入力バリデーションはセキュリティ対策ではない」とする声もあるようですが』の声に反論するために、「入力バリデーションはセキュリティ対策である」という筆者の誤った主張をごり押しするためにだけに書かれたように見受けられますが、多くの人の目に止まるこのような場で、そのような主張をすることを少々不快に感じます。
    仮にそのような声があったとしても、それは「セキュリティ対策**のためだけにあるの**ではない」といった意味合いであろうことは容易に推測できるのではないでしょうか?
    筆者におかれましては、このような稚拙な反論のための記事ではなく、もっと gihyo.jp に相応しい有用な記事を書かれることを(勝手ながら)期待しております。

    Commented : #2  moonlight (2011/12/24, 23:51)

  • 文章力の問題?それとも?

    序論で、「入力バリデーションはセキュリティ対策である」や「入力バリデーションは間違いなくセキュリティ対策です」と、まるでバリデーションがセキュリティ対策のためだけに必要であるかのように強調して書かれています。しかし、バリデーションはそれだけのために行うものではないので、このような書き方は読者に誤解を与える可能性がある、筆者によるセキュリティ偏重の誤った主張のように感じます。
    著者自身、「入力バリデーションが最も重要な対策の1つである」や「入力バリデーションを非常に有効なセキュリティ対策としてとらえらている」ということを書いているにも関わらず、なぜ「入力バリデーション === セキュリティ対策」であるかのように強調して主張するのか理解に苦しみます。
    筆者自身が「入力バリデーションはセキュリティ対策ではない,とする考え方は,混乱を招くだけです」と述べてるように、「入力バリデーションはセキュリティ対策である」とする考え方もまた混乱を招きますので、最初の文を以下のように修正することを提案いたします。


    「入力バリデーションはセキュリティ対策**に重要**である」は世界の常識です。少なくとも大多数の世界のセキュリティ専門家は「入力バリデーションはセキュリティ対策**に重要**」は常識だと考えています。

    Commented : #1  moonlight (2011/12/24, 18:46)

コメントの記入