區塊鏈安全————以太坊短地址攻擊
0x00 基礎知識
EVM虛擬機器在解析合約的位元組碼時,依賴的是ABI的定義,從而去識別各個欄位位於位元組碼的什麼地方。關於ABI,可以閱讀這個文件:
一般ERC-20 TOKEN標準的代幣都會實現transfer方法,這個方法在ERC-20標籤中的定義為:
function transfer(address to, uint tokens) public returns (bool success);
第一引數是傳送代幣的目的地址,第二個引數是傳送token的數量。
當我們呼叫transfer函式向某個地址傳送N個ERC-20代幣的時候,交易的input資料分為3個部分:
- 4 位元組,是方法名的雜湊:a9059cbb
- 32位元組,放以太坊地址,目前以太坊地址是20個位元組,高位補0 00000000000000000000000abcabcabcabcabcabcabcabcabcabcabcabcabca
- 32位元組,是需要傳輸的代幣數量,這裡是1*10^18 GNT 0000000000000000000000000000000000000000000000000de0b6b3a7640000
所有這些加在一起就是交易資料:
a9059cbb000000000000000000000000abcabcabcabcabcabcabcabcabcabcabcabcabca0000000000000000000000000000000000000000000000000de0b6b3a7640000
0x01 以太坊短地址
當呼叫transfer方法提幣時,如果允許使用者輸入了一個短地址,這裡通常是交易所這裡沒有做處理,比如沒有校驗使用者輸入的地址長度是否合法。
如果一個以太坊地址如下,注意到結尾為0:
0x1234567890123456789012345678901234567800
當我們將後面的00省略時,EVM會從下一個引數的高位拿到00來補充,這就會導致一些問題了。
這時,token數量引數其實就會少了1個位元組,即token數量左移了一個位元組,使得合約多傳送很多代幣出來。我們看個例子:
這裡呼叫sendCoin方法時,傳入的引數如下:
0x90b98a11
00000000000000000000000062bec9abe373123b9b635b75608f94eb8644163e
0000000000000000000000000000000000000000000000000000000000000002
這裡的0x90b98a11是method的hash值,第二個是地址,第三個是amount引數。
如果我們呼叫sendCoin方法的時候,傳入地址0x62bec9abe373123b9b635b75608f94eb8644163e,把這個地址的“3e”丟掉,即扔掉末尾的一個位元組,引數就變成了:
0x90b98a11
00000000000000000000000062bec9abe373123b9b635b75608f94eb86441600
00000000000000000000000000000000000000000000000000000000000002
^^
缺失1個位元組
這裡EVM把amount的高位的一個位元組的0填充到了address部分,這樣使得amount向左移位了1個位元組,即向左移位8。
這樣,amount就成了2 << 8 = 512。
0x02 構造短地址攻擊
(1)首先生成一個ETH的靚號,這個賬號末尾為2個0
使用一些跑號工具就可以做到,比如MyLinkToken工具,可以很輕易跑出末尾兩個0的。
(2)找一個交易所錢包,該錢包裡token數量為256000
(3)往這個錢包傳送1000個幣
(4)然後再從這個錢包中提出1000個幣,當然這時候寫地址的時候把最後兩個0去掉
如果交易所並沒有校驗使用者填入的以太坊地址,則EVM會把所有函式的引數一起打包,會把amount引數的高位1個位元組吃掉。
(5)這三個引數會被傳入到msg.data中,然後呼叫合約的transfer方法,此時,amount由於高位的1個位元組被吃掉了,因此amount = amount << 8,即擴大了256倍,這樣就把25600個幣全部提出來了。
0x03 總結
針對這個漏洞,說實話以太坊有不可推卸的責任,因為EVM並沒有嚴格校驗地址的位數,並且還擅自自動補充消失的位數。此外,交易所在提幣的時候,需要嚴格校驗使用者輸入的地址,這樣可以儘早在前端就禁止掉惡意的短地址。
更多參考:
相關文章
- 區塊鏈安全 - 以太坊短地址攻擊區塊鏈
- 區塊鏈之以太坊初探區塊鏈
- 區塊鏈 2.0 :以太坊(九)區塊鏈
- 區塊鏈安全————DAO攻擊事件解析區塊鏈事件
- 區塊鏈2.0架構:以太坊區塊鏈的介紹區塊鏈架構
- 區塊鏈2.0以太坊漫談(1)區塊鏈
- 區塊鏈2.0以太坊漫談(2)區塊鏈
- 區塊鏈2.0以太坊漫談(3)區塊鏈
- 區塊鏈2.0以太坊漫談(4)區塊鏈
- 區塊鏈2.0以太坊環境搭建區塊鏈
- 區塊鏈——以太坊、智慧合約簡介區塊鏈
- 以太坊及區塊鏈 程式資源整合區塊鏈
- 區塊鏈安全:基於區塊鏈網路攻擊的方式原理詳解區塊鏈
- 如何招聘面試區塊鏈以太坊開發人才面試區塊鏈
- 區塊鏈比較:以太坊 Cosmos Cardano EOS和Hyperledger區塊鏈
- 區塊鏈2.0以太坊智慧合約solidity之helloworld區塊鏈Solid
- 第6章 區塊鏈開發平臺:以太坊區塊鏈
- 使用truffle部署以太坊智慧合約到區塊鏈區塊鏈
- 以太坊創世區塊與鏈配置載入分析
- 以太坊·將資料寫入到區塊鏈中區塊鏈
- 以太坊智慧合約call注入攻擊
- 區塊鏈安全:實現公鏈雙花攻擊的多種方法區塊鏈
- 以太坊原始碼分析(21)chain_indexer 區塊鏈索引原始碼AIIndex區塊鏈索引
- 區塊鏈2.0以太坊編輯器atom配置詳解區塊鏈
- AWS推出以太坊和超級賬本區塊鏈模板區塊鏈
- 區塊鏈分散式賬本Fabric、Corda和以太坊比較區塊鏈分散式
- 區塊鏈2.0以太坊配置solidity編譯器sublime詳解區塊鏈Solid編譯
- 區塊鏈之--2小時構建以太坊智慧合約區塊鏈
- 以太坊DApp開發入門教程——區塊鏈投票系統APP區塊鏈
- 區塊鏈2.0以太坊錢包編譯詳解+連線私有鏈+修改區塊鏈編譯
- 以太坊原始碼分析(8)區塊分析原始碼
- 加拿大政府機構建立以太坊區塊鏈瀏覽器區塊鏈瀏覽器
- 區塊鏈100講:淺析以太坊網路智慧合約原理區塊鏈
- 以太坊和比特幣區塊鏈的異同(一些QA)比特幣區塊鏈
- 【區塊鏈】實戰·以太坊智慧合約程式設計引導區塊鏈程式設計
- 以太坊之類區塊鏈的擴充套件存在各種限制 - vitalik區塊鏈套件
- 一文讀懂區塊鏈安全:區塊鏈會帶來哪些衝擊?區塊鏈
- 區塊鏈安全————區塊鏈技術安全討論區塊鏈