本サイトは、快適にご利用いただくためにクッキー(Cookie)を使用しております。
Cookieの使用に同意いただける場合は「同意する」ボタンを押してください。
なお本サイトのCookie使用については、「個人情報保護方針」をご覧ください。
1. はじめに
先日、某セキュリティ系の勉強会で「AIにWebアプリケーション診断をさせてみる」と題し、Webアプリケーション診断(以下、Webアプリ診断)を行う人工知能(以下、診断AI)のデモを行ったところ、意外にも好評でしたので、本Blogで少し深堀したいと思います。
なお、本Blogでは機械学習アルゴリズムにも触れますが、これらの詳細な解説は行っておりません。機械学習アルゴリズムの詳細については、「6.参考文献」に示した書籍やWebサイトで解説されておりますので、そちらでご確認いただければ幸いです。
それでは、診断AIの概要について解説を始めます。
2. 最終目標
以下の動作を実現できる「診断AI」を目指して開発を進めています。
「人間の診断員と同じように、診断対象のWebアプリをクローリングしながら診断を行い、発見した脆弱性を開発者、または、サイトオーナに報告することができる。」
これを実現するためには、最低限以下の3点を実装する必要があります。
- 診断対象のWebアプリを隅々までクローリング
静的ページは勿論のこと、ログインや会員登録などの動的ページもクローリングする必要があります。 - 様々な診断を実施
機械的に検出できる脆弱性は勿論のこと、人間の知覚を要しなければ検出が困難な脆弱性も検出する必要があります。 - 診断結果を報告
検出した脆弱性や対策を報告書に纏め、Webアプリの改修者に分かり易く報告する必要があります。
これらを診断AIが行うには、人間並みの知能を手に入れる必要があります。なお、AI研究者の間では、AIが人間の知能を超えるのは2045年頃との予測もありますので、この予測通りに技術が推移したとすると、診断AIの完成も2045年頃になってしまいますね。。
とは言え、現時点でも一部は実現できます。
現在は超ベータ版ですが、以下の機能を有した診断AIを開発しています。
- 比較的単純なWebアプリをクローリング
ログイン/会員登録/検索などの動的ページを含む、(ECサイトなどと比べると)単純なWebアプリをクローリング可能。 - 機械的な診断を実施
検出ロジックをパターン化できる脆弱性を検出可能(一部のSQLi、XSSなど)。 - 診断結果レポートを出力
テキストベースの簡易レポートを出力可能。
レポートには、クローリングしたURLリストと、脆弱性の検出箇所が含まれる。
この診断AIは、以下のような人間っぽい動作を行うことが可能です。
「ログイン時にログインアカウントを持っていない場合、先に会員登録機能でアカウントを作成する。そして、作成したアカウントでログインし、ログイン後のページをクローリングしながら診断を行う。診断が終了したら、簡易レポートを出力する。」
なお、現時点では上記の1に機械学習アルゴリズムを採用しています。よって、本Blogでは、機械学習アルゴリズムを採用した①の機能を中心に、実装のポイントを解説していきます(2,3は技術的に独自性がないため、説明は割愛致します)。
3. 診断AIの実装
診断AIはWebアプリをクローリングしながら機械的に診断を行っていきますが、そもそもクローリングとは何でしょうか?
ざっくり言うと、Webアプリ上のHTML文書のリンクからリンクへと辿っていく動作になります。一見すると簡単そうに見えますが、これが意外と難しいです。
例えば、アクセスしたページのHTML中に、図 1に示すタグが含まれていたらどうでしょうか?
<a href="/cyclone/leaderboard">Leaders</a>
A
タグのhref
属性で指定されている「/cyclone/leaderboard
」にGET
メソッドでアクセスすれば、次ページに遷移することができます。これは非常に簡単です。
一方、図 2はどうでしょうか。
<form accept-charset="UTF-8" action="/cyclone/sessions" method="post">
<label for="email">Email</label>
<input id="email" name="email" size="30" type="text" />
<label for="password">Password</label>
<input id="password" name="password" size="30" type="password" />
<input class="btn btn-large btn-primary" name="commit" type="submit" value="Sign in" />
</form>
INPUT
タグで指定された入力フォームに、Webアプリが期待する値を入力しなければ、おそらく次ページへは遷移できないでしょう。Email
には電子メールアドレスを、Password
にはパスワードを入力する必要がありそうです。
また、「Sign in
」という記述もあるので、このページはログインフォームであると推測できます。ということは、事前にログインアカウントを用意する必要がありますね。ログインアカウントを持っていなければ、先に会員登録をしてログインアカウントを作る必要があるでしょう。
さらに、入力フォームに適切な値を入れたつもりでも、何らかの理由によりエラーメッセージが表示されるかもしれません。この場合は、遷移に失敗したことを認識し、入力フォームに別の値を入力し直す必要があるでしょう。
このように、一口でクローリングと言っても、上記のような複雑な思考を行う必要があります。よって、診断AIでWebアプリをクローリングさせるには、最低限以下の思考パターンを実現する必要があります。
- ページ種別の認識(遷移先ページはログイン?会員登録?検索?)
- 入力フォームに最適なパラメータ値を入力
- ページ遷移の成否を認識
今回開発した診断AIでは、表 1に示す機械学習アルゴリズムを使用し、上記の思考パターンを実現しています。
No | 思考パターン | 使用する機械学習アルゴリズム |
---|---|---|
1 | ページ種別の認識 | ナイーブベイズ(Naive Bayes) |
2 | 入力フォームに最適なパラメータ値を入力 | 多層パーセプトロン(Multilayer perceptron) Q学習(Q-Learning) |
3 | ページ遷移の成否を認識 | ナイーブベイズ(Naive Bayes) |
各機械学習アリゴリズムの特徴をざっくり解説すると表 2になります。
No | 機械学習アルゴリズム | 特徴 |
---|---|---|
1 | ナイーブベイズ | テキスト分類に用いられるアルゴリズム。 何らかの情報を手掛かりに、テキストを予め定義しておいた幾つかのカテゴリに自動分類することが可能。 スパムフィルタなどで使用されている。 |
2 | 多層パーセプトロン | 生物の神経回路構造と機能を模したアルゴリズム。 入出力間の複雑な関係をモデル化し、学習を重ねることで、何らかの入力に対する最適な出力を得ることが可能。 画像認識や手書き文字認識などで使用されている。 |
3 | Q学習 | エージェントの最良行動を学習するアルゴリズム。 ある環境下におけるエージェントの行動をQ値と呼ばれる行動の良し悪しを表す値で評価することで、エージェントにより良い行動パターンを学習させることが可能。 ロボットの歩行動作獲得などで使用されている。 |
表 1のNo1,3のように、ページ上の何らかの情報を基にページ種別や遷移成否を認識させるには「ナイーブベイズ」を使用します。一方、No2のように、次のページに遷移するための最適な行動パターン(最適なパラメータ値)を学習させるには「多層パーセプトロン」と「Q学習」を組み合わせて使用します。
次に各思考パターンの実装ポイントを解説していきます。
3.1. 「ページ種別の認識」を実現する
図 3は、OWASP Broken Web Appsに収録されている「Cyclone」のとあるページを示しています。このページを見て何をするためのページだと思いますか?
大抵の人は「ログイン」ページと認識できるはずです。
それは、ページ上の「Sign in」「Email」「Password」などのページ種別を特徴付ける情報から「ログイン」と認識することができるからです。この認識ロジックはナイーブベイズで実現することができます。
図 3 ログインフォーム
ナイーブベイズでページ種別を認識させるためには、ページ種別を特徴付ける情報を入手する必要があります。これらの情報は、ページのHTMLソースから「Signin
」「Email
」「Password
」などをパースして取得します(図 4の赤字)
<h1>Sign in</h1>
<form accept-charset="UTF-8" action="/cyclone/sessions" method="post">
(省略)
<label for="session_email">Email</label>
<input id="session_email" name="session[email]" size="30" type="text" />
<label for="session_password">Password</label>
<input id="session_password" name="session[password]" size="30" type="password" />
(省略)
</form>
ここで認識するのはページ種別になりますので、事前に表 3のようなカテゴリテーブルを定義しておきます。なお、解説を単純化するために、カテゴリは3つに限定します。
No | カテゴリ | 分類に利用する単語 |
---|---|---|
1 | ログイン | Email, User ID, ID, Password, PW, Pass, Pass Phrase, Sign in … |
2 | 会員登録 | User ID, ID, Email, Password, Password Confirm, Sign Up … |
3 | ユーザ検索 | Word, Text, String, Search … |
図 4から取得した情報「Sign in
/Email
/Password
」を基に認識します。
各カテゴリでの各単語の出現確率が表 4になっていた場合、各カテゴリにおける情報「Sign in
/Email
/Password
」の出現確率は以下となります。
- カテゴリ「ログイン」: 「0.9×0.5×0.5×100=22.5」
- カテゴリ「会員登録」: 「0.2×0.5×0.5×100=5」
- カテゴリ「ユーザ検索」:「0.05×0.2×0.1×100=0.1」
「22.5」と「5」と「0.1」を比較すると、カテゴリ「ログイン」の出現確率が最も大きいことから、情報「Sign in
/Email
/Password
」を含んだページは「ログイン」と判定されます。
カテゴリ | 単語の出現確率 | ||
---|---|---|---|
Sign in |
Email |
Password |
|
ログイン | 90% | 50% | 50% |
会員登録 | 20% | 50% | 50% |
ユーザ検索 | 5% | 20% | 10% |
このように、ページ種別を特徴付ける情報を基にナイーブベイズで分類することで、「ページ種別の認識」を実現することができます。
なお、ナイーブベイズは単語の並びや相関関係を考慮せず(Bag of words)、単語の出現確率で分類することができるため、学習と分類を高速に行うことができます。また、カテゴリテーブルに存在しない単語が現れた場合にゼロ頻度問題が発生しますが、今回はラプラススムージングなどの手法を用いることで、本問題を回避しています。
3.2. 「ページ遷移の成否の認識」を実現する
勘の良い方は気づいたかもしれませんが、こちらもナイーブベイズを使用します。
図 5は、ログイン失敗時に表示されるページを示しています。
大抵の人は遷移失敗を特徴付ける情報「 Invalid email or password
」から、ログインに失敗したことを認識できるはずです。
図 5 ログインに失敗した様子
HTMLソース上では、遷移前と遷移後で図 6のエラーメッセージが差分として現れます。
<div class="alert lead alert-error">Invalid email or password </div>
このような遷移結果を特徴付ける情報を基にナイーブベイズで成功/失敗を分類することで、「ページ遷移の成否の認識」を実現することができます。
なお、ロジックは「3.1「ページ種別の認識」を実現する」と同様になりますので、解説は割愛致します。
3.3. 「最適なパラメータ値の学習」を実現する
図 7は、多層パーセプトロンとQ学習を組み合わせた、最適なパラメータ値を学習するモデルを表しています。
図 7 入力パラメータ値の学習モデル
このモデルでは、以下のフローを繰り返すことで、次のページに遷移できる最適な行動パターン(最適なパラメータ構成)を学習していきます。
- 診断AIの状態を入力(今のページNo:遷移元ページ、次のページNo:遷移先ページ)。
- 何らかのパラメータ構成を出力。
- 出力されたパラメータ構成を用いて、次ページへの遷移を試行。
- 遷移の成否を観測(※1)。
- Q値を更新し(※2)、更新前後のQ値の誤差を算出。
- 誤差が最小になるように、多層パーセプトロンを学習させる。
※2 遷移成功時はQ値を大きく更新、遷移失敗時はQ値を小さく更新。
最初はモデルの学習が行われていないため、ほぼランダムなパラメータ構成が出力され、殆ど遷移失敗、たまに遷移に成功します。この成功/失敗の結果を基に学習を進めていくことで、徐々により良いパラメータ構成(遷移に成功し易いパラメータ構成)が出力されるようになります。
よって、学習の初期では遷移が失敗する確率が高くなりますが、学習が進むにつれて、遷移に成功する確率が上がっていき、学習の終盤ではほぼ100%の確率で遷移に成功するようになります。なお、現在の学習時間は1遷移あたり5分弱となりますが、この時間は学習に使用するパラメータ(割引率など)を調整することで短縮可能です。
このように、多層パーセプトロンとQ学習を組み合わせることで、入力フォームに対する最適なパラメータ値を得ることができます。
次章では、これまで解説したロジックを基に実装した診断AIのデモをお見せします。
4. デモ
デモの概要は以下の通りです。
診断対象 | OWASP Broken Web Apps - Cyclone |
---|---|
診断対象ページ | ログイン(http://192.168.153.128/cyclone/sessions) |
会員登録(http://192.168.153.128/cyclone/users) | |
ユーザ検索(http://192.168.153.128/cyclone/search) | |
診断シグネチャ | SQLインジェクション1種類:「’の挿入」 |
診断対象はOWASP Broken Web Appsの「Cyclone」です。このWebアプリにはログイン/会員登録/検索などといった動的ページが含まれています。ログイン後のページに遷移するためには、会員登録でアカウントを作成する必要があります。
また、本Blogではデモ時間を短縮するため、診断対象は3ページに絞っています。同様の理由から、診断シグネチャも1種類に限定しています。
動画の左上のコマンドプロンプトは診断AIを実行しているコンソール、右上のブラウザ(FireFox)はデモの様子を分かり易くするために、診断AIが遷移したページのレスポンスをリアルタイムにレンダリングして表示しています。また、動画下部のBurp Proxy HTTP Historyは、診断AIのアクセスログをリアルタイムに表示しています。
以下、表 6はデモの解説です。
時間 | 解説 |
---|---|
0:00 | 診断開始。 |
0:04 | (初期状態ではログインアカウントを持っていないため)「ログイン」を後回しにして、先に「会員登録」の診断を開始。 |
0:36 | 「ユーザ検索」の診断を開始。 |
0:55 | コンソール上に「I found a vulnerability!!」、ブラウザ上にSQLエラー画面が表示されている。 診断AIがSQLインジェクション脆弱性を検出したことを示す。 |
0:58 | 「ログイン」の診断を開始。 |
1:29 | 診断終了。 |
1:42 | 手動操作で診断AIが出力した簡易診断レポートを表示。 「Target List」はクローリングしたURL一覧、 「Scan Result」に脆弱性の検出箇所。 「ユーザ検索」のパラメータ「search」でSQLインジェクション脆弱性を検出したことが示されている。 |
このように、Cycloneをクローリングしながら診断を行い、ログイン後のページ「ユーザ検索」でSQLインジェクション脆弱性を検出しています。診断対象ページや診断シグネチャを増やせば他の脆弱性も検出できますが、これらは別の機会でお見せしたいと思います。
5. まとめと今後の展望
今回はクローリングに機械学習アルゴリズムを実装した診断AIの概要と実装のポイントを解説致しました。人間の思考パターンを模した機械学習アルゴリズムを実装することで、比較的単純なWebアプリをクローリングしながら診断を行うことに成功しました。
今後はあらゆるWebアプリを診断できるよう、クローリング能力と診断能力の強化を行い、Webアプリ診断やバグバウンティなどの実戦に投入していきたいと考えています。
- クローリング能力の強化
- 複雑なWebアプリのクローリング(業務アプリ、ECサイトなど)
- 診断能力の強化
- 診断シグネチャの追加
- 検出に人間の知覚を要する脆弱性の検出
- 誤検出の低減
- 実戦投入
- Webアプリ診断業務への利用
- バグバウンティプログラムへの参戦
最後に、Deep Learningの登場をきっかけに、AIは大きな盛り上がりを見せています。また、今回の盛り上がりは一過性のものではないと考えています。それは、学術分野での盛り上がりに留まらず産業界にも波及しており、ドローンや自動運転車、ロボットの制御にも利用が広がっています。また、情報セキュリティ分野でも、WAFの攻撃検知やアンチウィルスソフトのマルウエア検知ロジック、標的型攻撃の早期検知などにも利用されています。
これからは当たり前のように機械学習が利用される時代になると思いますので、本Blogを読んで機械学習に興味を持った方がいましたら、ぜひ触ってみることをお勧め致します。
6. 参考文献
[1] 実践 機械学習システム/Willi Richert, Luis Pedro Coelho著/O’Reilly/2014年10月発行
[2] 進化計算と深層学習/伊庭斉志 著/Ohmsha/2015年10月発行
[3] 深層学習/岡谷貴之 著/講談社/2015年4月7日発行
[4] ニューラルネットワークと深層学習
[5] ニューラルネットワーク
おすすめ記事