在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

動不動就出事,智能合約攻擊該怎么辦

電子設計 ? 來源:電子設計 ? 作者:電子設計 ? 2020-12-25 19:00 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

如果你在數字貨幣世界待過足夠時間,也許你聽說過1或2個智能合約攻擊時間,這些攻擊導致了幾千萬美元的盜竊損失。最著名的攻擊是DAO事件,這是數字貨幣世界最受期待的項目之一,同時也是智能合約的改革。雖然很多人聽說過這些攻擊,但是很少人知道到底發生了什么,是怎么發生的,以及如何避免這些錯誤。

智能合約是動態的,復雜的以及難以置信地強大。雖然他們的潛力是很難想象,但是也不可能一夜之間就成為了攻擊的對象。也就是說,對于往后的數字貨幣,我們可以從之前的錯誤中學到經驗,然后一起成長。雖然DAO是已經發生的事情,但是這對于開發者,投資者,以及社區成員對于智能合約攻擊來說,都是一個很好的例子。

今天,我想和大家聊聊從DAO事件中,我們學到的3件事。

攻擊#1:重入攻擊

當攻擊者通過對目標調用提款操作的時候,重入攻擊就會發生,就好像DAO事件一樣。當合約不能在發出資金之前更新狀態(用戶余額),攻擊者就可以連續進行提取函數調用,來獲得合約中的資金。任何時候攻擊者獲得以太幣,他的合約都會自動地調用反饋函數,function (),這就再次調用了提現合約。這時候,攻擊就會進入遞歸回路,這時候這個合約中的資金就會轉入攻擊者。因為目標合約都在不停地調用攻擊者的函數,這個合約也不會更新攻擊者的余額。當前的合約不會發現有任何問題,更清楚地說,合約函數中包含反饋函數,當合約收到以太幣和零數據的時候,合約函數就會自動執行。

攻擊流程

1.攻擊者將以太幣存入目標函數

2.目標函數就會根據存入的以太幣而更新攻擊者的約

3.攻擊者請求拿回資金

4.資金就會退回

5.攻擊者的反饋函數生效,然后調用提現功能

6.智能合約的邏輯就會更新攻擊者的余額,因為提現又被成功調用

7.資金發送到攻擊者

8.第5-7步重復使用

9.一旦攻擊結束,攻擊者就會把資金從他們自己的合約發送到個人地址

1*UeDgMZo2n0skHzgkl352zQ

重入攻擊的遞歸回路

很不幸地是,一旦這個攻擊開始,無法停下。攻擊者的提現功能會被一次次地調用,直到合約中的燃料跑完,或者被害者的以太幣余額被消耗光。

代碼

下面就是DAO合約的簡單版本,其中會包括一些介紹來為這些不熟悉代碼/ solidity語言更好地理解合約。

