Webアプリケーションの脆弱性は非常に多岐にわたっており、攻撃手法は複数の脆弱性を利用したものである場合が多いためにジャンル分けも複雑になる。よくまとまった資料としてOWASP(The Open Web Security Project)がWebアプリケーションの脆弱性トップ10のリストを作成している。このリストには詳細な解説付きの日本語版もあるので、ぜひ参考としてほしい。
では、このリストに掲載されているような脆弱性を防御する場合、IDSやIPSといったネットワークセキュリティ製品がいかに無力であるのかを説明する。
まず、「アプリケーションセキュリティ」という言葉が多くの誤解を生んでいる。多くのネットワークセキュリティベンダが、マーケティングメッセージとしてアプリケーションセキュリティという言葉を使用し、アプリケーションレイヤの攻撃を防御できるという。このメッセージをそのまま信じるユーザーは、「この製品を導入しておけばアプリケーションレイヤのあらゆる攻撃からの防御が可能である」という間違った理解を持つかもしれない。ベンダがこういった誤解を意図的に生み出しているわけではないだろうが、あまりに広くこの言葉が使われているが故に、WAFの必要性が分かりにくくなっているのではないかと懸念する。
あらためて言明しておかねばならないが、既存のネットワークセキュリティ製品であるファイアウォール、IDS/IPSは、Webアプリケーションの脆弱性に対してほとんど無力である。ネットワークセキュリティ製品がどれだけ、「ディープパケットインスペクション」やアプリケーションセキュリティをうたっていたとしても、である。ファイアウォール、IDS/IPS が、いかにHTTPプロトコルやHTMLコンテンツを解析し、Webサーバの脆弱性を防いだとしても、Webアプリケーションは守れない。OWASPトップ10リストの中でも最も上位に位置する「Unvalidated Input(許可されていない入力)」を見てみよう。
Unvalidatedは「確認されていない」「許可されていない」というような意味を持つ。つまり、ユーザーからの入力(Input)があった際、プログラムでユーザー入力に対する確認作業が不足しているためにWebアプリケーション開発者が想定しない結果を引き起こすWebアプリケーションの脆弱性全般を指す。「フォースフルブラウジング」「コマンドインジェクション」「クロスサイトスクリプティング」「バッファオーバーフロー」「SQLインジェクション」「Cookieポイズニング」「Hiddenフィールドマニピュレーション」など代表的なWebアプリケーション脆弱性の多くがUnvalidated Inputの一部である。
Hiddenフィールドマニピュレーションは、「隠しフィールド操作」などと訳されることがあるが、そうすると意味が不明瞭になるため、ここではHiddenフィールドマニピュレーションと表記する。まず図3を見てもらいたい。このWebページはあるオークションサイトであると考えてほしい。
この購入画面で使用されるHTMLの一部は以下のとおりである。
<form name=bid action="buy.php" method=get> <input type="Hidden" name="price" value="10,000.00 JPY"> <input type="Hidden" name="product" value="PDA"> <b><FONT FACE=Tahoma,Verdana,Arial SIZE=2 COLOR=##006633>Buy it now!<br> 10,000.00 JPY</b> <br><br> <FONT FACE=Tahoma,Verdana,Arial SIZE=1 COLOR=##006633> <input type=submit name="Input" value="Buy it!"><br> </form>
先ほどと同様に、このフォームの解説を以下に示す。
パラメータの送信先:buy.php
使用するHTTPメソッド:GET
パラメータの種類と属性:
コントロールの種類 | 名前 | 値 |
---|---|---|
Hidden | price | 10,000.00 JPY |
Hidden | product | PDA |
送信ボタン | Input | Buy it! |
このようにHiddenフィールドとは、Webブラウザ内には表示されていないため、通常はユーザーが意識することのないフィールドである。だが実際には、WebアプリケーションからWebブラウザにデータが送信されており、ユーザーからのアクションによって再びWebアプリケーションに受け渡される。Hiddenフィールドはエディタを使用すれば簡単に参照できる。そして、このフィールドの改ざんも容易である。ローカルマシンにHTMLを保存して商品の価格を編集するだけである。
|
|
ローカルに保存して編集したHTML(赤字部分が編集した部分) |
改ざんしたHTMLファイルをWebブラウザで開き、“Buy it!”ボタンをクリックする。こうして高価な商品がタダ同然で購入できる(この例では、10,000円の商品を40円に改ざんした)。もちろん、Webアプリケーションのプログラムにおけるチェック機構が働いていなければ、の話である。
Hiddenフィールドマニピュレーションによる攻撃は、以下の手法によって防ぐことができると考えられる(WebアプリケーションでHiddenフィールドを使わない手法も考えられるが、ここでは述べない)。
ここで防御のために必要となる前提知識は「Webアプリケーションのつくり」である。既存のネットワークセキュリティ製品にとっては、HTTPリクエストに含まれるpriceのパラメータ値が40.00であろうと、10000.00であろうと“正しい”HTTPリクエストであることに変わりはない。単一のHTTPリクエストを採取して解析しても、なんら怪しいところはない。
おかしいところといえば、このページにおけるPDAの購入を行うにしては価格が低いというのみであり、それを検知する手段はWebアプリケーションのつくりを理解する仕組みがなければ存在しない。仮に極めて柔軟性の高いIDS/IPSが存在するならば、カスタマイズ設定において、「このURLにおけるパラメータとパラメータ値は、この入力しか受け付けない」という正規表現を入力できるかもしれない。
しかし、Webアプリケーションにおいてパラメータ値は状況に応じて変わっていく。さらに、どのページをリクエストするときも同一のURLが使われ、パラメータのみが異なっており、それに基づいてコンテンツがダイナミックに生成されるWebアプリケーションも多数存在する。そのような環境においてIDS/IPSを使用するWebアプリケーションに合わせてカスタマイズしていくことは不可能である。この攻撃を防御できるのはセキュアプログラミングとWAFである。
Hiddenフィールドマニピュレーションの例で分かるように、Webブラウザに渡される情報は簡単に参照、改ざんされる可能性がある。その前提をおろそかにし、プログラムでユーザー入力のチェックを行わないことからWebアプリケーションの脆弱性は発生しやすい。そして改ざんされたユーザー入力はIDSやIPSをすり抜けてしまう。
次回は、より多くのWebアプリケーション脆弱性について、実際の攻撃手法を解説していく。
Copyright © ITmedia, Inc. All Rights Reserved.