99久久国产亚洲高清观看2020_国产免费成人_四虎国产精品永久地址入口_国产精品免费一区二区久久夜色_美国超碰在线_男人天堂tv

您的位置:首頁 > 互聯網 >

簽名重放攻擊是常見漏洞 能夠被對應公鑰驗證

2019-06-12 15:33:27 來源: 以太坊愛好者

密碼學簽名是區塊鏈系統中的基本模塊。使用對應的私鑰對交易進行簽名能夠將交易發起人與特定帳戶聯系起來。如果沒有此功能,區塊鏈的記帳工

密碼學簽名是區塊鏈系統中的基本模塊。使用對應的私鑰對交易進行簽名能夠將交易發起人與特定帳戶聯系起來。如果沒有此功能,區塊鏈的記帳工作將無法正常進行。

許多在以太坊上部署的智能合約也有直接驗證數字簽名的功能,以使得一個或多個驗證者可以通過提交離線創建的簽名(甚至是由另一個智能合約生成的簽名)來授權操作。這項驗證通常被用于多重簽名冷錢包或者投票合同,以便一起提交各種簽名或委托授權。

此類實現中的常見漏洞是簽名重放攻擊。在 Cryptonics 對一個重要項目的智能合約審計中,我們遇到了這個問題的一個有趣例子。在本文中,我們將使用此示例來說明智能合約中簽名驗證是如何出錯的。

與簽名驗證相關的漏洞通常是由于誤解了底層的密碼學原理和簽名的目的而引起的。因此,在詳細了解此特定漏洞之前,我們先快速了解一下密碼學簽名的工作原理。

密碼學簽名

大多數的密碼學簽名體系都基于公私鑰對。私鑰能夠對數據進行簽名,而且此簽名能夠被對應的公鑰所驗證。就像它的名字所暗示的一樣,一個用戶的公鑰是公開的,而私鑰則一定要保密。

對數據進行加密簽名可實現兩個重要屬性:

· 數據簽名者可識別性,這是通過恢復簽名者的公鑰來實現的。

· 數據完整的可驗證性,意思是簽名可以用于證明自簽名以來數據未被修改。

雖然這些是非常強大的屬性,但是需要重點注意的是簽過名的數據本身不提供額外的保障。簽名不能保證一條消息的唯一性,也不能保證簽名人就是發信人本身。當然,加密簽名可以被用于確認相關事實,但是應用程序也須執行必要的檢查。我們可以在以太坊智能合約中調查以上事實。

以太坊中的簽名驗證

以太坊和比特幣一樣,采用橢圓曲線數字簽名算法(ECDSA)和 secp256k1 曲線。智能合約可以通過系統方法 ecrecover 訪問內置的 ECDSA 簽名驗證算法。以下示例展示了這個函數的用法:

address signer = ecrecover(msgHash, v, r, s);

這個方法的輸入參數是簽名值 v,r 和 s,以及簽名數據的 keccak256 哈希值。它可以校驗數據的完整性,即確認數字簽名與數據的哈希值相對應,并且可以從簽名中恢復簽名者的以太坊地址(以太坊地址乃是從公鑰中推導出來的)。

任何額外的檢查,不論是檢查簽名地址是否為正確地址,還是檢查被簽名的消息是否唯一,都必須被手動添加進智能合約中。

經常有人誤解了 ecrecover 的功能,然后搞出了安全漏洞。

簽名重放漏洞

代碼示例

讓我們來看一下我們在最近的合約審計中發現的漏洞:

function unlock(

address _to,

uint256 _amount,

uint8[] _v,

bytes32[] _r,

bytes32[] _s

)

external

{

require(_v.length >= 5);

bytes32 hashData = keccak256(_to, _amount);

for (uint i = 0; i < _v.length; i++) {

address recAddr = ecrecover(hashData, _v[i], _r[i], _s[i]);

require(_isValidator(recAddr));

}

to.transfer(_amount);

}

以上代碼是我們所審計的代碼的簡化版本,為使代碼變得簡短易懂,它只保留了最基礎的信息。但是其中的漏洞被完整地保留了下來。

被審計的合約是跨鏈橋接器的一部分,它能讓數字資產從一個區塊鏈轉移到另一個上。以太幣在以太坊智能合約中被鎖定之時,另一條鏈上會創建出對應的資產。當資產在另一條鏈上被鎖定或銷毀時, unlock 函數可以釋放先前被鎖定的以太幣。

要實現這個效果時,跨鏈中繼者可以提交一系列的驗證者簽名、一個解鎖的數額以及一個目標地址。這個函數要求至少五個簽名來解鎖需要的數額并將資金傳給接收方。而內部的 _isValidator 函數(為了簡化,省略掉了具體實現)會檢查一個地址具不具備驗證者身份。

攻擊情景

以上代碼的問題在于被驗證者用 ECDSA 算法簽過名的消息中。這個消息只包含接收者的地址以及需要解鎖的數量。在這個消息中,并沒有什么內容能防止相同的簽名被多次重復使用。想象如下的情景:

· Bob 在與以太坊連接的另一條鏈上有等價于 10ETH 的資產被他通過橋接器傳回了以太坊鏈上。

· Alice 是一個處理跨鏈交易的中繼者。她收集了必需的驗證者簽名,在所連接的鏈上鎖定了相對應的資產數量,并且調用 unlock 函數將 10ETH 從合約中釋放給 Bob。

· 包含一系列簽名值的交易能夠在區塊鏈上公開讀取。

