2007年10月16日 04時45分 UPDATE
特集/連載

スーパーテスターの3つのスキルセキュリティテストには攻撃者の視点が肝心

攻撃者はバグを1つ見つければ済むが、セキュリティテスターは、リリース期限までに多くの重大なセキュリティバグをつぶさなければならない。

[Joe Basirico,TechTarget]

 ソフトウェアセキュリティエンジニアとトレーナー、両方の経験から言うと、物事を理解する早さは人によって大きく違うものだ。だが、本来優秀な人がなかなか実力を発揮しないことも多い。どんなバグでも突き止められるベテランのテスターが、セキュリティテストにはなかなか習熟できない、といったことがよくある。わたしはこの数年、世界最大級のソフトウェアベンダー数社で開発者チームのトレーニングに従事する中で、彼らの行動を調べ、優れたセキュリティテスターに必要なものを明らかにしようとしてきた。その結果分かったことを紹介しよう。

セキュリティテスターに必要な3つのスキル

 わたしは、セキュリティテスターは皆、以下の3つの専門スキルをベースとして持たなければならないという結論に達した。

優れた想像力

 多くの場合、セキュリティテスターとして欲しい情報は、すべて手に入るわけではない。例えば、SQLインジェクションの脆弱性をチェックする場合、セキュリティテスターが効果的なテストを作成するには、対象システムについて一定の仮定を置き、手持ちの知識に基づいて内部動作を推測しなければならない。

包括的なシステム知識

 優れたセキュリティテスターは、テストするシステムの各コンポーネントについて知っていなければならない。テスト対象がWebアプリケーションの場合、JavaScript、XML、サーバ側コード(ASP、JSP、Ruby、PHPなど)、データベース、Webサービスなどに関する深い知識が必要だ。また、テスターは、システムの作りに問題がある場合やコンポーネントの使い方が誤っている可能性がある場合、それを認識できなければならない。こうした包括的な知識は、時間をかけて専門的な経験を積むことで得られるが、セキュリティの観点からそれぞれのテーマについて集中的に調べることで、習得を促進することもできる。

攻撃者の視点に立つ能力

 理想的なセキュリティテストの実施を目指すためには、上の2つの専門スキルを駆使するだけではまだ足りない。決定的に重要なスキルは、攻撃者のように考える力だ。攻撃者がシステムをどのようにとらえるかを予測する能力は、システムのテストに不可欠な要素となっている。セキュリティテストでは、泥棒があなたの家に侵入するために使いそうな方法を洗い出すのと同じような思考プロセスにより、攻撃者があなたのアプリケーションに不正アクセスするために使いそうな巧妙な方法を、すべてカバーする必要がある。

 これらの専門スキルについてそれぞれ詳しく説明し、各スキルを実践するための幾つかのポイントを紹介する。

