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 の閲覧履歴を弄るくらいなら可能。

※ページ内に 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 のセキュリティにより、拡張機能からページ上で定義されているメソッドをオーバーライドすることはできない。

Isolated World



左が拡張機能で定義されたスクリプト
右がサイト内で定義されたスクリプト
お互いに DOM 以外で干渉できないようになっている。

※ このの問題は、閲覧中のページに直接 script タグを埋め込むことで暫定対応しています。

Demo


こちらで Demo をお見せすることはできないので、簡単に内容を説明します。

リクエストの送信先として、 CSRF 脆弱性のあるチャットと攻撃ページを用意しました。

Method の項で紹介した攻撃方法で実際に CSRF 脆弱性を利用してチャットへ書き込みを行います。

今回作成した Chrome CSRF Guardian という拡張機能を有効にした状態で同様の攻撃を試し、挙動を確認します。

Results


Chrome CSRF Guardian を有効にしてページを開く
↓
location.origin を使用して外部サイトであるかの判定
↓
外部サイトへの通信時にはユーザへ警告
↓
ユーザが拒否した場合はリクエストを送信しない

Thank you for listening.




# 現在確認している問題点
  • DOMContentLoaded Event が呼ばれるまでの間、 XHR を制御できない

# 実装途中
  • ホワイトリスト、ブラックリスト機能


※間違っている箇所等ありましたらご指摘お願いします!

chrome csrf guardian

By ww24

chrome csrf guardian

  • 3,577