跳到主要内容

常见漏洞

所有存在于以太坊的 EVM 安全问题也存在于 OXN。本页列出经典类别,配上 OXN 专属注意事项。

重入​

描述。 合约在完成自己的状态更新前调出到不可信地址,被攻击者重入,观察或操纵半完成状态。

OXN 上。 与以太坊一致。机密性不阻止重入——攻击者的合约也在 enclave 内,看到的正是你合约在调用中 emit 的东西。

预防。 用 ReentrancyGuard。遵循 checks-effects-interactions。

整数溢出 / 下溢​

描述。 超出类型范围的算术操作发生环绕。

OXN 上。 与以太坊一致。Solidity 0.8+ 内建溢出即 revert 的检查。不要禁用。

访问控制失败​

描述。 缺失或错误的授权检查允许未授权调用者调用特权函数。

OXN 上。 与以太坊一致。msg.sender 与 tx.origin 行为相同。用 OpenZeppelin AccessControl 或显式检查。

预言机操纵​

描述。 依赖外部价格 feed 的合约可以被喂坏价格操纵。

OXN 上。 与以太坊一致。加密不验证数据——通过明文预言机喂的谎话仍是谎话。

抢跑(OXN 上应用大减)​

描述。 攻击者观察 mempool 里的交易,提交一笔竞争交易谋利。

OXN 上。 显著减少。加密 calldata 意味着攻击者看不到你的交易做什么。基础机密性关闭了大部分基于 mempool 的 MEV 向量。但注意:

  • 交易排序仍可见。
  • 可预测的模式(例如总是在 UTC 03:00 交易)仍可能被 proximity 攻击利用。

签名重放​

描述。 在一条链上合法的签名在另一条链上重放做非预期操作。

OXN 上。 与以太坊一致。用 EIP-155(签名中带 chain ID)和 EIP-712(typed data)把签名绑到特定链与用途。

缺失输入校验​

描述。 合约接受输入不校验。

OXN 上。 与以太坊一致。加密 calldata 里仍是攻击者可控数据。

OXN 专属:不安全的随机数使用​

描述。 用 block.timestamp、block.number 或 PREVRANDAO 做随机数。

预防。 用 Sapphire.randomBytes。见随机数。

OXN 专属:通过明文调用发送方伪造​

描述。 门控 msg.sender 的 view 函数在通过明文 eth_call(msg.sender = 0x0)调用时行为错误。

// 通过明文 eth_call 调用时 msg.sender 是 0x0,检查通过
function isAdmin() external view returns (bool) {
return msg.sender == owner; // owner 恰好是 0x0 时返回 true
}

预防。 不要用 view 函数的 msg.sender 做安全决策——只用它过滤返回什么数据。真正的授权需要签名查询并显式检查。

OXN 专属:通过 gas 或存储模式泄漏机密​

详见机密性陷阱。

下一步​