區塊鏈安全入門筆記(八)

買賣虛擬貨幣

隨著越來越的人參與到區塊鏈這個行業中來,為行業注入新活力的同時也由於相關知識的薄弱以及安全意識的匱乏,給了攻擊者更多的可乘之機。面對頻頻爆發的安全事件,慢霧特推出區塊鏈安全入門筆記系列,向大家介紹區塊鏈安全相關名詞,讓新手們更快適應區塊鏈危機四伏的安全攻防世界,同時歡迎新增文章末尾二維碼催更!

系列回顧:

區塊鏈安全入門筆記(三) | 慢霧科普

區塊鏈安全入門筆記(四) | 慢霧科普

區塊鏈安全入門筆記(五) | 慢霧科普

區塊鏈安全入門筆記(六) | 慢霧科普

區塊鏈安全入門筆記(七) | 慢霧科普

短地址攻擊

Short Address Attack

短地址攻擊(Short Address Attack)是針對以太坊上 ERC20 智慧合約的一種攻擊形式,利用的是 EVM 中的對於輸入位元組碼的自動補全機制進行攻擊。

一般而言,針對 ERC20 合約中的 transfer 函式的呼叫,輸入的位元組碼位數都是 136 位元組的。當呼叫 ERC20 中的 transfer 函式進行 ERC20 Token 轉賬時,如果攻擊者提供的地址後有一個或多個 0,那麼攻擊者就可以把地址後的零省去,提供一個缺位的地址。當對這個地址轉賬的時候,比方說轉賬 100 的 A Token,然後輸入的地址是攻擊者提供的缺位地址,這時候,經過編碼輸入的資料是 134 位元組,比正常的資料少了 2 位元組,在這種情況下,EVM 就會對缺失的位元組位在編碼資料的末尾進行補 0 湊成 136 位元組,這樣本來地址段缺失的 0 被資料段的 0 補齊了,而由於給地址段補 0,資料段會少 0,而資料段缺失的 0 由 EVM 自動補齊,這就像資料段向地址段移動補齊地址段缺失位元組位,然後資料段缺失的位元組位由 EVM 用 0 補齊。這種情況下,轉賬金額就會由 100 變成 100 * 16 的 n 次方,n 是地址缺失的 0 的個數。透過這種方式,攻擊者就能對交易所或錢包進行攻擊,盜竊交易所和錢包的資產。

慢霧安全團隊建議交易所和錢包在處理轉賬的時候,要對轉賬地址進行嚴格的校驗,防止短地址攻擊的發生。詳情可參考:遺忘的亞特蘭蒂斯:以太坊短地址攻擊詳解

假幣攻擊

Fake Token Attack

假幣攻擊(Fake Token Attack),是針對那些在建立官方 Token 時採用通用建立模版建立出來的代幣,每個 Token 的識別僅根據特定的標記進行識別,如 EOS 官方 Token 的識別標記是 "eosio.token"合約,波場的 TRC10 的識別標記是 tokenid,以太坊的 ERC20 是用合約地址作為識別標記。那麼這樣就會出現一個問題,如果收款方在對這些 Token 進行收款的時候沒有嚴格校驗這些 Token 特有的標記,攻擊就會發生,以 EOS 為例子,由於 EOS 官方 Token 採用的是合約來發行一個名為 EOS 的 Token,標記 EOS 本身的標識是 "eosio.token" 這個發行帳號,如果在接受轉賬的時候沒有校驗這個標識,攻擊者就能用其他的帳號同樣發行一個名為 EOS 的 Token,對交易所或錢包進行假幣充值,換取真的代幣。

2019 年 4 月 11 日,波場 Dapp TronBank 1 小時內被盜走約 1.7 億枚 BTT(價值約 85 萬元)。監測顯示,駭客建立了名為 BTTx 的假幣向合約發起“ invest ”函式,而合約並沒有判定傳送者的代幣 id 是否與 BTT 真幣的 id 1002000 一致。因此駭客拿到真幣 BTT 的投資回報和推薦獎勵,以此方式迅速掏空資金池。對此,交易所和錢包在處理轉賬的時候,切記要嚴格檢驗各種代幣各種標識,防止假幣攻擊。

整型溢位攻擊

Integer Overflow Attack

資料的儲存是區塊鏈上重要的一環。但是每個資料型別本身是存在邊界的,例如以太坊中 uint8 型別的變數就只能儲存 0~255 大小的資料,超過了就存不下了。那麼如果要放一個超過資料型別大小的數字會怎樣呢?例如把 256 存進 uint8 的資料型別中,資料顯示出來會變成 1,而不是其他數值,也不會報錯,因為 uint8 本身能存一個 8 位二進位制數字,最大值為 11111111,如果這個時候加 1,這個二進位制數就變成了 100000001,而因為資料邊界的關係,只能拿到後 8 位,也就是 00000001,那麼數字的大小就變成 1 了,這種情況我們稱為上溢。有上就有下,下溢的意思就是一個值為 0 的 uint8 資料,如果這個時候對它進行減 1 操作,結果會變成該資料型別所能儲存的最大值加 1 減去被減數,在這個例子中是 255,也就是該資料型別所能儲存的最大值。那麼如果上述兩種情況發生在智慧合約當中的話,惡意使用者透過下溢的操作,操縱自己的帳號向其他帳號傳送超過自己餘額數量的代幣,如果合約內沒有對餘額進行檢查,惡意使用者的餘額就會下溢位變成一個超大的值,這個時候攻擊者如果大量拋售這些代幣,就能瞬間破壞整個代幣的價值系統。

慢霧安全團隊建議所有的智慧合約開發者在智慧合約中對資料進行操作的時候,要嚴格校驗資料邊界,防止整形溢位攻擊的發生。詳情可參考:BEC 智慧合約無限轉幣漏洞分析及預警

條件競爭攻擊

Race Condition

條件競爭(Race Condition)攻擊的方式很多樣,但是核心的本質無非是對某個條件的狀態修改的競爭,如上期介紹的重入漏洞,也是條件競爭的一種,針對的是使用者餘額這個條件進行競爭,只要使用者的餘額沒有歸零,使用者就能一直提走智慧合約的錢。這次介紹的條件競爭的例子是最近發生的著名的 Edgeware 鎖倉合約的拒絕服務漏洞,詳情可參考:關於 Edgeware 鎖倉合約的拒絕服務漏洞這個漏洞問題的本質在於對新建的鎖倉合約的餘額的這個條件進行競爭。攻擊者可以監控所有鏈上的鎖倉請求,提前計算出鎖倉合約的地址,然後向合約地址轉賬,造成鎖倉失敗。在官方沒有修復之前,要防止這種攻擊,只能使用比攻擊者更高的手續費讓自己的鎖倉交易先行打包,從而與攻擊者形成競爭避免攻擊。最後,官方修復方案為不對鎖倉合約的餘額進行強制性的相等檢查,而是採用大於等於的形式,避免了攻擊的發生。

慢霧安全團隊建議智慧合約的開發者在智慧合約中對某些狀態進行修改的時候,要根據實際情況充分考慮條件競爭的風險,防止遭受條件競爭攻擊。

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;