[TOC]
非正式定义: 技术安全 = 能够防御仅限于**原子操作(Atomic Actions)**的攻击者(例如,无法窃取资产)
"原子操作"意味着攻击必须在单个交易或同一区块中的多个交易内完成,不能跨越多个区块。这限制了攻击者的操作空间。
技术安全关注的是一个链上系统是否可以在 single tx 或一个区块中的 bundle of txs 范围内被利用
技术攻击是 risk-free,因为对攻击者来说结果是二元的:
- 要么攻击成功 = 获得利润
- 要么交易回滚 = 只需支付gas费用
这种安全模型主要适用于智能合约和DeFi(去中心化金融)系统的安全性分析,因为这些系统的所有操作都需要在区块链上执行和验证。
- Authorization issues 授权问题
- 缺乏对合同不变性的检查 contract invariants
- 缺乏适当的成功/失败检查 proper success/failure checks
- Integer manipulation issues 整数操作问题(自 Solidity 0.8 以来较为罕见) 即整数 overflow underflow 问题,Solidity 0.8.0+版本(内置溢出检查)
漏洞合约调用外部函数或向其他合约发送 ETH
在 ETH 发钱可以用
send
和transfer
,会限制 2300 gas,transfer
失败会回退。低风险,不实际。call
没有gas限制
- 漏洞合约调用外部函数或向其他地址发送 ETH
- 攻击者合约的函数被调用
- 攻击者合约调用易受攻击合约的可重入函数
- 易受攻击合约读取已过时(未正确更新)的状态
- 攻击者进行可重入调用,直到满足某些条件为止
- 测试 Testing
- 单元/集成测试 Unit/integration testing
- 模糊测试 Fuzz testing
- 正式验证 Formal verification
- 安全审计 Security audits
- 错误悬赏 Bug bounties
攻击逻辑在智能合约中实现,并且可以在单个交易中执行(攻击具有原子性,不需要多个交易配合)
攻击的成功不依赖于区块中的交易顺序(或区块中的任何其他交易)(难被防范,因为它不依赖于外部条件)
Example AMM(自动做市商)被临时 manipulate 目标是影响依赖该 AMM 作为价格预言机的其他协议
攻击者可能会暂时使 AMM 失衡以修改资产价格(例如,使用闪电贷)
如果某个协议使用 AMM 作为链上价格预言机,那么就可能存在攻击向量
攻击者可以在被操纵的价格下与协议进行交互并可能获利
攻击者在交易结束时恢复 AMM 的余额
- 初始操作
- 使用闪电贷(flash loan)获取大量资金
- 利用这些资金临时扰乱 AMM 的资产平衡
- 这会导致 AMM 中的资产价格发生显著变化
- 攻击条件
- 前提是有其他协议在使用这个 AMM 作为价格预言机
- 这些协议依赖 AMM 提供的价格信息来执行其功能
- 这种依赖性创造了攻击机会
- 获利机制
- 攻击者利用被操纵的价格与目标协议交互
- 由于价格偏离实际市场价值,可以套利获利
- 收尾处理
- 攻击者在同一笔交易结束前归还闪电贷
- 恢复 AMM 的正常余额状态
- 这样做可以避免承担长期持仓风险
这种攻击模式的特点是:
- 利用了闪电贷的无抵押特性
- 利用了某些协议过度依赖单一 AMM 作为价格源
- 整个过程在一个交易内完成,具有原子性
- 攻击者无需实际持有大量资金
防范建议:
- 协议应使用多个价格源
- 实施价格延迟机制
- 设置价格波动限制
- 使用时间加权平均价格(TWAP)等更稳健的价格机制
Example: Harvest Finance Exploit
https://rekt.news/harvest-finance-rekt/
攻击可能涉及单个 block 内的 Front- 和/或 Back-running,从而破坏 DeFi 协议的技术安全性
请记住,区块中的交易顺序是由矿工/验证者决定的!由于交易的顺序,存在许多盈利机会
**Front-running:**根据市场上即将发生的交易信息(通常为非公开信息)采取有利可图的行动
Maximal Extractable Value (MEV): 区块生产者通过操纵区块中的交易顺序所能提取的价值
矿工/Block Producer 可以:
- 排除 txs
- 决定 txs 的顺序
- 插入自己的 txs
任何可以观察到待处理交易的人都可以:
- Front-run txs(在目标交易之前插入自己的交易)
- Back-run txs(在目标交易之后插入自己的交易)
攻击成功与否取决于交易顺序。 交易排序攻击的类型:
- Displacement attacks 置换攻击
- Sandwich attacks 三明治攻击
攻击者 front-run 某些目标交易,攻击成功与否并不取决于目标交易是否在之后执行。"抢先提交" 例如
-
尝试注册域名
攻击者发现某人想要注册一个域名
攻击者抢先一步注册了这个域名
无论原本想注册域名的人最后是否尝试注册,攻击者已经成功获得了域名
攻击的结果(获得域名)不依赖于目标方的后续行为
-
试图申请漏洞赏金 bounty
攻击者发现某个安全漏洞
攻击者抢先提交漏洞报告以申请赏金
即使其他研究者后来也发现并报告了同样的漏洞,首个报告者(攻击者)已经获得了赏金
攻击的结果(获得赏金)不依赖于其他人是否也提交报告
攻击者需要快速行动("抢先"),一旦攻击成功完成,后续其他人的行为已经无法改变结果,攻击的目的是抢占某种稀缺资源或优先权
攻击者提交两笔交易,一笔在其他目标(受害者)交易之前,另一笔在其他目标(受害者)交易之后;如果三笔交易(包括目标交易)都成功(即不 revert),则攻击者获利
Alice提交了一笔交易,准备在AMM(自动做市商)上将资产X换成资产Y。
Bob(区块打包者)看到了Alice的待处理交易,于是提交了一笔具有更高优先费用的交易。这笔交易需要在Alice的交易之前执行,目的是购买大量资产Y。
Bob的交易先被执行,导致资产Y的价格上涨。随后Alice的交易执行,她不得不以更高的价格购买资产Y,这进一步推高了价格。
Bob再提交一笔交易,以更高的价格卖出资产Y,从而获取利润。
Swapping WETH for FARM tokens on Uniswap:
- TX1 (Open sandwich): Attacker swaps 220 WETH for 1234 FARM.
- TX2 (Target transaction): Victim swaps 153 WETH for 782 FARM (price: 1 WETH = 5.11 WETH)
- TX3 (Close sandwich): Attacker swaps 1234 FARM tokens for 234 WETH (price: 1 WETH = 5.27 FARM)
交易排序中可提取价值带来的问题
从交易排序中可提取的利润会导致以下几个问题:
- Gas价格波动问题:为争夺交易被纳入区块而产生的竞价战导致gas价格波动
- 当多个MEV机器人/矿工竞争同一个套利机会时
- 他们会不断提高gas价格来确保自己的交易被优先处理
- 这种竞价行为导致网络gas价格剧烈波动
- 影响普通用户的交易成本
- 区块空间浪费问题:失败的交易仍会被打包进区块并无谓占用区块空间(这些交易最终会回滚)
- 即使交易最终会失败(回滚),它们仍然被包含在区块中
- 这些失败的交易:
- 占用了宝贵的区块空间
- 浪费了网络资源
- 可能导致区块拥堵
- 用户仍需支付gas费,尽管交易失败
这些问题凸显了当前区块链MEV问题的严重性:
- 影响网络效率
- 增加用户成本
- 浪费计算资源
- 可能影响网络的公平性和可用性
- 私有的private mempool 和communication channels can be used
私有mempool(内存池)和通信通道之所以有用,主要是因为它们可以帮助防止MEV攻击,特别是三明治攻击。让我详细解释原因:
Public Mempool | Private Mempool |
---|---|
- 所有待处理交易对所有人可见 - MEV机器人可以轻易监控并识别有利可图的交易 - 攻击者可以通过front-running或sandwich攻击来获利 |
- 交易在执行前对外界不可见 - 只有特定的验证者/矿工能看到交易内容 - 降低了被front-running的风险 - 攻击者无法提前知道交易信息,因此无法进行三明治攻击 |
私有通信通道(Communication Channel)的作用:
- 允许用户直接与特定验证者/矿工通信
- 绕过公共mempool
- 可以建立加密的点对点连接
- 提供交易隐私保护
实际应用例子:
- Flashbots的私有通信通道
- 各种DEX的私有订单簿
- 矿池的私有交易提交系统
带来的好处:
- 减少MEV攻击
- 降低gas费波动
- 提高交易隐私性
- 改善用户交易体验
- 减少网络拥堤
但也要注意的问题:
- 可能带来中心化风险
- 需要信任特定的验证者/矿工
- 可能影响网络的透明度
- 需要额外的基础设施支持
总的来说,私有mempool和通信通道是当前应对MEV问题的重要工具,虽然不是完美的解决方案,但确实能在很大程度上保护用户免受MEV攻击。
非正式定义: 经济安全 = 对于能够执行非原子性操作来将协议操作到非预期状态的攻击者来说是不可盈利的
-
经济安全涉及试图通过 manipulate 协议的 incentive structure 来获利的攻击者(例如,通过盗取资产)。
-
经济攻击是 non-atomic 的:这意味着攻击不是瞬时完成的,而是需要一段时间和多个步骤。
-
这些攻击具有明确的前期成本,并且不是无风险的:
- 攻击可能会因为执行期间发生的其他事件而失败
- 攻击者可能会错误估计市场反应
这个定义主要用于区块链和加密货币领域,描述了一个安全的经济系统应该具备的特征:即使攻击者有能力执行复杂的操作,系统的经济激励机制也应该使得攻击在经济上是不可行或不划算的。
这种安全模型考虑了现实世界中的经济约束和市场动态,而不仅仅是技术层面的安全性。它强调了两个关键点:
- 攻击需要投入实际成本
- 攻击的结果存在不确定性,这增加了攻击者的风险
这样的设计理念使得系统能够通过经济激励来实现自我保护,而不仅仅依赖于技术手段。
Technical Attack | Economic Attack |
---|---|
攻击者发现一系列合约调用来获取利润 单个交易或交易打包 |
攻击者在不同"时间点"执行多个操作 但无法控制操作之间发生的事情 不能保证最终操作一定盈利(即非无风险) |
一个协议使用AMM的即时价格作为预言机,攻击者通过(原子性的)三明治攻击来窃取资产。 | 一个协议使用AMM的时间加权平均价格作为预言机。攻击者通过随时间推移操纵这个价格,可能会窃取资产。 |
-
执行时间和原子性
- 技术攻击是在单个交易或紧密打包的交易组合中完成,具有原子性
- 经济攻击需要在不同时间点执行多个操作,非原子性的
-
确定性
- 技术攻击一旦发现漏洞,执行结果通常是确定的
- 经济攻击受市场环境影响,结果具有不确定性
-
控制程度
- 技术攻击者能完全控制攻击流程
- 经济攻击者无法控制操作之间的市场变化
-
风险程度
- 技术攻击风险相对较低,一旦条件满足就能成功
- 经济攻击存在显著风险,最终是否盈利取决于多个外部因素
这种区分对于理解和设计区块链系统的安全机制很重要,因为它们需要同时防范这两种类型的攻击:
- 通过代码审计和安全测试来防范技术攻击
- 通过经济激励机制设计来防范经济攻击