chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

動(dòng)不動(dòng)就出事,智能合約攻擊該怎么辦

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

掃碼添加小助手

加入工程師交流群

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

智能合約是動(dòng)態(tài)的,復(fù)雜的以及難以置信地強(qiáng)大。雖然他們的潛力是很難想象,但是也不可能一夜之間就成為了攻擊的對(duì)象。也就是說,對(duì)于往后的數(shù)字貨幣,我們可以從之前的錯(cuò)誤中學(xué)到經(jīng)驗(yàn),然后一起成長。雖然DAO是已經(jīng)發(fā)生的事情,但是這對(duì)于開發(fā)者,投資者,以及社區(qū)成員對(duì)于智能合約攻擊來說,都是一個(gè)很好的例子。

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

攻擊#1:重入攻擊

當(dāng)攻擊者通過對(duì)目標(biāo)調(diào)用提款操作的時(shí)候,重入攻擊就會(huì)發(fā)生,就好像DAO事件一樣。當(dāng)合約不能在發(fā)出資金之前更新狀態(tài)(用戶余額),攻擊者就可以連續(xù)進(jìn)行提取函數(shù)調(diào)用,來獲得合約中的資金。任何時(shí)候攻擊者獲得以太幣,他的合約都會(huì)自動(dòng)地調(diào)用反饋函數(shù),function (),這就再次調(diào)用了提現(xiàn)合約。這時(shí)候,攻擊就會(huì)進(jìn)入遞歸回路,這時(shí)候這個(gè)合約中的資金就會(huì)轉(zhuǎn)入攻擊者。因?yàn)槟繕?biāo)合約都在不停地調(diào)用攻擊者的函數(shù),這個(gè)合約也不會(huì)更新攻擊者的余額。當(dāng)前的合約不會(huì)發(fā)現(xiàn)有任何問題,更清楚地說,合約函數(shù)中包含反饋函數(shù),當(dāng)合約收到以太幣和零數(shù)據(jù)的時(shí)候,合約函數(shù)就會(huì)自動(dòng)執(zhí)行。

攻擊流程

1.攻擊者將以太幣存入目標(biāo)函數(shù)

2.目標(biāo)函數(shù)就會(huì)根據(jù)存入的以太幣而更新攻擊者的約

3.攻擊者請(qǐng)求拿回資金

4.資金就會(huì)退回

5.攻擊者的反饋函數(shù)生效,然后調(diào)用提現(xiàn)功能

6.智能合約的邏輯就會(huì)更新攻擊者的余額,因?yàn)樘岈F(xiàn)又被成功調(diào)用

7.資金發(fā)送到攻擊者

8.第5-7步重復(fù)使用

9.一旦攻擊結(jié)束,攻擊者就會(huì)把資金從他們自己的合約發(fā)送到個(gè)人地址

1*UeDgMZo2n0skHzgkl352zQ

重入攻擊的遞歸回路

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

代碼

下面就是DAO合約的簡單版本,其中會(huì)包括一些介紹來為這些不熟悉代碼/ 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;

如果我們看下函數(shù)withdraw(),我們可以看到DAO合約使用address.call.value()來發(fā)送資金到msg.sender。不僅如此,在資金發(fā)出后,合約會(huì)更新credit[msg.sender]的狀態(tài)。攻擊者在發(fā)現(xiàn)了合約代碼中的問題,就能夠使用類似下面的ThisIsAHodlUp {}來將資金轉(zhuǎn)入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.a(chǎn)ssignedCredit(this));

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

function drainFunds() payable public{

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

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

解決方案

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

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合約不會(huì)讓受害者掉入下溢攻擊,我們能夠通過現(xiàn)有的babyDAO contract{}來更好地理解這些攻擊為什么會(huì)發(fā)生。

首先,我們需要理解什么是256單位制。一個(gè)256單位制是由256個(gè)字節(jié)組成。以太坊的虛擬機(jī)是使用256字節(jié)來完成的。因?yàn)橐蕴惶摂M機(jī)受限于256字節(jié)的大小,所以數(shù)字的范圍是0到4,294,967,295 (22??)。如果我們超過這個(gè)范圍,那么數(shù)字就會(huì)重置到范圍的最底部(22?? + 1 = 0)。如果我們低于這個(gè)范圍,這個(gè)數(shù)字就會(huì)重置到這個(gè)范圍的頂端(0–1= 22??)。

