智能合約簽名驗證漏洞分析你值得一看

链外消息签名的方式,对于节省 gas以及改善用户体验方面,的确是一个好的方法。

可重入(Reentrancy)或整数溢出漏洞,是大多数开发人员知道或者至少听说过的,关于智能合约当中容易出现的安全问题。另一方面,在考虑智能合约的安全性时,你可能不会立即想到针对密码签名实现的攻击方式。它们通常是与网络协议相关联的。例如,签名重放攻击(signature replay attacks),一个恶意用户可窃听包含有效签名的协议序列,并针对目标进行重放攻击,以期获得益处。xA2顯卡之家

本文將解釋智能合約處理DAPP生成簽名時可能存在的兩種類型的漏洞。我們將通過Diligence團隊在今年早些時候完成的現實例子審計結果進行分析。此外,我們將討論如何設計智能合約,以避免這類漏洞的出現。xA2顯卡之家

協議層xA2顯卡之家

签名是以太坊网络中的基础,发送至网络的每笔交易都必须具有有效的签名。下图显示了这种交易的一个例子。除了交易标准属性,例如 from、to、gas、value 或input在全局命名空间中可用,并且经常出现在智能合约代码中,字段v,r以及s共同组成了交易签名。xA2顯卡之家

智能合約簽名驗證漏洞分析你值得一看xA2顯卡之家

以太坊網絡確保只有具有有效簽名的交易可被納入新的區塊當中。這爲交易提供了以下安全屬性:xA2顯卡之家

1.身份驗證:以太坊節點使用簽名來驗證交易簽名者是否具有與公共地址相關聯的私鑰。開發者因此可以信任這個msg.sender是真實的;xA2顯卡之家

2.完整性:交易在簽名後不會發生更改,否則簽名就是無效的;xA2顯卡之家

3.不可否認性:交易是由from字段中公共地址對應的私鑰簽名的,這是不可否認的,並且擁有私鑰的簽名方已經進行了任何狀態更改。xA2顯卡之家

合約層xA2顯卡之家

協議層并不是签名发挥作用的唯一场地。签名也越来越多地被用于智能合约本身。随着gas价格的上涨,而扩容解决方案仍在进程当中,则避免链上(on-chain)交易便凸显出了越来越多的重要性。当谈到链外的交易时,签名也是非常有用的,EIP-191以及EIP-712,都是有关于如何处理智能合约中签名数据的通证标准。而后者旨在改善链外消息签名的可用性。那么,为什么它是有用的,以及它是如何节省链上交易的?xA2顯卡之家

讓我們來查看一個簡單的例子。愛麗絲爲鮑伯創建了一個命題,她將其編碼成了一條消息。她還用自己的私鑰創建了消息的簽名,並通過協商好的通道發送給鮑伯。鮑伯可以驗證愛麗絲是否簽署了該消息,如果鮑伯認爲該命題是合適的,那麽他可以創建新的交易,將他自己的消息、愛麗絲的消息及簽名共同納入到一個智能合約當中。通過數據,這個智能合約可以證實:xA2顯卡之家

1.鮑伯已簽署了自己的信息(或者在這種情況下,交易會是更具體的)。而網絡保證了身份驗證、完整性以及不可否認性。xA2顯卡之家

2.整個過程只需要一筆鏈上交易,其可提供明顯更好的用戶體驗,同時可節省gas。需要注意的是,智能合約需要確保愛麗絲發送給鮑伯的消息,能夠保持所有三個安全屬性的完整性。xA2顯卡之家

讓我們分析現實世界中存在的兩種簽名驗證漏洞,並探討如何修複它們。xA2顯卡之家

缺少針對簽名重放攻擊的保護(SWC-121)xA2顯卡之家

第一个例子,是由Consensys的Diligence部门在审计去中心化新闻应用Civil时发现的一个漏洞例子,与此案例相关的系统的第一部分,被Civil称之为Newsroom(新闻编辑室),而内容编辑可以把自己的文章发布到这个Newsroom,他们还可以为自己的内存创作进行加密签名,以此证明内容实际上是由他们创造的。pushRevision() 函数对现有内容进行更新或修订。参数内容哈希、内容URI、时间戳以及签名,为内容创建新的修订。之后,verifiyRevisionSignature()函数会调用提议修订,以及最初创建第一个签名修订的内容作者。根据设计,新修订的签署者,只能是创建初始签名内容版本的作者。xA2顯卡之家

智能合約簽名驗證漏洞分析你值得一看xA2顯卡之家

verifiyRevisionSignature() 函数会根据DApp生成的内容哈希,以及Newsroom合约的地址,创建一个已签名的消息哈希。然后,调用recover()函数(来自OpenZeppelin 的ECRecovery库)。随后,调用ecrecover()函数,并验证作者是否真正签署了消息。已讨论过的两个函数代码是没有问题的,因为只有最初创建内容的作者才能为它创建新的版本,所以实际上它们不存在什么安全问题。xA2顯卡之家

