區塊鏈研究實驗室 智慧型合約資料下溢攻擊案例分析

2021-09-10 08:20:22 字數 993 閱讀 4676

儘管dao合同並未成為下溢攻擊的受害者,但我們可以利用現有的babydao合同{}來更好地了解這種過於常見的攻擊方式。

首先我們了解uint256是什麼。 uint256是256位的無符號整數(無符號,只有正整數)。以太坊虛擬機器被設計為使用256位作為其字大小,或者由計算機的cpu一次處理的位數。由於evm的大小限制為256位,因此分配的編號範圍為0到4,294,967,295(2²⁵⁶)。如果我們超過這個範圍,數字將重置到範圍的底部(2²⁵⁶+ 1 = 0)。如果我們進入這個範圍,數字將重置到範圍的頂端(0-1 =2²⁵⁶)。

當我們從零中減去乙個大於零的數字時,會發生下溢,從而產生乙個新分配的2²⁵⁶整數。現在如果攻擊者的餘額出現下溢,則會更新餘額,以便所有資金都可能被盜。

如何攻擊

攻擊者通過向目標合同傳送1 wei發起攻擊;

合同將傳送方的資金記入貸方;

隨後撤回相同的1 wei;

合同從發件人的信用中減去1 wei,現在餘額再次為零;

由於目標合同向攻擊者傳送以太幣,攻擊者的撤回功能也會觸發,並再次呼叫撤消;

撤回的1 wei被記錄在合同中;

攻擊者合同的餘額已更新兩次,第一次為零,第二次為-1;

攻擊者的餘額重置為2²⁵⁶;

攻擊者通過撤回目標合同的所有資金來完成攻擊;

攻擊**

解決方案

為避免成為下溢攻擊的受害者,最佳做法是檢查更新的整數是否保持在其位元組範圍內。 我們可以在**中新增引數檢查以充當最後一道防線。 第一行函式withdraw()檢查是否有足夠的資金,第二行檢查溢位,第三行檢查是否有下溢。

區塊鏈研究實驗室 深入解析Solidity合約

這次主要討論solidity背後的運作原理,到底乙個solidity合約經過編譯到部署上鏈之間的過程是如何運作的,以及後續呼叫合約時的流程,知道得越多就越能寫出安全可靠的合約。我們都知道乙個solidity程式 寫完之後,必須將它編譯成byte code,才能透過交易部署至鏈上,變成所謂的智慧型合約...

區塊鏈研究實驗室除錯大揭秘!

除錯solidity 非常困難。隨著時間的流逝,諸如ganache,remix和solidity test helpers之類的工具使它變得更容易,但仍然存在bug。使用ganache進行除錯的gui將有助於減輕許多這些痛苦,並允許開發人員視覺化地處理和除錯合同。現在有一種方法可以做到這一點!本教程...

區塊鏈研究實驗室 以太坊上的廣義狀態通道

狀態通道是可用於分布式應用程式的基礎技術。它們可以用於與一組已定義的參與者進行任何互動,例如付款或類似象棋或撲克的遊戲。通道化 這些應用程式使其成本大大降低,並減少了當今區塊鏈應用程式中不可接受的高延遲,從而實現了使用者預期的類似網路的響應時間。儘管如此,在當今的以太坊應用中,狀態通道的利用率仍然很...