脆弱性は作り込まないのが一番。この回では、安全なコードを書くセキュアプログラミングと、作った後に弱点を洗い出す脆弱性診断・ペネトレーションテストを学びます。
SQLインジェクションとかXSSって、そもそもプログラムの書き方で防げるんだよね?
そうよ。
設計・実装の段階で脆弱性を作り込まないようにするのがセキュアプログラミングね。
基本は「入力を信用しない」ことよ。
SQLインジェクション対策なら、入力値を直接SQL文に埋め込まず、プレースホルダ(バインド機構)を使うのが定石ですね。
XSSはどう防ぐんですかぁ?
XSSは、ユーザーの入力を画面に出力するときにサニタイジング(無害化)、つまり「<」などの特殊文字をエスケープ処理して表示するのが基本よ。
入力値の妥当性を確認する入力値検証も併用するわ。
じゃあ、書いたコードが本当に安全かは、どうやって確かめるの?
作った後に弱点を洗い出すのが脆弱性診断よ。
ツールでスキャンしたり、専門家が手動で検査したりして、既知の弱点がないか調べるの。
さらに踏み込んで、実際に攻撃者の立場で侵入を試みる検査がペネトレーションテストですね。
「本当に侵入できてしまうか」を確認します。
脆弱性診断と、ペネトレーションテストは違うんですねぇ?
そうなの。
脆弱性診断は「弱点を網羅的に洗い出す」のが目的。
ペネトレーションテストは「特定の目標まで実際に到達できるかを検証する」のが目的よ。
目的が違うのよ。
本番システムにいきなり攻撃したら危なくない?
だから事前に実施範囲や時間帯、許可を明確に合意してから行うのがルールよ。
無断で他人のシステムに実施すると不正アクセスになりかねないから、実施許可が絶対に必要なの。
開発工程では、コードの脆弱性を検査するソースコード診断を取り入れる方法もありますね。
早い段階で見つけるほど修正コストが下がります。
作る前に気をつけて、作った後にも確かめる、両方が大事なんですねぇ。
その通りよ。
予防と検証の両輪でセキュリティ品質を高めていくのよ。
確認クイズ
ペネトレーションテストの説明として最も適切なものはどれか。
- システムに存在する既知の脆弱性をツールで網羅的に洗い出す検査
- 実際に攻撃者の視点で侵入を試み、目標とするシステムまで到達できるかを検証する検査
- ソースコードを静的に解析し、コーディング規約違反を指摘する作業
- 利用者に対して不審メールを送り、開封率を測定する訓練
こたえを見る
正解: 2. 実際に攻撃者の視点で侵入を試み、目標とするシステムまで到達できるかを検証する検査
正解は「実際に攻撃を試み目標到達できるかを検証する検査」。ペネトレーションテストは攻撃者の立場で実際に侵入を試み、特定の目標に到達できるかを確かめる。網羅的に弱点を洗い出すのは脆弱性診断、規約違反の指摘はコードレビュー/静的解析、不審メール訓練は標的型攻撃メール訓練であり、いずれも別の活動である。