code blue 2016 - 機械学習でwebアプリケーションの脆弱性を見つける方法
TRANSCRIPT
CODE BLUE 2016
Presented by Isao Takaesu
機械学習でWebアプリケーション
の脆弱性を見つける方法
About the speaker
• 職業 : Webセキュリティエンジニア
• 所属 : 三井物産セキュアディレクション
• 趣味 : 脆弱性スキャナ作り、機械学習
• ブログ: http://www.mbsd.jp/blog/
• Black Hat Asia 2016 Arsenal
• AISECjpを主催
高江洲 勲
MBSD
タカエス イサオ
CODE BLUE 2016
Agenda
1. 研究の背景
2. 研究の目的
3. SAIVSの概要
4. 実現手法
5. 検証結果
6. デモンストレーション
7. 将来の展望
MBSD CODE BLUE 2016
研究の背景
MBSD CODE BLUE 2016
セキュリティ技術者の圧倒的な不足
研究の背景
MBSD CODE BLUE 2016
その数、約24万人 (IPA調べ)
研究の背景
MBSD CODE BLUE 2016
人間のみでは限界では?
研究の目的
MBSD CODE BLUE 2016
情報セキュリティの完全自動化
研究の目的
MBSD CODE BLUE 2016
先ずは、
Webアプリケーション診断
Webアプリケーション診断とは?
MBSD CODE BLUE 2016
Webアプリの脆弱性を検出
Webアプリケーション診断とは?
MBSD
診断員Web Server
Web Apps診断ベンダ 顧客
疑似攻撃
レスポンスの分析
CODE BLUE 2016
Webアプリをクローリングしながら疑似攻撃
レスポンスを分析して脆弱性を判定
Webアプリケーション診断とは?
MBSD
診断員Web Server
Web Apps診断ベンダ 顧客
疑似攻撃
SQLi?
XSS?
レスポンスの分析
CODE BLUE 2016
Webアプリをクローリングしながら疑似攻撃
レスポンスを分析して脆弱性を判定
Webアプリケーション診断の課題
MBSD CODE BLUE 2016
診断員の職人技に大きく依存
最終目標
全自動Webアプリ診断の実現
MBSD
人工知能Web Server
Web Apps診断ベンダ 顧客
疑似攻撃
レスポンスの分析
CODE BLUE 2016
SQLi?
XSS?
診断AI「SAIVS」
MBSD CODE BLUE 2016
自律的にWebアプリ診断を行うAI
SAIVS
Spider Artificial Intelligence Vulnerability Scanner
SAIVSの能力
MBSD
Webアプリのクローリング
脆弱性の検出
CODE BLUE 2016
SAIVSの能力
MBSD
Webアプリのクローリング
脆弱性の検出
CODE BLUE 2016
クローリングの重要性
MBSD CODE BLUE 2016
Top Login
Register Confirm
Contact Us
My Page
Complete
Send
message
脆弱性
クローリングの重要性
MBSD CODE BLUE 2016
Top Login
Register Confirm
Contact Us
My Page
Complete
正しくログインすることが必要
Send
message
クローリングの重要性
MBSD CODE BLUE 2016
Top Login
Register Confirm
Contact Us
My Page
Complete
正しく会員登録することが必要
Send
message
クローリングの重要性
MBSD CODE BLUE 2016
Top Login
Register Confirm
Contact Us
My Page
Complete
網羅的に正しくページ遷移することが重要
Send
message
MBSD
Webアプリのクローリングって難しい
なぜ?
CODE BLUE 2016
このページは何?
MBSD
人間:キーワードを基に容易にページ種別を認識
機械:困難(ログイン?会員登録?)CODE BLUE 2016
何が起きたのか?
MBSD
人間:メッセ―ジ内容から遷移失敗を認識
機械:メッセージの解釈は困難CODE BLUE 2016
フォームに入力する文字は?
MBSD
遷移
人間:入力フォームに正しい文字列を入力
機械:フォームの意味解釈は困難
???
???
???
???
???
CODE BLUE 2016
MBSD
クローリングには複雑な思考が必要
CODE BLUE 2016
クローリングの3要件
MBSD
ページ種別の認識
遷移成否の認識
最適文字の入力
CODE BLUE 2016
MBSD CODE BLUE 2016
どのように実現するか?
本研究のアプローチ
MBSD CODE BLUE 2016
人間の脳をリバースエンジニアリング
本研究のアプローチ
MBSD CODE BLUE 2016
各思考パターンを
機械学習アルゴリズムで実現
クローリングの3要件
MBSD
ページ種別の認識
遷移成否の認識
最適文字の入力
CODE BLUE 2016
人間によるページ種別認識
MBSD CODE BLUE 2016
人間によるページ種別認識
MBSD CODE BLUE 2016
ページ種別を特徴付けるキーワードで認識
機械によるページ種別認識
MBSD CODE BLUE 2016
ナイーブベイズを使う
ナイーブベイズ?
テキスト分類に使用される機械学習アルゴリズム
カテゴリテーブルと確率理論を使用
MBSD
利用例)
スパムメールフィルタ
ブログ記事のカテゴリ自動分類
WAFの攻撃検知率向上
CODE BLUE 2016
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の確率を求め、確率が高いカテゴリを選択
スパムメールフィルタへの利用例
CODE BLUE 2016
MBSD CODE BLUE 2016
ナイーブベイズによるページ種別認識
ナイーブベイズによるページ種別認識
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>
ページを特徴付けるキーワードを抽出
ストップワードは除外
CODE BLUE 2016
ページ種別認識のカテゴリテーブル
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 …
CODE BLUE 2016
抽出したキーワードが多く含まれるカテゴリを選択
keywords : Sign in, Email, Password
ページ種別認識のカテゴリテーブル
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 …
CODE BLUE 2016
「ログイン」に多く含まれる
⇒カテゴリ「ログイン」の確率が最も高い
MBSD CODE BLUE 2016
ナイーブベイズによるページ種別認識
「ログイン」と認識
クローリングの3要件
MBSD
ページ種別の認識 (✔)
遷移成否の認識
最適文字の入力
CODE BLUE 2016
MBSD CODE BLUE 2016
人間によるページ遷移成否の認識
MBSD CODE BLUE 2016
人間によるページ遷移成否の認識
遷移失敗を特徴付けるキーワードで判断
MBSD CODE BLUE 2016
ナイーブベイズを使う
機械による遷移成否認識
MBSD CODE BLUE 2016
機械による遷移成否認識
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>
CODE BLUE 2016
遷移成否を特徴付けるキーワードを抽出
ストップワードは除外
機械による遷移成否認識
遷移成否認識のカテゴリテーブル
MBSD
カテゴリ キーワード
遷移成功good, valid, success, normal, fine, clean, nice,
can, match, confirmation, ok, finish, thank …
遷移失敗bad, invalid, failure, error, problem, unmatch,
doesn’t match, can’t, too, wrong, ng, blank …
CODE BLUE 2016
抽出したキーワードが多く含まれるカテゴリを選択
keywords : errors, problem, doesn’t match, invalid
遷移成否認識のカテゴリテーブル
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 …
CODE BLUE 2016
「遷移失敗」に多く含まれる
⇒カテゴリ「遷移失敗」の確率が最も高い
MBSD CODE BLUE 2016
機械による遷移成否認識
「遷移失敗」と認識
クローリングの3要件
MBSD
ページ種別の認識 (✔)
遷移成否の認識 (✔)
最適文字の入力
CODE BLUE 2016
MBSD
人間による最適文字の入力
CODE BLUE 2016
フォームの意味を解釈し、正しい文字を入力
遷移
Isao Takaesu
mbsd1234
mbsd1234
機械による最適文字の入力
MBSD CODE BLUE 2016
多層パーセプトロン(MLP)、Q学習を使う
多層パーセプトロン(MLP)?
画像認識などに使用される機械学習アルゴリズム
生物の神経回路構造と機能を模したモデル
MBSD
利用例)
画像認識
手書き数字認識
CODE BLUE 2016
・・・
・・・
・・・
Data Label
0
1
2
学習データ
手書き数字認識への利用例
CODE BLUE 2016MBSD
・・・
・・・
・・・
X₁
X₂
X784
X0
Y₁
Y₂
Y300
Y0
Z₁
Z₂
Z10
MLP
学習
入力データに応じた”答え”を出力することが可能
学習済みMLP
014679 425970401967
手書き数字認識への利用例
CODE BLUE 2016MBSD
Q学習?
エージェントの最良行動を学習する機械学習アルゴリズム
行動の良し悪しをQ値で評価
MBSD
利用例)
ロボットの歩行動作習得
ビデオゲームのプレイ
経路探索
CODE BLUE 2016
ロボット歩行動作習得への利用例
MBSD CODE BLUE 2016
エージェント
環境
a1 前進
a2 左折
a3 右折
a4 後退
行動
状態 s
・・・
次の状態 s’
方策 ( a | s ) 遷移確率 ( s’ | s, a )
目の前に穴が…
報酬 r = R( s, a, s’ )
タスク:障害物を避けてゴールすること
報酬の合計が最大となる方策を学習
Q( s, a )値の更新
最適な文字入力を実現するモデル
MBSD
遷移試行を繰り返しながら最適な入力文字列を学習CODE BLUE 2016
・・・
・・・
遷移元ページ
MLP
入力値
Q学習
遷移先ページ
p1=abc, xyz・・・
p1=123, 12a・・・
p1=abc@xxx・・・
状態観測
評価
重み更新
最適な文字入力を実現するモデル
MBSD
遷移試行を繰り返しながら最適な入力文字列を学習CODE BLUE 2016
・・・
・・・
遷移元ページ
MLP
入力値
Q学習
遷移先ページ
p1=abc, xyz・・・
p1=123, 12a・・・
p1=abc@xxx・・・
状態観測
評価
重み更新
入力値のパターン
MBSD
パターン 入力値
英字のみ abc, abcdef, aBc, aBcdEf, ABCDEF …
数字のみ 123, 12345, 4111111111111111 …
英字・数字 abc123, 123abc, aBc123, 1a2b3c …
英字・記号 abc!, abc!#$, abcdef!, abcdef!#$ …
数字・記号 123!, 123!#$, 12345!, !#$12345 …
英字・数字・記号 abc123!, 123abc!, abc!123, !#$%&a1 …
メアド風 [email protected], [email protected] …
CODE BLUE 2016
入力値の組み合わせをパラメータに設定
対象:INPUT TYPE = text, password
学習の流れ
MBSD
遷移元/遷移先ページをMLPに入力CODE BLUE 2016
・・・
・・・
遷移元ページ
MLP
入力値
Q学習
遷移先ページ
p1=abc, xyz・・・
p1=123, 12a・・・
p1=abc@xxx・・・
状態観測
評価
重み更新
学習の流れ
MBSD
(入力に対する)何れかの入力値パターンを選択CODE BLUE 2016
・・・
・・・
遷移元ページ
MLP
入力値
Q学習
遷移先ページ
p1=abc, xyz・・・
p1=123, 12a・・・
p1=abc@xxx・・・
状態観測
評価
重み更新
学習の流れ
MBSD
MLPが選択した入力値パターンで遷移を試行CODE BLUE 2016
・・・
・・・
遷移元ページ
MLP
入力値
Q学習
遷移先ページ
p1=abc, xyz・・・
p1=123, 12a・・・
p1=abc@xxx・・・
状態観測
評価
重み更新
学習の流れ
MBSD
遷移試行の結果を観測CODE BLUE 2016
・・・
・・・
遷移元ページ
MLP
入力値
Q学習
遷移先ページ
p1=abc, xyz・・・
p1=123, 12a・・・
p1=abc@xxx・・・
状態観測
評価
重み更新
学習の流れ
MBSD
遷移結果に応じた報酬の付与(Q値の更新)CODE BLUE 2016
・・・
・・・
遷移元ページ
MLP
入力値
Q学習
遷移先ページ
p1=abc, xyz・・・
p1=123, 12a・・・
p1=abc@xxx・・・
状態観測
評価
重み更新
学習の流れ
MBSD
MLPの重みを更新(バックプロパゲーション)CODE BLUE 2016
・・・
・・・
遷移元ページ
MLP
入力値
Q学習
遷移先ページ
p1=abc, xyz・・・
p1=123, 12a・・・
p1=abc@xxx・・・
状態観測
評価
重み更新
学習の流れ
MBSD
300回程度の試行で学習可能CODE BLUE 2016
・・・
・・・
遷移元ページ
MLP
入力値
Q学習
遷移先ページ
p1=abc, xyz・・・
p1=123, 12a・・・
p1=abc@xxx・・・
状態観測
評価
重み更新
問題
MBSD CODE BLUE 2016
300回の試行 ⇒ 効率が悪い
MBSD CODE BLUE 2016
本番前に訓練を行う
解決方法
遷移の訓練に使用したWebアプリ(一例)
MBSD
OWASP Broken Web Apps
CODE BLUE 2016
SAIVSの訓練
MBSD CODE BLUE 2016
BodgeIt peruggia WackoPicko Yazd
SAIVS遷移試行&学習
⇒ 各300回
各入力フォームに対する最適文字列の獲得
・・・
Web Apps
訓練で獲得した最適文字列(一例)
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 …
Email address [email protected], [email protected] …
Username abc, abcdef, aBc, aBcdEf, ABCDEF …
Signature abc, abcdef, aBc, aBcdEf, ABCDEF …
CODE BLUE 2016
問題:添え字の不一致
MBSD CODE BLUE 2016
訓練時 診断時
不一致!!
MBSD CODE BLUE 2016
添え字の類似度を求める
解決方法
類似度の算出
MBSD CODE BLUE 2016
word2vecを使う
word2vec?
単語同士の類似度を求める自然言語処理の手法
単語をベクトルで表現
MBSD CODE BLUE 2016
利用例)
単語の類似度
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
類似度計算への利用例
MBSD CODE BLUE 2016
注目単語周辺の単語を基に類似度を計算
学習データ)
interpretation further. However, if anyone wishes to discuss this, I‘m certainly willing
(either offline - e-mail - or Stephen In article [email protected] (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 [email protected] saying help send atheism/index
and it will mail back a reply. mathew An・・・
send mail to [email protected] 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」の類似度は高い
word2vecの学習データ
MBSD CODE BLUE 2016
The 20 Newsgroups data set.
約2万のニュースグループドキュメント集
ニュースグループ例)
コンピュータ(Graphics, MS-Windows, Hardware)
サイエンス(Cryptography, Electronics, Space)
趣味(Motorcycles, Baseball, Hockey)
SAIVSの訓練
MBSD CODE BLUE 2016
Windows Crypt Hardware Space
SAIVS
The 20 Newsgroups data set
類似度の学習
単語同士の類似度の習得
・・・
word2vec
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
CODE BLUE 2016
候補 類似度
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
訓練で獲得した類似単語
上位10個の候補単語を抽出
Target :websiteTarget :nameTarget : e-mail
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
CODE BLUE 2016
候補 類似度
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
訓練で獲得した類似単語
訓練時の添え字と一致する候補単語を選択
Target :websiteTarget :nameTarget : e-mail
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
CODE BLUE 2016
候補 類似度
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
訓練で獲得した類似単語
⇒ [email protected] ⇒ aBcdEf ⇒ http://hoge.com
Target :websiteTarget :nameTarget : e-mail
クローリングの3要件
MBSD
ページ種別の認識 (✔)
遷移成否の認識 (✔)
最適文字の入力 (✔)
CODE BLUE 2016
クローリングのデモ
MBSD
Target:OWASP Broken Web Apps Cyclone
CODE BLUE 2016
クローリングのデモ
MBSD CODE BLUE 2016
Top Login
Register Confirm
User Search
Complete
1.Registerでアカウント作成
2.ログイン
3.ユーザ検索
脆弱性
クローリングのデモ
MBSD CODE BLUE 2016
Top Login
Register Confirm
User Search
Complete
1.Registerでアカウント作成
2.ログイン
3.ユーザ検索
クローリングのデモ
MBSD CODE BLUE 2016
Top Login
Register Confirm
User Search
Complete
1.Registerでアカウント作成
2.ログイン
3.ユーザ検索
クローリングのデモ
MBSD CODE BLUE 2016
Top Login
Register Confirm
User Search
Complete
1.Registerでアカウント作成
2.ログイン
3.ユーザ検索
クローリングのデモ
MBSD CODE BLUE 2016
Top Login
Register Confirm
User Search
Complete
1.Registerでアカウント作成
2.ログイン
3.ユーザ検索
MBSD CODE BLUE 2016
https://www.youtube.com/watch?v=aXw3vgXbl1U
クローリングのデモ動画
SAIVSの能力
MBSD
Webアプリのクローリング(✔)
脆弱性の検出
CODE BLUE 2016
本研究の目的
MBSD CODE BLUE 2016
少ない手数で脆弱性を検出
MBSD CODE BLUE 2016
Webアプリの脆弱性も色々あるが…
本研究の対象
MBSD CODE BLUE 2016
Reflected Cross-Site Scripting
(RXSS)
RXSSの例①:超脆弱なアプリ
MBSD
<html><head><meta http-equiv="Content-Type" content="text/html"><title>Case 3 - RXSS</title></head><body><input type="text" value="testData"></body></html>
http://xxx/case3/?input=testData
入力値がINPUTタグのVALUE属性内にエコーバック
CODE BLUE 2016
RXSSの例①: 攻撃された様子
MBSD
<html><head><meta http-equiv="Content-Type" content="text/html"><title>Case 3 - RXSS</title></head><body><input type="text" value=""/><script>alert('XSS');</script>"></body></html>
http://xxx/case3/?input="/><script>alert(‘XSS');</script>
HTML内へのスクリプト埋め込み
CODE BLUE 2016
RXSSの例②:ちょっとセキュアなアプリ
MBSD
<html><head><meta http-equiv="Content-Type" content="text/html"><title>Case 4 - RXSS</title></head><body><input type="text" value=""/> alert('XSS');"></body></html>
SCRIPTタグのサニタイズ
http://xxx/case4/?input="/><script>alert(‘XSS');</script>
CODE BLUE 2016
RXSSの例②:攻撃された様子
MBSD
<html><head><meta http-equiv="Content-Type" content="text/html"><title>Case 4 - RXSS</title></head><body><input type="text" value=""onmouseout=alert('XSS')""></body></html>
サニタイズを回避してスクリプト埋め込み
http://xxx/case4/?input=“onmouseout=alert(‘XSS')”
CODE BLUE 2016
RXSS検出の3要件
MBSD
HTML構文の理解
JavaScript構文の理解
サニタイズの回避
CODE BLUE 2016
MBSD CODE BLUE 2016
どのように実現するか?
本研究のアプローチ
MBSD CODE BLUE 2016
人間の脳をリバースエンジニアリング
本研究のアプローチ
MBSD CODE BLUE 2016
各思考パターンを
機械学習アルゴリズムで実現
RXSS検出の3要件
MBSD
HTML構文の理解
JavaScript構文の理解
サニタイズの回避
CODE BLUE 2016
MBSD
機械によるHTML/JavaScriptの理解
LSTMを使う
CODE BLUE 2016
LSTM(Long-Short Term Memory)?
時系列データの学習が可能な機械学習アルゴリズム
短期的・長期的なデータ間の依存関係を学習可能
MBSD
利用例)
機械翻訳
文書生成(小説、歌詞、ソースコード)
音生成(音楽、声)
CODE BLUE 2016
LSTM(Long-Short Term Memory)?
時系列データの学習が可能な機械学習アルゴリズム
短期的・長期的なデータ間の依存関係を学習可能
MBSD
利用例)
機械翻訳
文書生成(小説、歌詞、ソースコード)
音生成(音楽、声)
CODE BLUE 2016
文書生成への利用例
MBSD CODE BLUE 2016
ソースコードの生成(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の生成コード
起点(シード)を基に次々とコードを生成
なぜLSTMなのか?
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内にエコーバック
CODE BLUE 2016
なぜLSTMなのか?
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>
スクリプトは動作しない
⇒単純なスクリプト挿入は不可
CODE BLUE 2016
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タグを閉じた後にスクリプト挿入?」
CODE BLUE 2016
なぜLSTMなのか?
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></textarea>・・・
http://xxx/textarea1?in=</textarea><script>alert(‘XSS’);</script>
CODE BLUE 2016
なぜLSTMなのか?
文脈を理解してスクリプトを挿入
⇒ スクリプトが動く
MBSD CODE BLUE 2016
どのようにしてLSTMを学習させるか?
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種類)
CODE BLUE 2016
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));
CODE BLUE 2016
LSTMの学習データ(JavaScript)
1万ページ分のJavaScript構文
学習済み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
CODE BLUE 2016
シードに対応した構文生成が可能
RXSS検出の3要件
MBSD
HTML構文の理解(✔)
JavaScript構文の理解(✔)
サニタイズの回避
CODE BLUE 2016
機械によるサニタイズの回避
MBSD CODE BLUE 2016
多層パーセプトロン(MLP)、Q学習を使う
MBSD
・・・
・・・
属性値
JS内
・・・
出力箇所
MLP
タグの外
“sCriPt”
他のタグ
URL encode
検査パターン
Event handler
・・・
Q学習
状態観測
サニタイズ回避を実現するモデル
・・・
評価
重み更新
“ ⇒ "
< ⇒ <
・・・
サニタイズ
> ⇒ >
検査試行を繰り返しながらサニタイズ回避パターンを学習CODE BLUE 2016
MBSD
・・・
・・・
属性値
JS内
・・・
出力箇所
MLP
タグの外
“sCriPt”
他のタグ
URL encode
検査パターン
Event handler
・・・
Q学習
状態観測
サニタイズ回避を実現するモデル
・・・
評価
重み更新
“ ⇒ "
< ⇒ <
・・・
サニタイズ
> ⇒ >
CODE BLUE 2016
出力箇所のパターン
MBSD
出力箇所 例
属性値 : 「”」 <~value="xxx">
属性値 : 「'」 <~value='xxx'>
属性値 : noquote <~value=xxx>
JavaScript 内 <script>xxx</script>
HTML タグの外側 <~>xxx</~>
CODE BLUE 2016
MBSD
・・・
・・・
属性値
JS内
・・・
出力箇所
MLP
タグの外
“sCriPt”
他のタグ
URL encode
検査パターン
Event handler
・・・
Q学習
状態観測
サニタイズ回避を実現するモデル
・・・
評価
重み更新
“ ⇒ "
< ⇒ <
・・・
サニタイズ
> ⇒ >
CODE BLUE 2016
サニタイズのパターン
MBSD
サニタイズ 例
「“」の実体参照への変換・排除 「”」⇒「"」
「‘」の実体参照への変換・排除 「’」⇒「'」
「<」の実体参照への変換・排除 「<」⇒「<」
「>」の実体参照への変換・排除 「>」⇒「>」
「alert();」の排除 「alert();」⇒「」
CODE BLUE 2016
MBSD
・・・
・・・
属性値
JS内
・・・
出力箇所
MLP
タグの外
“sCriPt”
他のタグ
URL encode
検査パターン
Event handler
・・・
Q学習
状態観測
サニタイズ回避を実現するモデル
・・・
評価
重み更新
“ ⇒ "
< ⇒ <
・・・
サニタイズ
> ⇒ >
CODE BLUE 2016
検査パターン(一例)
MBSD
出力箇所 検査パターン
「”」で囲まれた属性値「'」で囲まれた属性値noquoteの属性値HTML タグの外側
“event handler
"><sCriPt>xxx
"><img src=xxx
‘event handler
‘><sCriPt>xxx
<svg/onload=alert()>
<sCriPt>xxx</sCriPt>
JavaScript 内
";alert();//
[CR][LF]alert();
¥";alert();//
CODE BLUE 2016
MBSD
・・・
・・・
属性値
JS内
・・・
出力箇所
MLP
タグの外
“sCriPt”
他のタグ
URL encode
検査パターン
Event handler
・・・
Q学習
状態観測
学習の流れ
・・・
評価
重み更新
“ ⇒ "
< ⇒ <
・・・
サニタイズ
> ⇒ >
出力箇所/サニタイズパターンをMLPに入力CODE BLUE 2016
MBSD
・・・
・・・
属性値
JS内
・・・
出力箇所
MLP
タグの外
“sCriPt”
他のタグ
URL encode
検査パターン
Event handler
・・・
Q学習
状態観測
学習の流れ
・・・
評価
重み更新
“ ⇒ "
< ⇒ <
・・・
サニタイズ
> ⇒ >
(入力に対する)何れかの検査パターンを選択CODE BLUE 2016
MBSD
・・・
・・・
属性値
JS内
・・・
出力箇所
MLP
タグの外
“sCriPt”
他のタグ
URL encode
検査パターン
Event handler
・・・
Q学習
状態観測
学習の流れ
・・・
評価
重み更新
“ ⇒ "
< ⇒ <
・・・
サニタイズ
> ⇒ >
MLPが選択した検査パターンで検査を試行CODE BLUE 2016
MBSD
・・・
・・・
属性値
JS内
・・・
出力箇所
MLP
タグの外
“sCriPt”
他のタグ
URL encode
検査パターン
Event handler
・・・
Q学習
状態観測
学習の流れ
・・・
評価
重み更新
“ ⇒ "
< ⇒ <
・・・
サニタイズ
> ⇒ >
検査結果を観測CODE BLUE 2016
MBSD
・・・
・・・
属性値
JS内
・・・
出力箇所
MLP
タグの外
“sCriPt”
他のタグ
URL encode
検査パターン
Event handler
・・・
Q学習
状態観測
学習の流れ
・・・
評価
重み更新
“ ⇒ "
< ⇒ <
・・・
サニタイズ
> ⇒ >
検査結果に応じた報酬の付与(Q値の更新)CODE BLUE 2016
MBSD
・・・
・・・
属性値
JS内
・・・
出力箇所
MLP
タグの外
“sCriPt”
他のタグ
URL encode
検査パターン
Event handler
・・・
Q学習
状態観測
学習の流れ
・・・
評価
重み更新
“ ⇒ "
< ⇒ <
・・・
サニタイズ
> ⇒ >
MLPの重みを更新(バックプロパゲーション)CODE BLUE 2016
MBSD
・・・
・・・
属性値
JS内
・・・
出力箇所
MLP
タグの外
“sCriPt”
他のタグ
URL encode
検査パターン
Event handler
・・・
Q学習
状態観測
学習の流れ
・・・
評価
重み更新
“ ⇒ "
< ⇒ <
・・・
サニタイズ
> ⇒ >
100回程度の試行で最適な検査パターンを学習可能CODE BLUE 2016
問題
MBSD CODE BLUE 2016
100回の試行 ⇒ 効率が悪い
MBSD CODE BLUE 2016
本番前に訓練を行う
訓練に使用したWebアプリ(一例)
MBSD
WAVSEP
CODE BLUE 2016
ReflectedXSS GET Input Vector
Case06 出力箇所 :IMG タグの SRC 属性値サニタイズ:< , > ⇒ < , >
検査例 :"onmouseover=alert(3122);"
Case10 出力箇所 :SCRIPT タグの onClick 値サニタイズ:“ , < , > ⇒ " , < , >
検査例 :';alert(3122);//
Case27 出力箇所 :JavaScript の単行コメント内サニタイズ:コメントアウト検査例 :[CR][LF]alert(3122);//
SAIVSの訓練
MBSD CODE BLUE 2016
Case06 Case08 Case10 Case27
SAIVS
WAVSEP
検査試行&学習
⇒各100回
各サニタイズパターンを回避する検査文字列の獲得
・・・
RXSS検出の3要件
MBSD
HTML構文の理解(✔)
JavaScript構文の理解(✔)
サニタイズの回避(✔)
CODE BLUE 2016
MBSD
SAIVSの検査フロー
第1次検査
第2次検査
CODE BLUE 2016
出力箇所を調べるために正常リクエストを送信
MBSD
Web Server
Web AppsSAIVS
正常リクエスト送信
CODE BLUE 2016
第1次検査
入力値の出力箇所を認識
MBSD
Web Server
Web AppsSAIVS
正常リクエスト送信
レスポンスの分析
CODE BLUE 2016
第1次検査
<~value="xxx">
出力箇所を基にシードを抽出
MBSD
Web Server
Web AppsSAIVS
正常リクエスト送信
レスポンスの分析
CODE BLUE 2016
第1次検査
<~value="xxx">
シードに対応したHTML/JSを生成
(学習済みLSTMを使用)
MBSD
Web Server
Web AppsSAIVS
正常リクエスト送信
レスポンスの分析
CODE BLUE 2016
第1次検査
<~value=“”>
生成したHTML / JavaScriptにスクリプトを付与
MBSD
Web Server
Web AppsSAIVS
正常リクエスト送信
レスポンスの分析
CODE BLUE 2016
第1次検査
<~value=“”><script>alert(3122);</script>
RXSSを検出するために検査リクエストを送信
MBSD
Web Server
Web AppsSAIVS
検査リクエスト送信
CODE BLUE 2016
第1次検査
<~value=“”><script>alert(3122);</script>
RXSS有無を判定
検出 ⇒ 検査終了、未検出 ⇒ 第2次検査へ
MBSD
Web Server
Web AppsSAIVS
検査リクエスト送信
レスポンスの分析
CODE BLUE 2016
第1次検査
RXSSあり?なし?
サニタイズのパターンを特定
MBSD
Web Server
Web AppsSAIVS
検査リクエスト送信
レスポンスの分析
CODE BLUE 2016
第2次検査
<~value=“”><script>alert(3122);・・・
サニタイズ回避可能な検査パターンを選択
(学習済みMLPを使用)
MBSD
Web Server
Web AppsSAIVS
検査リクエスト送信
レスポンスの分析
CODE BLUE 2016
第2次検査
Event handler?
サニタイズを回避する検査リクエストを送信
MBSD
Web Server
Web AppsSAIVS
検査リクエスト再送信
CODE BLUE 2016
第2次検査
Event handler?
RXSS有無を判定
検出 ⇒ 検査終了、未検出 ⇒ 第2次検査を再試行
MBSD
Web Server
Web AppsSAIVS
検査リクエスト再送信
レスポンスの分析
CODE BLUE 2016
第2次検査
RXSSあり?なし?
RXSS検出のデモ
MBSD
Target:webseclab
CODE BLUE 2016
Caseサニタイズ
出力箇所/サニタイズ
/reflect/full1 × BODY タグ内
/reflect/textarea1 × TEXTAREA タグ内
/reflect/onmouseover 〇INPUTタグの属性値入力値からタグ閉じが削除
/reflect/js4_dq × SCRIPT タグ内
RXSS検出のデモ
MBSD
Target:webseclab
CODE BLUE 2016
Caseサニタイズ
出力箇所/サニタイズ
/reflect/full1 × BODY タグ内
/reflect/textarea1 × TEXTAREA タグ内
/reflect/onmouseover 〇INPUTタグの属性値入力値からタグ閉じが削除
/reflect/js4_dq × SCRIPT タグ内
MBSD
<!doctype html><html><head><title>Full JavascriptInjection (full.1)</title></head><body>Hello!<BR>The value of cgi parameter "in" is:saivs12345</body></html>
http://xxx/reflect/full1?in=saivs12345
出力箇所 :BODYタグ内
サニタイズ:なし
Case1:正常リクエスト送信時
CODE BLUE 2016
MBSD
<!doctype html><html><head><title>Full JavascriptInjection (full.1)</title></head><body>Hello!<BR>The value of cgi parameter "in" is:lasther=''></form>D0i7Q"VW53N'nT7t0<script>alert(3122);kc5i3</script>ueFj8</body></html>
http://xxx/reflect/full1?in=lasther=''%3E%3C/form%3ED0i7Q%22VW
53N'nT7t0%3Cscript%3Ealert(3122);kc5i3%3C/script%3EueFj8
試行回数:1回
Case1:検査リクエスト送信時
CODE BLUE 2016
MBSD
Case1:検査の動画
CODE BLUE 2016
https://www.youtube.com/watch?v=3RkhSED5DQU
RXSS検出のデモ
MBSD
Target:webseclab
CODE BLUE 2016
Caseサニタイズ
出力箇所/サニタイズ
/reflect/full1 × BODY タグ内
/reflect/textarea1 × TEXTAREA タグ内
/reflect/onmouseover 〇INPUTタグの属性値入力値からタグ閉じが削除
/reflect/js4_dq × SCRIPT タグ内
MBSD
<!doctype html><html><head><title>Reflected XSS in textarea (textarea1)</title></head><body><H2>Textarea injection test</H2><p><FORM><textarea name="in" rows="5" cols="60">saivs12345</textarea><p>
http://xxx/reflect/textarea1?in=saivs12345
出力箇所 :TEXTAREAタグ内
サニタイズ:なし
Case2:正常リクエスト送信時
CODE BLUE 2016
MBSD
<!doctype html><html><head><title>Reflected XSS in textarea (textarea1)</title></head><body><H2>Textarea injection test</H2><p><FORM><textarea name="in" rows="5" cols="60"></textarea>7Q7pN"MBPcc'PA6tz<script>alert(3122);WKr8J</script>fowCP</textarea><p>
http://xxx/reflect/textarea1?in=%3C/textarea%3E7Q7pN%22MBPcc'
PA6tz%3Cscript%3Ealert(3122);WKr8J%3C/script%3EfowCP
試行回数:1回
Case2:検査リクエスト送信時
CODE BLUE 2016
MBSD
Case2:検査の動画
CODE BLUE 2016
https://www.youtube.com/watch?v=6UHbMGdqr_0
RXSS検出のデモ
MBSD
Target:webseclab
CODE BLUE 2016
Caseサニタイズ
出力箇所/サニタイズ
/reflect/full1 × BODY タグ内
/reflect/textarea1 × TEXTAREA タグ内
/reflect/onmouseover 〇INPUTタグの属性値入力値からタグ閉じが削除
/reflect/js4_dq × SCRIPT タグ内
MBSD
<!doctype html><html><head><title>Reflected XSS - attribute injection in tags (dq.2)</title></head><body><H2>Update Your Preferences</H2><p><FORM>Homepage: <input value=""><script>alert()" name="in" size="40"><BR>
http://xxx/xss/reflect/onmouseover?in=”><script>alert()</script>
出力箇所 :INPUTタグ内
サニタイズ:タグ閉じの削除
Case3:正常リクエスト送信時
CODE BLUE 2016
MBSD
<!doctype html><html><head><title>Reflected XSS - attribute injection in tags (dq.2)</title></head><body><H2>Update Your Preferences</H2><p><FORM>Homepage: <input value=""> <option s onmouseover=alert(3122);//" name="in" size="40"><BR>
http://xxx/xss/reflect/onmouseover?in=%22%3E%3C/option%3E%3
Coption%20s%20onmouseover=alert(3122);//
試行回数:3回
Case3:検査リクエスト送信時
CODE BLUE 2016
MBSD
Case3:検査の様子
CODE BLUE 2016
https://www.youtube.com/watch?v=-r3C1moUVqU
RXSS検出のデモ
MBSD
Target:webseclab
CODE BLUE 2016
Caseサニタイズ
出力箇所/サニタイズ
/reflect/full1 × BODY タグ内
/reflect/textarea1 × TEXTAREA タグ内
/reflect/onmouseover 〇INPUTタグの属性値入力値からタグ閉じが削除
/reflect/js4_dq × SCRIPT タグ内
MBSD
<!doctype html><html><head><title>JavaScript anddouble-quote injection in JS block (js.4)</title></head><body><script language="javascript">var f = {date: "",week: "1",bad: "saivs12345",phase: "2",
http://xxx/xss/reflect/js4_dq?in=saivs12345
出力箇所 :SCRIPTタグ内
サニタイズ:なし
Case4:正常リクエスト送信時
CODE BLUE 2016
MBSD
<!doctype html><html><head><title>JavaScript anddouble-quote injection in JS block (js.4)</title></head><body><script language="javascript">var f = {date: "",week: "1",bad: "6",skuI;alert(3122);//1VU7k",phase: "2",
http://xxx/xss/reflect/js4_dq?in=6%22,%0A%20%20%20%20%20%20
%20%20%20%20%20%20skuI;alert(3122);//1VU7k
試行回数:1回
Case4:検査リクエスト送信時
CODE BLUE 2016
MBSD
Case4:検査の様子
CODE BLUE 2016
https://www.youtube.com/watch?v=Pf2lSB25C3M
SAIVSの能力
MBSD CODE BLUE 2016
Webアプリのクローリング (✔)
脆弱性の検出 (✔)
SAIVSの能力
MBSD CODE BLUE 2016
「WebアプリをクローリングしながらRXSSを検出」
これを、全自動で実現
SAIVSのデモ
MBSD
Target:OWASP Broken Web Apps Google Gruyere
CODE BLUE 2016
SAIVSのデモ
MBSD CODE BLUE 2016
Top Sign up
Login New snippet
Sign up
complete
1.Sign upでアカウント作成
2.ログイン
3.Snippet 登録
4.Profile 更新
Profile
New snippet
register
Profile
update
脆弱性
SAIVSのデモ
MBSD CODE BLUE 2016
Top Sign up
Login New snippet
Sign up
complete
1.Sign upでアカウント作成
2.ログイン
3.Snippet 登録
4.Profile 更新
Profile
New snippet
register
Profile
update
SAIVSのデモ
MBSD CODE BLUE 2016
Top Sign up
Login New snippet
Sign up
complete
1.Sign upでアカウント作成
2.ログイン
3.Snippet 登録
4.Profile 更新
Profile
New snippet
register
Profile
update
SAIVSのデモ
MBSD CODE BLUE 2016
Top Sign up
Login New snippet
Sign up
complete
1.Sign upでアカウント作成
2.ログイン
3.Snippet 登録
4.Profile 更新
Profile
New snippet
register
Profile
update
SAIVSのデモ
MBSD CODE BLUE 2016
Top Sign up
Login
Sign up
complete
1.Sign upでアカウント作成
2.ログイン
3.Snippet 登録
4.Profile 更新
Profile Profile
update
New snippetNew snippet
register
SAIVSのデモ
MBSD CODE BLUE 2016
機能名サニタイズ
出力箇所/サニタイズ
New snippet register 〇BODY タグ内SCRIPTタグをサニタイズ
Profile update 〇A タグ内「<」「>」をサニタイズ
MBSD CODE BLUE 2016
SAIVSのデモ
https://www.youtube.com/watch?v=N5d9oM0NcM0
MBSD
クローリング能力の強化
複雑なアプリへの対応
CAPTCHAへの対応
CODE BLUE 2016
将来の展望
脆弱性検出能力の強化
複雑なRXSSパターンへの対応
他脆弱性への対応
• Download “.PDF” version of this document:
≫ http://www.mbsd.jp
MBSD