比特幣交易所 比特幣交易所
Ctrl+D 比特幣交易所
ads

Solidity編譯器中高危漏洞:誤刪狀態變量賦值_TOR

Author:

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

本文從源代碼層面詳解介紹了?Solidity(?0.8.13<=solidity<0.8.17)編譯器在編譯過程中,因為?Yul?優化機制的缺陷導致的狀態變量賦值操作被錯誤刪除的中/高漏洞原理及相應的預防措施。

幫助合約開發人員提高合約開發時的安全意識,有效規避或緩解?SOL-2022-7?漏洞對合約代碼安全性的影響。

官方文檔。

在編譯過程的?UnusedStoreEliminator?優化步驟中,編譯器會將“冗余”的?Storage?寫入操作移除,但由于對“冗余”的識別缺陷,當某個?Yul?函數塊調用特定的用戶定義函數(函數內部存在某個分支不影響調用塊的執行流),且在該?Yul?函數塊中被調用函數前后存在對同一狀態變量的寫入操作,會導致在?Yul?優化機制將塊中該用戶定義函數被調用前的所有的?Storage?寫入操作從編譯層面被永久刪除。

考慮如下代碼:

contractEocene{

????????uintpublicx;

????????functionattack()public{

????????????????x=1;

Solana基金會:截止7月11日,Solana網絡上有1893個驗證節點、925個RPC節點:7月21日消息,Solana基金會官方發布了自2022年10月以來的首份網絡性能報告,數據顯示,截至2023年7月11日,Solana網絡上有1893個區塊生成驗證者、925個RPC節點、中本聰系數為33、活躍開源開發者數量2053個。此外,Solana基金會還公布后即將推出的部分網絡升級舉措,包括擬實施SIMD-33實時投票積分、優化Turbine、以及部署停用違規質押(Deactivate Delinquent Stake)指令等。[2023/7/21 11:08:43]

????????????????x=2;

????????}

}

在?UnusedStoreEliminator?優化時,x=?1?顯然對于函數?attack()的整個執行是冗余的。自然的,優化后的?Yul?代碼會將?x=?1;刪除來降低合約的?gas?消耗。

接下來考慮在中間插入對自定義函數調用:

