比特幣行情 比特幣行情
Ctrl+D 比特幣行情
ads
首頁 > 波場 > Info

INT:深入理解 EVM 存儲機制及安全問題

Author:

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

EVM 是一個輕量級的虛擬機,其設計初衷就是提供一種可以忽略硬件、操作系統等兼容性的虛擬的執行環境供以太坊網絡運行智能合約。

簡單來說 EVM 是一個完全獨立的沙盒,在 EVM 中運行的代碼是無法訪問網絡、文件系統和其他進程的,以此來避免錯誤的代碼能讓智能合約毀滅或者影響外部環境。

在此基礎上,知道創宇區塊鏈安全實驗室帶大家一起深入理解 EVM 的存儲機制和安全問題。

可以看到 EVM 存儲數據分為兩類:

存儲在 code 和 storage 里的數據是 non-volatile (不容易丟失的)

存儲在 stack,args,memory 里數據是volatile(容易丟失的)

Code

code 部署合約時儲存 data 字段也就是合約內容的空間,即專門存儲智能合約的二進制源碼的空間

Storage

Storage 是一個可以讀寫修改的持久存儲的空間,也是每個合約持久化存儲數據的地方。Storage 是一個巨大的 map,一共 2^256 個插槽 (slot),每個插糟有 32byte,合約中的“狀態變量”會根據其具體類型分別保存到這些插槽中。

Stack

stack 即所謂的“運行棧",用來保存 EVM 指令的輸入和輸出數據。可以免費使用,沒有 gas 消耗,用來保存函數的局部變量,數量被限制在 16 個。stack 的最大深度為 1024 ,其中每個單元是 32 byte。

教育部等六部門:深入應用區塊鏈等信息技術,推動教育數字轉型:7月21日消息,教育部等六部門發布《關于推進教育新型基礎設施建設構建高質量教育支撐體系的指導意見》。指導意見提出,深入應用5G、人工智能、大數據、云計算、區塊鏈等新一代信息技術,充分發揮數據作為新型生產要素的作用,推動教育數字轉型。利用區塊鏈技術保護知識產權,探索個性化資源購買使用和后付費機制。通過用戶評價和第三方評估相結合的方式,推動數字資源迭代更新。(教育部官網)[2021/7/21 1:07:07]

Args

args 也叫 calldata,是一段只讀的可尋址的保存函數調用參數的空間,與棧不同的地方的是,如果要使用 calldata 里面的數據,必須手動指定偏移量和讀取的字節數。

Memory

Memory 一個簡單的字節數組,主要是在運行期間存儲數據,將參數傳遞給內部函數。基于 32byte 進行尋址和擴展。

前面已經說過 Storage 是每個合約持久化存儲數據的地方其儲存數據的方式是通過插槽來實現的,現在就具體介紹它是怎么實現的:

1.對于大小在 32 字節以內的變量(常量),以其定義的順序作為它的索引值來存儲。即第一個變量的索引為 key(0),第二個變量的索引為 key(1)...

2.對于連續較小的值,可能被優化存儲在同一個位置,比如:合約中前四個狀態變量都是 uint64 類型的,則四個狀態變量的值會被打包成一個 32 字節的值存儲在 0 位置。

外匯局山西省分局深入推進跨境金融區塊鏈服務平臺試點工作:疫情期間,外匯局山西省分局深入推進國家外匯管理局推出的跨境金融區塊鏈服務平臺的試點工作,專題調研全省中小微外貿企業融資現狀;深入宣傳,促進更多中小微外貿企業了解區塊鏈平臺融資的便利性;加強推動,鼓勵銀行對中小微外貿企業建立專營服務機制;及時引導,推進銀行主動對接中小微外貿企業,開展出口應收賬款融資;“點對點”輔導,加快推進地方法人銀行上線區塊鏈平臺,挖掘中小微外貿企業融資需求。通過外匯局的有效措施,銀行對中小企業融資的積極性有了明顯提高,企業對區塊鏈融資的便利性也越來越了解,銀行擴大了對中小微企業的融資規模,企業獲得了便捷的融資,實現了“一項政策、多方共贏”。截至今年3月底,16家銀行加入了區塊鏈平臺,全省通過區塊鏈平臺累計放款7.65億美元。山西省涉外中小微外貿企業復工復產1458戶,復工率達91%。(金融時報)[2020/4/9]

未優化:

pragma solidity ^0.4.11;contract C {? ?uint256 a = 12;? ?uint256 c = 12;? ?uint256 b = 12;? ?uint256 d = 12;? ?function m() view public returns(uint256,uint256,uint256,uint256){? ? ? ?return (a,b,c,d);? ?}}

