麻豆国内精品欧美在线-麻豆国内精品久久久久久-麻豆国产在线观看一区二区-麻豆国产在线观看免费-麻豆国产原创-麻豆国产一区二区在线观看

曲速未來 :以太坊智能合約編碼安全之Call注入區塊鏈

區塊鏈安全檔案 2018-09-14 19:42
分享到:
導讀

區塊鏈安全咨詢公司曲速未來表示:Solidity作為一種用于編寫以太坊智能合約的圖靈完備的語言,除了常見語言特性以外,還提供了調用/繼承其他合約的功能。在call、delegatecall、callcode三個函數來實現合約之間相互調用及交互。

前言

區塊鏈安全咨詢公司 曲速未來 表示:Solidity作為一種用于編寫以太坊智能合約的圖靈完備的語言,除了常見語言特性以外,還提供了調用/繼承其他合約的功能。在call、delegatecall、callcode三個函數來實現合約之間相互調用及交互。正是因為這些靈活各種調用,也導致了這些函數被合約開發者“濫用”,甚至“肆無忌憚”提供任意調用“功能”,導致了各種安全漏洞及風險。

上述代碼就是一個典型的存在call注入問題直接導致重入漏洞的demo。

2016年7月,The DAO被攻擊者使用重入漏洞取走了所有代幣,損失超過60億,直接導致了eth的硬分叉,影響深遠。

2017年7月20日,Parity Multisig電子錢包版本1.5 的漏洞被發現,使得攻擊者從三個高安全的多重簽名合約中竊取到超過15萬ETH ,其事件原因是由于未做限制的 delegatecall 函數調用了合約初始化函數導致合約擁有者被修改。

2018年6月16日,有人在先知大會上提到了一種新的攻擊場景——call注?,主要介紹了利用對call調用處理不當,配合一定的應用場景的一種攻擊手段。

接著于 2018年6月20日,ATN代幣團隊發布《ATN抵御黑客攻擊的報告》,報告指出黑客利用call注入攻擊漏洞修改合約擁有者,然后給自己發行代幣,從而造成 ATN 代幣增發。

Solidity 的三種調用函數

在Solidity中,call函數簇可以實現跨合約的函數調用功能,其中包括call、delegatecall和callcode三種方式。

以下是Solidity中call函數簇的調用模型:

這些函數提供了靈活的方式與合約進行交互,并且可以接受任何長度、任何類型的參數,其傳入的參數會被填充至32字節最后拼接為一個字符串序列,由EVM解析執行。

在函數調用的過程中,Solidity中的內置變量msg會隨著調用的發起而改變,msg保存了調用方的信息包括:調用發起的地址,交易金額,被調用函數字符序列等。

三種調用方式的異同點

call: 最常用的調用方式,調用后內置變量msg的值會修改為調用者,執行環境為被調用者的運行環境(合約的 storage)。

delegatecall: 調用后內置變量msg的值不會修改為調用者,但執行環境為調用者的運行環境。

callcode: 調用后內置變量msg的值會修改為調用者,但執行環境為調用者的運行環境。

delegatecall濫用問題

delegatecall: 調用后內置變量msg的值不會修改為調用者,但執行環境為調用者的運行環境。

原理

在智能合約的開發過程中,合約的相互調用是經常發生的。開發者為了實現某些功能會調用另一個合約的函數。比如下面的例子,調用一個合約A的test()函數,這是一個正常安全的調用。

但是在實際開發過程中,開發者為了兼顧代碼的靈活性,往往會有下面這種寫法:

這將引起任意 public 函數調用的問題:合約中的delegatecall的調用地址和調用的字符序列都由用戶傳入,那么完全可以調用任意地址的函數。

除此之外,由于delegatecall的執行環境為調用者環境,當調用者和被調用者有相同變量時,如果被調用的函數對變量值進行修改,那么修改的是調用者中的變量。

call 安全問題

call: 最常用的調用方式,調用后內置變量msg的值會修改為調用者,執行環境為被調用者的運行環境。

call注入是一種新的攻擊場景,原因是對call調用處理不當,配合一定的應用場景的一種攻擊手段。

call 注入原理

call 調用修改 msg.sender 值

通常情況下合約通過call來執行來相互調用執行,由于call在相互調用過程中內置變量msg會隨著調用方的改變而改變,這就成為了一個安全隱患,在特定的應用場景下將引發安全問題。

