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,196