· Bob 現在可以復制這個簽名值的序列并且自己提交一個一模一樣的解鎖函數調用請求。這個解鎖的操作能夠再一次成功,導致又一個 10ETH 被發送給Bob。

· Bob 能夠重復這個過程直到智能合約中的以太坊被耗盡。

改進手段

以上情形被稱為簽名重放攻擊。這種攻擊能成功是由于我們無法驗證所簽名消息的唯一性,也不知道它之前是否被用過。

一個防止此類攻擊的簡單方法是在被簽名數據中包含一個消息序列號或者 nonce。以上代碼的修正版如下:

public uint256 nonce;

function unlock(

address _to,

uint256 _amount,

uint256 _nonce,

uint8[] _v,

bytes32[] _r,

bytes32[] _s

)

external

{

require(_v.length >= 5);

require(_nonce == nonce++);

bytes32 hashData = keccak256(_to, _amount, _nonce);

for (uint i = 0; i < _v.length; i++) {

address recAddr = ecrecover(hashData, _v[i], _r[i], _s[i]);

require(_isValidator(recAddr));

}

to.transfer(_amount);

}

這段代碼現在要求每一個成功的解鎖調用都包含一個序列號。因為消息中得包含一個獨一無二的數字,所以每次成功調用所要求的簽名都是獨一無二的。這表示之前觀測到的消息對攻擊者來說沒用了,因為重放會失敗。

簽名驗證的最佳模式

上述例子只是其中一個示例,演示了不能保證唯一型的簽名如何被重放。在大部分情景中,確保簽名能夠與每一次調用形成唯一的匹配對預防重放攻擊是非常重要的。

但是,這段代碼并不完美。它并沒有遵循簽名驗證的最佳實踐。原因是它沒有檢查可塑性簽名,我們應檢查作為已接受簽名一部分的 s 值是否在較低范圍內。使用 ecrecover 函數的推薦流程可以在 Open Zeppelin 的 excellent ECDSA 庫中找到。事實上,在社區審計過的代碼,比如 Open Zeppelin 上進行開發,總是一個好主意。(作者: Stefan Beyer)

關鍵詞: 簽名重放攻擊 公鑰驗證

精選 導讀

募資55億港元萬物云啟動招股 預計9月29日登陸港交所主板

萬科9月19日早間公告,萬物云當日啟動招股,預計發行價介乎每股47 1港元至52 7港元,預計9月29日登陸港交所主板。按發行1 167億股計算,萬

發布時間: 2022-09-20 10:39
管理   2022-09-20

公募基金二季度持股情況曝光 隱形重倉股多為高端制造業

隨著半年報披露收官,公募基金二季度持股情況曝光。截至今年二季度末,公募基金全市場基金總數為9794只,資產凈值為269454 75億元,同比上

發布時間: 2022-09-02 10:45
資訊   2022-09-02

又有上市公司宣布變賣房產 上市公司粉飾財報動作不斷

再有上市公司宣布變賣房產。四川長虹25日稱,擬以1 66億元的轉讓底價掛牌出售31套房產。今年以來,A股公司出售房產不斷。根據記者不完全統

發布時間: 2022-08-26 09:44
資訊   2022-08-26

16天12連板大港股份回復深交所關注函 股份繼續沖高

回復交易所關注函后,大港股份繼續沖高。8月11日大港股份高開,隨后震蕩走高,接近收盤時觸及漲停,報20 2元 股。值得一提的是,在7月21日

發布時間: 2022-08-12 09:56
資訊   2022-08-12

萬家基金再添第二大股東 中泰證券擬受讓11%基金股權

7月13日,中泰證券發布公告,擬受讓齊河眾鑫投資有限公司(以下簡稱齊河眾鑫)所持有的萬家基金11%的股權,交易雙方共同確定本次交易的標的資

發布時間: 2022-07-14 09:39
管理   2022-07-14

央行連續7日每天30億元逆回購 對債市影響如何?

央行12日再次開展了30億元逆回購操作,中標利率2 10%。這已是央行連續7日每天僅進行30億元的逆回購縮量投放,創下去年1月以來的最低操作規

發布時間: 2022-07-13 09:38
資訊   2022-07-13

美元指數創近20年新高 黃金期貨創出逾9個月新低

由于對美聯儲激進加息的擔憂,美元指數11日大漲近1%創出近20年新高。受此影響,歐美股市、大宗商品均走弱,而黃金期貨創出逾9個月新低。美

發布時間: 2022-07-13 09:36
資訊   2022-07-13

美股三大股指全線下跌 納斯達克跌幅創下記錄以來最大跌幅

今年上半年,美股持續回落。數據顯示,道瓊斯指數上半年下跌15 3%,納斯達克綜合指數下跌29 5%,標普500指數下跌20 6%。其中,納斯達克連續

發布時間: 2022-07-04 09:51
推薦   2022-07-04

融資客熱情回升 兩市融資余額月內增加超344億元

近期A股走強,滬指6月以來上漲4%,融資客熱情明顯回升。數據顯示,截至6月16日,兩市融資余額1 479萬億元,月內增加344 67億元,最近一個半

發布時間: 2022-06-20 09:41
資訊   2022-06-20

4個交易日凈買入超百億元 北向資金持續流入A股市場

北向資金凈流入態勢延續。繼6月15日凈買入133 59億元后,北向資金6月16日凈買入44 52億元。自5月27日至今,除6月13日以外,北向資金累計凈

發布時間: 2022-06-17 09:37
推薦   2022-06-17