外部用戶通過call函數再調用合約函數:

高度自由的 call 調用

在某些應用場景下,調用函數可以由用戶指定;下面是call函數的調用方式:

從上面可以看出,call函數擁有極大的自由度:

1.對于一個指定合約地址的call調用,可以調用該合約下的任意函數

2.如果call調用的合約地址由用戶指定,那么可以調用任意合約的任意函數

為了便于理解,可以將智能合約中的call函數類比為其他語言中的eval函數,call函數相當于給用戶提供了隨意調用合約函數的入口,如果合約中有函數以msg.sender作為關鍵變量,那么就會引發安全問題。

call 函數簇調用自動忽略多余參數

call函數簇在調用函數的過程中,會自動忽略多余的參數,這又額外增加了call函數簇調用的自由度。下面的例子演示call自動忽略多余參數:

例子中test()函數僅接收一個uint256的參數,但在callFunc()中傳入了三個參數,由于call自動忽略多余參數,所以成功調用了test()函數。

callcode 安全問題

callcode: 調用后內置變量msg的值會修改為調用者,但執行環境為調用者的運行環境。

由于callcode同時包含了call和delegatecall 的特性,通過上文對call和delegatecall的安全問題進行了分析和舉例,可以得出的結論是call和delegatecall存在的安全問題將同時存在于callcode中,這里不再進行詳細的分析。

總結

針對文中所提到的安全隱患,區塊鏈安全咨詢公司 曲速未來 建議:

1.call、callcode、delegatecall調用的自由度極大,并且call會發生msg值的改變,需要謹慎的使用這些底層的函數;同時在使用時,需要對調用的合約地址、可調用的函數做嚴格的限制。

2.call與callcode調用會改變msg的值,會修改msg.sender為調用者合約的地址,所以在合約中不能輕易將合約本身的地址作為可信地址。

3.delegatecall與callcode會拷貝目標代碼到自己的環境中執行,所以調用的函數應該做嚴格的限制,避開調用任意函數的隱患。

4.智能合約在部署前必須通過嚴格的審計和測試。

本文內容由 曲速未來安全咨詢公司編譯,轉載請注明。 曲速未來提供包括主鏈安全、交易所安全、交易所錢包安全、DAPP開發安全、智能合約開發安全等相關區塊鏈安全咨詢服務。

調用 合約 函數 安全 delegatecall
分享到:

1.TMT觀察網遵循行業規范,任何轉載的稿件都會明確標注作者和來源;
2.TMT觀察網的原創文章,請轉載時務必注明文章作者和"來源:TMT觀察網",不尊重原創的行為TMT觀察網或將追究責任;
3.作者投稿可能會經TMT觀察網編輯修改或補充。


主站蜘蛛池模板: 欧美精品亚洲精品日韩专区va | 国产99er66在线视频 | 美女污视频在线观看 | 二次元美女扒开内裤露尿口 | 亚洲天堂一区二区在线观看 | 国产99精品成人免费视频 | 国产午夜精品一区二区三区 | 国产精品久久久久久久免费大片 | 亚洲欧美另类第一页 | chinesemature精品| 经典三级四虎在线观看 | 国产东北三老头伦一肥婆 | 亚洲午夜精品久久久久久人妖 | 亚洲国产精品成人久久 | 免费成年网站 | 1769在线观看 | 情缘免费观看完整版 | 美女隐私部位视频网站 | 日韩在线观看免费 | 香蕉久久一区二区三区 | 男人躁女人p| 无码人妻少妇色欲AV一区二区 | 动漫美女日批 | 娇小异类videos | 国产91一区二区在线播放不卡 | 人人爱天天做夜夜爽88 | 久久热国产在线视频 | 草草视频人人爽 | meyd—447佐山爱在线 | 免费一级特黄特色大片在线观看 | 欧美日韩精品乱国产 | 校服下的白嫩小乳尖h1v1 | 很黄的网站在线观看 | 办公室操秘书 | 蜜桃影像传媒破解版 | 接吻吃胸摸下面啪啪教程 | 久久久大香菇 | 成人国产在线播放 | 亚洲干综合 | 黄a 大片a v 永久免费 | 精品高潮呻吟99AV无码视频 |