contract babyDAO {

/* assign key/value pair so we can look up

credit integers with an ETH address */

mapping (address => uint256) public credit;

/* a function for funds to be added to the contract,

sender will be credited amount sent */

function donate(address to) payable {

credit[msg.sender] += msg.value;

/*show ether credited to address*/

function assignedCredit(address) returns (uint) {

return credit[msg.sender];

/*withdrawal ether from contract*/

function withdraw(uint amount) {

if (credit[msg.sender] >= amount) {

msg.sender.call.value(amount)();

credit[msg.sender] -= amount;

如果我們看下函數withdraw(),我們可以看到DAO合約使用address.call.value()來發送資金到msg.sender。不僅如此,在資金發出后,合約會更新credit[msg.sender]的狀態。攻擊者在發現了合約代碼中的問題,就能夠使用類似下面的ThisIsAHodlUp {}來將資金轉入contract babyDAO{}合約。

import ‘browser/babyDAO.sol’;

contract ThisIsAHodlUp {

/* assign babyDAO contract as "dao" */

babyDAO public dao = babyDAO(0x2ae...);

address owner;

/*assign contract creator as owner*/

constructor(ThisIsAHodlUp) public {

owner = msg.sender;

/*fallback function, withdraws funds from babyDAO*/

function() public {

dao.withdraw(dao.assignedCredit(this));

/*send drained funds to attacker’s address*/

function drainFunds() payable public{

owner.transfer(address(this).balance);

需要注意地是,這個后退函數,function(),會調用DAO或者babyDAO{}的提現函數,來從合約中盜取資金。從另個方面來說,當攻擊者想要把所有偷竊來的資金賺到他們的地址,drainFunds()功能會被調用。

解決方案

現在,我們應該清楚重放攻擊會利用兩個特別的智能合約漏洞。第一個是當合約的狀態在資金發出之后,而不是之前進行更新。由于在發出資金前無法更新合約狀態,函數就會在中間計算的時候被打斷,合約也認為資金其實還沒有發出。第二個漏洞就當合約錯誤地使用address.call.value()來發出資金,而不是address.transfer() 或者 address.send()。這兩個都受限于2300gas,只記錄一個事件而不是多個外部調用。

contract babyDAO{

....

function withdraw(uint amount) {

if (credit[msg.sender] >= amount) {

credit[msg.sender] -= amount; /* updates balance first */

msg.sender.send(amount)(); /* send funds properly */

攻擊2:下溢攻擊

雖然DAO合約不會讓受害者掉入下溢攻擊,我們能夠通過現有的babyDAO contract{}來更好地理解這些攻擊為什么會發生。

首先,我們需要理解什么是256單位制。一個256單位制是由256個字節組成。以太坊的虛擬機是使用256字節來完成的。因為以太坊虛擬機受限于256字節的大小,所以數字的范圍是0到4,294,967,295 (22??)。如果我們超過這個范圍,那么數字就會重置到范圍的最底部(22?? + 1 = 0)。如果我們低于這個范圍,這個數字就會重置到這個范圍的頂端(0–1= 22??)。

當我們從零中減去大于零的數,就會發生下溢攻擊,導致一個新的22??數集。現在,如果攻擊者的余額發生了下溢,那么這部分余額就會更新,從而導致整個資金被盜。

攻擊流程

攻擊者通過發出1Wei到目標合約,來啟動攻擊。

合約認證發出資金的人

隨后調用1Wei的提現函數

合約會從發送者的賬戶扣除的1Wei,現在賬戶余額又是零

因為目標合約將以太幣發給攻擊者,攻擊者的退回函數被處罰,所以提現函數又被調用。

提現1Wei的事件被記錄

攻擊者合約的余額就會更新兩次,第一次是到零,第二次是到-1。

攻擊者的余額回置到22??

攻擊者通過提現目標合約的所有資金,從而完成整個攻擊

代碼

/*donate 1 wei, withdraw 1 wei*/

function attack() {

dao.donate.value(1)(this);

dao.withdraw(1);

/*fallback function, results in 0–1 = 2**256 */

function() {

if (performAttack) {

performAttack = false;

dao.withdraw(1);

/*extract balance from smart contract*/

function getJackpot() {

dao.withdraw(dao.balance);

owner.send(this.balance);

解決方案

為了防止受害人陷入下溢攻擊,最好的方法是看更新的狀態是否在字節范圍內。我們可以添加參數來檢查我們的代碼,作為最后一層保護。函數withdraw()的首行代碼是為了檢查是否有足夠的資金,第二行是為了檢查超溢,第三個是檢查下溢。

contract babysDAO{

....

/*withdrawal ether from contract*/

function withdraw(uint amount) {

if (credit[msg.sender] >= amount

&& credit[msg.sender] + amount >= credit[msg.sender]

&& credit[msg.sender] - amount <= credit[msg.sender]) {

credit[msg.sender] -= amount;

msg.sender.send(amount)();

需要注意,就像我們之前討論,我們上面的代碼是在發出資金之前更新用戶的余額。

審核編輯:符乾江
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 代碼
    +關注

    關注

    30

    文章

    4898

    瀏覽量

    70581
  • 智能計算
    +關注

    關注

    0

    文章

    191

    瀏覽量

    16709
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    拆了才知道的秘密——為啥這款飛利浦LED燈(10個)動不動就翹?

    1、為啥這款LED燈動不動就不亮了 這個是知名品牌,做工精致,我一批買10個。還好,每個能堅持一段時間。但是,最終,還是全部休息了,這個是最后一個。沒扔,留著拆一下。 用螺絲刀沿著邊緣慢慢撬,這個
    的頭像 發表于 05-08 13:47 ?240次閱讀
    拆了才知道的秘密——為啥這款飛利浦LED燈(10個)<b class='flag-5'>動不動</b>就翹?

    FPGA的Jtag接口燒了,怎么辦

    在展開今天的文章前,先來討論一個問題:FPGA的jtag接口燒了怎么辦?JTAG接口的輸入引腳通常設計為高阻抗,這使得它們對靜電電荷積累非常敏感,由于JTAG接口需要頻繁連接調試器、下載線纜等外
    的頭像 發表于 04-27 11:01 ?858次閱讀
    FPGA的Jtag接口燒了,<b class='flag-5'>怎么辦</b>?

    開關電源漏電怎么辦?開關電源漏電流標準是什么?

    在現在水電工程中,開關電源是必不可少的家居用品,開關電源漏電怎么辦,市面上開關電源產品還是不少的,功能很多,品牌也不少,所以,選擇的時候也需要特別注意。好的品牌就會避免漏電的情況出現,開關電源漏電
    發表于 01-09 13:59

    盛顯科技:拼接處理器串口不受控制,怎么辦?

    我們在使用拼接處理器的過程中,因種種原因,有時候會出現串口不受控制的情況發生。當出現這種情況時,用戶將無法通過串口對拼接處理器進行有效的控制或指令傳輸。那么您知道拼接處理器串口不受控制,怎么辦
    的頭像 發表于 11-15 11:56 ?509次閱讀
    盛顯科技:拼接處理器串口不受控制,<b class='flag-5'>該</b><b class='flag-5'>怎么辦</b>?

    EMI傳導500KHz位置余量不足怎么辦?快來試試這個方法

    EMI傳導500KHz位置余量不足怎么辦?快來試試這個方法【樣機芯片介紹】本次調試的樣機主控IC為思睿達主推的成都啟臣微的CR52168BSJ,IC為原邊控制IC,最大可設計瓦數為18W,內置一顆
    的頭像 發表于 11-12 11:03 ?1030次閱讀
    EMI傳導500KHz位置余量不足<b class='flag-5'>怎么辦</b>?快來試試這個方法

    盛顯科技:投影融合處理器連接出現超時,怎么辦?

    了連接嘗試的失敗。這樣的情形無疑會給我們的使用帶來諸多不便與困擾。那么您知道投影融合處理器連接出現超時,怎么辦嗎?下面盛顯科技小編為您介紹: 投影融合處理器連接出現超時,可采取以下處理措施: 1、檢查網絡連接
    的頭像 發表于 11-06 10:58 ?550次閱讀
    盛顯科技:投影融合處理器連接出現超時,<b class='flag-5'>該</b><b class='flag-5'>怎么辦</b>?

    安裝proteus8.15時出現這種情況怎么辦

    安裝proteus8.15時出現這種情況怎么辦,請求幫忙解答一下,急求,需要使用所以要趕緊給下載,求告知。
    發表于 10-24 19:28

    TAS5711功放ESD打掛了,怎么辦

    TAS5711 功放ESD 打掛了,怎么辦? 1.如何防護。 2,.哪個寄存器判斷是否能工作正常? 3.設計上有什么建議?
    發表于 10-23 08:09

    TAS5751M PurePathTM軟件無法使用怎么辦呢?

    有位客戶說登錄了myTI賬號也無法使用,如下圖,請問怎么辦呢?
    發表于 10-18 07:19

    盛顯科技:投影融合處理器兼容性出現問題,怎么辦?

    ,解決這些兼容性問題顯得尤為重要。那么您知道投影融合處理器兼容性出現問題,怎么辦嗎?下面盛顯科技小編為您介紹: 當投影融合處理器出現兼容性問題時,可以采取以下措施來解決: 一、檢查與確認 (1)確認設備兼容性: 需要確
    的頭像 發表于 10-16 12:11 ?577次閱讀
    盛顯科技:投影融合處理器兼容性出現問題,<b class='flag-5'>該</b><b class='flag-5'>怎么辦</b>?

    信號噪聲太大怎么辦

    我用一個TMR磁場傳感器,后面接一個儀表放大器,測出來的信號的噪聲特別大,如圖所示。這種情況怎么辦
    發表于 09-06 11:09

    ddos造成服務器癱瘓后怎么辦

    在服務器遭受DDoS攻擊后,應立即采取相應措施,包括加強服務器安全、使用CDN和DDoS防御服務來減輕攻擊的影響。rak小編為您整理發布ddos造成服務器癱瘓后怎么辦
    的頭像 發表于 08-15 10:08 ?512次閱讀

    盛顯科技:投影融合處理器畫面出現閃爍或抖動,怎么辦?

    采取一系列專業而周密的處理措施來解決問題。那么您知道投影融合處理器畫面出現閃爍或抖動,怎么辦嗎?下面盛顯科技科技小編為您介紹: 投影融合處理器畫面出現閃爍或抖動,可采取以下措施進行處理: 一、檢查電源與連接
    的頭像 發表于 08-14 17:00 ?732次閱讀
    盛顯科技:投影融合處理器畫面出現閃爍或抖動,<b class='flag-5'>該</b><b class='flag-5'>怎么辦</b>?

    盛顯科技:投影融合處理器出現顏色失真或偏色,怎么辦

    我們在使用投影融合處理器的過程中,因種種原因,有時候會遇到出現顏色失真或偏色的情況。此種情況的出現,會對視覺效果、信息傳遞和設備性能產生負面影響。因此,需要我們及時采取措施解決問題,以確保投影設備的正常運行和良好的展示效果表現。那么您知道投影融合處理器出現顏色失真或偏色,怎么辦
    的頭像 發表于 07-31 17:09 ?550次閱讀
    盛顯科技:投影融合處理器出現顏色失真或偏色,<b class='flag-5'>該</b><b class='flag-5'>怎么辦</b>?

    大電流一體成型電感有噪音怎么辦

    電子發燒友網站提供《大電流一體成型電感有噪音怎么辦.docx》資料免費下載
    發表于 07-30 12:30 ?0次下載
    主站蜘蛛池模板: 天堂网中文在线 | 九色中文 | 色老头免费视频 | 成 人在线观看视频网站 | 狠狠色丁香久久综合婷婷 | 大尺度视频网站久久久久久久久 | 萝l在线精品社区资源 | 男男h文小说阅 | 玖操在线 | 欧美性视频一区二区三区 | 成人伊人亚洲人综合网站222 | 亚洲视频一二 | 久久精品国产精品亚洲红杏 | a资源在线观看 | 免费看啪啪网站 | 四虎影院永久免费 | 欧美一级日韩一级亚洲一级 | 国产全肉乱妇杂乱视频 | ts人妖国产一区 | 欧美一区二区不卡视频 | 69久久夜色精品国产69小说 | 真实女人寂寞偷人视频 | 全黄色一级片 | 久青草国产免费观看 | 天天摸天天碰成人免费视频 | 日韩免费 | 久久久午夜精品 | 国产一区二区丁香婷婷 | 嘿嘿嘿视频在线观看 | 男女同床爽爽视频免费 | 亚洲国产婷婷综合在线精品 | 日本黄色绿像 | 无遮挡一级毛片视频 | 天天操夜夜操狠狠操 | 高清不卡日本v在线二区 | 97色在线播放 | 欧美日本免费 | 天天色综合4 | 激情综合激情 | 天天摸夜夜添狠狠添2018 | 丁香六月激情网 |