當(dāng)我們從零中減去大于零的數(shù),就會(huì)發(fā)生下溢攻擊,導(dǎo)致一個(gè)新的22??數(shù)集?,F(xiàn)在,如果攻擊者的余額發(fā)生了下溢,那么這部分余額就會(huì)更新,從而導(dǎo)致整個(gè)資金被盜。

攻擊流程

攻擊者通過發(fā)出1Wei到目標(biāo)合約,來啟動(dòng)攻擊。

合約認(rèn)證發(fā)出資金的人

隨后調(diào)用1Wei的提現(xiàn)函數(shù)

合約會(huì)從發(fā)送者的賬戶扣除的1Wei,現(xiàn)在賬戶余額又是零

因?yàn)槟繕?biāo)合約將以太幣發(fā)給攻擊者,攻擊者的退回函數(shù)被處罰,所以提現(xiàn)函數(shù)又被調(diào)用。

提現(xiàn)1Wei的事件被記錄

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

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

攻擊者通過提現(xiàn)目標(biāo)合約的所有資金,從而完成整個(gè)攻擊

代碼

/*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);

解決方案

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

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)();

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

審核編輯:符乾江
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4922

    瀏覽量

    72236
  • 智能計(jì)算
    +關(guān)注

    關(guān)注

    0

    文章

    191

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    當(dāng)NUC505 USBD設(shè)置為全速模式,主機(jī)發(fā)送“SET REPORT”命令但未正常檢測到 NUC505 怎么辦?

    當(dāng) NUC505 USBD 設(shè)置為全速模式,主機(jī)發(fā)送“SET REPORT”命令但未正常檢測到 NUC505 時(shí)怎么辦?
    發(fā)表于 08-27 12:17

    電腦開機(jī)每次自動(dòng)開啟很多軟件怎么辦?

    電腦開機(jī)每次自動(dòng)開啟很多軟件怎么辦
    發(fā)表于 07-17 06:40

    路由器能連上但是沒有網(wǎng)絡(luò)怎么辦

    路由器能連上但是沒有網(wǎng)絡(luò)怎么辦
    發(fā)表于 07-10 06:15

    電腦連接到openmv,但不會(huì)自動(dòng)彈出盤符,請(qǐng)問怎么辦?

    電腦連接到openmv,但不會(huì)自動(dòng)彈出盤符,請(qǐng)問怎么辦
    發(fā)表于 05-27 06:53

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

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

    FPGA的Jtag接口燒了,怎么辦

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

    TLC2551不能工作的原因?怎么辦?

    用TL431提供參考電壓,后接LM358做射級(jí)跟隨器來降低輸出阻抗, 同時(shí)給兩個(gè)TLC2551提供參考5V電壓,結(jié)果電壓被拉到3.8V,然后去掉一個(gè)AD,參考電壓可以到5V,但是SDO沒有數(shù)據(jù)輸出,怎么辦?。?
    發(fā)表于 02-12 07:58

    開關(guān)電源漏電怎么辦?開關(guān)電源漏電流標(biāo)準(zhǔn)是什么?

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

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

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

    EMI傳導(dǎo)500KHz位置余量不足怎么辦?快來試試這個(gè)方法

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

    SMT錫膏焊接后PCB板面有錫珠產(chǎn)生怎么辦?

    ,會(huì)導(dǎo)致設(shè)備故障和電路板的使用壽命。在接下來深圳佳金源錫膏廠家將討論SMT錫膏焊接后PCB板面有錫珠產(chǎn)生時(shí)怎么辦?錫珠的形成是由于SMT生產(chǎn)過程中的一些原因?qū)е?/div>
    的頭像 發(fā)表于 11-06 16:04 ?1760次閱讀
    SMT錫膏焊接后PCB板面有錫珠產(chǎn)生<b class='flag-5'>怎么辦</b>?

    盛顯科技:投影融合處理器連接出現(xiàn)超時(shí),怎么辦?

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

    安裝proteus8.15時(shí)出現(xiàn)這種情況怎么辦

    安裝proteus8.15時(shí)出現(xiàn)這種情況怎么辦,請(qǐng)求幫忙解答一下,急求,需要使用所以要趕緊給下載,求告知。
    發(fā)表于 10-24 19:28

    TAS5711功放ESD打掛了,怎么辦

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

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

    有位客戶說登錄了myTI賬號(hào)也無法使用,如下圖,請(qǐng)問怎么辦呢?
    發(fā)表于 10-18 07:19