比特幣交易所 比特幣交易所
Ctrl+D 比特幣交易所
ads
首頁 > ADA > Info

深入理解重入攻擊漏洞_TRA

Author:

Time:1900/1/1 0:00:00

摘要:重入攻擊本質上與編程里的遞歸調用類似,當合約將以太幣發送到未知地址時就可能會發生,威脅以太坊智能合約的安全性。知道創宇區塊鏈安全實驗室?從轉賬方法、fallback 函數、漏洞代碼、源碼分析四個方面入手,深入分析攻擊原因,詳解?The?DAO 事件。

智能合約(英文:Smart contract )的概念于 1995 年由 Nick Szabo 首次提出,它是一種旨在以信息化方式傳播、驗證或執行合同的計算機協議,它允許在沒有第三方的情況下進行可信交易,這些交易可追蹤且不可逆轉。

然而智能合約也并非是安全的,其中?重入 (Re-Entrance) 攻擊?漏洞是以太坊中的攻擊方式之一,早在 2016 年就因為 The DAO 事件而造成了以太坊的硬分叉。

在以太坊中,智能合約能夠調用其他外部合約的代碼,由于智能合約可以調用外部合約或者發送以太幣,這些操作需要合約提交外部的調用,所以這些合約外部的調用就可以被攻擊者利用造成攻擊劫持,使得被攻擊合約在任意位置重新執行,繞過原代碼中的限制條件,從而發生重入攻擊。重入攻擊本質上與編程里的遞歸調用類似,所以當合約將以太幣發送到未知地址時就可能會發生。

簡單的來說,發生重入攻擊漏洞的條件有 2 個:

調用了外部的合約且該合約是不安全的

外部合約的函數調用早于狀態變量的修改

下面給出一個簡單的代碼片段示例:

上述代碼片段就是最簡單的提款操作,接下來會給大家詳細分析重入攻擊造成的原因。

山西深入推進跨境金融區塊鏈服務平臺應用:國家外匯管理局山西省分局深入推進跨境金融區塊鏈服務平臺應用,為中小微外貿企業跨境結算與融資擴渠道、增便利。目前,山西省已有17家銀行加入該平臺,為16家企業辦理融資業務116筆,累計放款7.67億美元。(中國新聞網)[2020/5/3]

在正式的分析重入攻擊之前,我們先來介紹幾個重點知識。

轉賬方法

由于重入攻擊會發送在轉賬操作時,而 Solidity 中常用的轉賬方法為

<address>.transfer(),<address>.send() 和 <address>.gas().call.vale()(),下面對這 3 種轉賬方法進行說明:

<address>.transfer():只會發送 2300 gas 進行調用,當發送失敗時會通過 throw 來進行回滾操作,從而防止了重入攻擊。

<address>.send():只會發送 2300 gas 進行調用,當發送失敗時會返回布爾值 false,從而防止了重入攻擊。

<address>.gas().call.vale()():在調用時會發送所有的 gas,當發送失敗時會返回布爾值 false,不能有效的防止重入攻擊。

fallback 函數

接著我們來講解下 fallback 回退函數。

回退函數 (fallback function):回退函數是每個合約中有且僅有一個沒有名字的函數,并且該函數無參數,無返回值,如下所示:

吉林省法院部署2020年工作:要深入推進區塊鏈技術創新應用:2月28日,吉林省法院召開網絡安全和信息化領導小組2020年第一次會議,聽取2019年全省法院網絡安全和信息化建設情況匯報,研究部署2020年工作。會議要求,要以重點任務為抓手,全面加快智慧法院建設工作。深入推進區塊鏈技術創新應用,全面加快業務場景的創新應用研發。(新浪網)[2020/2/29]

function() public payable{???

? ? ? ...

}

回退函數在以下幾種情況中被執行:

調用合約時沒有匹配到任何一個函數;

沒有傳數據;

智能合約收到以太幣(為了接受以太幣,fallback 函數必被標記為 payable)。

漏洞代碼

下面的代碼就是存在重入攻擊的,實現的是一個類似于公共錢包的合約,所有的用戶都可以使用 deposit() 存款到 Reentrance 合約中,也可以從 Reentrance 合約中使用 withdraw() 進行提款,當然了所有人也可以使用 balanceof() 查詢自己或者其他人在該合約中的余額。

