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.
re RainbowTwtr 構造化テキストの 安全 なエスケープ手法について Cybozu Labs, Inc. Kazuho Oku
Twitter  の  XSS  事件を覚えていますか ? <ul><li>@ の直後にある”がエスケープされないから、タグの属性を閉じることができた ⇒  XSS </li></ul><ul><ul><li>http://x.xx/@&quo...
XSS  の温床=間違った設計 <ul><li>Twitter 純正の HTML 化アルゴリズム </li></ul><ul><ul><ul><li>html = linkify_usernames( </li></ul></ul></ul><...
<ul><li>解決策:設計からやりなおし </li></ul>2010 年 9 月 30 日 re RainbowTwtr -  構造化テキストの安全なエスケープ手法について
でも… <ul><li>正しいコードを書くのって難しいよね ? </li></ul>2010 年 9 月 30 日 re RainbowTwtr -  構造化テキストの安全なエスケープ手法について
正常動作  >  バグ  >>  超えられない壁  >> XSS <ul><li>正しい設計は重要 </li></ul><ul><ul><li>from  プログラミングの観点 </li></ul></ul><ul><li>XSS  が起きにく...
Tweet  の  HTML  化問題を分割して考える <ul><li>Tweet  の  HTML  化とは何か </li></ul><ul><ul><li>まず  Tweet (= 構造化テキスト )  をパースして </li></ul><...
パース処理の具体例 <ul><li>@foo Hello  http://example.com/ </li></ul><ul><li>⇩ </li></ul><ul><li>( </li></ul><ul><li>[ ’user’ => ’f...
エンコード処理の実装例 <ul><li>for my $element (@tweet_elements) { </li></ul><ul><li>my ($type, $data) = @$element; </li></ul><ul><li...
重要なことなので、もう1回 <ul><li>エンコード処理が正しければ  XSS  起きない </li></ul><ul><ul><li>エンコード処理は簡単だったでしょ ? </li></ul></ul><ul><li>あとは、パース処理をど...
まとめ <ul><li>バグがあってもいいから、セキュアなプログラムを書こう </li></ul><ul><li>セキュアコーディングの観点からは、エンコード処理をできるだけ最後に、まとめて行うべき </li></ul><ul><ul><li>...
まとめ  (2) <ul><li>エンコード機能つきのミドルウェアを使おう </li></ul><ul><ul><li>例 :  たとえば  Template-Toolkit  を避ける </li></ul></ul><ul><ul><ul><...
参考資料 <ul><li>http://codezine.jp/article/detail/5472 </li></ul><ul><li>http://togetter.com/li/52475 </li></ul><ul><li>http:...
Upcoming SlideShare
Loading in …5
×

re RainbowTwtr - 構造化テキストの安全なエスケープ手法について

1,153 views

Published on

Published in: Technology
  • Be the first to comment

  • Be the first to like this

re RainbowTwtr - 構造化テキストの安全なエスケープ手法について

  1. 1. re RainbowTwtr 構造化テキストの 安全 なエスケープ手法について Cybozu Labs, Inc. Kazuho Oku
  2. 2. Twitter の XSS 事件を覚えていますか ? <ul><li>@ の直後にある”がエスケープされないから、タグの属性を閉じることができた ⇒ XSS </li></ul><ul><ul><li>http://x.xx/@&quot;style=&quot;color:pink&quot;onmouseover=alert(1)//&quot; </li></ul></ul>2010 年 9 月 30 日 re RainbowTwtr - 構造化テキストの安全なエスケープ手法について
  3. 3. XSS の温床=間違った設計 <ul><li>Twitter 純正の HTML 化アルゴリズム </li></ul><ul><ul><ul><li>html = linkify_usernames( </li></ul></ul></ul><ul><ul><ul><li>linkify_urls( </li></ul></ul></ul><ul><ul><ul><li>linkify_hashtags(tweet) </li></ul></ul></ul><ul><ul><ul><li>) </li></ul></ul></ul><ul><ul><ul><li>) </li></ul></ul></ul><ul><li>問題点 </li></ul><ul><ul><li>HTML への変換を多重に行っている </li></ul></ul><ul><ul><ul><li>リンクがリンク化されるのを防ぐための工夫で誤摩化す </li></ul></ul></ul><ul><ul><li>結果として処理が複雑になり、検証が困難 </li></ul></ul>2010 年 9 月 30 日 re RainbowTwtr - 構造化テキストの安全なエスケープ手法について
  4. 4. <ul><li>解決策:設計からやりなおし </li></ul>2010 年 9 月 30 日 re RainbowTwtr - 構造化テキストの安全なエスケープ手法について
  5. 5. でも… <ul><li>正しいコードを書くのって難しいよね ? </li></ul>2010 年 9 月 30 日 re RainbowTwtr - 構造化テキストの安全なエスケープ手法について
  6. 6. 正常動作 > バグ >> 超えられない壁 >> XSS <ul><li>正しい設計は重要 </li></ul><ul><ul><li>from プログラミングの観点 </li></ul></ul><ul><li>XSS が起きにくい設計 も 重要 </li></ul><ul><ul><li>from セキュアコーディングの観点 </li></ul></ul><ul><ul><li>XSS は直さないとヤバい </li></ul></ul><ul><ul><li>バグってても XSS が起きなければ優先度調整可能 </li></ul></ul>2010 年 9 月 30 日 re RainbowTwtr - 構造化テキストの安全なエスケープ手法について
  7. 7. Tweet の HTML 化問題を分割して考える <ul><li>Tweet の HTML 化とは何か </li></ul><ul><ul><li>まず Tweet (= 構造化テキスト ) をパースして </li></ul></ul><ul><ul><li>次にその構造を HTML エンコードする処理 </li></ul></ul><ul><li>パースとエンコードに分割する理由は ? </li></ul><ul><ul><li>パース結果が間違っていてもエンコード処理が正しければ XSS は発生しない </li></ul></ul><ul><ul><li>構造化テキストとは? </li></ul></ul><ul><ul><ul><li>ここでは、 @user やリンクなどの構造をもつテキストのこと </li></ul></ul></ul><ul><ul><ul><li>他の例 : Wiki や、はてなダイアリーのマークアップ </li></ul></ul></ul>2010 年 9 月 30 日 re RainbowTwtr - 構造化テキストの安全なエスケープ手法について
  8. 8. パース処理の具体例 <ul><li>@foo Hello http://example.com/ </li></ul><ul><li>⇩ </li></ul><ul><li>( </li></ul><ul><li>[ ’user’ => ’foo’ ], </li></ul><ul><li>[ ’text’ => ’ Hello ’ ], </li></ul><ul><li>[ ’link’ => ’http://example.com/’ ], </li></ul><ul><li>) </li></ul>2010 年 9 月 30 日 re RainbowTwtr - 構造化テキストの安全なエスケープ手法について
  9. 9. エンコード処理の実装例 <ul><li>for my $element (@tweet_elements) { </li></ul><ul><li>my ($type, $data) = @$element; </li></ul><ul><li>if ($type eq 'user') { </li></ul><ul><li>$html .= sprintf( </li></ul><ul><li>'@<a href=”http://twitter.com/%s&quot;>%s</a>', </li></ul><ul><li>encode_entities($data), </li></ul><ul><li>encode_entities($data), </li></ul><ul><li>); </li></ul><ul><li>} elsif ($type eq 'link') { </li></ul><ul><li>$html .= sprintf( </li></ul><ul><li>'<a href=&quot;%s&quot;>%s</a>', </li></ul><ul><li>encode_entities($data), </li></ul><ul><li>encode_entities($data), </li></ul><ul><li>); </li></ul><ul><li>… </li></ul>2010 年 9 月 30 日 re RainbowTwtr - 構造化テキストの安全なエスケープ手法について
  10. 10. 重要なことなので、もう1回 <ul><li>エンコード処理が正しければ XSS 起きない </li></ul><ul><ul><li>エンコード処理は簡単だったでしょ ? </li></ul></ul><ul><li>あとは、パース処理をどう書くか </li></ul><ul><ul><li>間違えてもセキュリティホールにならないから安心♡ </li></ul></ul><ul><ul><li>DOM ライクなアプローチ ( データ構造を作ってからまとめてエンコード ) と SAX ライクなアプローチ ( コールバック・イベントベースでのエンコード ) </li></ul></ul><ul><ul><li>続きはブログで… http://developer.cybozu.co.jp/kazuho/2010/09/twitter-xss-f73.html </li></ul></ul>2010 年 9 月 30 日 re RainbowTwtr - 構造化テキストの安全なエスケープ手法について
  11. 11. まとめ <ul><li>バグがあってもいいから、セキュアなプログラムを書こう </li></ul><ul><li>セキュアコーディングの観点からは、エンコード処理をできるだけ最後に、まとめて行うべき </li></ul><ul><ul><li>cf. 「サニタイズ言うな」キャンペーン </li></ul></ul><ul><ul><li>エンコード処理がまとまることで、レビューとテストが簡単になる </li></ul></ul>2010 年 9 月 30 日 re RainbowTwtr - 構造化テキストの安全なエスケープ手法について
  12. 12. まとめ (2) <ul><li>エンコード機能つきのミドルウェアを使おう </li></ul><ul><ul><li>例 : たとえば Template-Toolkit を避ける </li></ul></ul><ul><ul><ul><li>型ベースのエスケープ機能を備えた Text::Xslate や Text::MicroTemplate を使おう </li></ul></ul></ul><ul><ul><li>ORM や DBI のプレースホルダ… </li></ul></ul>2010 年 9 月 30 日 re RainbowTwtr - 構造化テキストの安全なエスケープ手法について
  13. 13. 参考資料 <ul><li>http://codezine.jp/article/detail/5472 </li></ul><ul><li>http://togetter.com/li/52475 </li></ul><ul><li>http://github.com/mzsanford/twitter-text-rb/ </li></ul><ul><li>http://d.hatena.ne.jp/gnarl/20100922/1285165197 </li></ul>2010 年 9 月 30 日 re RainbowTwtr - 構造化テキストの安全なエスケープ手法について

×