contractEocene{

uintpublicx;

functionattack(uinti)public{

Cardano已成為過去30天NFT交易量第三高的公鏈,僅次于以太坊與Solana:10月31日消息,據DappRadar發布的一份報告顯示,Cardano已成為NFT交易量第三高的公鏈,僅次于以太坊與Solana。數據顯示,截至10月27日,Cardano30天內的NFT交易量為1.91億美元,僅次于以太坊與Solana。此外,Cardano生態主要的DEXMinswap活躍錢包數量在同樣的時間內增長了19.89%,交易量增長了15.11%;NFT交易市場JPGStore活躍錢包數量增長13.66%,交易量則增長了40%至1120萬美元。[2022/10/31 12:01:20]

????????x=1;

????????y(i);

????????x=2;

}

functiony(uinti)internal{

????????if(i>0){

????????????????return;

????????}

????????assembly{return(?0,?0。

}

Galaxy Digital推出Solana加密基金 追蹤Solana指數:12月15日消息,GalaxyDigital宣布將為Solana推出名為Galaxy Solana Funds的加密基金,該基金將主要面向機構級用戶開放。根據Galaxy的網站,投資者必須至少投入25,000美元,Coinbase將保管這些代幣。據悉,該基金將追蹤Galaxy和彭博社此前創建的Solana指數。(coindesk)[2021/12/15 7:41:52]

}

顯然,由于?y()函數的調用,我們需要判斷?y()函數是否會影響函數?attack()的執行,如果?y()函數可以導致整個函數執行流終止(注意,不是回滾,Yul?代碼中的?return()函數可以實現),那么?x=?1?顯然是不能刪除的,所以對于上面的合約來說由于?y()函數中存在?assembly{return(?0,?0。可以導致整個消息調用終止,x=?1?自然不能被刪除。

但在?Solidity?編譯器中,由于代碼邏輯的問題,使得?x=?1?在編譯時被錯誤的刪除,永久改變了代碼邏輯。

實際編譯測試結果如下:

震驚!不應該被優化的?x=?1?的?Yul?代碼丟了!欲知后事如何,請往下看。

Raydium 與 NFT 市場平臺 Magic Eden 達成合作關系以推動 Solana NFT 生態:10月20日消息,Solana 生態項目 Raydium 在繼推出 NFT Launchpad“DropZone”后,宣布與 NFT 市場平臺 Magic Eden 達成合作關系,Raydium 用戶將能夠在由 Magic Eden 提供支持的 Raydium 網站上交易 NFT,所有上架 NFT 的項目將在 Raydium 和 Magic Eden 網站同步上線,此外,Magic Eden 將整合 Raydium 的 Swaps,允許任何代幣購買平臺上的 NFT。 Raydium DropZone 的項目能夠在 Magic Eden 獲得優先驗證,可以在不到 10 分鐘的時間內加入并上線新項目。[2021/10/20 20:44:23]

在?solidiry?編譯器代碼的?UnusedStoreEliminator?中,通過?SSA?變量追蹤和控制流追蹤來判斷一個?Storage?寫入操作是否是冗余的。當進入一個自定義函數中時,UnusedStoreEliminator?如果遇到:

memory?或?storage?寫入操作:將?memory?和?storage?寫入操作存儲到?m_store?變量中,并將該操作的初始狀態設置為?Undecided;

動態 | SEC撤銷Blockchain Solutions的證券注冊:在美國證券交易委員會(SEC)暫時中止Blockchain Solutions證券交易后不久,SEC已發布針對該公司的行政訴訟結果。SEC在文件中表示,Blockchain Solutions同意根據1934年《證券交易法》第12(j)條的規定進行證券定單調查和撤銷注冊。自2018年6月30日以來,該公司尚未向SEC提交任何定期報告。撤銷證券注冊自2019年10月8日起生效。(financefeeds)[2019/10/9]

函數調用:獲取函數的?memory?或?storage?讀寫操作位置,并和?m_store?變量中存儲的所有?Undecided?狀態下的操作進行對比:

1.如果是對?m_store?中存儲操作的寫入覆蓋,則將?m_store?中對應的操作狀態改為?Unused

2.如果是對?m_store?中存儲操作的讀取,則將對應?m_store?中的對應操作狀態改為?Used

3.如果該函數沒有任何可以繼續執行消息調用的分支,將?m_store?中所有的內存寫操作改為?Unused

???1.在上訴條件下,如果函數可以終止執行流,將?m_store?中,狀態為?Undecided?狀態的?storage?寫操作改為?Used;反之,標識為?Unused

函數結束:將所有標記為?Unused?的寫入操作刪除

對?memory?或?storage?寫入操作的初始化代碼如下:

可以看到,將遇到的?memory?和?storage?寫入操作存儲到?m_store?中

遇到函數調用時的處理邏輯代碼如下:

其中,operationFromFunctionCall()和?applyOperation()實現上訴的?2.1?,?2.2?處理邏輯。位于下方的基于函數的?canContinue?和?canTerminate?進行判斷的?If?語句實現?2.3?邏輯。

需要注意,正是下方的?If?判斷的缺陷,導致了漏洞的存在!!!

operationFromFunctionCall()來獲取該函數的所有?memory?或?storage?讀寫操作,這里需要注意,Yul?中存在很多的內置函數,例如?sstore(),?return()。這里可以看到對于內置函數和用戶定義函數有不同的處理邏輯。

而?applyOperation()函數則是將從?operationFromFuncitonCall()獲取的所有讀寫操作進行對比,來判斷存儲到?m_store?中的是否在該次函數調用中被讀寫,并修改?m_store?中的對應的操作狀態。

考慮上述的?UnusedStoreEliminator?優化邏輯對?Eocene?合約的?attack()函數的處理:

將?x=?1?存儲操作到?m_store?變量中,狀態設置為?Undecided

????1.遇到?y()函數調用,獲取?y()函數調用的所有讀寫操作

????2.遍歷?m_store?變量,發現?y()調用引起的所有讀寫操作和?x=?1?無關,x=?1?狀態仍然是?Undecided

????????1.獲取?y()函數的控制流邏輯,因為?y()函數存在可以正常返回的分支,所以?canContinue?為?True,不進入?If?判斷。x=?1?狀態仍然為?Undecided!!!

????3.遇到?x=?2?存儲操作:

????????1.?遍歷?m_store?變量,發現處于?Undecided?狀態的?x=?1?,x=?2?操作覆蓋?x=?1?,設置?x=?1?狀態為?Unused。

????????2.?將?x=?2?操作存入?m_store,初始狀態為?undecided。

????4.函數結束:

????????1.將所有?m_store?中?undecided?狀態的操作狀態改為?Used

????????2.將所有?m_store?中?Unused?狀態的操作刪除

顯然,在調用函數時,如果被調用函數可以終止消息執行,應該將被調用函數前所有的?Undecided?狀態的寫入操作改為?Used,而不是依舊保留為?Undecided,導致位于被調用函數前的寫入操作被錯誤的刪除。

此外,需要注意的是,每個用戶自定義函數控制流標識是會傳遞的,所以在多個函數遞歸調用的場景下,即便最底層函數滿足上訴邏輯,x=?1?也有可能被刪除。

在Solidity中,舉例了基本相同的邏輯下,不會受到影響的合約代碼。但,該代碼不受該漏洞的影響并不是因為?UnusedStoreEliminator?的處理邏輯存在其他可能,而是在?UnusedStoreEliminator?之前的?Yul?優化步驟中,存在?FullInliner?優化過程會將微小或只有一次調用的被調用函數,嵌入到調用函數中,避免了漏洞觸發條件中的用戶定義函數。

contractNormal{

????uintpublicx;

????functionf(boola)public{

????????x=1;

????????g(a);

????????x=2;

????}

????functiong(boola)internal{

????????if(!a)

????????assembly{return(?0,?0。

????}

}

編譯結果如下:

函數?g(boola)被嵌入到函數?f()中,避免了用戶定義函數的漏洞條件,避免了漏洞的產生。

2.解決方案

最根本的解決方案是不使用在受影響范圍的?solidity?編譯器進行編譯,如果需要使用漏洞版本的編譯器,可以考慮在編譯時去除?UnusedStoreEliminator?優化步驟。

如果想要從合約代碼層面進行漏洞緩解,考慮到多個優化步驟的復雜性,以及實際函數調用流的復雜性,請尋找專業的安全人員進行代碼審計來幫助發現合約中的因為該漏洞導致的安全問題。

Tags:TORSTOSTORSTORETORC幣Silver StonksSTORJdAppstore

比特幣交易
自帶Meme效應,老牌NFT Milady再度翻紅_MIL

原文作者:Nancy,PANews“價值投資一場空,梭哈佩佩住皇宮。”從寂寂無名到躋身市值前100,PEPE譜寫暴富神話的同時,也徹底點燃Meme行情.

1900/1/1 0:00:00
5 個山寨幣跌入谷底,看看都是哪些?_THE

公眾呺:Web3團子 加密貨幣專家本周公布了5個表現最差的山寨幣項目!那么,這些山寨幣是什么?這是詳細信息……專家公布了本周見底的5個山寨幣項目!由于許多宏觀經濟原因.

1900/1/1 0:00:00
八大數據解讀BRC-20:如何影響比特幣生態和礦工收入?_加密貨幣

原文作者:?21?Shares?研究員?TomWan 原文編譯:PANews BRC-20?代幣標準由加密社區用戶@domodat?于?2023?年?3?月?8?日創建.

1900/1/1 0:00:00
Limit Break 推出可執行的鏈上可編程版稅新標準 ERC721-C_LIMIT

5月10日消息,LimitBreak首席執行官GabrielLeydon宣布推出創作者代幣合約ERC721-C作為可執行的鏈上版稅和可編程版稅合約的解決方案,旨在幫助NFT創作者賺取更多版稅.

1900/1/1 0:00:00
BANKBRC(BTC-BANK)項目解析——幣贏研究院_SDT

BANKBRC(BTC-BANK)項目解析 1.?研究院點評 每個brc20代幣都有一個唯一的編號,可以作為收藏品或數字藝術品.

1900/1/1 0:00:00
Gate.io將上線BRC20/Ordinals代幣$nals(NALS)_GATE

Gate.io將于2023年5月10日11:00am(UTC8)上線$nals(NALS)交易。關于$nals(NALS):部署在BRC20上的meme.

1900/1/1 0:00:00
ads