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。
Bondly獲OKEx Blockdream Ventrues投資 雙方將深入探索NFT領域:據官方消息,Bondly已獲OKEx Blockdream Ventrues(OKEx BDV)投資,雙方將深入探索NFT領域,為NFT優質區塊鏈項目發展提供服務和資源支持。一方面,Bondly將通過NFT形式為OKEx BDV合作的優質項目提供LaunchPad服務;另一方面,雙方共同把優秀品牌帶到Bprotect,也將以NFT創新形式與OKExChain生態資產進行品牌合作。
Bondly是一種可互操作、透明、便捷的資產兌換協議,旨在徹底改變傳統的資產托管方法,并使每個藝術創作人都能進入自己的數字市場,旗下產品包括BSwap(NFT發售平臺)、Bondly LaunchPad(IDO平臺)、BProtect(NFT交易平臺)。OKEx BDV初始資金1 億美金,致力于發現和投資最前沿的產品技術創新類區塊鏈項目,投資方向包括基礎設施、交易及金融項目、公鏈生態類項目、應用類流量入口等。[2021/5/6 21:28:39]
Args
args 也叫 calldata,是一段只讀的可尋址的保存函數調用參數的空間,與棧不同的地方的是,如果要使用 calldata 里面的數據,必須手動指定偏移量和讀取的字節數。
Memory
Memory 一個簡單的字節數組,主要是在運行期間存儲數據,將參數傳遞給內部函數。基于 32byte 進行尋址和擴展。
姚前:區塊鏈技術值得數據跨境流動及其監管各方深入研究:《中國金融》2020年第22期,中國證監會科技監管局局長姚前刊文《數據跨境流動的制度建設與技術支撐》表示,支付標記化技術將個人數據的“匿名化”交由可信第三方負責,而區塊鏈技術則創造了用戶完全自主可控的數據隱私保護新思路。用戶的私鑰可以本地生成,通過公鑰計算發布有效的賬戶地址,從而隔斷賬戶地址和賬戶持有人真實身份的關聯。通過控制私鑰,用戶可以在區塊鏈上自主完成交易,雖然在區塊鏈網絡上能夠看到每一筆交易的細節,但無法對應到現實世界中的具體某個人。區塊鏈技術從根本上打破中心化模式下數據控制者對數據的天然壟斷,賦予用戶真正的數據隱私保護權。區塊鏈技術還可與先進密碼學技術結合,發展出各類隱私保護方案。比如,利用基于環簽名、群簽名等密碼學方案保護簽名方身份;采用高效的同態加密方案實現密文的多方處理,隱藏用戶交易金額等敏感信息;采用零知識證明方案,使交易數據能被審查和驗證,但又不能被真實探知。區塊鏈技術這一自主可控的隱私保護新思路,值得數據跨境流動及其監管各方深入研究。[2020/11/24 21:56:04]
前面已經說過 Storage 是每個合約持久化存儲數據的地方其儲存數據的方式是通過插槽來實現的,現在就具體介紹它是怎么實現的:
1.對于大小在 32 字節以內的變量(常量),以其定義的順序作為它的索引值來存儲。即第一個變量的索引為 key(0),第二個變量的索引為 key(1)...
2.對于連續較小的值,可能被優化存儲在同一個位置,比如:合約中前四個狀態變量都是 uint64 類型的,則四個狀態變量的值會被打包成一個 32 字節的值存儲在 0 位置。
現場 | 觀點:區塊鏈技術需要深入場景才能形成產業:金色財經現場報道,10月15日,華山論劍2020網絡安全大會于西安召開,在大會的區塊鏈安全與應用創新分論壇圓桌討論環節,
基石基金管理合伙人秦少博分享表示,區塊鏈創新型的業務需要承擔比較大的沉默成本,在區塊鏈領域創業需要考量自身能力。區塊鏈技術需要深入場景才能形成產業,過去5年由幣引發的熱潮已經越發理智。把區塊鏈作為技術、生產力討論更合適。不宜與太大的市場概念結合。
中國移動研究院安全技術研究所所長何申分享表示,從通信行業看待區塊鏈,會從系統工程高度去看,當區塊鏈從節點成網形成共識,需要考慮節點的安全。此外,可信是一種保障預期方案,區塊鏈是一種方案,兩種方案的協同,是通信領域的重點。對于區塊鏈透明性帶來的隱私問題可以通過隱私技術解決,但可能在公鏈場景里比較難實現。[2020/10/15]
未優化:
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);? ?}}
優化后:
聲音 | 中國銀行支付清算部總經理:商業銀行借助區塊鏈等技術,深入分析客戶行為以提升支付效率:金色財經報道,11月28日,中國銀行支付清算部總經理范耀勝在第八屆中國支付清算論壇上指出,如今數字化轉型已經成為商業銀行共同關注融入和推動的行業趨勢,主要體現在一智能化,借助大數據、機器學習、區塊鏈等技術,深入分析客戶行為,提升支付效率,實現安全便捷的統一。[2019/11/29]
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);? ?}}
動態 | SAP與蘇寧將在區塊鏈等領域開展深入研究:在“第9屆中德經濟技術合作論壇”上,中國國務院總理李克強與德國總理默克爾,共同見證了SAP與蘇寧控股集團的戰略合作簽約。根據合作協議,未來,雙方將聯合開展技術創新和行業實踐,在人工智能、機器學習、區塊鏈、物聯網等領域開展課題研究,共同促進數字經濟發展。[2018/7/10]
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 字節以內也是順序存儲,不過在編譯時編譯器會進行邊界檢查防止越界。
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 的健值數據庫,存儲的數據可以通過校驗和來確保一致。但是其也是和智能合約語言進行交互的,當其中一些規則發生沖突很可能就被別有用心的人用來作惡,所以規范的使用智能合約語言是避開漏洞的必要條件。
“一個充滿機會的世界,唯一缺少的,就是發現價值的眼睛”Web3.0?的快速發展,新事物層出不窮。每天都可以看到各種新產品的宣發信息.
1900/1/1 0:00:001.DeFi總市值:1477.6億美元 DeFi總市值數據來源:Coingecko2.過去24小時去中心化交易所的交易量:43.
1900/1/1 0:00:00“Play-to-Earn”(P2E)的流行,似乎正在改變著過去DeFi一統天下的局面。據dappradar統計,在剛剛過去的第三季度中,平均每天有大約154萬個活躍的獨立錢包(Unique A.
1900/1/1 0:00:00官方消息,JGN成立生態基金,全球投資 DAO!JGN與眾多領先的全球基金合作,成立JGN生態基金,通過 Juggernaut 投資更多優質的加密項目.
1900/1/1 0:00:00證監會科技監管局局長姚前表示,隨著現代信息技術革命的興起,技術對貨幣的影響正達到前所未有的狀態,比特幣已經引發了全球大規模的數字貨幣實驗。數字時代已然來臨,數字貨幣時代也必將來臨.
1900/1/1 0:00:00姚前? ?中國證監會科技監管局局長在紙媒時代,證券的形式是紙質憑證,立“字”為據;在電子化時代,證券無紙化,以“第三方電子簿記”為據;在數字時代,證券的形式則是可信數字憑證,立“數字”為據.
1900/1/1 0:00:00