優れた想像力

 優れた想像力とは、システムの実態を想像する力だけを指すわけではない。その中には、システムの重大なバグや脆弱性を推測する力も含まれる。ほとんどのセキュリティ評価は、ソースやドキュメントがなく、内部システムにアクセスできない状態で手探りで行われる。わずかな情報を基にセキュリティ評価に当たる場合、セキュリティテスターはテストするシステムについて、何らかの仮定と推測を行わなければならない。後で集中的なテストによってそれらを検証できる場合もあるが、大抵は検証できない。

 Ajaxを利用したWebアプリケーションの例を見てみよう。まず明らかなのは、JavaScript、サーバ言語、あるいはSSLが使われていることだろう。さらにテスターは、サーバトポロジがどのようなものか想像し、幾つかの点について自問しなければならない。

    ・Microsoft SQL ServerかMySQLが使われているか、あるいは、すべてがXMLデータストアに保存されているか
    ・SQLが使われている場合、ストアドプロシージャかパラメータ化クエリが使われているか
    ・どこで/どのような入力チェックが行われているか
    ・クライアントのJavaScriptで行われているか
    ・サーバで行われているか
    ・独自に作成された入力検証ルーチンが使われているか、あるいは、言語で提供されるコントロールが使われているか

 ベテランのセキュリティテスターであれば、このソフトウェアシステムの舞台裏で何が起こっているかをより良く理解するために、もっと多くのことを自問するだろう。こうしてアーキテクチャとトポロジが分かったら、システムがどの程度安全かを調べ始めることになる。

 SQLインジェクションは、発見するのに創造的な想像力が必要となる脆弱性の特別な例だ。この脆弱性の場合、テスターは、Webアプリケーションの特定の機能がデータベースでどのように実行されるかを推測できなければならない。

 ユーザーにユーザー名とパスワードを要求し、その情報を使ってデータベースクエリを実行し、ユーザーを特定してログインを許可するログイン管理を例に取ろう。この機能を実行するSQLはどのようなものか。セキュリティテスターはそのクエリを想定した後、ユーザー名およびパスワードフィールドに特定の入力を試行し、本番システムで想定を検証できる。テストが成功し、脆弱性が見つかったら、テスターはその脆弱性を利用してさらにテストを行い、システムにほかの脆弱性が潜んでいないか調査することもできる。

 この場合、セキュリティテスターには、データベースに問い合わせて情報を返すSQL文が分かっている。これはエキサイティングな状況だ。SQLインジェクションに使う文字列をうまく作成すれば、テスターはデータベースから自由に読み取りができる可能性があるからだ。適切なセキュリティ対策が施されていないデータベースは、SELECT、JOIN、INSERT、DROP、EXECといった複数のSQL文の連続実行を許してしまうことにより、ユーザーに完全に乗っ取られる恐れがある。

 SQL文やシステムのバックエンドアーキテクチャを想像できなければ、こうした攻撃は不可能だろう。想像力の乏しいテスターは、この脆弱性を偶然見つけられたとしても、さらに危険なほかの脆弱性を見逃してしまうかもしれない。

包括的なシステム知識

 Webアプリケーションの脆弱性の中で圧倒的に多く見られるのは、クロスサイトスクリプティング(XSS)だ。わたしが勤務するSecurity Innovationのエンジニアは、われわれが長年行ってきたセキュリティテストで発見した、すべてのセキュリティ脆弱性のナレッジベースを維持管理している。それによると、Webアプリケーションで見つかった脆弱性は、85%以上がXSSによるものだ。これらの脆弱性は非常にありふれているため、われわれは顧客のシステムでそれらが何十件か見つかると、その段階で検出をやめてしまうことが多い。そして顧客の開発者チームを指導して、それらの脆弱性を修正できるようにするとともに、よりミッションクリティカルな問題を重点的にテストするようにしている。

 このように、XSSはごく一般的な脆弱性であるため、この節で取り上げるテーマの格好の例になる。システムは、徹底的なセキュリティ対策で保護されていることが理想だ。ユーザー入力はすべて、まずWebブラウザでチェックし、次にサーバでホワイトリストと正規表現を使って検証する必要がある。さらに、返されたデータがユーザーに表示されるときには、不正な文字列が紛れ込んでクライアントのブラウザで実行されないように、ホワイトリストに基づいてエンコードされていなければならない。

 こうした徹底的なセキュリティ対策の各段階で、何を行うべきかを詳しく見てみよう。

 最初のステップは、ユーザー入力についてユーザーにすぐにフィードバックすることだ。これは、ブラウザのJavaScriptによる入力チェックで行われる。優れたセキュリティテスターは、エラーメッセージが何に起因するものか、どのような場合に簡単に回避されるかを認識できなければならない。JavaScriptは、セキュリティメカニズムは提供しない。ブラウザで動作し、簡単に無効にされてしまうからだ。しかし、JavaScriptは特定のフォームでどのような入力が求められているかについて、ユーザーに具体的なフィードバックを返すための優れたメカニズムを提供する。このメカニズムはユーザーの操作を手助けするとともに、サーバとのやりとりを不要にしてフォーム完了までのプロセスをスピードアップし、データをサーバに渡す前にこのプロセスでチェックして、サーバの作業負荷を軽減する。

 今述べたように、クライアント側の入力チェックは簡単に回避されてしまうため、セキュリティ対策メカニズムとして利用することはできない。JavaScriptにはセキュリティ上のメリットはないのだ。こうしたことから、すべての入力をサーバ側で、クライアント側と同様またはそれ以上に徹底的にチェックしなければならない。

 このためセキュリティテスターは、クライアント側の入力チェックメカニズムを回避して個々の入力をサーバ側でチェックさせ、その処理が適切かどうか確認する方法を知らなければならない。また、エラーメッセージがどのレイヤから生成されているかも認識できなければならない。入力検証ルーチンによってエラーが返されているのか、あるいは、システムの内部コンポーネントで何らかの処理の実行が停止されているということなのか。セキュリティテスターは、入力検証ルーチンを回避できたら、次にXSSの脆弱性にはどのような攻撃が有効なのかを理解しなければならない。

 多くの場合、XSSの脆弱性は、タグや属性が不適切にエンコードされていることに起因している。このため、この脆弱性を悪用するJavaScriptを開始するには、あらかじめ文字列やタグを閉じておく必要があるだろう。また、この入力文字列は、JavaScriptブロックに直接ロードされると考えられるため、ほかのJavaScriptタグを開くと、システムに障害が発生するだろう。

