d doeda-zogt.xyz
Solidity安全进阶教程

Solidity安全进阶教程:从已知漏洞模式到原创攻击思路

本教程帮助资深开发者从「能识别已知漏洞」跨越到「能发现新攻击思路」,覆盖跨函数重入、价格预言机操纵、签名重放等进阶议题,结合[[Binance]]生态典型案例。

d
doeda-zogt.xyz 编辑部
1241 字· 约 3 分钟阅读· 2026-05-24T06:12:22.878951+00:00
Solidity安全进阶教程 - Solidity安全进阶教程:从已知漏洞模式到原创攻击思路
关于「Solidity安全进阶教程」的视觉延伸

Solidity安全进阶教程:从已知漏洞模式到原创攻击思路

初级 Solidity 开发者学的是「不要犯已知错误」;进阶开发者要做的是「预判未发生的攻击」。这两者之间最大的差距在于思维方式。本教程围绕几类极具代表性的进阶漏洞,训练你建立原创攻击思路。

一、跨函数重入:传统重入之外的新维度

经典重入发生在同一函数内,但跨函数重入更隐蔽。比如 withdraw 函数有 reentrancyGuard,transferShare 没有;攻击者在 withdraw 的 callback 中调用 transferShare,绕开守卫继续操纵份额。

防护思路是:要么每个函数都加 reentrancyGuard,要么把 nonReentrant 提升到合约级别。对于在 Binance Smart Chain 上集成大量外部协议的 DeFi 项目,这种全局守护尤为关键。

二、只读重入:even read 也能被利用

只读重入(read-only reentrancy)针对 view 函数。当外部协议在 reentrancy 状态中读取 victim 的 view 函数,得到的可能是「未结算的中间状态」,攻击者据此发起套利。

2022 年的多起借贷协议事件都是此模式。防护方法是:在 view 函数中也加入 reentrancy 状态检查,或避免协议在中间状态暴露关键 view。涉及 USDT 价格读取的预言机协议尤其要警惕。

三、价格预言机操纵:闪电贷下的脆弱性

如果协议直接读取 DEX 现价做清算或借贷决策,攻击者可以借闪电贷操纵价格在一笔交易内完成攻击。防护方法是使用 TWAP(时间加权平均价)或 Chainlink 这类受抗操纵的预言机。

但 TWAP 也不是万能:低流动性池子的 TWAP 同样能被持续多块的攻击者操纵。设计时必须考虑「最差流动性条件下,攻击者操纵预言机的成本是否大于收益」。

四、签名重放:跨域、跨合约、跨链

签名授权类协议必须考虑三种重放:同合约内的 nonce 重放、跨合约(同链)重放、跨链重放。EIP-712 的 domain separator 同时包含 chainId、verifyingContract、name、version,正是为了这三层防护。

ETH 多链部署的协议必须保证不同链上的 verifyingContract 不同,或显式包含 chainId,避免攻击者把签名复制到另一条链上重放。

五、治理攻击:经济学层面的安全

治理代币集中、提案缺乏时间锁、闪电贷可投票,这些都会让协议在「治理层」被攻击。Mango Markets 等事件展示了治理攻击的破坏力。

防护方法是:时间锁(timelock)、quorum 阈值、防闪电贷的 vote-locking、社区紧急委员会。涉及 BTC 跨链资产的协议必须考虑:一旦治理被攻陷,攻击者能不能直接转移用户的跨链资产?

结语

安全进阶不是学更多「规则」,而是培养「攻击者思维」。看代码时主动问:哪一步外部调用会让中间状态可观测?哪一个 view 函数被读到时合约还没结算?哪一个治理参数变更没有时间锁?把这些问题内化为反射,你就跨过了进阶门槛。