PR

 機械学習を利用して、Webサイトが抱えるクロスサイトスクリプティング(XSS)▼の脆弱性を自動的に検出する技術が登場した。2017年9月上旬に開催されたイベント「PyCon JP 2017 in Tokyo」で、三井物産セキュアディレクションの高江洲 勲セキュリティエンジニアが発表した「SAIVS▼」である。(図1

図1 XSS脆弱性を自動検出するシステム「SAIVS」を発表する高江洲氏
図1 XSS脆弱性を自動検出するシステム「SAIVS」を発表する高江洲氏
2017年9月上旬に開催されたイベント「PyCon JP 2017 in Tokyo」において「Pythonと機械学習によるWebセキュリティの自動化」と題して発表した。
[画像のクリックで拡大表示]

 WebサイトにXSSの脆弱性があると、例えば細工が施されたリンクをユーザーがクリックすることで、悪意のあるスクリプトが勝手に実行される恐れがある。これを防ぐために、Webサイト側で「scriptタグを無効にする」といった対策を施していることが多い。ところが、そうした対策をかいくぐって攻撃できてしまうXSS脆弱性も存在する(図2)。そこで同氏は、単純なXSS脆弱性に加え、通常の対策では攻撃を防げないようなXSS脆弱性も自動的に発見するシステムとしてSAIVSを開発した。

図2 XSS対策をかいくぐってスクリプトを実行させる攻撃の例
図2 XSS対策をかいくぐってスクリプトを実行させる攻撃の例
XSS脆弱性を悪用した攻撃を防ぐため、Webサイト側が「クエリー内のscriptタグを無効化する」といった対策を実施していることがある。その場合でも、scriptタグを使わないタイプの攻撃が成功するケースがある。SAIVSはそうしたタイプの攻撃が可能な脆弱性も検出できる(高江洲氏の発表資料を基に編集部で作成した。以降の図表も同様)。
[画像のクリックで拡大表示]

機械に文法を学習させる

 SAIVSでは機械学習の様々な手法を利用している(図3)。

図3 SAIVSで利用した機械学習の手法
図3 SAIVSで利用した機械学習の手法
SAIVSは、単純なXSS脆弱性を検出する第1次検査と、「対策をかいくぐる攻撃が可能なXSS脆弱性」を検出する第2次検査から成る。機械学習の手法として、第1次検査では「LSTM」、第2次検査では「多層パーセプトロン」「Q学習」「GAN」を利用している。第2次検査の学習に利用したデータの生成には、機械学習だけでなく「遺伝的アルゴリズム」という手法も利用した。
[画像のクリックで拡大表示]

 SAIVSの検査は二つのステップから成る。前半の検査では、単純なXSS脆弱性を検出する。XSS脆弱性を検出するには、SAIVSがHTMLやJavaScriptの文法を理解する必要がある。そこで「LSTM▼」という機械学習の手法を使って文法を学習させた。

 LSTMは動画や音声といった時系列データの学習に適したアルゴリズム。文字の流れを時間とみなすと、文章やプログラムも時系列データとして扱える。

 具体的には、スクリプトを埋め込むために必要なコードをLSTMで生成している。そのために、ある値を入力し、結果の出力箇所でスクリプトが動作するかどうかを学習していった。LSTMの学習に使うデータは、実際のWebページから2万ページ分のHTML構文と1万ページ分のJavaScript構文を取得して利用した。学習の結果、Webサイトのコードをシード▼とみなして対応する構文を生成できるようになった(表1)。

表1 LSTMが学習した構文の例
表1 LSTMが学習した構文の例
LSTMにHTMLとJavaScriptの文法を学習させることで、スクリプトを挿入するために必要なコードを文脈に応じて生成できるようになった。
[画像のクリックで拡大表示]

学習用データも自動生成

 SAIVSの後半の検査が、対策を回避するような攻撃が可能な脆弱性の検出である。これには、「多層パーセプトロン」と「Q学習」という二つの機械学習の手法を利用した。データの作成には「遺伝的アルゴリズム」や「GAN▼」といった技術を使った。

 多層パーセプトロンは、一般には「深層学習」(ディープラーニング)として知られているもの。画像認識や手書き文字認識などによく使われる機械学習のアルゴリズムだ。Q学習は、結果の良し悪しをスコア化して行動を学習していく機械学習のアルゴリズム。ロボットの歩行動作の学習やビデオゲームの自動プレイなどに利用されている。

 まず、コードの出力箇所と対策のパターンをそれぞれ多層パーセプトロンに入力する。これらを基に多層パーセプトロンが選択した検査値で検査を試行。検査結果に応じたスコアを付与する。具体的には、その検査値でXSSが成功すれば高いスコアを与え、失敗すればマイナスのスコアを与える。これを繰り返すことで対策を回避する攻撃パターンを学習させた。

 対策をかいくぐるような検査値の作成には、本来はセキュリティエンジニアが持つノウハウが必要だ。しかし、データを人間が用意していては自動化できない。そこで、こうした検査値も自動生成することにした。それに使った技術が遺伝的アルゴリズムとGANである。

 遺伝的アルゴリズムは、進化計算▼を繰り返すことで最適な遺伝子の組み合わせを見つける手法。SAIVSでは、「>」「<script>」「alert();」といった、検査値を構成する最小要素を約220種類の遺伝子として定義した。

 こうした遺伝子を使って進化計算を繰り返すことで、1回の生成処理につき6種類程度の検査値を生成できるようになった。ところが、この生成処理は1回で約5時間かかる。必要な量の検査値を集めるには、この処理を何十回、何百回と繰り返す必要があり、膨大な時間がかかってしまう。

 そこで、検査値を「水増し」するためにGANを利用した。GANで学習を重ねると、基の検査値に似たデータを生成できるようになる。30分程度の処理で、一つの検査値から複数の検査値を生成できた。このように遺伝的アルゴリズムとGANを組み合わせることで、大量の検査値を効率良く生成できるようになった(図4)。

図4 遺伝的アルゴリズムとGANで生成した学習用データの例
図4 遺伝的アルゴリズムとGANで生成した学習用データの例
XSS攻撃が可能なコードを学習用データとして大量に生成し、多層パーセプトロンに「対策をかいくぐる攻撃」を学習させていった。
[画像のクリックで拡大表示]

 SAIVSの動作は、セキュリティ診断員の訓練によく使われる「OWASP▼ Broken Web Apps Google Gruyere」というWebアプリケーションのサンプルの脆弱性を検出できるかどうかで確認した。その結果、「scriptタグの無効化」と「『<』や『>』のエスケープ」という2種類の対策をかいくぐる攻撃パターンを発見できた(図5)。

図5 発見した脆弱性の箇所と攻撃パターン
図5 発見した脆弱性の箇所と攻撃パターン
「OWASP Broken Web Apps Google Gruyere」というWebアプリケーションのサンプルが持つ脆弱性を検出できるかどうかで動作を検証した。黄色の部分が脆弱性を検出した箇所と攻撃パターン。
[画像のクリックで拡大表示]

 SAIVSはPython▼で実装している。LSTMや多層パーセプトロン、GANには機械学習のライブラリであるKerasケラスを利用した。Q学習や遺伝的アルゴリズムの部分は高江洲氏が実装した。(大森 敏行)

▼クロスサイトスクリプティング(XSS)
Webアプリケーションの脆弱性の一種。この脆弱性があると攻撃者が任意のスクリプトを実行できてしまう。
▼SAIVS
Spider Artificial Intelligence Vulnerability Scannerの略。
▼LSTM
Long-Short Term Memoryの略。ニューラルネットワークのアルゴリズムの一種。
▼シード
日本語では種。基になるデータのこと。
▼GAN
Generative Adversarial Networksの略。本物のデータと生成器が作ったデータを識別しようとする「識別器」と、識別器をだまそうとする「生成器」を互いに競わせることで、生成するデータの精度を上げる仕組みになっている。
▼進化計算
生物の進化をシミュレートする計算。世代ごとに遺伝子の交配や突然変異などを行い、世代交代を繰り返す。
▼OWASP
Open Web Application Security Projectの略。セキュリティに関する標準化などを実施している組織。
▼Python
機械学習などのデータサイエンスの分野でよく使われているプログラミング言語。