
lcamtufがGoogle向けに作成したWebアプリケーションセキュリティスキャナー - 非公式ミラー
http://code.google.com/p/skipfish/
作成・メンテナンス:
Michal Zalewski [email protected] Niels Heinen [email protected] Sebastian Roschke [email protected]
Copyright 2009 - 2012 Google Inc, 無断複製禁止。
Apache License Version 2.0 の条件に基づいて公開されています。
Skipfishは、アクティブなWebアプリケーションセキュリティ偵察ツールです。再帰的なクロールと辞書ベースのプローブを実行することで、対象サイトのインタラクティブなサイトマップを作成します。得られたマップには、多数のアクティブ(ただし、非破壊的であることを期待する)なセキュリティチェックの出力が注釈として付けられます。このツールが生成する最終レポートは、プロフェッショナルなWebアプリケーションセキュリティ評価の基礎として利用されることを意図しています。
同様の機能を持つ商用およびオープンソースのツールは数多く存在します(例:Nikto、Nessus)。自分に最適なものを選んでください。とはいえ、skipfishはWebセキュリティスキャナによくある問題に対処しようとしています。具体的な利点は以下の通りです。
高性能:応答性の高いインターネットターゲットに対して毎秒500以上のリクエスト、LAN/MANネットワークでは毎秒2000以上のリクエスト、ローカルインスタンスでは毎秒7000以上のリクエストが観測されており、CPU、ネットワーク、メモリのフットプリントは非常に控えめです。これは以下によるものです。
マルチプレックス単一スレッド、完全非同期のネットワークI/Oおよびデータ処理モデルにより、一部のマルチスレッドクライアントに見られるメモリ管理、スケジューリング、IPCの非効率性を排除。
Rangeリクエスト、コンテンツ圧縮、Keep-Alive接続などの高度なHTTP/1.1機能、および強制的な応答サイズ制限により、ネットワークレベルのオーバーヘッドを抑制。
スマートな応答キャッシュと高度なサーバ動作ヒューリスティックを使用して、不要なトラフィックを最小化。
パフォーマンス重視の純粋なC実装(カスタムHTTPスタックを含む)。
使いやすさ:skipfishは高い適応性と信頼性を持っています。スキャナの特徴は以下の通りです。
あいまいなパスおよびクエリベースのパラメータ処理スキームのヒューリスティック認識。
特定のパスが完全に異なるセマンティクスに従う、または異なるフィルタリングルールの対象となる、マルチフレームワークサイトの優雅な処理。
サイトコンテンツ分析に基づく自動的なワードリスト構築。
任意に複雑なサイトの定期的かつ時間制限付き評価を可能にする確率的スキャン機能。
よく設計されたセキュリティチェック:このツールは正確で意味のある結果を提供することを意図しています。
手作りの辞書は優れたカバレッジを提供し、合理的な時間枠での徹底的な$keyword.$extensionテストを可能にします。
脆弱性検出には、シグネチャチェックよりも3段階の差分プローブが優先されます。
Ratproxyスタイルのロジックを使用して、微妙なセキュリティ問題(クロスサイトリクエストフォージェリ、クロスサイトスクリプトインクルージョン、混合コンテンツ、MIMEおよび文字セットの不一致、不適切なキャッシュディレクティブなど)を発見します。
バンドルされているセキュリティチェックは、厄介なシナリオ(保存型XSS(パス、パラメータ、ヘッダー)、ブラインドSQL/XMLインジェクション、ブラインドシェルインジェクション)を処理するように設計されています。
Snortスタイルのコンテンツシグネチャで、サーバエラー、情報漏洩、または危険なWebアプリケーションを強調表示します。
レポートの後処理により、繰り返しパターンを識別することで、残っている誤検出やサーバのギミックによるノイズを大幅に低減します。
とはいえ、skipfishは銀の弾丸ではなく、特定の目的には適さない場合があります。例えば、WASC Web Application Security Scanner Evaluation Criteriaで概説されている要件のほとんどを満たしていません(一部は意図的、一部は必要性から)。また、この種の他のほとんどのプロジェクトとは異なり、バナータイプのチェックのための既知の脆弱性の広範なデータベースは付属していません。
以下に、このツールが提供するセキュリティチェックの大まかなリストを示します。
高リスクの欠陥(システム侵害につながる可能性があるもの):
中リスクの欠陥(データ侵害につながる可能性があるもの):
低リスクの問題(限定的な影響または低い特異性):
内部警告:
非特異的な情報エントリ:
特定された問題のリストに加えて、skipfishは見つかったドキュメントタイプと問題タイプの概要も提供します。また、ブルートフォースで発見されたノードが区別可能な方法で示されたインタラクティブなサイトマップも提供します。
注意:設計上の決定として、skipfishは非常に非特異的な問題について冗長に警告することはありません。これには以下が含まれますが、これらに限定されません。
これらの側面のほとんどは、必要に応じてレポート内で簡単に検査できます。たとえば、すべてのHTMLフォームは個別にリストされ、新しいCookieや興味深いHTTPヘッダーも同様です。そして、監査担当者は適切な場合にこれらのデータに基づいて特定の設計上の推奨を行うことを選択できます。とはいえ、これらの出現は特定のセキュリティ上の欠陥として強調表示されるわけではありません。
まず第一に、悪用しないでください。所有しているサービス、またはテストする許可があるサービスに対してのみskipfishを使用してください。
あらゆる種類のセキュリティテストは破壊的になる可能性があることを覚えておいてください。スキャナは悪意のある攻撃を実行しないように設計されていますが、誤ってサイトの運用を妨害する可能性があります。リスクを受け入れ、それに応じて計画を立てる必要があります。可能であればテストインスタンスに対してスキャナを実行し、問題が発生した場合の結果に対処する準備をしてください。
また、このツールはセキュリティ専門家が使用することを意図しており、実験的な性質を持っています。誤検出を返したり、明らかなセキュリティ問題を見逃したりする可能性があります。完全に動作している場合でも、ポイントアンドクリックのアプリケーションとして設計されているわけではありません。その出力を額面通りに受け取らないでください。
ベンダー提供のデモサイトに対してツールを実行することは、それを評価する良い方法ではありません。これらのサイトは通常、脆弱性を非常に不完全に近似しているためです。私たちはこれらのケースに対応するための努力はしていません。
最後に、スキャナは単に不正な動作をするHTTPサーバを扱うようには設計されていません。また、そこでの安全な(またはまともな)動作を保証するものではありません。
コンパイルするには、アーカイブを解凍してmakeを試してください。おそらく、最初にlibidnをインストールする必要があります。
次に、doc/dictionaries.txtの説明を読み、適切な辞書ファイルを選択し、正しく設定する必要があります。このステップは、後でスキャン結果の品質に大きな影響を与えるため、省略しないでください。
辞書を選択したら、-Sを使用してその辞書をロードし、-Wを使用して新しく学習したサイト固有のキーワード(将来の評価で役立ちます)のために最初は空のファイルを指定できます。
$ touch new_dict.wl
$ ./skipfish -o output_dir -S existing_dictionary.wl -W new_dict.wl
http://www.example.com/some/starting/path.txt
自動学習されたキーワードをどこにも保存したくない場合は、-W-を使用できます。
必要に応じて複数の開始URLを指定できることに注意してください。それらすべてがクロールされます。また、以下の構文を使用してファイルからURLを読み取ることも可能です。
$ ./skipfish [...その他のオプション...] @../path/to/url_list.txt
ツールはスキャンの進行中にいくつかの役立つ統計情報を表示します。また、リターンを押すことで進行中のHTTPリクエストのリストに切り替えることもできます。
上記の例では、skipfishはwww.example.com全体(メインページからリンクされている場合、他のポートのサービスも含む)をスキャンし、output_dir/index.htmlにレポートを書き込みます。その後、お好みのブラウザでこのレポートを表示できます(JavaScriptが有効である必要があります。また、最近の一部のブラウザでのfile:///のセキュリティ強化のため、結果にはHTTP経由でアクセスする必要があるかもしれません)。index.htmlファイルは静的です。実際の結果はJSONファイルの階層として保存され、必要に応じて機械処理や異なるプレゼンテーションフロントエンドに適しています。さらに、発見されたすべてのURLのリストが単一のファイルpivots.txtに保存され、後処理が容易になります。
シンプルな付属スクリプトsfscandiffを使用して、同じターゲットに対して同じフラグで実行された2つのスキャンの差分を計算できます。新しいレポートには、すべての新規または変更されたノードに赤い背景、すべての新規または変更された問題に青い背景が非破壊的に追加されます。
一部のサイトでは認証が必要であり、そのサポートについてはdoc/authentication.txtに記載されています。ほとんどの場合、フォーム認証方法を使用することになります。この方法は、再認証のために壊れたセッションを検出できます。
認証後、サイト上の特定のURLがセッションをログアウトさせる可能性があります。これに対抗するには、2つの方法があります:-Nオプションを使用すると、スキャナがCookieの設定または削除の試みを拒否するようになります。または、-Xパラメータを使用して、一致するURLのフェッチを防ぎます。
$ ./skipfish -X /logout/logout.aspx ...その他のパラメータ...
-Xオプションは、/icons/、/doc/、/manuals/などの標準的なありふれた場所を除外することでスキャンを高速化するのにも役立ちます。一般的に、-Xと-I(サブ文字列に一致するURLのみをスパイダーする)を使用して、スキャンのスコープを好きなように制限できます。特定のプロトコルとポートに制限することも含みます。
$ ./skipfish -I http://example.com:1234/ ...その他のパラメータ...
関連する機能として、-Kを使用すると、ファジングしないパラメータ名を指定できます(アプリケーションがURLにセッションIDを配置する場合にノイズを最小化するのに役立ちます)。
もう1つの便利なスコープオプションは-Dです。これにより、テストのスコープ内と見なす追加のホストまたはドメインを指定できます。デフォルトでは、コマンドラインURLに現れるすべてのホストがリストに追加されますが、-Dを使用してこれらのルールを拡張できます。例:
$ ./skipfish -D test2.example.com -o output-dir http://test1.example.com/
...または、ドメインワイルドカードマッチの場合は、次を使用します。
$ ./skipfish -D .example.com -o output-dir http://test1.example.com/
場合によっては、サードパーティのドメインを実際にクロールしたくないが、そのドメインの所有者を信頼しているため、その場所からのクロスドメインコンテンツインクルージョンを心配しないこともあります。警告を抑制するには、-Bオプションを使用できます。例:
$ ./skipfish -B .google-analytics.com -B .googleapis.com ...その他のパラメータ...
デフォルトでは、skipfishは最小限のHTTPヘッダーを送信してワイヤ上で交換されるデータ量を削減します。ただし、一部のサイトはUser-Agent文字列やヘッダーの順序を調べてサポートされていないクライアントを拒否します。そのような場合、-b ie、-b ffox、または-b phoneを使用して、一般的な2つのブラウザ(またはiPhone)のいずれかを模倣できます。
HTTPリクエストをカスタマイズする場合、-Hオプションを使用して追加の非標準ヘッダーを挿入したり、-Fを使用してホストとIPの間のカスタムマッピングを定義(リゾルバをバイパス)したりすることもできます。後者の機能は、まだ起動していないサービスやレガシーサービスに特に便利です。
一部のサイトは、妥当な時間枠でスキャンするには大きすぎる場合があります。サイトに明確に定義されたターピットがある場合(たとえば、ソーシャルネットワークの一部として10万のほぼ同一のユーザープロファイル)、これらの特定の場所は-Xまたは-Sで除外できます。それ以外の場合は、他の設定に頼る必要があるかもしれません。-dはクロールの深さを指定されたサブディレクトリ数に制限します。-cはディレクトリあたりの子の数を制限します。-xはクロールツリーのブランチあたりの子孫の総数を制限します。-rはスキャンで送信するリクエストの総数を制限します。
繰り返し評価に役立つオプションとして-pがあります。1〜100%のパーセンテージを指定することで、クローラーにすべてのリンクの100%未満をたどらせ、すべての辞書エントリの100%未満を試行させることができます。これにより、当然、スキャンの完全性は制限されますが、他のほとんどの設定とは異なり、バランスのとれた非決定的な方法で行われます。これは、インフラストラクチャの時間制限付きだが定期的な評価を設定する場合に非常に便利です。もう1つの関連オプションは-qで、クローラーの初期ランダムシードを指定された値に設定します。これを使用して、結果を比較するために以前のスキャンを正確に再現できます。ランダム性は-pモードで最も頻繁に使用されますが、他の場所でのスキャン管理の決定にもいくつか使用されます。
特に複雑な(または壊れた)サービスには、同一またはほぼ同一のページが非常に多く含まれる場合があります。これらの発生はデフォルトでレポート内でグレーアウトされますが、それでも画面スペースを消費し、JavaScriptレベルで処理するのに時間がかかります。このような極端な場合、-Qオプションを使用して、レポートが書き込まれる前に重複ノードの報告を完全に抑制できます。これにより、サイトの構成に関する理解が低下する可能性がありますが、テストカバレッジには影響しません。
特定の迅速な評価では、サイトの意図された機能に特に注意を払うことなく、リンクされていない秘密のみを探索したい場合があります。そのような場合、-Pを指定してすべてのHTML解析を禁止できます。これによりカバレッジが制限され、スキャナがHTMLを見て新しいキーワードを学習する能力が奪われますが、テストが劇的に高速化されます。スキャンの永続的な影響のリスクを軽減するもう1つの同様に機能を制限するオプションは-Oで、すべてのフォーム解析および送信ステップを禁止します。
機密性の高いユーザーデータを扱う一部のサイトはSSLに関心があります。また、それを正しく行うことにも関心があります。Skipfishは、問題のある混合コンテンツやパスワード送信シナリオを理解するのを支援する場合があります。-Mオプションを使用してこれを有効にします。スキャナは、https://ページでhttp://スクリプトが読み込まれているなどの状況について警告しますが、画像などのリスクのないシナリオは無視します。
同様に、特定の細かいサイトでは、HTTP/1.1レベルでキャッシュが制限されているが、明示的なHTTP/1.0キャッシュディレクティブが指定されていない場合を気にする場合があります。コマンドラインで-Eを指定すると、skipfishはそのようなすべてのケースを注意深く記録します。
場合によっては、ターゲットサーバーの負荷を制限する(またはDoS保護を回避する可能性がある)ために、1秒あたりのリクエスト数を制限したいことがあります。-lフラグを使用してこの制限を設定でき、指定された値はskipfishが実行する1秒あたりの最大リクエスト数です。
スキャンは通常、数週間かかるべきではありません。多くの場合、スキャン時間を特定の時間枠に収まるように制限したいでしょう。これは、時間、分、秒の量をH:M:S形式で指定できる-kフラグで行えます。このフラグを使用すると、すべてのページをテストする前にスキャンがタイムアウトした場合、スキャンカバレッジに影響を与える可能性があります。
最後に、ユーザーコンテンツが豊富でない自己完結型のサイトを含む一部の評価では、監査担当者は、直接的なセキュリティ影響がなくても、見られた外部メールやHTTPリンクを気にする場合があります。-Uオプションを使用して、これらを記録できます。
辞書管理は特別なトピックであり、前述のように、doc/dictionaries.txtでより詳細に説明されています。先に進む前にそのファイルをお読みください。関連するオプションには、-Sと-W(前述)、自動学習を抑制するための-L、キーワード推測ジャーのサイズを制限するための-G、古い辞書エントリを削除するための-R、高価な$keyword.$extensionファジングを抑制するための-Yがあります。
Skipfishには、スキャンカバレッジを最大化するためのフォーム自動補完メカニズムもあります。値は悪意のあるものであってはなりません。これらはセキュリティチェックを実装するためのものではなく、入力検証ロジックを通過するためのものです。-Tオプションを使用して追加のルールを定義したり、既存のルールを上書きしたりできます(-T form_field_name=field_value、例:-T login=test123 -T password=test321 - ただし、-Cと-Aはログインにはるかに適した方法であることに注意してください)。パフォーマンス関連のオプションもいくつか用意されています。-g を使用して、グローバルにすべてのターゲットに対して維持する最大接続数を設定します(システムや近くのNAT/ファイアウォールデバイスのTCP/IPスタックを圧迫しないように、50以下に抑えるのが賢明です)。-m はIPごとの制限を設定します(少し実験してみてください:localhostでは2~4、ローカルネットワークでは4~8、外部ターゲットでは10~20、非常に遅延が大きいかキープアライブ非対応のホストでは30以上が通常適切です)。また、-w でI/Oタイムアウト(skipfishが個々の読み取りまたは書き込みを待機する最大時間)を設定でき、-t で総リクエストタイムアウトを設定して、非常に遅いサイトまたは非常に速いサイトに対応できます。
最後に、-f はスキャンを中止するまでに許容する連続HTTPエラーの最大数を制御し、-s はフェッチして解析するレスポンスの最大長を設定します(これより長いレスポンスは切り捨てられます)。
大規模でマルチメディアが多いサイトをスキャンする場合は、-e を指定することも検討してください。これにより、バイナリドキュメントがレポート目的でメモリに保持されるのを防ぎ、大量のRAMを解放します。
さらに、レート制限は、trickle などのサードパーティのユーザーモードツールや、カーネルレベルのトラフィックシェイピングを通じて利用できます。
あと、リアルタイムのスキャン統計は -u で抑制できます。
適切に設計された自己完結型サイトに対する標準的な認証スキャン(すべての外部リンク、メール、混合コンテンツ、キャッシュヘッダーの問題を警告)、穏やかなブルートフォースを含む:
$ touch new_dict.wl
$ ./skipfish -MEU -S dictionaries/minimal.wl -W new_dict.wl
-C "AuthCookie=value" -X /logout.aspx -o output_dir
http://www.example.com/
5接続クロール、ただしブルートフォースなし。MSIEになりすまし、example.comのコンテンツを信頼:
$ ./skipfish -m 5 -L -W- -o output_dir -b ie -B example.com
http://www.example.com/
強力なブルートフォースのみ(HTMLリンク抽出なし)、単一ディレクトリに制限、5秒でタイムアウト:
$ touch new_dict.wl
$ ./skipfish -S dictionaries/complete.wl -W new_dict.wl
-P -I http://www.example.com/dir1/ -o output_dir -t 5 -I
http://www.example.com/dir1/
全コマンドラインオプションの短い一覧については、./skipfish -h を試してください。
skipfish が報告する問題のほとんどは、Webセキュリティの基礎をしっかり理解していれば、自明のはずです。MIMEスニッフィングなど、より複雑なトピックについて簡単に復習したい場合は、包括的な『Browser Security Handbook』を出発点としてご利用ください。
http://code.google.com/p/browsersec/
それでも支援が必要な場合、多くの一般的なWebセキュリティ脅威を文書化・説明し、その対処法を一般にアドバイスするために多大な努力を払っている組織がいくつかあります。OWASPやWeb Application Security Consortiumなどが公開している資料を参照することをお勧めします。
スキャナ自体の問題の診断については喜んで支援しますが、残念ながらサードパーティのWebアプリケーションの内部動作についての支援は提供できません。
以下は、skipfish に現在欠けている機能のリストです。これらの分野のいずれかでコードを提供してツールを改善したい場合は、ご連絡ください。
バッファオーバーフローチェック:慎重に検討した結果、バッファオーバーフローをリモートでテストする信頼性の高い方法はないのではないかと考えています。我々が探している実際の障害状態と同様に、適切なバッファサイズチェックでも、キャッチされない例外や500メッセージなどが発生する可能性があります。ただし、間違いであることが証明されることを歓迎します。
本格的なJavaScript XSS検出:コードにはいくつかの初歩的なチェックが含まれていますが、式やDOMアクセスを評価する適切なスクリプトエンジンは組み込まれていません。
可変長エンコーディングによる文字消費/インジェクションバグ:これらの問題は現時点ではブラウザレベルで大部分が対処されているため、本稿執筆時点では優先度がはるかに低くなっています。
サードパーティのプラグインベースコンテンツ(Flash、Java、PDFなど)に対するセキュリティチェックとリンク抽出。
パスワードブルートフォースと数値ファイル名ブルートフォースのプローブ。
検索エンジン連携(vhost、開始パス)。
VIEWSTATE デコード。
NTLMおよびダイジェスト認証。
より特化したPHPテスト(evalインジェクション、RFI)。
プロキシサポート:実験的なHTTPプロキシサポートが config.h の #define ディレクティブを通じて利用可能です。HTTPSプロキシのサポートを追加するのはより複雑で、まだ開発中です。
スキャン再開オプション、より良い実行時情報。
スタンドアロンインストール(make install)のサポート。
スケジューリングおよび管理用Web UI。
ある日Webフレームワークに火をつけられないほど優れたWebクローラーは存在しません。異常な動作(例:スキャンが永遠に続き、リクエストが多すぎる、スキャン出力に完全に偽のノードがある、または完全にクラッシュする)に遭遇した場合は、まず既知の問題ページを確認してください。
http://code.google.com/p/skipfish/wiki/KnownIssues
そこに満足のいく回答が見つからない場合は、次のコマンドでスキャナを再コンパイルしてください。
$ make clean debug
...そして、次のように再実行します。
$ ./skipfish [...以前のオプション...] 2>logfile.txt
その後、logfile.txt を調べて何が問題だったかを把握できます。スキャナの問題のように見える場合は、ログファイルから機密情報をすべて削除し、作成者に送信してください。
スキャナがクラッシュした場合は、上記のように再コンパイルし、次のコマンドを入力してください。
$ ulimit -c unlimited $ ./skipfish [...以前のオプション...] 2>logfile.txt $ gdb --batch -ex back ./skipfish core
...そして、その最後のコマンドの出力も必ず作成者に送信してください。
Skipfish は、Googleの情報セキュリティエンジニアリングチームの貢献と貴重なフィードバックのおかげで実現しました。
バグ報告、質問、提案、アプリケーションに関する懸念がある場合は、主著者である [email protected] までご連絡ください。