常见漏洞
所有存在于以太坊的 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 或存储模式泄漏机密
详见机密性陷阱。