Webサイトの「脆弱性」を狙ったサイバー攻撃が後を絶たない。Webサイトを運営する企業にとって、脆弱性を解消することは、必ず実施すべきセキュリティ対策の一つである。このことは、マネジャー層も当然認識しているだろう。

 だが、脆弱性という言葉は、きちんと定義されずに使われることが多いので、何となく分かった気になっている人は少なくないと感じている。一口に脆弱性といっても、その原因は様々。Webアプリケーションなどの実装の不備だけが原因ではない。設計や仕様の不備が原因の場合もある。

 深刻度も様々だ。どのようなWebサイトであっても対応が急務なものから、“グレーな脆弱性”まで存在する。適切な対策を採るには、脆弱性に対する正しい理解が不可欠だ。そこで今回は、「脆弱性とは何か」について、具体例を挙げながら詳細に解説する。

脆弱性は「悪用できるバグ」

 脆弱性の定義としては、「悪用可能なバグ(欠陥)」だと考えると分かりやすい。通常、プログラムにバグがあると、「できるはずのことができない」。だが、脆弱性はこの逆で、「できないはずのことができる」ようになる。つまり、悪用が可能になるのだ。Webサイトの代表的な脆弱性の一つである「SQLインジェクション脆弱性」で説明しよう。SQLインジェクション脆弱性とは、Webサイトの背後で動くデータベースに、悪質なSQLコマンドを送り込める脆弱性である。

 ここでは、書籍データベースから著者名で検索するWebアプリケーションを例に考える(図1)。このWebアプリケーションでは、利用者が入力した著者名を「$author」という変数に格納したSQL文を書籍データベースに送信する。このSQL文には、SQLインジェクション脆弱性が存在する。例えば、著者名に「';DROP TABLE accounts --」を指定すると、アカウントのテーブル全件を削除するSQL文が生成される。つまり、Webサイトの利用者が本来はできないはずの「任意のSQL文を実行する」ことが可能になる。

図1●「SQLインジェクション脆弱性」の悪用例
図1●「SQLインジェクション脆弱性」の悪用例
[画像のクリックで拡大表示]

 次に、脆弱性の原因について考えよう。脆弱性の原因としては、「実装」「設計」「仕様」の3種類がある。前述のSQLインジェクション脆弱性は、実装が原因の脆弱性の代表例である。SQL文法の基本的な約束として、文字列中でシングルクォート「'」を使う場合には、「''」といった具合にシングルクォートを重ねるというものがある。先の例では、この文法上の約束に従っていないことが、脆弱性の原因だ。

 類似の例としては、「クロスサイトスクリプティング(XSS)脆弱性」がある。XSS脆弱性が混入するのは、WebアプリケーションのプログラムがHTMLやJavaScriptの文法に従っていないためだ。例えばHTMLの中では、「<」という文字を表示する場合には、「&lt;」という形式にするという文法上の約束がある。

 重大な影響があることで知られる「バッファオーバーフローの脆弱性」も、実装上の単純なバグの一例だ。バッファオーバーフロー脆弱性が混入する原因は、C言語などで宣言した配列サイズを超えて書き込みをしてしまうことにある。配列の範囲を超えてアクセスしてはいけないというのはC言語の初歩的なルール。それを怠っているために、重大な脆弱性が生じる。