首先使用一個賬戶 (0x5B38Da6a701c568545dCfcB03FcB875f56beddC4) 扮演受害者,將該合約在 Remix IDE?點擊 Deploy 按鈕進行部署。

動態 | 中國聯通將深入開展區塊鏈等前瞻安全技術研究:據通信世界網消息,中國聯通網研院副院長朱常波表示,中國聯通高度重視網絡安全能力建設,提出了‘全方位、高智能、重演進、大生態’的網絡安全總體發展戰略。其中,高智能是指要充分利用大數據、人工智能等創新技術,建設全面感知、精準處置的決策響應中樞,實施積極主動的防御模式;重演進是指提前布局5G、 SDN等新型網絡架構安全研究,深入開展量子加密、區塊鏈等前瞻安全技術研究,積極探索自主可控的創新技術,重構未來網絡的安全能力。[2018/12/18]

在部署合約成功后在 VALUE 設置框中填寫 5,將單位改成 ether,點擊 deposit 存入 5 個以太幣。

點擊 wallet 查看該合約的余額,發現余額為 5 ether,說明我們的存款成功。

而下面的代碼則是針對上面存在漏洞的合約進行的攻擊:

中國發展高層論壇將對區塊鏈技術進行深入討論:2018年中國發展高層論壇將于3月24至26日在北京舉行,中國發展研究基金會相關人士表示,中國發展高層論壇在今年迎來了第19屆。圍繞高質量發展、財稅體制改革、供給側結構性改革與金融政策、全面開放新格局、創新與未來等重大議題,中外方嘉賓將開展深入討論。此外,參會嘉賓還將對中國改革開放四十周年、全球不平等、新時代的中美關系、一帶一路、人工智能時代的產業轉型、鄉村振興與農業現代化、金融創新與區塊鏈革命等熱點議題進行深入交流。[2018/2/26]

使用另外一個賬戶 (0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2) 扮演攻擊者,復制存在漏洞的合約地址到 Deploy 的設置框內,點擊 Deploy 部署上面的攻擊合約。

部署成功后先調用 wallet() 函數查看攻擊合約的余額為 0。

攻擊者先存款 1 ether 到漏洞合約中,這里設置 VALUE 為 1 ether,之后點擊攻擊合約的 deposit 進行存款。

全球的規則制定者將深入研究數字貨幣:擔任G20金融穩定委員會(FSB)主席和英格蘭銀行行長的馬克·卡尼(Mark Carney)表示,鑒于去年數字貨幣的爆炸式增長,全球的規則制定者將深入研究數字貨幣。卡尼先生告訴財政部特別委員會說,他希望金融穩定委員會能夠討論分布式分類賬技術,這是加密貨幣和數字貨幣本身的基礎。他還表示,收緊有關ICO的規定是十分必要的。卡尼先生被委員會問及如何看待比特幣,他重復了英國官員之前的言論,盡管比特幣的價值在上漲,但當局并不認為這會成為英國整體金融穩定的風險。他補充說,英國央行認為支撐比特幣的分布式賬本技術可以最好地應用于大規模的結算,但仍然需要正確部署接下來的道路。[2017/12/21]

再次調用合約的 wallet 函數查看漏洞合約的余額,發現已經變成了 6 ether。

攻擊者 (0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2) 調用攻擊合約的 attack 函數模擬攻擊,之后調用被攻擊合約的 wallet 函數去查看合約的余額,發現已經歸零,此時回到攻擊合約查看余額,發現被攻擊合約中的 6 ether 已經全部提款到了攻擊者合約中,這就造成了重入攻擊。

源碼分析

上面講解了如何進行重入攻擊已經漏洞原因,這里梳理了漏洞源碼和攻擊的步驟,列出了關鍵代碼。

2016 年 6 月 17 日,TheDAO 項目遭到了重入攻擊,導致了 300 多萬個以太幣被從 TheDAO 資產池中分離出來,而攻擊者利用 TheDAO 智能合約中的 splitDAO() 函數重復利用自己的 DAO 資產進行重入攻擊,不斷的從 TheDAO 項目的資產池中將 DAO 資產分離出來并轉移到自己的賬戶中。

