攻击事件概述
本周末,一名攻击者在未拥有私钥的情况下,从Kaspa KRC-20桥接钱包中提取了1.864亿ZEAL和544亿NACHO。随后,攻击者通过第二层(L2)网络回收这些代币,并将其出售到流动性池中。值得注意的是,Kaspa本身并未遭到黑客攻击。
攻击手法分析
攻击者通过五笔有效交易欺骗了一个链外索引器,使其错误地识别出实际上没有人签署的转账,导致桥接代币未得到支持,部分池的KAS侧价值被削减了多达99.6%。
“私钥本应是拥有加密货币与仅仅知道其存放位置之间的界限。”
然而,在9月20日,有人找到了一种绕过这一假设的方法,针对KRC-20代币而不破坏Kaspa的基础链。攻击者从一个桥接保管地址转移了186,425,259 ZEAL和54,397,983,246 NACHO,尽管他们并不控制该地址的私钥。
攻击后果
这些代币随后作为普通桥接存款被发送回同一保管地址,并在Igra Labs的EVM层和Kasplex L2上铸造,最终被倾倒到Zealous Swap流动性池中。当尘埃落定时,攻击者的L2 ZEAL和NACHO余额已为空,而受影响的池损失了94%至99.6%的KAS侧价值。
问题在于,Kaspa的第一层(L1)完全按照预期运行。KRC-20代币的所有权并不是由Kaspa共识直接强制执行的。代币指令嵌入在Kaspa交易中,而链外的Kasplex索引器读取这些指令并确定谁拥有什么。
攻击机制详解
通常,KRC-20转账包含一个公钥、代币指令和有效签名。攻击者保持了这种熟悉的结构,但提供了一个空签名,并在OP_ENDIF之后添加了OP_NOT。空签名导致OP_CHECKSIG返回false,而不是直接终止交易。额外的OP_NOT将结果翻转回true,使Kaspa接受了一个有效的交易。
在共识层面上没有出现问题,但索引器的情况则不同。它识别了KRC-20封装,但并不要求脚本完全匹配规范格式,因此错误地将伪造的转账视为合法。Kasplex自己的API甚至在第一次伪造的ZEAL交易中返回了opAccept: 1。
后续影响与应对措施
最令人震惊的是,攻击者并不需要发现某种隐藏的凭证。标准的Kaspa地址暴露了构造伪造KRC-20操作所需的公钥。这意味着将代币转移到另一个地址并不能解决根本问题。在索引器被修补并重新索引历史之前,理论上可以在其他地方对KRC-20余额使用相同的漏洞。
五笔交易伪造了ZEAL和NACHO的转账。相比之下,九笔小额一单位的提款确实由保管方签署,似乎是测试出口路径是否有效的探测。值得注意的是,合法交易都是小额交易。
周日早上,Igra表示,保管钱包的所有ZEAL和NACHO持有量已被取走,留下976,512,12 ZEAL和42,570,879,908 NACHO在L2网络上没有完整的L1支持。另有45亿NACHO仍在攻击者手中。
Igra暂停了iKAS到Kaspa L1的退出和Hyperlane转账,同时警告用户不要桥接KRC-20代币、在L2去中心化交易所(DEX)上购买ZEAL或NACHO,或向受影响的池中添加流动性。原生KAS、Kaspa共识和未桥接的KRC-20代币被描述为未受影响。
未来展望
仅仅修复软件并不能清理这个烂摊子。Zealous Swap表示,运营商需要修补索引器并重新索引其历史,拒绝空签名、格式错误的标签和在OP_ENDIF之后继续的脚本。与此同时,Nacho the Kat表示,社区打算向KCC-20标准迈进,该标准旨在将代币规则放入由网络本身强制执行的脚本中。
这一事件发生在过去几周一系列漏洞、错误、黑客攻击和数据泄露之后。周六,闪电网络的托管和非托管基础设施提供商Blink Wallet披露,”几打”托管账户被掏空。网络安全公司DCENT本周也发现DCENT App钱包被盗。此时正值网络安全攻击加剧,有人怀疑人工智能正在助长这一波攻击者的浪潮。