加密貨幣交易所 加密貨幣交易所
Ctrl+D 加密貨幣交易所
ads
首頁 > XMR > Info

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

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。

Fireblocks Web3負責人:傳統金融公司正在深入研究加密貨幣:金色財經報道,Fireblocks的Web3負責人表示,傳統金融公司正在進一步進入加密領域。Fireblocks代表1,500多家金融機構托管資金,并使它們能夠與區塊鏈和加密服務進行交互。

Amsel表示,這些公司,尤其是更傳統的公司,從托管服務開始,然后慢慢轉向更多的加密原生交互。Amsel說,“我們看到越來越多的傳統金融正在探索進入加密貨幣的方式,也許他們正在采取一種更加膽小的方法”。

Amsel舉了一個假設的例子,一家公司可能在一兩年前開始使用加密貨幣托管。他說,這些公司邁出了第一步,看到沒問題,然后開始更多地探索這項技術。[2022/11/6 12:21:55]

Args

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

Memory

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

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

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

廣州市市長郭永航帶隊深入調研“元宇宙”產業發展:金色財經報道,智度股份(000676)官微消息,3月2日上午,廣州市市委副書記、市長郭永航帶領市政府領導班子一行考察智度股份與國光電器(002045),深入一線調研“元宇宙”產業發展情況,并就企業在“元宇宙”領域的技術、人才、市場以及創新等方面情況進行了充分交流。(同花順)[2022/3/3 13:35:08]

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

未優化:

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);? ?}}

優化后:

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);? ?}}

高鴻股份:公司正在深入研究可信計算在區塊鏈的應用:高鴻股份在互動平臺表示,公司正在深入研究可信計算在區塊鏈的應用,可信計算可以有效提高區塊鏈節點設備的安全,并保護底層軟件不被滲透和篡改。公司計劃為區塊鏈產業提供以可信計算為核心的安全加固技術支持。(財聯社)[2021/4/19 20:36:09]

對于大小在 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);? ?}}

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

聲音 | 河北辛集副市長:大力推進“區塊鏈+智能制造”的深入融合:12月27日,河北省鋼鐵行業“區塊鏈+智能制造”主題峰會在石家莊辛集市舉行,峰會由河北省冶金行業協會、中國電信河北分公司、長城新媒體集團主辦。辛集市副市長牛軍波表示,冶金行業的發展對于辛集市的經濟建設起到舉足輕重的作用,目前鋼鐵行業的自動化、信息化的發展已具有良好的基礎。大力推進“區塊鏈+智能制造”的深入融合,可以為鋼鐵行業帶來全面的提升,在提高企業競爭力、打造優質產品方面提供有力支持。(長城網)[2019/12/27]

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);? ?}? ?}

聲音 | 大連港:將繼續開拓區塊鏈技術 深入開展創新工作:金色財經報道,大連港(601880)被提問“除了區塊鏈電子放貨平臺之外,接下來還有什么區塊鏈項目落地”時表示,目前,大連港利用區塊鏈的去中心化、不可篡改、共享賬本等特征所建立的區塊鏈信任機制,使業務信息公開透明公正,借助區塊鏈的數據加密作用強化數據信息安全功能,確保數據的安全性、完整性和一致性,使船、輪駁公司、智慧港口平臺各方都能實時、安全、無縫地傳遞拖輪作業信息,實現全程留痕和全程可追溯,滿足輪駁業務的安全性和準確性要求。未來大連港還將繼續開拓區塊鏈技術業務實現場景,深入開展創新工作,在全港口領域推行區塊鏈技術應用落地。(上證e互動)[2019/10/30]

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

而具體的數據地址會通過計算 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:UININT區塊鏈LICQUINTAMINTY區塊鏈是什么工作DALICHAIN

XMR
全球這242家機構正在大力推進區塊鏈技術應用_區塊鏈:區塊鏈dapp開發

根據資本實驗室與遠望智庫聯合發布的《2021全球區塊鏈應用市場報告》,區塊鏈技術通過與各行業、各領域的持續融合,正處于加速落地應用階段,并顯示出其在信任、共享、交易、效率、安全等方面的獨特性能.

1900/1/1 0:00:00
洞察新興公鏈生態的潛力項目 哪類協議有異軍突起之勢?_ANC:TVL

隨著流動性激勵的變化,BSC、Polygon、Heco等公鏈出現資金外流,而Solana、Avalanche、Terra、Fantom的TVL經歷了快速上升.

1900/1/1 0:00:00
盤點過去兩周國際媒體發布的NFT新聞_NFT:區塊鏈

塞蕾娜出現在意大利媒體上??當代數字藝術博物館(Museum of Contemporary Digital Art)館長兼聯合創始人塞蕾娜·塔巴奇(Serena Tabacchi)參加了意大利.

1900/1/1 0:00:00
科技巨頭搶灘元宇宙 一文梳理元宇宙的七個挑戰_元宇宙:元宇宙平臺公司

元宇宙在普及之前,還要面臨知識產權糾紛、數據隱私、法律、支付系統、技術限制和民眾接受度低等挑戰.

1900/1/1 0:00:00
金色DeFi日報 | NFT第三季度交易額環比增長超700%_區塊鏈:去中心化金融defi入門分析與理解

DeFi總市值:1284.71億美元 DeFi總市值數據來源:Coingecko過去24小時去中心化交易所的交易量:33.

1900/1/1 0:00:00
外國主體 在境內可經營虛擬幣業務嗎?_OTC:區塊鏈

伴隨2021年9月24日《關于整治虛擬貨幣“挖礦”活動的通知》及《關于進一步防范和處置虛擬貨幣交易炒作風險的通知》的出臺與施行,颯姐團隊在近期接到了諸多幣圈、礦圈朋友關于新規內容的法律咨詢.

1900/1/1 0:00:00
ads