下列代碼為 splitDAO() 函數中的部分代碼,源代碼在 TokenCreation.sol 中,它會將代幣從 the parent DAO 轉移到 the child DAO 中。平衡數組 uint fundsToBeMoved = (balances[msg.sender] * p.splitData.splitBalance) ?/ p.splitData.totalSupply 決定了要轉移的代幣數量。

下面的代碼則是進行提款獎勵操作,每次攻擊者調用這項功能時 p.splitData 都是一樣的(它是 p 的一個屬性,即一個固定的值),并且 p.splitData.totalSupply 與 balances[msg.sender] 的值由于函數順序問題,發生在了轉賬操作之后,并沒有被更新。

paidOut[_account] += reward 更新狀態變量放在了問題代碼 payOut 函數調用之后。

對 _recipient 發出 .call.value 調用,轉賬 _amount 個 Wei,.call.value 調用默認會使用當前剩余的所有 gas。

通過上面對重入攻擊的分析,我們可以發現重入攻擊漏洞的重點在于使用了 fallback 等函數回調自己造成遞歸調用進行循環轉賬操作,所以針對重入攻擊漏洞的解決辦法有以下幾種。

使用其他轉賬函數

在進行以太幣轉賬發送給外部地址時使用 Solidity 內置的 transfer() 函數,因為 transfer() 轉賬時只會發送 2300 gas 進行調用,這將不足以調用另一份合約,使用 transfer() 重寫原合約的 withdraw() 如下:

先修改狀態變量

這種方式就是確保狀態變量的修改要早于轉賬操作,即 Solidity 官方推薦的檢查-生效-交互模式 (checks-effects-interactions)。

使用互斥鎖

互斥鎖就是添加一個在代碼執行過程中鎖定合約的狀態變量以防止重入攻擊。

使用?OpenZeppelin 官方庫

OpenZeppelin 官方庫中有一個專門針對重入攻擊的安全合約:

https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/security/ReentrancyGuard.sol

參考文獻

1. 以太坊的幾次硬分叉:

https://zhuanlan.zhihu.com/p/111446792

2. 以太坊智能合約安全漏洞 (1):重入攻擊:

https://blog.csdn.net/henrynote/article/details/82119116

3.?區塊鏈的那些事 — THE DAO 攻擊事件源碼分析:

https://blog.csdn.net/Fly_hps/article/details/83095036

Tags:THEALLDAOTRAThe Crypto PropheciesBlockchain Valley VirtualTracer DAOUltrAlpha

ADA
美國投資者在2020年從比特幣收益中凈賺41億美元_加密貨幣

根據區塊鏈分析公司 Chainalysis 的一份報告,美國的比特幣投資者在2020年實現了41億美元的比特幣收益.

1900/1/1 0:00:00
金色觀察 | 比特幣重挫10% 仍不能妨礙“國家隊”入場_DAI

從馬斯克的“嘴”到中國的監管,再到特朗普的“比特幣是騙局,我不喜歡它”,比特幣接連遭受打擊而頻頻下跌。數據顯示,最近24h比特幣跌破3.3萬美元,跌幅達10.3%.

1900/1/1 0:00:00
人民政協報:說說“數字貨幣”_數字貨幣

“十四五”規劃和2035年遠景目標綱要提出“穩妥推進數字貨幣研發”,彰顯了對數字人民幣的積極審慎態度。我國龐大的消費市場、豐富的消費場景,將為數字人民幣的推進提供重要支撐.

1900/1/1 0:00:00
解密NFT藝術品:虛擬世界給藝術交易帶來泡沫還是機會?_數字藝術

最近,成都畫家李建勛拍賣個人畫作,獲得人民幣77554元。畫家賣畫本是尋常,可李建勛這次賣畫的奇特在于——他賣出的不是可懸掛在家中的畫,而是這些畫的數字編碼號(證書)及實物的100%精度數碼掃描.

1900/1/1 0:00:00
技術周刊|Kusama已上線第1條公益平行鏈Statemine_ARM

本周技術周刊包含以太坊、Kusama、Filecoin、zkSync、Swarm五個網絡的技術類新聞.

1900/1/1 0:00:00
以太坊元宇宙入門:虛擬土地拍賣_NFT

近幾十年來,虛擬世界對人類而言已變得越來越重要,我相信在接下來的幾十年里,這些VR世界將逐漸成為以太坊的重心.

1900/1/1 0:00:00
ads