攻撃者の視点に立つ能力

 優れたセキュリティテスターに必要なもう1つの、そしてわたしの意見では最も重要な専門スキルは、どのような原因でシステムが異常を来すかを理解でき、システムをチェックする際は悪意ある攻撃者の視点に立てることだ。まず、潜在的な脆弱性が見つかったら、そのリスク評価を行わなければならない。リスク評価システムとして最も一般的なのは、DREADだ。DREADは、Discoverability(検出可能性)、Reproducibility(再現性)、Exploitability(悪用性)、Affected users(影響を受けるユーザー)、Damage potential(潜在的損害の大きさ)を略したものだ。最新の攻撃コードを的確に把握し、攻撃者の視点で考えられるテスターは、重大な脆弱性について開発者とマネジャーを説得し、リスクが高いという評価をつけて迅速な修正を促進することができるだろう。

 攻撃者の視点で考えることは、あなたの担当するソフトウェアシステムに影響する可能性がある最新のセキュリティ問題を、常にフォローしていくことにもつながる。これらのセキュリティ問題に関しては、有益な情報源として役立つメーリングリスト、Webサイト、カンファレンスがたくさんある。セキュリティテスターは、最新のセキュリティ脆弱性とそれらの悪用コードについて学び、議論できるコミュニティーを見つけるとよいだろう。こうしたコミュニティーはテスターに、担当システムと似たアプリケーションに広く発生している脆弱性に関して、先進的な知識をもたらす。また、担当システムがほかのシステムに依存している場合は、それらのシステムのメーリングリストを検索し、安全性が低いコンポーネントのせいで影響を受ける可能性がある脆弱性を調べるのが賢明だ。

 カンファレンスも現場で役立つ専門知識を仕入れ、セキュリティテストの最新技術を学べる格好の場だ。セキュリティテストに関する充実したカンファレンスとして、RSA、Blackhat、Software Security Summitなどがある。いずれも毎年開催される。

まとめ

 セキュリティテスターの仕事は、業界で最もエキサイティングで創造的なものの1つだ。複雑なソフトウェアシステムの難解なセキュリティバグを発見し、チームにその危険性を周知する任務を担っている。時間と労力に優先順位を付けて、深刻なセキュリティ脆弱性を確実に発見、修正しなければならない。

 こうした仕事を行うために、セキュリティテスターは、外部の講習、カンファレンス、雑誌、書籍など、利用可能な最良の情報源を活用するべきだ。だがセキュリティテスターは、限られたリソースでリリース期限までに、多くの重大なセキュリティバグをつぶさなければならない。これに対し、攻撃者はバグを1つだけ見つければ済む。しかも、攻撃者にとってはソフトウェアがいったんリリースされてしまえば、そのための時間は幾らでもある。これは決して公平な戦いではない。テスターの仕事がエキサイティングで、重要で、困難なのはそのためだ。

 優れたセキュリティテスターは皆、上で説明した3つの専門スキルを持っている。優れた想像力、テストするシステムに関する包括的な知識、そして攻撃者の視点で考え、彼らを出し抜く力だ。これらの専門スキルをマスターすることで、セキュリティテスターとして大きく飛躍することができる。

本稿筆者のジョー・バシリコ氏は、Security Innovationのシニアセキュリティトレーナー。

関連ホワイトペーパー

脆弱性 | スキル | 開発プロセス


この記事を読んだ人にお薦めのホワイトペーパー

この記事を読んだ人にお薦めの関連記事