【慢霧科技】以太坊 Solidity 未初始化存儲(chǔ)指針安全風(fēng)險(xiǎn)

引子

看到安比實(shí)驗(yàn)室有篇文章在說(shuō)《警惕瘾腰!Solidity缺陷易使合約狀態(tài)失控》的問題,原文鏈接可以在參考鏈接中獲取。

這個(gè)問題實(shí)際上之前在慢霧區(qū)中寂殉,愛上平頂山(山哥)和 keywolf 就有對(duì)一篇外文進(jìn)行了翻譯,可以在 SlowMist 的 GitHub 中找到(地址見參考鏈接)原在,這篇譯文《Solidity 安全:已知攻擊方法和常見防御模式綜合列表》里面就有講到友扰。

其實(shí)就是 Unintialised Storage Pointers(未初始化的存儲(chǔ)指針)的安全問題,EVM中會(huì)將數(shù)據(jù)存儲(chǔ)為 storage 或 memory 庶柿,在函數(shù)中局部變量的默認(rèn)類型取決于它們本身的類型村怪,未進(jìn)行初始化的 storage 變量,會(huì)指向合約中的其他變量浮庐,從而改變其他變量的值甚负,常見的場(chǎng)景就是指向狀態(tài)變量,改變狀態(tài)變量的值审残,導(dǎo)致漏洞的產(chǎn)生梭域。

1,分析過(guò)程

依據(jù) Solidity 官方手冊(cè)上的介紹搅轿,以及經(jīng)過(guò)實(shí)驗(yàn)得到了一些總結(jié)分析病涨。

這里要注意結(jié)構(gòu)體,數(shù)組和映射的局部變量璧坟,在官方手冊(cè)中有提到這些類型的局部變量默認(rèn)是放在 storage 中的既穆,因此這些局部變量可能都存在相同的問題赎懦。(本文分析了結(jié)構(gòu)體和數(shù)組的 Unintialised Storage Pointers 問題,而 mapping 暫未找到存在問題的案例)

而 struct 中在和局部變量進(jìn)行賦值操作的時(shí)候循衰,是保存成一個(gè)引用


如下是問題代碼铲敛,struct 在函數(shù)中被聲明但是沒有初始化,根據(jù)官方文檔中可以知道会钝,struct 在局部變量中默 認(rèn)是存放在 storage 中的伐蒋,因此可以利用 Unintialised Storage Pointers 的問題, p 會(huì)被當(dāng)成一個(gè)指針迁酸,并默 認(rèn)指向 slot[0] 和 slot[1] 先鱼,因此在進(jìn)行 p.name 和 p.mappedAddress 賦值的時(shí)候,實(shí)際上會(huì)修改變量 testA 奸鬓, test B 的值焙畔。

同理數(shù)組也有同樣的問題,如下是問題代碼:


2串远,解決方案

結(jié)構(gòu)體 Unintialised Storage Pointers 問題的正確的解決方法是將聲明的 struct 進(jìn)行賦值初始化宏多,通過(guò)創(chuàng)建一 個(gè)新的臨時(shí) memory 結(jié)構(gòu)體,然后將它拷貝到 storage 中澡罚。

數(shù)組 Unintialised Storage Pointers 問題的正確解決方法是在聲明局部變量 x 的時(shí)候伸但,同時(shí)對(duì) x 進(jìn)行初始化操作。

Solidity 編譯器開發(fā)團(tuán)隊(duì)不出意外將在下一個(gè)版本(Solidity 0.4.25)中對(duì)存在 Unintialised Storage Pointers 問題的代碼進(jìn)行修復(fù)留搔,否則將無(wú)法正常通過(guò)編譯更胖。

開發(fā)人員需要關(guān)注 Solidity 0.4.25 版本的發(fā)布,并且使用 Solidity 0.4.25 編寫代碼隔显。

最后却妨,本篇未涉及的 mapping 未初始化存儲(chǔ)指針的安全問題和案例场斑,期待能夠和師傅們一起研究討論溯壶。

3尽超, 參考鏈接

1)《警惕抽高!Solidity 缺陷易使合約狀態(tài)失控》
2)《Solidity 安全:已知攻擊方法和常見防御模式綜合列表》
3) Solidity 官方-常見問題
4)Solidity 官方-結(jié)構(gòu)定義

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市字柠,隨后出現(xiàn)的幾起案子弧哎,更是在濱河造成了極大的恐慌朵逝,老刑警劉巖萌业,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異奸柬,居然都是意外死亡生年,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門廓奕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)抱婉,“玉大人档叔,你說(shuō)我怎么就攤上這事≌艏ǎ” “怎么了衙四?”我有些...
    開封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)患亿。 經(jīng)常有香客問我传蹈,道長(zhǎng),這世上最難降的妖魔是什么步藕? 我笑而不...
    開封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任惦界,我火速辦了婚禮,結(jié)果婚禮上咙冗,老公的妹妹穿的比我還像新娘沾歪。我一直安慰自己,他們只是感情好雾消,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開白布灾搏。 她就那樣靜靜地躺著,像睡著了一般立润。 火紅的嫁衣襯著肌膚如雪狂窑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天范删,我揣著相機(jī)與錄音蕾域,去河邊找鬼。 笑死到旦,一個(gè)胖子當(dāng)著我的面吹牛旨巷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播添忘,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼采呐,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了搁骑?” 一聲冷哼從身側(cè)響起斧吐,我...
    開封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎仲器,沒想到半個(gè)月后煤率,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡乏冀,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年蝶糯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辆沦。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡昼捍,死狀恐怖识虚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情妒茬,我是刑警寧澤担锤,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站乍钻,受9級(jí)特大地震影響肛循,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜团赁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一育拨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧欢摄,春花似錦熬丧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至绿淋,卻和暖如春闷畸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背吞滞。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工佑菩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人裁赠。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓殿漠,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親佩捞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子绞幌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容