スキャンの種類
ベースライン (--scan=baseline、デフォルト) | フル (--scan=full) | |
|---|---|---|
| すること | クロールして、リクエストとレスポンスを確かめます (パッシブスキャン) | 同じことをしてから、各ページとパラメーターを攻撃します (アクティブスキャン) |
| 見つけるもの | セキュリティヘッダー、Cookie、トークンのないフォーム、エラーページ、ヘッダーのバージョンなど | 同じものと、XSS (反射型、持続型、DOM ベース)、SQL インジェクション、パストラバーサル、コマンドインジェクション、オープンリダイレクトなど |
| データの変更 | しません。ページを読むだけです | します。攻撃を入れたフォームを送るので、レコードを追加したり変更したりします |
| 実行する場所 | どの環境でも。ステージングのサーバーでも | テストのデータベースを使うテスト環境だけ |
| 時間 | 1、2 分ほど | 数分以上。攻撃は最大 --scan-minutes 分 (デフォルト 10) |
ベースラインスキャン
ZAP は、サイトをトップページから --minutes 分 (デフォルト 1) クロールします。ページのリンクとフォームを、 ログインを指定しなければログインしていない訪問者として、たどります (スパイダー)。各リクエストと レスポンスを、パッシブスキャンのルールで確かめます。ヘッダー、Cookie、フォーム、ページとスクリプトの内容です。 攻撃は送らないので、どの環境でも、ステージングのサーバーでも実行できます (--url=https://staging.example.com)。
クロールで見つけるページは、実行ごとに少し変わります。JavaScript が作るリンクには、ブラウザでもクロールする --ajax-spider=1 を付けます (遅くなります)。操作を順に重ねないと届かないページには、クロールの代わりに End-to-End テストを使います。
フルスキャン
フルスキャンでは、続けて、クロールやテストで見つけた各ページと各パラメーター (クエリ、フォーム、Cookie、ヘッダー) を、 ZAP のアクティブスキャンのルールで攻撃します。スクリプト、クォート、SQL、../ の付いたパス、コマンド、ほかの サイトの URL などの値を送り、送ったスクリプトがそのまま出力された、SQL のエラーが出た、などレスポンスに表れたものを 報告します。
bash
vendor/bin/security-dast --scan=full --scan-minutes=20- データを変えます。 攻撃を入れたフォームを何度も送るので、レコードが追加、変更、削除され、メールが送られることも あります。スキャンの組み込みウェブサーバー (デフォルト、テストのデータベース) か、データが消えてもよい自分の サーバーでだけ実行してください。本番では決して実行しないでください。
- 時間がかかります。 攻撃は
--scan-minutes分 (デフォルト 10) までです。長いシナリオにはもっと必要です。時間が 過ぎると、まだ攻撃していないパラメーターは検査されません。 - 多くの脆弱性を見つけますが、すべてではありません。 攻撃は、レスポンスに表れた影響で見つけます。コードも pieceofcake2/security-sast で確かめてください。
フルスキャンは、報告書の言語に関係なく、ZAP の Default Policy のすべてのアクティブスキャンのルールを実行します。
CakePHP 2 と ZAP
ZAP は、CakePHP 2 のアプリケーションに合わせて設定してあります。
SecurityComponentのフォームの CSRF トークン (data[_Token][key]) を知っています。そうしたフォームをトークンの ないフォームとして指摘せず、フルスキャンでは、攻撃ごとにフォームのページから、スキャンのセッションの中で新しい トークンを取り直すので、SecurityComponentに弾かれません。SecurityComponentが固定する欄 (_method、data[_Token][fields]、data[_Token][unlocked]) は攻撃しません。 これらを変えると必ず弾かれるので、攻撃しても時間がかかるだけです。- CakePHP のセッションの Cookie (
CAKEPHP) を知っています。 - ユーザーとしてのスキャンがログインしたままでいられるよう、ログアウトの URL (
.*logout.*、--excludeを参照) は 除きます。
どこで何を実行するか
| いつ | スキャン |
|---|---|
| push と pull request のたび | ベースラインスキャン。訪問者として、とユーザーとして |
| 毎晩、またはリリースの前 | CI のテストのデータベースで、End-to-End テストのフルスキャン |
| ステージングへのデプロイのあと | --url でベースラインスキャン |
ワークフローは GitHub Actions での CI をご覧ください。
DAST で見つけられないもの
- スキャンが届かないページ。ユーザーと End-to-End テストを与えてください。
- アプリケーションのルール。あるユーザーがほかのユーザーのデータを見たり変えたりできるか (ほかのユーザーの
/orders/view/12)、管理者だけができるはずのことができるか、などです。アプリケーションの テストで確かめてください。 - 複数の手順や時間に関わるもの。2 つのリクエストの競合などです。
- どのレスポンスにも表れないもの。パスワードの弱いハッシュや、コードの中の秘密などです。 pieceofcake2/security-sast (設定の検査で既定の salt や鍵も 見つけます) と pieceofcake2/security-sca (パッケージ) を ご覧ください。