動態 | 中國電信翼支付將在區塊鏈核心應用等方面深入開展技術創新合作:金色財經報道,中國電信翼支付將深化\"5G+金融科技\"創新合作,在支付媒介創新、用戶精準營銷、智能授信、智慧風控、智能投顧、區塊鏈核心應用等方面,深入開展技術創新合作,探索\"5G+金融科技\"新模式。[2019/12/12]

優化后:

pragma solidity ^0.4.11;contract C {? ?uint64 a = 12;? ?uint64 c = 12;? ?uint64 b = 12;? ?uint64 d = 12;? ?function m() view public returns(uint64,uint64,uint64,uint64){? ? ? ?return (a,b,c,d);? ?}}

對于大小在 32 字節以內的結構體同樣也是順序存儲,例如結構體變量索引定義在位置 0,結構體內部有兩個成員,則這兩個成員的依序為 0 和 1。

pragma solidity ^0.4.11;contract C {struct Info {? ?uint256 a ;? ?uint256 b ;}? ?function m() ?external returns(uint256,uint256){? ? ? ?Info storage info;? ? ? ?info.a = 12 ;? ? ? ?info.b = 24 ;? ? ? ?return(info.a,info.b);? ?}}

聲音 | 王天宇:打造銀企協同平臺 深入拓展人工智能、區塊鏈等的應用:據證券日報消息,10月19日,2019第四屆中國物流與供應鏈金融峰會暨第三屆中國商貿物流銀行聯盟峰會在鄭州舉行。中國商貿物流銀行聯盟主席王天宇表示:“我們聯盟有銀行、有電商平臺,有行業的龍頭,匯聚了金融商貿的領軍企業,今后共同打造銀企的協同平臺,免費為聯盟平臺提供金融服務科技,深入拓展人工智能、區塊鏈、大數據、物聯網等的應用,加速金融科技賦能,創新商業模式和業態,發揮聯盟成員互補優勢,加快信息流、商流、物流、資金流的四流合一,融合發展互利共贏。”[2019/10/20]

map 存儲位置是通過 keccak256 (bytes32(key) + bytes32(position) ) 計算得到的,position 表示 key 對應 storage 類型變量存儲的位置。

pragma solidity ^0.4.11;contract Test {?mapping(uint256 => uint256) knownsec;?function go() public {? ? ?knownsec[0x60] = 0x40;?}}

同上,只要在 32 字節以內也是順序存儲,不過在編譯時編譯器會進行邊界檢查防止越界。

動態 | 湖南婁底書記市長會見中國工程院院士陳純,深入探討區塊鏈技術與應用:據婁底新聞網消息,湖南婁底市委書記、市人大常委會主任李薦國9月19日會見中國工程院院士、杭州趣鏈科技有限公司董事長陳純。雙方圍繞區塊鏈技術與應用等方面開展合作,進行了深入探討。李薦國表示,婁底市委、市政府對于區塊鏈發展是積極支持、穩步推進的,目前已取得了初步成效。我們希望雙方能夠尋求一種利益共享、風險共擔、合作共贏的發展模式,在堅持政府引導、企業主導的基礎上,加強對區塊鏈技術應用的監管,讓區塊鏈更好地為經濟社會發展服務,為提高政府效能、創新社會管理服務,盡快把技術優勢轉化為經濟優勢,讓老百姓得到實惠。[2019/9/20]

pragma solidity ^0.4.11;contract C {? ?uint256 a = [12,24,48] ;? ?? ?function m() public view returns(uint256,uint256,uint256){? ? ? ?return (a,a,a);? ?}? ?}

由于可變長度數組長度不定,一般在編譯可變長度數組時會提前預留存儲空間,所以就會使用狀態變量的位置存儲可變長度數組的長度。

而具體的數據地址會通過計算 keccak256 (bytes32(position)) 算得數組首地址,再加數組長度偏移量獲得具體的元素。

pragma solidity ^0.4.11;contract C {? ?uint256[] a = [12,24,48] ;? ?? ?function m() public view returns(uint256,uint256,uint256){? ? ? ?return (a,a,a);? ?}? ?}

如果長度小于等于31字節 :

1.對于定長字節數組則是同定長數組一樣;

2.對于可變字節數組和字符串,會在存儲值位置補0一直到32字節,并用補0的最后一個字節存儲字符串的編碼長度。

