JavaScript Security
@ww24 (たけ)
Agenda
- CSRF
- Method
- Measure
- Chrome Extensions
- Demo
↓ ↓ ↓
こんにちは
ヾ(l _ l〃)ノ゙ 三ヾ(〃l _ l)ノ゙
Twitter: @ww24 (たけ)
# 職業
大学生プログラマ# 趣味
-
プログラミング (主に JavaScript)
-
旅行
CSRF
ユーザーの意図に反して外部のサイトに対して
リクエストを送信し、副作用を発生させる攻撃。
サーバからは正常なリクエストに見えるため、厄介。
Method
- CSRF の手法 -
Method
- Form 要素を使う
- XMLHttpRequest を使う
- Img 要素, Object 要素…etc
Form - Method
<body onload="document.form.submit()">
<form method="post" target="http://example.com/hoge.php">
<input type="hidden" name="data" value="hogehoge">
</form>
</body>
XMLHttpRequest - Method
<body>
<script>
var xhr = new XMLHttpRequest();
xhr.open("post", "http://example.com/piyo.php", true);
xhr.send("data=piyopiyo");
</script>
</body>
Others - Method
<img src="http://example.com/attack?data=foo">
<object data="http://example.com/attack?data=foo">
Measure
- CSRF クライアントサイドでの対策 -
Measure
JavaScript で通信を監視し、外部のサイトへのリクエストはユーザへ確認画面を出す。
Measure
# Form
-
document.form.submit のオーバーライド
- Submit Event の監視
Measure
# XMLHttpRequest
- XMLHttpRequest.prototype.open のオーバーライド
ちなみに、 Same Origin Policy では CSRF は防げない。
Access-Control-Allow-Origin ヘッダの有無に関わらず CSRF は成立する。
Measure
# Others
JavaScript だけでは無理。
ブラウザやセキュリティソフトレベルでないと制御不可能。
この方法では、リクエストに GET method しか使えない。
Amazon の閲覧履歴を弄るくらいなら可能。
この方法では、リクエストに GET method しか使えない。
Amazon の閲覧履歴を弄るくらいなら可能。
※ページ内に Amazon の商品ページの URL を入れた img タグ、 object タグを設置すると、閲覧履歴を更新できてしまうというもの。危険度は低いですが、 GET method でも副作用が生じる例です。
Chrome Extensions
- 対策例 -
Chrome Extensions
ページが読み込まれる前に拡張機能のスクリプトをロードして、
をオーバーライドする。
を監視する。
- document.form.submit
- XMLHttpRequest.prototype.open
をオーバーライドする。
- Submit Event
を監視する。
Chrome Extensions
( ^o^)CSRF 対策!
( ˘⊖˘) 。o(それ、 Chrome Extensions で実装できるのでは?)
|Google Chrome|┗(☋` )┓三
( ◠‿◠ )☛Isolated World *(Chrome のセキュリティ機能)
▂▅▇█▓▒░(’ω’)░▒▓█▇▅▂うわあああああ
※ Chrome のセキュリティにより、拡張機能からページ上で定義されているメソッドをオーバーライドすることはできない。
( ˘⊖˘) 。o(それ、 Chrome Extensions で実装できるのでは?)
|Google Chrome|┗(☋` )┓三
( ◠‿◠ )☛Isolated World *(Chrome のセキュリティ機能)
▂▅▇█▓▒░(’ω’)░▒▓█▇▅▂うわあああああ
※ Chrome のセキュリティにより、拡張機能からページ上で定義されているメソッドをオーバーライドすることはできない。
Isolated World
左が拡張機能で定義されたスクリプト
右がサイト内で定義されたスクリプト
お互いに DOM 以外で干渉できないようになっている。
右がサイト内で定義されたスクリプト
お互いに DOM 以外で干渉できないようになっている。
※ このの問題は、閲覧中のページに直接 script タグを埋め込むことで暫定対応しています。
Demo
こちらで Demo をお見せすることはできないので、簡単に内容を説明します。
リクエストの送信先として、 CSRF 脆弱性のあるチャットと攻撃ページを用意しました。
Method の項で紹介した攻撃方法で実際に CSRF 脆弱性を利用してチャットへ書き込みを行います。
今回作成した Chrome CSRF Guardian という拡張機能を有効にした状態で同様の攻撃を試し、挙動を確認します。
Results
Chrome CSRF Guardian を有効にしてページを開く
↓
location.origin を使用して外部サイトであるかの判定
↓
外部サイトへの通信時にはユーザへ警告
↓
ユーザが拒否した場合はリクエストを送信しない
↓
location.origin を使用して外部サイトであるかの判定
↓
外部サイトへの通信時にはユーザへ警告
↓
ユーザが拒否した場合はリクエストを送信しない
Thank you for listening.
# 現在確認している問題点
# 実装途中
※間違っている箇所等ありましたらご指摘お願いします!
- DOMContentLoaded Event が呼ばれるまでの間、 XHR を制御できない
- ホワイトリスト、ブラックリスト機能
※間違っている箇所等ありましたらご指摘お願いします!
chrome csrf guardian
By ww24
chrome csrf guardian
- 3,196