以太幣交易所 以太幣交易所
Ctrl+D 以太幣交易所
ads

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

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。

彭博社:美國聯邦貿易委員會對推特的隱私和安全問題進行更深入審查:12月21日消息,據知情人士透露,在Elon Musk收購推特后,美國聯邦貿易委員會(FTC)正在對推特的隱私和數據安全做法進行更深入的調查。在過去的一個月里,美國聯邦貿易委員會的律師詢問了兩名前高管,自Elon Musk上任以來,推特是否能夠遵守該機構2011年的同意令。Elon Musk的收購導致推特的許多法律、隱私和合規高管離職,引發了更為廣泛的調查。

據悉,這次調查標志著FTC至少第三次就其隱私和數據安全做法對推特進行審查,審查可能導致數百萬美元的罰款,以及FTC對馬斯克本人施加義務的新命令,這些義務將適用于他的公司,即使他卸任CEO或離開推特也仍然有效。(彭博社)[2022/12/21 21:57:50]

Args

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

Memory

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

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

江蘇銀行年報:將對區塊鏈等技術持續深入研究:4月20日消息,日前,江蘇銀行年報指出,江蘇銀行將不斷優化IT治理體系,加快重大創新項目建設,對5G、區塊鏈、人工智能等技術持續深入研究,在互聯網貸款、智能投顧、線上票據貼現、線上動產質押、跨境業務等領域落地的產品擴面成勢。(經濟參考網)[2020/4/20]

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

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

聲音 | 天津市委常委:區塊鏈等科技同經濟等深入協同,城市建設步入城市化3.0的時代:據環球網報道,以“科技賦能城市與區域治理創新”為主題的天津論壇2019于19日在天津拉開帷幕。天津市委常委、教委工委書記于立軍表示,智慧是城市的靈魂,是城市的精氣神,當前新一輪科技革命和產業變革不斷推進,特別是人工智能、區塊鏈和云科技同經濟、社會、文化、生態深入協同,城市建設步入了城市化3.0的時代。[2019/10/20]

對于大小在 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 類型變量存儲的位置。

聲音 | 中國平安:深入開展人工智能、區塊鏈、云三大核心技術的研發與應用:中國平安(601318)昨日發布了即將在年度股東大會及H股類別股東大會上的決議資料,其中包括《公司2019-2021年發展規劃》,規劃在發展措施中指出,公司持續夯實基礎,深入開展人工智能、區塊鏈、云三大核心技術的研發與應用,深度賦能核心業務的客戶經營、渠道管理、客戶服務、風險管控等方面,推動業務價值提升和創新公司孵化。[2019/3/29]

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

全球的規則制定者將深入研究數字貨幣:擔任G20金融穩定委員會(FSB)主席和英格蘭銀行行長的馬克·卡尼(Mark Carney)表示,鑒于去年數字貨幣的爆炸式增長,全球的規則制定者將深入研究數字貨幣。卡尼先生告訴財政部特別委員會說,他希望金融穩定委員會能夠討論分布式分類賬技術,這是加密貨幣和數字貨幣本身的基礎。他還表示,收緊有關ICO的規定是十分必要的。卡尼先生被委員會問及如何看待比特幣,他重復了英國官員之前的言論,盡管比特幣的價值在上漲,但當局并不認為這會成為英國整體金融穩定的風險。他補充說,英國央行認為支撐比特幣的分布式賬本技術可以最好地應用于大規模的結算,但仍然需要正確部署接下來的道路。[2017/12/21]

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

而具體的數據地址會通過計算 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:UININTLICPUBQUIN幣虎cointiger下載alice幣價格PUBE finance

歐易okex官網
如何成為 DAO 工作者并獲取報酬_DAO

DAO 作為一種數字社區,擁有共同使命和財富。在過去的一年里, 隨著 Uniswap 和 Sushi 等協議 DAO (持有數十億美元的資本) 的興起,我們確實看到了該領域取得了一定的成果,同時.

1900/1/1 0:00:00
DeFi周刊 | Coinbase將于年底推出NFT市場_NFT

1.DeFi總市值:1391.36億美元 市值前十幣種價格及本周漲跌幅,數據來源:CoinGecko2.去中心化交易所24小時交易量:44.3億美元 過去24小時DEX交易量 數據來源:Deba.

1900/1/1 0:00:00
數說跨鏈橋:總鎖倉額突破131億美元 9月獨立地址總數超12萬個_BRI

如果縱觀DeFi的發展,可以看到一條較為清晰的路徑。DeFi從去年下半年開始,在流動性挖礦的激勵下,率先在以太坊上爆發.

1900/1/1 0:00:00
肖颯:NFT買家 有100%所有權嗎?_NFT

就颯姐團隊的觀察,目前國內主流的數字藝術品/藏品/作品NFT發行平臺中,買家對NFT享有的權益主要有三類:一是可以在該平臺看到區塊鏈查證信息.

1900/1/1 0:00:00
虛擬貨幣跑分洗錢可能會構成哪些犯罪?(一)_USDT

跑分洗錢是什么?USDT跑分洗錢有什么特點?其與傳統跑分洗錢的區別又是什么?參與USDT跑分有可能會構成哪些犯罪?今天颯姐法律團隊就以案說法.

1900/1/1 0:00:00
為什么“價值儲藏手段”并不存在?_比特幣

我們真正應該構建的是生產性資產和穩定幣特別感謝 David Andolfatto、Vitalik Buterin、Chih-Cheng Liang、Barnabé Monnot 和 Danny.

1900/1/1 0:00:00
ads