pragma solidity ^0.4.4;contract A{? ?string public name0 = "knownsec";?? ?bytes8 public name=0x6b6e6f776e736563;? ?bytes public g ;? ?? ?function test() public {? ? ? ?g.push(0xAA);? ? ? ?g.push(0xBB);? ? ? ?g.push(0xCC);? ?}? ?function go() public view returns(bytes){? ? ? ?return g;? ?}}

當節數組和字符串長度大于31字節時

1.變量位置存儲編碼長度,并且編碼長度公式更換為編碼長度 = 字符數 * 2 + 1

2.真實存儲值第一個位置通過公式 keccak256(bytes32(position)) 獲取,剩余值在獲取到的位置順序存儲,同樣在最后存儲位置補0到32字節。

string public name = "knownsecooooooooooooooooooooooooo";

前面已經講到EVM的存儲結構及存儲機制,現在我們再來探討其安全問題。

漏洞原理:

在官方手冊中提到結構體,數組和映射的局部變量默認是放在 storage 中的,而 solidity 語言中函數中設置的局部變量的默認類型取決于它們本身的類型。

因此如果在函數內部設置以上 storage 類型變量卻沒有進行初始化,他們就相當于存儲指針指向合約中的其他變量,當我們對其進行改變時改變的就是其指向的變量。漏洞合約,目的修改 owner 為自己地址:

pragma solidity ^0.4.0;contract testContract{? ?bool public unlocked = false;? ?address public owner = 0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c;struct Person {? ?bytes32 name;? ?address mappedAddress;}? ?function test(bytes32 _name , address ?_mappedAddress) public{? ? ? ?Person person;? ? ? ?person.name = _name;? ? ? ?person.mappedAddress = _mappedAddress;? ? ? ?require(unlocked);? }}

漏洞合約分析:

可以看到該合約在函數部分創建新的結構體時沒有進行初始化,由此我們可以利用該函數進行對owner的修改。不過使用該函數我們還要通過require驗證,不過這也不難因為狀態變量unlocked也同樣在我們可控的范圍內。

具體操作:

調用test函數分別傳入向_name 傳入:0x0000000000000000000000000000000000000000000000000000000000000001(真值)

_mappedAddress 傳入:0xfB89eCb0188cb83c220aADDa1468C1635208e821(個人地址)

傳參前:

傳參后:

可以看到已經成功更改了地址。

可以看到 EVM 的存儲器就是一個 key=>value 的健值數據庫,存儲的數據可以通過校驗和來確保一致。但是其也是和智能合約語言進行交互的,當其中一些規則發生沖突很可能就被別有用心的人用來作惡,所以規范的使用智能合約語言是避開漏洞的必要條件。

Tags:INTUIN區塊鏈PUBCoinToGoQuinads區塊鏈卡鏈是什么意思Republic Protocol

波場
區塊鏈:31省區市區塊鏈相關政策應用最新進展

近日,阿里研究院、螞蟻研究院“區塊鏈+”研究中心聯合發布《信任經濟的崛起——2020中國區塊鏈發展報告》。報告指出,區塊鏈發展中應用推廣是核心.

1900/1/1 0:00:00
區塊鏈:金色早報 | 外媒:美國首個比特幣期貨ETF將于下周啟動交易

頭條 ▌外媒:美國首個比特幣期貨ETF將于下周開始交易在美國證券交易委員會 (SEC) 的五位委員舉行會議后,SEC于周五首次批準了比特幣期貨ETF.

1900/1/1 0:00:00
VER:金色觀察?|?基于Arweave的NFT平臺Verto:鑄造NFT指南

隨著JAY-Z、Snoop Dogg和Edward Snowden的加入,今年NFT從小眾走向了主流。即使市場下跌,JPEG也在上漲.

1900/1/1 0:00:00
NFT:NFT“羅生門”:繁榮背后的捍衛

摘要 繁榮下的危機 NFT,即Non-Fungible Token,中文名為非同質化通證。“通證”即通過區塊鏈技術,為照片、視頻、音頻和其他類型的數字文件建立經過驗證的被公開證明的所有權.

1900/1/1 0:00:00
區塊鏈:金色觀察|一文讀懂聯盟鏈跨鏈方案Poly Enterprise

當聯盟鏈開始大規模建立的時候,像互聯網一樣,也會面臨新的數據孤島問題,那聯盟鏈間的跨鏈就會成為剛需.

1900/1/1 0:00:00
DAO:去中心化是風險投資的未來

約瑟夫·熊彼特 (Joseph Schumpeter)在 1942 年創造了創造性破壞一詞。其核心思想是,隨著時間的推移,資本主義傾向于一個更有效率的系統。取代舊的、過時的做事方式.

1900/1/1 0:00:00
ads