問題在于,合約是不會跟蹤內容哈希的,因此,已提交的一個內容哈希及其用戶簽名,實際是有可能被提交多次的。而惡意的內容作者就可以利用這個漏洞,從其他作者那裏獲取有效的簽名和內容哈希,並在他們不知情的情況下爲他們創建新的有效修訂。xA2顯卡之家

智能合約簽名驗證漏洞分析你值得一看xA2顯卡之家

Civil 已通过跟踪这些内容哈希,并拒绝已是先前修订部分的哈希,来解决这个问题。xA2顯卡之家

缺乏正確的簽名驗證(SWC-122)xA2顯卡之家

在上一次審計去中心化協議0x的過程當中,Diligence發現了這種漏洞類型的一個實例。以下解釋,是這次審計報告當中3-2節內容中描述的問題總結。0x協議具有不同簽名類型的各種簽名驗證器,包括Web3以及EIP712。另一個存在的驗證器稱爲SignatureType.Caller,如果order.makerAddress等于msg.sender(order.makerAddress是創建order的用戶),則允許order有效。如果設置了SignatureType.Caller,則沒有實際簽名驗證是由交易合約執行的。現在還不清楚爲什麽這會導致漏洞,因爲已經證實msg.sender以及order的創建者是相同的,至少從理論上看是這樣的。xA2顯卡之家

除了交易合约之外,0x系统还有另一部分称为Forwarder的合约,有了这个合约,用户可以简单地发送以太币,以及他们想要填写的 order,而这个Forwarder合约会在同一笔交易中执行所有的order;xA2顯卡之家

智能合約簽名驗證漏洞分析你值得一看xA2顯卡之家

想要用以太币交易其他通证的用户,可以向其他用户发送order,而Forwarder合约将代表他们进行交易。这个交易合约会验证每个order,以确保order签名的有效性,并确保其他用户已实际签署了order。让我们再次查看上面的图,并重新评估以下假设:如果order.makerAddress等于msg.sender,则我们不需要在这个交易合约当中进行适当的签名验证,因为发送交易的用户也是order的创建者。如果用户直接向交易合约发送order,则该假设成立。但是,如果我们通过Forwarder合约发送这个order,将order.makerAddress设置为 Forwarder合约的地址,并使用SignatureType.Caller签名验证器呢?xA2顯卡之家

在交易執行處理結算個別order的過程中,Forwarder合約會調用這個交易合約。這個交易合約會驗證這個order.makerAddress中的地址,就是msg.sender,在這種情況下,可以將其設置爲Forwarder地址。由于合約在交易雙方之間起到了中介作用,所以order.takerAddress通常被設置爲Forwarder地址。因此,惡意用戶可以使用Forwarder處理order,其中合約會與其本身進行交易,因爲它既是接受者又是制造者。這是因爲以下的原因:xA2顯卡之家

1.在 Forwarder当中,没有逻辑可以阻止合约成为一个 order的制造者;xA2顯卡之家

2.用于transferFrom((address _from, address _to, uint256 _value) )的ERC20规范,不会阻止用户进行“空传输”。而 _from和_to可以是相同的地址;xA2顯卡之家

3.這個交易合約允許基于以下事實來處理order:如果用戶實際上已經簽署了order,則msg.sender沒有發送order。xA2顯卡之家

在交易合约解决了order之后,这个Forwarder合约将得到完全相同的 balance,并且Forwarder合约将takerAmount转移给自己,而把makerAmount转移给一个恶意用户,而恶意用户可以使用这个场景,来创建“恶意order”,以便用1 Wei(以太币最低单位)的价格从 Forwarder合约中换取到所有的ZRX通证;xA2顯卡之家

综上所述,假设消息的发送者也是其创建者,而不去验证其签名,这可能是不安全的,尤其是在通过代理转发交易的情况下。在合约处理消息签名的任何时候,都需要执行正确的签名恢复及验证。0x通过删除了 SignatureType.Caller签名验证器修复了这个问题。xA2顯卡之家

總結xA2顯卡之家

链外消息签名的方式,对于节省 gas以及改善用户体验方面,的确是一个好的方法。但从安全性的角度来看,这无疑增加了复杂性,并使得智能合约在处理已签名消息的情况下成为了一个更具挑战性的任务。如果你对针对基于签名的攻击,或其它智能合约漏洞示例感兴趣,你可以查看SWC-registry在Github的内容,里面拥有大量易受攻击的合约示例,此外还有关于智能合约弱点分类(SWC)计划的更多信息,我们一直在与社会各界合作。如果你想了解更多关于SWC的信息,或者有其他好的想法,那么欢迎你在ethereum/EIPs以及Ethereum Magicians里面参加关于EIP-1470的讨论;xA2顯卡之家

責任編輯:ctxA2顯卡之家

相關推薦