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

SMTChecker 檢查合約漏洞的超能力_POS:POSI

Author:

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

譯文出自:登鏈翻譯計劃

譯者:翻譯小組

校對:Tiny熊

理論:什么是SMTChecker?

你是否敢打賭保證,你剛剛部署的合約沒有嚴重的漏洞嗎?如果你像我一樣,想必答案是一個響亮的不。

我在傳統的軟件工程中見過足夠多的黑客,知道你永遠不可能100%確定。這很可怕,但不同技術的組合使用可以讓我們相當接近到所需要的信心。

SMTChecker就是這樣給我信心的技術之一。

SMTChecker是一個對合約進行形式化驗證的工具:你定義一個規范,SMTChecker以證明該合約符合該規范。如果不符合,SMTChecker通常會給你一個具體的反例:一個破壞規范的交易序列。

最重要的是什么?如果你使用Solidity,你已經有了SMTChecker-它是Solidity編譯器的一部分。

不過它決不是一個無懈可擊的解決方案--驗證錯誤是慢的。最重要的是,要定義一個完整的規范是非常困難的。但即使如此,SMTChecker仍然值得一試。

以跳棋合約為例

該合約實現了一個計數器--一個在8x8棋盤上玩的跳棋游戲的棋子。

我們將設計一個LazyCounter:它不能移動,但可以通過捕獲(capture)相鄰的“支點”棋子,跳到對角線格子:如果當前在,想要支點棋子是,我最終會跳在,很簡單吧。

//SPDX-License-Identifier:MITpragmasolidity>=0

//////}

代碼很簡單:我們在一個給定的位置創建一個計數器。然后它可以捕捉其他棋子。

有趣的是最后一個函數(invariant),它定義了一個在任何時候都必須保持的不變性。這個不變性很簡單--計數器不能離開棋盤。讓我們編譯合約,看看我們的不變性是否被破壞。

~/hide/smtchecker_demo???solc1

functionmove1()public{x=1;y=2;require(isValidPosition());}functionmove2()public{x=2;y=1;require(isValidPosition());}functionmove3()public{x=2;y-=1;require(isValidPosition());}functionmove4()public{x-=1;y-=2;require(isValidPosition());}functionmove5()public{x-=1;y=2;require(isValidPosition());}functionmove6()public{x-=2;y=1;require(isValidPosition());}functionmove7()public{x-=2;y-=1;require(isValidPosition());}functionmove8()public{x-=1;y-=2;require(isValidPosition());}functionget_to_7_7()publicview{assert(!(x==7&&y==7));}}

Gate.io Startup首發項目SMTY已認購成功:據官方公告,Gate.io Startup首發項目奶昔 (SMTY)認購成功,并已于4月27日(昨日)21:00開通SMTY交易并隨后開通提現服務。據悉,本次認購參與人數共有10,505人,下單總價值超過1,000萬美金,認購系數約為0.0008 。Gate.io將根據每個人的下單情況和每個下單幣種的認購系數進行SMTY的分發。請務必注意:由于部分用戶在下單認購后到當天16點之前,沒有保持賬戶中有不低于認購金額的足夠金額,因此被排除在有效下單之外。[2021/4/28 21:06:02]

~/hide/smtchecker_demo???solc2

