ジョブセキュリティ:セキュリティ業界の為のセキュリティ対策ではありませんか?

(Last Updated On: )

追記:このエントリの背景となる根拠の一部となる開発者は必修、SANS TOP 25の怪物的なセキュリティ対策に書きました。こちらも合わせてご覧ください。

今日のエントリは「セキュリティ業界ジョブセキュリの為のセキュリティー対策になっていないか?」という話です。

ジョブセキュリティ

知らないと仕事にならないような、雇用を守る作用を持つ手法や知識のこと。

セキュリティ対策は様々な対象を守る為に行いますが、このエントリではアプリケーションセキュリティを維持することだけを考えます。


セキュリティで飯を食べるには脆弱性が量産されればされるほど困る事はありません。脆弱性を量産するには基本的なセキュリティ対策を教えないことが最も効果的です。

SANS/CWE TOP 25では、ソフトウェアの脆弱性を無くす為に最も効果的なセキュリティ対策は「確実な入力の制御」次に「確実な出力の制御」だとしています。この2つのセキュリティ対策を「Effective(効果的)」でもなく「Mandatory(必須)」でもなく、「Monster(怪物的)」なセキュリティ対策だとしています。 それくらい強調すべき対策であると考えているのでしょう。私も全く同じ考えです。この2つを守っているだけでCVEに登録されるセキュリティ脆弱性の多くが発生しません。怪物的なセキュリティ対策となるのが確実な入力チェックと出力制御です。

なぜ「確実な入力の制御」と「確実な出力の制御」が必要なのでしょうか?

Cプログラムのバッファーオーバーフローも、WebアプリのJavaScript/SQL/XPath/LDAP/XML/etcインジェクションも全て「攻撃用のデータを送りつけて不正な処理を行わせる」攻撃手法です。攻撃用のデータを受け入れない(入力の制御)、出力しない・出力しても安全な形で出力する(出力の制御)ようにすれば良いからです。

コードを書く上で「確実な入力の制御」と「確実な出力の制御」を行うには何が必要でしょうか?

確実な入力の制御に必要となるのは、確実な入力バリデーションです。想定される入力のみ受け入れるようにします。”確実”な出力の制御に必要なことは、出力先の入力仕様に則った出力を”確実”に行うことです。

アプリケーションセキュリティの場合、アプリケーションからの入力と出力を確実に制御することが最も重要なセキュリティ対策になります。入力・出力、つまりデータを確実に制御する責任はプラットフォームやフレームワーク、ライブラリではなくアプリケーションプログラマにあります。

教育を行う上で「確実な入力の制御」と「確実な出力の制御」を教えるには何が必要でしょうか?

どのような出力を入力先が送ってくるのか考え厳格に入力バリデーションを行うこと、出力先の入力仕様を正しく理解し誤作動させない出力を行うことを教えなければなりません。

何の為に確実な入出力制御を行うのか?C/++なら確実なメモリ管理を行いメモリへの不正コードインジェクションを防ぐ為、Webアプリケーションなら確実なテキスト管理を行い出力先へ不正テキストインジェクションを防ぐ為、に確実に入出力を制御すると教えるなければなりません。

ディフェンスインデプス(多層防御・深層防御)を誤解してアプリ内部で対策を行えば良い、という意見を散見しますが入出力のセキュリティ対策はトラストバウンダリ(信頼境界線)で行うのがベストプラクティスです。アプリならアプリの入力・出力処理時に行います。

 

セキュリティ業界にとって有難い現在のセキュリティ対策

アプリケーションセキュリティにとって根本的な対策は教育です。プログラマが脆弱なコードを書いたり、利用しなければアプリケーションセキュリティは維持できます。SANS/CWE TOP 25の「Monster Mitigation(怪物的なセキュリティ対策)」に挙げられている項目は必須事項として教えるべきです。

しかし、セキュリティ専門家の中にも確実な入力制御を実現する入力バリデーションを「セキュリティ対策ではない」などと主張する人も居ます。

確実な入出力制御にはホワイトリスト型のチェックが有用ですが、ブラックリスト型でも構わないと言う方も居ます。

確実に出力先の入力仕様に合った出力を行うには、出力先が正しく処理する出力を知る必要がありますが、完全な対策でないにも関わらずAPIを使えばOK、テキストインターフェースを持つシステムでもエスケープ処理は知らなくて良いと言う方もいます。

文字エンコーディングのバリデーションはアプリケーションが入力処理時にバリデーションすることが最も効率的かつ効果的ですが、文字エンコーディングのバリデーションはアプリケーションプログラマは考えなくても良いと言う方もいます。

意図はどうあれ、上記の「アドバイス」は全てセキュリティ業界の仕事を守る「ジョブセキュリティの為のアドバイス(セキュリティ対策)」ではないでしょうか?

プログラマに、最も効果的なセキュリティ対策(入力バリデーション)や安全な思考方法(ホワイトリスト)、最も基本的なセキュリティ知識(出力先の基本仕様)を教えなければ、アプリケーションには脆弱性が量産されます。経験を積んでいけば脆弱なコードを書かなくなりますが、新人プログラマに教えなければ脆弱なコードが無くなることはありません。

意図はどうあれ、結果として

  1. 開発者が脆弱性検査ツール・サービスで簡単に見つかる脆弱性を量産し、実際に見つかるのでツール・サービスが売れる
  2. ツールで簡単に見つかるような問題があると怖いのでコストが高いWAF(Web Application Firewall)やコンサルティングサービスも売れる
  3. 根本的なセキュリティ対策を教えないので、対処策の教育・トレーニングサービスが売れる
  4. 根本的なセキュリティ対策を教えないので、脆弱なコードを書く開発者が育てられる(1へ戻る)

というセキュリティ業界にとっては有難い「ジョブセキュリティ」のサイクルが出来上がっていないでしょうか?

セキュリティ専門家や専門会社の殆どは自分たちの「ジョブセキュリティ」の為、悪意をもってこのようなサイクルを作っているとは思いませんが、「結果として自分たちのジョブセキュリティ」を守る為のセキュリティ教育・対策を行っているのでは?と言わざるを得ません。

まとめ

教育は最も根本的なセキュリティ対策です。開発者が以下の3つを学んで意識するだけでも、単純な脆弱性検査ツールで発見されるような脆弱なアプリケーションを作る可能性は随分低くなります。

セキュリティ業界の為のセキュリティ対策・教育はもう止めにしませんか?

 

最近はエスケープ処理について多く書いているので1つ付け足します。

基本中の基本は普段使わなくても知っておく、教えておくべきだと思います。 今の大工は昔ながらのノコギリを使って仕事をする事はあまり無いでしょう。しかし、だからといって電動ノコギリだけ使えれば良いのか?というと、そうではないですよね?プロであるなら尚更では?

テキスト型インターフェースを持つシステムではエスケープ処理は基本中の基本です。安全な出力を知るためには、先ずエスケープ方法は何?と調べると一番速く、ほぼ確実に安全な出力方法が分かります。正しいエスケープ処理は使わなくても知っていて当たり前。プロなら尚更です。

 

参考

 

投稿者: yohgaki