診断をする上で大切にしていること

診断を行う上で大切にしていることは? と聞かれたら「想像力」と「発想力」ですと答えます。ちょっと驚かれるかたもおられるかもしれませんが、私が教わった若いエンジニアがそんなことを言っていました。確かにそうだと思っています。もう一つは違和感を感じることですかね。(違和感を感じにくい人は問題を見逃してしまいがちですよね。。。)

私の場合で言えば、診断する対象のWebアプリ(サイト)を操作してみて、データの流れを頭の中でシミュレーションしてみます。これが想像力なのかなあと思ったりしています。ブラウザから表示されているこの数字は一体どのからどのようにしてやって来たのかを想像するのです。
それは検索フィールドに入力されたデータを元にSQLが発行されてDBから持ってきたもので、そのDBに入っているデータは夜間バッチ処理で、自動的に入れられたものであるなら、そのデータは管理者が直接DBに書き込んだものなのか、管理者用画面から入力されたものなのか、はたまた外部サイトからAPIで取得されたものなのか、その経路の中に抜け道はないのだろうか?というようなことを一瞬の間に頭の中で巡らせるんですね。

そうしてその画面の流れの中で、もしこんなことをしたらこの操作をスキップしてこのパラメータを変更してみたら、もしかしたらこうなるかもしれないということを考えます。これがたぶん発想力なんでしょうかね?これが出来る人出来ない人、得意な人苦手な人が当然いる訳です。ただ長年続けているうちに身についてくるということもあると思います。

基本的な脆弱性はツールにより検知しますが、大きな脆弱性は案外、手動(人間)による診断で見つけることが多いですね。様々なセキュリティベンダーが脆弱性診断サービスを行っていますが、その結果を見て手動で見つけたんだなあというのはすぐにわかります。
手動でしか見つからないものを見つけていると、その診断サービスのクォリティは高いなと思ってしまいます。同じようなサービスであっても、そこで差が出てくるのです。

当然やっているであろう手動確認の代表的なものは、アクセス制御の問題です。
これはユーザーアカウントに権限が設定されており、単純なものは一般権限と管理者権限ですが、管理者権限でしか表示されないメニューが一般権限のユーザで表示されてしまう問題です。これは診断ツールではまず検知してくれません。

複雑な権限のパターン例に、学校や塾のWEBテストサイトがあります。
ユーザーアカウントの種類がたくさんあるのです。「管理者」「校長先生」「先生」「保護者」「生徒」というようにですが、「先生」は自分の担任の生徒のテスト結果のみ閲覧可能ですし、「保護者」は自分の子供の成績のみ閲覧可能、「生徒」は自分自身に限る。さらに「先生」だけがテスト作成、編集、採点が可能というように出来ることが細かく分類されているので、そのアクセス制御を理解することから始めないと診断ができません。そこから、テストNo.などのように怪しいパラメータを見つけて改ざんしてみるという作業になりますが、これをツールでやれって言われてもできるものではないです。ただ、このアクセス制御は脆弱性というより単なるバグではという話しも当然出てきますが。

アップロード機能がある場合は、不正なファイル例えば、実行ファイルの拡張子を.jpgに変えてアップロードしてみるとかです。このようなチェックはツールではやっていないように思います。(もしかしたら知らないだけでやっているのかもしれませんが)

それと、大きな問題の一つが格納型のクロスサイトスクリプティングがあります。通常の反射型はツールがほぼ確実に見つけてくれるのですが、格納型は難しいです。人間でも難しいかもしれません。私の場合は、登録・更新がある場合に、スクリプト文字を混入してエラーにならずに正常登録した場合は、格納型クロスサイトスクリプティングの脆弱性に繋がるかもと判断して、そのデータが出力されている画面をチェックしていきます。
反射型に比べて格納型は影響範囲が広いのでそれだけリスクが大きくなり危険な脆弱性なのですが、見つけるのには苦労する脆弱性です。

こんな変わった例もあります。
会員新規登録の場合、まず仮登録してメールに届くURLにアクセスして登録完了という一般的な流れがあると思います。そのURLにはユニークでランダムな文字列が入っていてこれは仮登録者を特定する重要な文字列なので、入力したメールアドレス宛てのメール内にしか出力してはいけないものなんですが、、、。なんとそのURLがメール送信画面のhidden値に入っていました。メール送信する前にURLがわかってしまうという問題です。これも人間が違和感を感じて気づかないとツールではわからない問題です。

それから、Base64エンコードされたパスワードがCookieに納められていたという、ちょっとあり得ないのですがこれも違和感ですかね。怪しいと感じるセンサーですか。結局、DBにパスワードが平文で登録されていたということまでわかってしまったというおまけ付きの問題です。

開発者のセキュリティ意識は思ってる以上に低いものです。中には凄く高い人もいますが。
脆弱性を指摘したら、それはデータを改ざんするから発生するもので、改ざんしなければ問題ないので対応しませんという回答には驚きました。つまり、考えもしないようなコーディングをしている可能性があるということを常に頭に置きながら診断すること、ですかね。