本文從源代碼層面詳解介紹了?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生態借貸聚合器Everlend完成260萬美元融資,GSR等參投:8月19日,據官方消息,基于Solana的借貸聚合器Everlend宣布完成260萬美元戰略輪融資,GSR、Serum Foundation、Everstake Capital、Portico VC和幾位天使投資人參投。
此輪融資資金將主要用于促進產品的開發進程和整體增長。此外,一部分資金將專門用于安全基金(Safety Fund),這是一個保險池,在基礎貨幣市場出現違約或黑客攻擊事件時將為Everlend用戶提供保障。
據悉,Everlend于5月初在主網上線,目前支持10種資產和3個貨幣市場。Everlend計劃在未來逐步轉變為社區主導的DAO。[2022/8/19 12:36:20]
????????????????x=2;
????????}
}
在?UnusedStoreEliminator?優化時,x=?1?顯然對于函數?attack()的整個執行是冗余的。自然的,優化后的?Yul?代碼會將?x=?1;刪除來降低合約的?gas?消耗。
接下來考慮在中間插入對自定義函數調用:
Slope:無確鑿證據將超400萬美元的Solana黑客攻擊與其自身的安全漏洞關聯:金色財經報道,Slope錢包的團隊表示,承認存在安全漏洞,目前沒有確鑿證據將超400萬美元的Solana黑客攻擊與其自身的安全漏洞聯系起來。仍在調查這次攻擊事件。
此外,Slope更新攻擊調查進展,除此前Sentry服務器實施問題外未發現其他漏洞。[2022/8/11 12:19:05]
contractEocene{
uintpublicx;
functionattack(uinti)public{
????????x=1;
????????y(i);
????????x=2;
}
functiony(uinti)internal{
????????if(i>0){
????????????????return;
????????}
????????assembly{return(?0,?0。
}
}
Solana開發人員:Solana的600萬美元漏洞利用可能與Slope錢包有關:金色財經消息,Solana區塊鏈背后的開發人員表示,Solana的600萬美元從9,000多個熱錢包中被盜的漏洞利用可能與Slope錢包有關。受影響的錢包都被確認是在Slope移動錢包應用程序中創建或使用過的。(Coindesk)[2022/8/4 2:57:34]
顯然,由于?y()函數的調用,我們需要判斷?y()函數是否會影響函數?attack()的執行,如果?y()函數可以導致整個函數執行流終止(注意,不是回滾,Yul?代碼中的?return()函數可以實現),那么?x=?1?顯然是不能刪除的,所以對于上面的合約來說由于?y()函數中存在?assembly{return(?0,?0。可以導致整個消息調用終止,x=?1?自然不能被刪除。
但在?Solidity?編譯器中,由于代碼邏輯的問題,使得?x=?1?在編譯時被錯誤的刪除,永久改變了代碼邏輯。
實際編譯測試結果如下:
震驚!不應該被優化的?x=?1?的?Yul?代碼丟了!欲知后事如何,請往下看。
在?solidiry?編譯器代碼的?UnusedStoreEliminator?中,通過?SSA?變量追蹤和控制流追蹤來判斷一個?Storage?寫入操作是否是冗余的。當進入一個自定義函數中時,UnusedStoreEliminator?如果遇到:
Lido DAO批準5個新節點運營商加入Solana上的Lido:7月29日消息,據官方推特,Lido宣布Lido DAO已通過投票批準了5個新的節點運營商加入Solana上 Lido,這些節點分別是01node、Allnodes、Kiln、Stakewithus和Stakin。這些運營商已開始主網上線流程,并將在未來幾天成為Solana上的Lido的活躍運營商成員。[2022/7/29 2:45:56]
memory?或?storage?寫入操作:將?memory?和?storage?寫入操作存儲到?m_store?變量中,并將該操作的初始狀態設置為?Undecided;
函數調用:獲取函數的?memory?或?storage?讀寫操作位置,并和?m_store?變量中存儲的所有?Undecided?狀態下的操作進行對比:
1.如果是對?m_store?中存儲操作的寫入覆蓋,則將?m_store?中對應的操作狀態改為?Unused
2.如果是對?m_store?中存儲操作的讀取,則將對應?m_store?中的對應操作狀態改為?Used
3.如果該函數沒有任何可以繼續執行消息調用的分支,將?m_store?中所有的內存寫操作改為?Unused
基于Solana的衍生品流動性協議Hxro Network發布v1版Litepaper:基于Solana的衍生品流動性協議Hxro Network發布v1版Litepaper,主要內容如下:
1.Hxro Network主要由HXRO Token(原生代幣,可參與質押和治理)、SAMM Protocol與THEO Protocol組成。其中SAMM協議是一個“智能”AMM,旨在向二元期權市場提供鏈上流動性;THEO是一個自我維持的風險管理AMM,專門為普通和奇異期權提供鏈上流動性;
2.Hxro Network將與Serum合并,以整合其訂單簿、現貨和永續市場(用于流動性協議對沖)等;
3.將重點關注三種類型的期權市場:普通期權、奇異期權以及二元期權市場;
4.致力于建立一個無需許可、全功能的去中心化期權交易協議,該協議將支持標準化和奇異鏈上期權。流動性將通過引入傳統做市商和THEO協議來創建;
5.擬建立一個7500萬HXRO(供應量的7.5%)的流動性激勵池,獎勵取決于Hxro Network上任意一天的名義交易量,如果總交易額超過10億美元,獎勵最多為每天10274萬HXRO。[2021/4/16 20:27:39]
???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?優化步驟。
如果想要從合約代碼層面進行漏洞緩解,考慮到多個優化步驟的復雜性,以及實際函數調用流的復雜性,請尋找專業的安全人員進行代碼審計來幫助發現合約中的因為該漏洞導致的安全問題。
Limewire宣布整合Ripple(XRP)作為代幣銷售的支付選項。XRP的下跌并沒有阻止仍然看好該代幣的投資者。Limewire在社區請求后添加了XRP作為支付選項.
1900/1/1 0:00:00原文作者:Frankie原文編譯:深潮TechFlowParadigm?宣布開源了一個關于?MEVBot的框架Artemis,在本文中.
1900/1/1 0:00:00DearKuCoinUsers,KuCoinwillrescheduletheadditionoftheOLT/USDTtradingpairat10:00:00onMay9.
1900/1/1 0:00:00隨著BRC-20的爆火,一些圍繞著比特幣網絡構建的其他資產標準也開始相繼出現。5月7日,跨鏈互操作性項目Interlay的創始人AlexeiZamyatin提議推出BRC-21標準,以向比特幣網.
1900/1/1 0:00:00幣安于?4?月下旬宣布推出第31檔Launchpad?專案——OpenCampus。該協議是一個結合教育創作與區塊鏈技術的平臺,旨在鼓勵教育者對社會的貢獻及給予充分認可,并為全世界的學生提供一個.
1900/1/1 0:00:00比特幣上周五重新站穩29,000美元,以太幣也悄悄升至2,000美元大關,加密貨幣市場迎來一定程度的復蘇,特別是比特幣成功抵擋住Fed再度升息以及美國強勁就業報告的利空題材,再度挑戰30.
1900/1/1 0:00:00