升级合约:引入合约升级的思想是为了缓解智能合约一旦部署后就无法修改的问题,即使以后发现它们存在漏洞。为了允许合约升级,有两种方法:(i)将合约分为代理合约和逻辑合约,以使开发人员可以升级后者而不是前者; (ii)使用注册管理机构合约来保存更新后的合约。这些方法虽然有效,但却引入了一个新的漏洞:当合约开发者变得恶意时,更新的合约可能是恶意的。此漏洞(即,不安全的联系人更新)仍然是一个未解决的问题。 具有意外还原的 DoS:发生这种情况的原因是,由于主叫方合约遇到外部呼叫失败而导致事务被还原,或者被叫方合约故意执行还原操作以中断主叫方合约的执行。此漏洞是由执行被调用方合约还原的调用方合约引起的。通过使接收者调用交易来「提取」发件人为接收者预留的资金,可以防止此漏洞,从而有效地防止了发件人的交易被还原。 整数上溢和下溢:首次从针对 BEC 令牌的攻击中发现了此漏洞 [4]。当运算的结果超出了 Solidity 数据类型的范围时,就会发生这种情况,例如导致对攻击者的余额或其他状态变量进行未经授权的操纵。该漏洞是由 Solidity 源代码未在数字输入上执行正确的验证引起的,并且 Solidity 编译器和 EVM 均未提供整数上溢 / 下溢检测。可以通过使用 SafeMath 库来防止此漏洞处理这些问题。 操纵余额:当合约的控制流决策依赖于此值时,会发生此漏洞。平衡或解决(balance)平衡,攻击者可以利用它使自己成为唯一可以获取金钱的人。可以通过不使用任何条件声明中的合约余额来防止此漏洞 [5]。通过 tx.origin 进行身份验证:tx.origin 是 Solidity 中的全局变量,它指的是发起有问题交易的原始 EOA。当合约使用 tx.origin 进行授权时会发生此漏洞,这可能会受到网络钓鱼攻击的危害。通过使用 msg.sender 而不是 tx.origin 进行身份验证,可以防止此漏洞,因为 msg.sender 返回导致该消息的帐户。 错误的可见性:错误地指定功能的可见性,从而允许未经授权的访问。 无保护的自杀:合约的所有者(或受委托的第三方)可以使用自杀或自毁方法销毁合约。 取消合约时,将删除其关联的字节码和存储。 该漏洞是由合约强制执行的身份验证不足引起的。 可以通过强制执行例如多因素身份验证来缓解此漏洞,这意味着自杀操作必须得到多方的批准。 将以太币泄漏到任意地址:当任意调用方都可以提取合约的资金时,该漏洞就不会发生,该调用方既不是合约的所有者,也不是向合约存入资金的投资者。 此漏洞是由调用者调用将以太币发送到任意地址的功能时无法检查呼叫者的身份引起的。 通过对发送资金的功能进行适当的身份验证,可以防止此漏洞。 (责任编辑:admin) |