關閉惡意挖礦操作
當檢測到惡意的加密貨幣挖礦操作時,目前有兩種方法可以嘗試關閉它:
我們可以請求礦池服務禁止攻擊者的帳戶
我們可以嘗試攻擊攻擊者基礎設施中的其他服務,以干擾其活動
這些方法的問題在於,由於依賴第三方,它們可能會變得非常複雜且耗時。
我們找到了一個更好的解決方案。
我們開發了兩種技術,通過利用挖礦拓撲和礦池策略,能夠將加密貨幣挖礦殭屍網絡的效果降低到完全關閉的程度,迫使攻擊者對其基礎設施進行重大更改,甚至放棄整個活動。
這兩種技術都是基於利用[Stratum]通信協議,從而禁止與挖礦操作相關的關鍵組件,如代理或錢包。
從 330 萬到零
我們針對一個[活躍了六年的惡意挖礦操作]。通過禁止攻擊者的挖礦代理(挖礦拓撲中的一個關鍵單點故障),我們能夠將其算力從每秒330 萬次哈希降低到零(圖 1)。
攻擊者輕鬆賺錢的同時,我們也能在幾秒鐘內終止其潛在的年收入。僅用一台簡單的筆記本電腦,我們就讓挖礦操作者失去了每年26,000 美元的收益,算力瞬間暴跌。
什麼是壞區塊(Bad Shares)?
圖 2中的影片展示了這種技術,我們稱之為「壞區塊」。影片中展示了一個連接到惡意挖礦代理的受害者。通過執行「壞區塊」,我們能夠讓礦池禁止該挖礦代理,從而關閉挖礦操作,並將受害者的CPU 使用率從 100% 降至 0%。
加密貨幣礦工剖析:關閉挖礦殭屍網絡
圖 2:在實驗環境中應用壞區塊技術
如果不能擊敗他們,就禁止他們
通過[礦池]進行的加密貨幣挖礦基於提交有效的哈希計算結果,這些結果被稱為「區塊(Shares)」。為了產生收益,挖礦者需要向礦池提交區塊。礦池收到區塊後,會驗證哈希結果及其難度。
驗證區塊是礦池服務器最繁重的任務之一,尤其是在處理無效區塊時。就像生活中的一切,錯誤是可能發生的,例如硬件故障可能導致提交錯誤的區塊。
處理無效區塊會消耗大量資源,因此礦池必須保護自己免受大量無效區塊提交的影響。大多數礦池會對提交無效區塊的礦工實施懲罰,通常是暫時禁止其訪問。
這種互動在嘗試關閉惡意挖礦操作時非常有用。如果我們能讓後端節點或礦池禁止攻擊者的礦工(即受害者),我們就能停止挖礦行為,釋放受害者。
在以下部分,我們將通過針對兩種挖礦活動來展示這一概念,每種活動代表不同的挖礦拓撲:挖礦代理和直接連接到公共礦池。
使用壞區塊禁止攻擊者的挖礦代理
惡意挖礦者最常用的拓撲之一是挖礦代理(圖3)。這種設置通過隱藏攻擊者的後端和錢包地址來增強隱私,從而保護其身份並減少網絡中的可追溯性
圖 3:基於挖礦代理的挖礦拓撲
挖礦代理對網絡檢測提出了獨特的挑戰,因為它們「隱藏」了礦工連接的目標礦池,這通常可以通過網絡檢查來檢測。它們還隱藏了錢包地址,進一步減少了礦工的[可檢測足跡]。然而,我們發現挖礦代理可能是加密貨幣礦工的阿喀琉斯之踵。
當使用代理挖礦時,所有受害者都連接到單一服務器,這意味著干擾代理可以讓整個挖礦操作癱瘓。我們開發了一種技術,可以實現這一點。
其原理很簡單:通過以礦工身份連接到惡意代理,我們可以提交無效的挖礦任務結果(壞區塊),這些結果會繞過代理驗證並被提交到礦池。連續的壞區塊最終會導致代理被禁止,從而有效停止整個挖礦殭屍網絡的操作。
與代理通信
挖礦者首先需要使用 Stratum 登錄方法連接到代理。如果沒有其他配置,礦工在 XMRig
代理服務器中默認標識為 x(圖 4)。
圖 4:登錄請求的 JSON 表示
如果連接成功,意味著代理端有一個監聽器。我們可以通過解析響應來確認它確實是一個挖礦代理——有效的響應將是一個符合Stratum 協議的 JSON 文檔,結果將是一個「任務(job)」。
雖然完整的挖礦過程很複雜(如 [Zero to Monero]中所述),但製作一個自定義區塊相對簡單。只需要從代理響應中提取幾個值:礦工ID、任務 ID 和 NiceHash Nonce。這三個字段對於跟踪特定挖礦任務是必需的,因此如果我們希望代理接受我們的壞區塊,就必須正確填寫這些字段(圖5)
圖 5:任務分配響應的 JSON 表示
當代理從礦工收到一個區塊時,它會幾乎原封不動地將其轉發給礦池,但有一個關鍵區別——它是用攻擊者的錢包地址提交的。這就是為什麼我們永遠無法從挖礦樣本中獲取攻擊者的錢包或其他帳戶或礦池信息。
XMRogue
作為受害者之一滲透到挖礦殭屍網絡並不困難。通常,沒有特殊的授權——而且在許多情況下,它使用標準應用程序,如XMRig 作為礦工,XMRig-proxy 作為挖礦代理。
這促使我們開發了[XMRogue]。XMRogue是一個工具,可以讓我們偽裝成礦工,連接到挖礦代理,提交連續的壞區塊,最終讓礦池禁止該挖礦代理(圖
6)。
圖 6:壞區塊技術的序列圖
一個重要的考慮因素是代理層面的區塊驗證——由於我們的壞區塊是由代理轉發到礦池的,代理有機會識別並丟棄它們。
例如,流行的 XMRig-proxy 會驗證它與任務一起提供的 NiceHash Nonce以及結果的難度。如果 Nonce 或難度不正確,壞區塊將不會被轉發到後端礦池。在圖 7中,我們看到代碼中的驗證邏輯,其中低難度哈希或不正確 NiceHash 值的區塊會被丟棄。
圖 7:XMRig-proxy 處理挖礦錯誤的代碼。
(資料來源:https://github.com/xmrig/xmrig-proxy/blob/501d9722454e20de90ed205e26da8cbf304c2ac8/src/proxy/Miner.cpp#L259)
我們可以通過解析任務請求並精心製作一個被代理視為有效的「壞」任務結果來克服這些驗證,從而讓代理將我們的區塊轉發到礦池。
測試理論
為了測試我們的技術,我們選擇針對
[我們在第二部分中發現的一個挖礦活動]。我們能夠提取該活動使用的所有挖礦代理地址,這為我們提供了大量信息。例如,我們可以看到攻擊者的中央代理(名為「proxy」)在Nanopool 中評分最高,表明其長期使用(圖 8)。
圖 8:惡意活動的礦工列表
該代理每秒產生 300 萬次哈希,大約相當於每小時 3 美元或每年 26,000美元的收入。通過使用 XMRogue針對該代理,我們能夠迅速讓礦池禁止它,並停止所有連接到它的受害者的挖礦行為。如果我們檢查代理的算力,可以看到它已經降至零(圖9)。
圖 9:XMRogue 運行期間的活動挖礦儀表板
如果我們考慮 XMRogue對攻擊者整個活動的影響,可以看到其盈利能力大幅下降。當我們首次記錄該活動時,它每年產生近50,000 美元的收入。在我們干擾並破壞其平衡後,該活動的年收入下降了 76%,降至12,000美元。通過針對更多代理,收入可能會降至零。這種影響可能很容易迫使攻擊者完全放棄其活動,或者在進行可能被監控的更改時冒著被識別的風險。
利用其他礦池策略
攻擊者並不總是使用代理。在許多情況下,受害者會直接連接到礦池,這意味著之前的技術將不適用。提交壞區塊只會禁止我們的IP 地址,而不會影響挖礦操作。
圖 10:公共礦池拓撲;受害者礦工直接連接到公共礦池
當我們檢查礦池的 [源代碼]
時,想到了另一種選擇——針對錢包地址。雖然之前的壞區塊策略針對礦工的 IP 地址,但我們發現礦池還有一個針對錢包地址的策略——如果一個錢包地址 [擁有超過1,000個礦工],礦池會禁止該錢包地址一小時。
在使用代理挖礦時,攻擊者可以將其錢包地址僅嵌入代理服務器,從而有效地隱藏它。但在直接挖礦的情況下,錢包地址必須存在於受害機器上,這使我們能夠提取它。
在這種情況下,讓攻擊者被禁止很簡單——我們只需同時發送超過 1,000個使用攻擊者錢包的登錄請求,這將迫使礦池禁止攻擊者的錢包。這種技術已作為一種操作模式添加到XMRogue 工具中。
為了說明這一想法,我們使用了另一個我們發現的活動,該活動使用公共礦池MoneroOcean。該活動的初始狀態為 22 kH/s 的算力(圖11)。[該活動]
比我們上面討論的活動小得多,但該技術本身應涵蓋更廣泛的挖礦活動配置。
圖 11:使用 MoneroOcean 公共礦池的活躍挖礦活動
在啟動我們的腳本(立即發起數千次登錄)後,我們看到挖礦速率急劇下降,最終完全停止(圖12)。
圖 12:挖礦者的算力持續下降
更廣的網,更淺的收穫
這種策略可能會干擾更多挖礦操作,但它不是永久性的解決方案。一旦我們停止多重登錄連接,活動的算力就會恢復(圖13)。
圖 13:在我們停止 XMRogue 的多重登錄序列後,帳戶恢復
總結
上述技術展示了防禦者如何通過利用礦池策略,在不干擾合法礦池操作的情況下,有效關閉惡意挖礦活動。合法的礦工可以通過輕鬆修改其IP或錢包來快速恢復,而惡意挖礦者則需要修改整個殭屍網絡,這對低技術水平的挖礦者來說可能是致命的。
歡迎關注Akamai,通過定期更新的文章瞭解更多與Web、安全、雲計算、邊緣計算有關的資訊和見解。