contractAMMPair{IERC20Metadatax;IERC20Metadatay;uint256xReserves;uint256yReserves;uint256totalSupply;constructor(IERC20Metadata_x,IERC20Metadata_y,uint256depositX,uint256depositY){require(_x

functionaddLiquidity(uint256depositX,uint256depositY)publicreturns(uint256){require(depositX!=0,"depositX!=0");require(depositY!=0,"depositY!=0");require(depositX*1e18/depositY==xReserves*1e18/yReserves,"unbalancing");uint256extraSupply=depositX*totalSupply/xReserves;xReserves=depositX;yReserves=depositY;totalSupply=extraSupply;x

}

我們可以添加什么樣不變性?不多--也許儲備不為空,僅此而已。

讓我們把不變性的定義擴展,稱之為動態不變性:知道執行addLiquidity之前和之后的狀態,我們可以斷言什么?

WBF交易所將正式上線GSMT:據官方消息,WBF交易所將正式上線GSMT,新加坡時間 2020年04月23日15:00,在開放區上線GSMT/USDT交易對。新加坡時間 2020年04月23日16:00,在開放區上線GSMT/DUSD交易對。

據了解,GSMT聚焦于音樂內容領域創作者的版權,旨在保護創作者的權利,防止不合理的利益分配和剽竊等行為破壞創作者音樂價值,為此GSMT創造一個良性循環,在這個循環里,用戶可以直接參與創作,并將創造產生的價值進行重新投資,同時GSMT也提供內容消費,努力為用戶提供一個創新,健康的音樂市場生態系統。[2020/4/21]

contractAMMPair{//..

}

注意結尾處的revert()--它確保了此不變函數沒有副作用,讓我們試試吧

~/hide/smtchecker_demo???solc--model-checker-enginechc--model-checker-show-unproved--model-checker-timeout0--model-checker-contracts3

functionaddLiquidityStateChange(uint256depositX,uint256depositY)internalreturns(uint256){require(depositX!=0,"depositX!=0");require(depositY!=0,"depositY!=0");require((depositX*1e18)/depositY==(xReserves*1e18)/yReserves,"unbalancing");uint256extraSupply=(depositX*totalSupply)/xReserves;xReserves=depositX;yReserves=depositY;totalSupply=extraSupply;returnextraSupply;}functioninvariant1()publicview{assert(xReserves>0);assert(yReserves>0);}functioninvariantAddLiquidity(uint256depositX,uint256depositY)public{uint256oldSupply=totalSupply;uint256oldXReserves=xReserves;uint256supplyAdded=addLiquidityStateChange(depositX,depositY);assert(depositX/oldXReserves==supplyAdded/oldSupply);revert("alldone");}}contractAMMPairisAMMPairEngine{IERC20x;IERC20y;constructor(IERC20_x,IERC20_y,uint256depositX,uint256depositY)AMMPairEngine(depositX,depositY){require(_x

公告 | 火幣全球站將于11月7日11時暫停SMT舊幣提幣業務:據火幣公告,火幣全球站支持SMT主網切換,為了配合項目方做好換幣的相關準備工作,將于新加坡時間11月7日11時暫停舊幣提幣業務。用戶若在火幣全球站有SMT舊幣,火幣全球站將自動為其兌換為SMT新幣,無需做任何操作,也無需擔心的資產受到任何損失。待主鏈上線穩定后,用戶可提現SMT新幣,具體時間關注公告。[2018/11/6]

functionaddLiquidity(uint256depositX,uint256depositY)public{addLiquidityStateChange(depositX,depositY);x

}

AMMPairEngine有addLiquidityStateChange作為一個內部函數。它是由AMMPair調用的。AMMPairEngine唯一的公共函數是不變性函數。如果我們不希望它們出現在部署的代碼中,則它們可以被移到AMMPairEngineTestisAMMPairEngine合約中。

~/hide/smtchecker_demo???timesolc--model-checker-enginechc--model-checker-show-unproved--model-checker-timeout0--model-checker-contracts3.sol:AMMPairEngine3.solWarning:CHC:Divisionbyzerohappenshere.Counterexample:xReserves=2,yReserves=2,totalSupply=0depositX=1depositY=1oldSupply=0oldXReserves=1supplyAdded=0Transactiontrace:AMMPairEngine.constructor(1,1)State:xReserves=1,yReserves=1,totalSupply=0AMMPairEngine.invariantAddLiquidity(1,1)AMMPairEngine.addLiquidityStateChange(1,1)--internalcall-->3.sol:117:43:|117|assert(depositX/oldXReserves==supplyAdded/oldSupply);|^^^^^^^^^^^^^^^^^^^^^^^Warning:CHC:Assertionviolationhappenshere.-->3.sol:117:9:|117|assert(depositX/oldXReserves==supplyAdded/oldSupply);|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^solc--model-checker-enginechc--model-checker-show-unproved03.sol7.11suser0.17ssystem98%cpu7.357total

公告 | OKex不支持SMT主網映射:OKEx發布公告,由于OKex已于 2018年 6月暫停SMT的交易,因此無法支持 SMT 主網映射。用戶需要在 9月 30 日前將存至OKex的SMT 代幣充值到支持映射的交易平臺和錢包,超出期限導致的個人資產損失OKex將不作補償。[2018/9/6]

可以看到會出現除以0會導致違反斷言。反例使問題很明顯:合約創建者存入了1e-18的X和1e-18的Y代幣。這使得合約發行了0個LP代幣。我們將切換到36進制的數學,這應該可以解決這個問題。

contractAMMPairEngine{//...constructor(uint256depositX,uint256depositY){//...totalSupply=depositX*depositY;//removed'/1e18'}//...}

~/hide/smtchecker_demo???timesolc--model-checker-enginechc--model-checker-show-unproved--model-checker-timeout0--model-checker-contracts3.sol:AMMPairEngine3.solWarning:CHC:Assertionviolationmighthappenhere.-->3.sol:117:9:|117|assert(depositX/oldXReserves==supplyAdded/oldSupply);|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^solc--model-checker-enginechc--model-checker-show-unproved03.sol75.19suser0.50ssystem99%cpu1:16.27total

注意這個變化:現在沒有除以0違反斷言的情況,現在是Assertionviolationmighthappenhere。這里表達了不確定。我需要做更多的調查以更好地了解這里發生了什么。

更新09/05/2021:LeoAlt指出,可能發生并不足以稱之為部分成功--而是SMTChecker真的很難證明這個斷言,所以我們不能真的依賴它。

SMT發現與BEC類似的安全漏洞:據慢霧區消息,又一代幣SMT發現與前幾天爆出的美圖BEC代幣類似的安全漏洞。可以通過溢出攻擊可以收到大量的代幣。SMT已經上線火幣、okex等多家交易所,請投資者注意安全。[2018/4/25]

WechatIMG386image-20210909173722020

順便說一句,你可以手動證明最后一個例子中的數學公式,但這顯然沒有擴展性,原代碼中有斷言違反,有一個反例:

1_H28r2hdKhCL9JAgarE53iA

證明新代碼中沒有違反斷言的情況:

1_F9k9Dwa8_Lba-4zTG68q9w

結論

當我們編寫合約的時候考慮到它,那每個人都可以享受到SMTChecke自動形式化驗證的好處。

我希望能花些時間深入研究SMTChecker,敬請關注。

其他的替代品

Manticore是一個符號執行引擎,可以做與SMTChecker類似的事情。一方面它是高度可編程的,但它做更少的事情。另一方面,這些事情是可實現的,另外我們對驗證過程有更多的控制

Echidna是一個模糊工具--使用類似于不變性的想法,隨機地試圖找到破壞它們的輸入。它并不能證明不變性的成立,但可以快速發現很多非邊緣案例的缺陷。Echidna使用與Manticore相同的語法,因此它們都可以并行使用。

Scribble采取了一種不同的方法--用動態不變性對每個函數進行注解。它使用自己的語言來描述不變性,并且可以用物化的不變性來記錄你的代碼。

大量的靜態分析/其他模糊分析工具--它們非常有用,但不在本文的討論范圍之內。

鳴謝

AlbertoCuestaCa?ada為上述大多數參考資料和最小AMM的想法。

本翻譯由CellETF贊助支持。

來源:https://medium.com/@sblowpckcr/smtchecker-almost-practical-superpower-5a3efdb3cf19

參考資料

登鏈翻譯計劃:https://github.com/lbc-team/Pioneer

翻譯小組:https://learnblockchain.cn/people/412

Tiny熊:https://learnblockchain.cn/people/15

SMTChecker:https://docs.soliditylang.org/en/v0.8.7/smtchecker.html

積極(aggressive):https://docs.soliditylang.org/en/v0.8.7/smtchecker.html#timeout

準確(accurate):https://docs.soliditylang.org/en/v0.8.7/smtchecker.html#constrained-horn-clauses-chc

這里:https://docs.soliditylang.org/en/v0.8.7/smtchecker.html#smt-and-horn-solvers

可以可以幫助發現重入問題:https://docs.soliditylang.org/en/v0.8.7/smtchecker.html#external-calls-and-reentrancy

LeoAlt:https://twitter.com/leonardoalt

你可以手動證明最后一個例子中的數學公式:https://github.com/sblOWPCKCR/smtchecker_demo/blob/main/z3.ipynb

Manticore:https://github.com/trailofbits/manticore

Echidna:https://github.com/crytic/echidna

Scribble:https://consensys.net/diligence/scribble/

AlbertoCuestaCa?ada:https://medium.com/u/8206cbb70805?source=post_page-----5a3efdb3cf19--------------------------------

CellETF:https://celletf.io/?utm_souce=learnblockchain

免責聲明:作為區塊鏈信息平臺,本站所發布文章僅代表作者個人觀點,與鏈聞ChainNews立場無關。文章內的信息、意見等均僅供參考,并非作為或被視為實際投資建議。

本文來源于非小號媒體平臺:

登鏈社區

現已在非小號資訊平臺發布105篇作品,

非小號開放平臺歡迎幣圈作者入駐

入駐指南:

/apply_guide/

本文網址:

/news/10351087.html

免責聲明:

1.資訊內容不構成投資建議,投資者應獨立決策并自行承擔風險

2.本文版權歸屬原作所有,僅代表作者本人觀點,不代表非小號的觀點或立場

上一篇:

每周編輯精選WeeklyEditors'Picks

Tags:POSPOSISMTDEPOPOSHPOSI幣SMTH

FTT
波場代幣基金(VTRX)正式在德意志交易所掛牌上市_RON:ETN

9月20日,全球著名的ETF基金公司范達集團官方消息稱,波場代幣基金VanEckTRONETN已獲德國金融管理局批準,于當日在德意志交易所首發上市.

1900/1/1 0:00:00
Zabu Finance 閃電貸安全事件分析_ABU:SPO

9月12日,知道創宇區塊鏈安全實驗室監測到Avalanche上的DeFi協議?ZabuFinance項目遭受閃電貸攻擊。實驗室第一時間跟蹤本次事件并分析.

1900/1/1 0:00:00
Huobi Global將于9月16日上線EDEN新幣活動_OBI:Huobi Polkadot

尊敬的用戶: Huobi?Global即將開啟EDEN新幣活動。即刻參與,領取獎勵。充值EDEN,瓜分20,000USDT等值EDEN獎勵池充值活動時間:2021年9月16日18:00:00——.

1900/1/1 0:00:00
標準普爾:美國各州和各城市正積極研究加密貨幣_加密貨幣:MMON

據彭博社消息,9月15日,標準普爾全球評級公司發布報告表示,美國各州和地方政府正積極研究加密貨幣,并越來越有興趣通過養老基金投資加密貨幣,以及接受數字貨幣作為稅收和服務的支付手段.

1900/1/1 0:00:00
Gate.io 已開啟SUTER,FEAR,BFC,XEND,WOOP新版流動性礦池獎勵(自動做市商AMM模式),今日年化收益率高達2,144.95%_GATE:GATE價格

今日,FEAR,BFC,XEND,WOOP已正式上線USDT、ETH交易池,SUTER已正式上線USDT交易池,并開啟新版流動性礦池獎勵.

1900/1/1 0:00:00
內蒙古聘請承包商監控非法加密采礦_區塊鏈:人工智能

金色財經報道,內蒙古自治區發展和改革委員會9月15日發布“關于清理虛擬貨幣‘挖礦’政策機制研究項目中標結果”公告,內蒙古蒙澤工程管理有限公司中標,政府預算為4.6萬美元.

1900/1/1 0:00:00
ads