SingularityNET 遭攻击复盘:23 亿枚代币被凭空铸造,攻击者套现约 229 万 美元
资料来源:SingularityNET、慢雾、Bitquery、PeckShield、ASI Alliance、Blockaid、Uniswap、Baltex、AMLBot、NuNet、Fetch.ai。
SingularityNET 多年来一直致力于推广一个供自主 AI 智能体使用的市场。
然而,9 月 19 日晚,其网络上最忙碌的“智能体”,却是一段并非由 SingularityNET 团队编写的脚本。
攻击者通过入侵该项目的云基础设施,获取了暴露的签名权限,仅凭一次签名便抽干了以太坊上兑换合约中的 FET 流动性,随后在九个小时内凭空铸造了总计 23 亿枚 AGIX、NTX、WMTX 和 CGV 代币。部分报道将被盗金额列为 1,677 万美元。但逐笔交易还原显示,攻击者实际获得的已变现资金总额约为 229 万美元,大部分增发代币并未售出。所有用于签名的密钥都是真实有效的。每一个执行指令的合约,也都在按既定逻辑运行。
但这场攻击造成的影响远不止资金损失。数日过去,相关各方仍未发布完整的事后调查报告。
当整个 AI 项目联盟的密钥都存放在同一套云基础设施中时,究竟是谁真正掌控着这台机器?
资料来源:SingularityNET、慢雾、Bitquery、PeckShield、ASI Alliance、Blockaid、Uniswap、Baltex、AMLBot、NuNet、Fetch.ai。
最先出现的资产损失是 FET,但攻击并未止步于此。
9 月 19 日 20:21(UTC+8),攻击者完成了对 FET 的转移。仅过了 2 分 24 秒,被转走的约 870 万枚 FET 就全部兑换成了 522.78 枚 ETH。21:40(UTC+8),Blockaid 就这笔 FET 资金流出发出警报,并指出,同一个钱包还接收了由 NuNet 部署者地址大量铸造的 NTX。Blockaid 最初将其称为 Fetch.ai 遭攻击事件,但 SingularityNET 随后确认,被入侵的是自身的基础设施。这场起初看似只涉及 Fetch.ai 的事件,影响范围比最初预想的更广。
到 9 月 20 日 02:47(UTC+8),慢雾已识别出攻击机制:只要控制授权者密钥,就足以抽干跨链桥。一把泄露的密钥,加上一个信任它的合约——这样的故事已经反复上演。
FET 被转走并不是攻击的终点。29 分钟后,也就是 9 月 19 日 20:50(UTC+8),攻击者利用 NuNet 的铸币权限,直接在代币合约上创建了约 4.085 亿枚 NTX。更大规模的增发从次日 03:13(UTC+8)开始,攻击者以每批 1,000 万枚的规模未经授权铸造 AGIX;03:38(UTC+8),WMTX 的非法铸造也随之开始。AGIX 的铸造一直持续到 04:21(UTC+8),随后,CGV 在 04:34(UTC+8)至 04:38(UTC+8)之间经历了 50 次铸币调用。
到天亮时,公开警报已将事件范围从跨链桥资金被抽干,扩大为多个代币的权限遭到入侵。早期钱包快照将攻击者持仓的名义价值估为约 1,677 万美元,但这一估值实际上假设,那些刚刚铸造、交易深度不足的代币都能按市场报价卖出。
攻击并未随着夜晚结束。9 月 20 日 13:10(UTC+8),SingularityNET 的一个付款合约将全部 289,575.10 枚 USDC 余额,转给了此前入侵期间已被清空的一个钱包。12 秒后,这笔资金便进入攻击者的第二个归集钱包。
一份被盗用的签名,为何能通过一次调用就抽干跨链桥?链上又为何没有任何机制阻止它?
从未发起交易的密钥
SingularityNET 跨链桥支持的代币横跨两条链。对于其支持的 Cardano 至以太坊转移路径,代币先在 Cardano 上销毁,再由以太坊侧的跨链桥铸造或释放对应代币。然而,以太坊侧合约并不会独立验证 Cardano 上的销毁是否真实发生,而是将预设授权者提供的签名,视为销毁已完成的证明。
Bitquery 在受影响的跨链桥中统计出五个授权者地址,这些地址此前从未发送过链上交易。这种模式与用于批准跨链桥资产释放、而非直接发起交易的链下签名密钥相符。SingularityNET 后来表示,一名未经授权的第三方“访问了我们的部分云基础设施”,但没有说明对方如何取得访问权限。
这种设计使每座跨链桥的信任,集中在掌握其签名权限的一方手中。
被抽干全部 FET 余额的跨链兑换合约:0xab424a430cc09864fa1277a38193111705adf3a3
签名批准此次资金转出的兑换授权者:0x69e5446b07b23de0a76730062c3252152216c85c
释放 8,721,530.40 枚 FET 的攻击交易:0xfe12c63b322d52727c615f3342222138d1563400a9880cebb516a9a162ac69e2
Athena 为 ASI Alliance 编制的一份取证报告,从此次转出操作的签名中恢复出签名者地址,并确认其与合约当前配置的授权者一致。报告称,自该兑换合约于 2024 年 9 月部署以来,这一授权者从未变更。
两项设计选择放大了授权权限失陷造成的影响。首先,conversionIn() 将单个外部账户(EOA)的签名作为唯一授权检查;其次,该函数没有采用 conversionOut() 中使用的 checkLimits(amount) 限额检查。因此,合约配置的 100 至 100 万枚 FET 限额并不约束 conversionIn(),合约最终接受了约 872 万枚 FET 的释放请求,约为其标示最高限额的 8.7 倍。
Athena 的取证报告还发现,全部 100 次正常的 ConversionIn 事件,都使用了 SingularityNET 后端生成的 UUID 格式标识符。此次攻击使用的标识符却是一串原始的非 ASCII 字节,是唯一的例外。这笔交易并不符合正常跨链桥操作的特征。
NuNet 部分的攻击则涉及更直接的权限。约 4.085 亿枚 NTX 根本没有经过兑换合约,而是由一个持有 NuNet 链上铸币角色的地址,直接调用代币合约中的 mint() 函数生成。
铸造 408,532,878.13 枚 NTX 的交易:0xe14442f6171d8a652e79d44336e58c00cdab271bdb69c668493d420e03ee13ab
AGIX 的批量铸造则通过 SingularityNET 的部署者地址执行:0xA7A31d206042B8A3E81aa4cf8c68c1B76856eE48
AGIX、WMTX 和 CGV 的兑换合约调用,都以一笔不同于常规批量数量的铸币操作结束。这种模式与自动化铸币持续运行、直至触及某项操作约束的情况相符。
World Mobile 的 WMTX 兑换合约确实设置了单次调用限额,但它没有阻止攻击,只是迫使攻击者将铸造拆成了 503 次调用。其中大多数调用恰好铸造 100 万枚 WMTX,单个区块内最多出现了十次。
Bitquery 表示,在任何代币被铸造之前,已有 16 个钱包在 21 分钟内遭到清空,同一时间段内还出现了相关的 BNB Chain 活动。根据其地址目录,其中四个钱包带有 SingularityNET 或 NuNet 员工标签,包括一个于 2022 年部署相关兑换合约的账户。这表明,事件涉及受影响项目的多条授权路径。
一个恢复地址修改了 NuNet、Cogito 和 Rejuve 兑换合约的授权者配置,随后冻结了 NTX。Bitquery 称,AGIX 和 WMTX 兑换合约未能通过相同方式得到及时处置,因为它们的所有者分别是一个 Gnosis Safe 多签钱包,以及一个需要四名签名者中三人批准的 Safe 多签钱包。权限交接处理期间,AGIX 和 WMTX 的铸造又持续了约一个小时。
SingularityNET 写道:“我们的系统定期接受审计,并遵循行业安全标准。”审计可以评估智能合约代码,但仅凭审计,并不能证明用于生成签名或行使签名权限的链下系统及私钥是安全的。与受影响项目相关的授权密钥提供了有效签名,继而使大量额外代币得以生成。
那么,报道中的高额损失究竟有多少已经变成流动性资产,又有多少只是市场可能根本无法消化的新铸造代币?
账面上的数百万美元
本文中的不同数字,衡量的是不同的事情。未经授权从合约中转走代币,属于直接的资产损失;未经授权铸造代币,则破坏了代币供应。归属于攻击者的地址通过出售代币或直接提取资产获得的 ETH 和稳定币,才属于已经实现的收益。按代币市场报价计算出的钱包余额,既不自动等于现金,也不自动等于能够收回的价值。早期报道反复混淆了这些概念。
铸造 23 亿枚代币很容易,找到买家却并不容易。跨链桥中被转走的 FET,构成了已识别出的最大单笔变现操作。通过 MetaMask 路由完成的一笔兑换,在扣除该路径可见的费用后,将这些 FET 换成了 522.78 枚 ETH。
约 872 万枚 FET 兑换为 522.78 枚 ETH 的交易:0x98f6e59b54fd4d2c086cc7cab4e7070edff6410210a1bf1fbaffd62da3b76d1c
两个地址接收了已识别收益及增发代币中的大部分。攻击者的主要归集地址接收了被转走的 FET 和新铸造的 NTX。根据此次交易还原,它还是 90 次 AGIX 铸币调用中前 26 次,以及 503 次 WMTX 铸币调用中前 54 次的接收方。
攻击者主要归集地址:0x2dcc1085fdcf418b421e45e86e4e54637cc21dfe
第二个钱包接收了剩余 64 次 AGIX 铸币调用、449 次 WMTX 铸币调用、全部 50 次 CGV 铸币调用所生成的代币,以及来自付款合约的 USDC。
第二个钱包地址:0x83f4424a401a9bb75f90314f21adaea6a9ce09c5
Bitquery 将主要归集地址的早期资金来源追溯至 ChangeNOW。
ChangeNOW 提供资金的交易:0xa99a8b71bd90d295db305639fc976339a057812c2693f3e44ae9288e5c13ebe1
该归集地址的以太坊历史记录还显示,9 月 1 日有一笔通过 Across 跨链桥完成的交付。
9 月 1 日的 Across 跨链交付交易:0xb56d3b900b5ac694d56d6efb9552a89fc0a14641eceefa7e16107cb8ccb0ea6d
9 月 20 日 04:04(UTC+8),第二个钱包收到用于支付 Gas 的 ETH,并在约一分钟后开始卖出代币。
第二个钱包收到 Gas 资金的交易:0x4e8894823caaf8fefaf0849cf69b30148ae5ddcee9e7f9bd0c1be0dae0c720c2
第二个钱包授权 MetaMask Swap Router 使用 100,000 枚 WMTX 的交易:0x8fcaa005da0c1a5ab138898571e2974ba8aa8f0b9864381e5b2b98b81e702da9
第二个钱包首次出售 WMTX 的交易:100,000 枚 WMTX 在扣除显示的 MetaMask 费用后,兑换为 0.832455441 枚 ETH:0xcf4b119f38d0da10dccac787234e05c6cabe3440dfe303f4f407daa92ab8829e
资产分散在两个钱包中,使报道中的统计更加复杂。PeckShield 的早期警报,将其认定属于攻击者的资产估值为 1,677 万美元,包括 1.983 亿枚 AGIX、649 枚 ETH 和 3,353.8 万枚 WMTX。
实际销售结果则揭示了账面估值与变现能力的差异。一笔通过 MetaMask 路由、经由 Mayan 执行的兑换,将 1,000 万枚 NTX 换成了 940.39 枚 USDT。与此同时,第二个钱包使用 UniswapX 订单,由第三方订单执行者提供 ETH 对价。结算记录并不能说明,这些执行者如何筹措资金、进行对冲,或最终如何处理收到的 WMTX。
NTX 经 MetaMask/Mayan 路径兑换的交易:投入 10,000,000 枚 NTX,940.5087 枚 USDT 到达 Mayan 在以太坊上的源链合约,用于在 BNB Chain 上结算:0xb6ecca4deeb2a616507a3f5779cb12db4fd986e5ee37c1832237fae2a1f1258f
CGV 是最极端的例子:将 2.462 亿枚 CGV 卖入 Cogito 的 Uniswap 池,只换回了 0.0123 枚 ETH。
246,200,000 枚 CGV 兑换为 0.0123 枚 ETH 的交易:0x69a28fb152b2b1b4158ec3db17f7baf565b644859a5150c38729bbb2d198bfad
此外,付款合约转出的 289,575.10 枚 USDC 最终进入第二个钱包,成为另一笔大额稳定币收入。这笔资金不需要通过出售增发代币获得。
付款合约向中转地址发送 289,575.1047 枚 USDC 的交易:0x869343d87a137a52aebce119c8c35e2fc3500205bf7a8c574ec2e8f4ab677c18
中转地址将 289,575.1047 枚 USDC 转入第二个钱包的交易:0xca9facda3f3629fa72ff98b4c8e663d3b415011979d749fab96ed9eda287e66f
截至 9 月 22 日,此次逐笔交易还原发现,两个主要地址共收到约 742.7 枚 ETH 等值资产,以及价值 362,075 美元的稳定币。这一统计不包含尚未出售的 AGIX、WMTX、CGV 和 NTX,将 WETH 与 ETH 按 1∶1 计算,统计的是总收入,而非净利润。
相当一部分流动性资产并未留在这两个主要钱包中。最迟到 9 月 21 日 00:00(UTC+8),三个不同的钱包分别向 Chainflip 存入 75,000 枚 USDC、向 Baltex 存入 75,000 枚 USDC,以及向 Chainflip 存入 118,015.16 枚 USDC。
Baltex 将其服务描述为无需 KYC,并宣传一条涉及门罗币的“隐私”兑换路径。另据 AMLBot 披露,Chainflip 的一家经纪商拒绝了一笔 ETH 存款,AMLBot 将该笔存款归因于同一攻击者。
向 Chainflip 转入 75,000 枚 USDC 的交易:0x3c8b12fedf147d82c8a5506edf3fcad4b7e25c8b96e4fb13b10cf2915aba0076
向 Baltex 转入 75,000 枚 USDC 的交易:0x05d6d42c75356900e523116d34892b480e9f9134ba195db698d7b1448e0b0696
最后一笔向 Chainflip 转入 118,015.16 枚 USDC 的交易:0xea254b148da1a6d028050f3a59f87845e3dc177ca37ef6441c7eb6cff47eb8ed
临近 UTC 午夜时,第二个钱包向一个接收地址发送了 93.70 枚 ETH。本文引用的公开来源均未确认该地址的所有者。约 40 分钟后,攻击者的主要归集钱包又发起了两笔转账,每笔恰好为 100 枚 ETH。
第二个钱包转出 93.70 枚 ETH 的交易:0x605d803890ae4eddc684f82f6de1a82c49a6a3f5646295c1a01fd897fa2a7577
接收钱包:0x2fD3285C93437077EF5FA6cecc367FD24d0fF726
攻击者主要归集钱包转出第一笔 100 枚 ETH 的交易:0xa8511628388c330db78fcdcfe7af5577e1f300adee795b578508fb21203b4756
攻击者主要归集钱包转出第二笔 100 枚 ETH 的交易:0x14399c61687de491461f76e961a91d2c0dcda4c6bb00ba332ec18b19d394822f
AMLBot 随后描述了两笔各 100 枚 ETH 的独立资金转移。它表示,其中一笔被兑换为约 266,000 枚 USDC,再经 CCTP、Arbitrum 和 Hyperliquid 转入“FXMR”;另一笔遭 Chainflip 经纪商拒绝后,据称通过 THORChain 兑换为约 3.28 枚 BTC。AMLBot 并未公布这些资金的来源地址。
两个钱包还都出现了小额“撒尘”转账和伪造的代币转账记录,发送地址刻意模仿此前交易对手的地址,符合地址投毒攻击的特征。如果这确实是其目的,那就是有人试图再偷一次攻击者的钱。
截至 9 月 25 日,攻击者的主要归集钱包持有约 433 枚 ETH、15.94 枚 WETH 和 52,395 枚 mUSD,与 AMLBot 前一天报告的约 433 枚 ETH 余额相符。此外,该钱包还持有约 1.983 亿枚 AGIX 和 3,354 万枚 WMTX。第二个钱包则持有约 18,109 枚 USDC、6.2586 亿枚 AGIX、1.6649 亿枚 WMTX 和 2.46 亿枚 CGV。
这些代币显示出来的价值,并不等于实际能够卖出的价值。如此大规模的持仓一旦出售,可能面临流动性不足和严重的价格冲击。真正的问题不是余额界面显示了多少钱,而是在不击穿市场的情况下,究竟能卖出多少。
根据此次交易还原,攻击行动带来的已变现流动性资产总额约为 229 万美元。已变现的资金可以转移,剩余约 12.7 亿枚代币却难以同样变现。如果这些持仓最终被卖出,代价将由谁来承担?
七成代币来自非法增发
价格可以恢复,供应结构却无法自行复原。
Bitquery 在跨链核对中统计出约 12.8 亿枚 AGIX,其中约 8.9596 亿枚是在攻击期间铸造的,占所统计总量的 70.1%;剩余约 3.8265 亿枚则可追溯至攻击前的供应。同一份分析显示,未经授权铸造的代币分别占所统计 CGV 供应量的 81.1%、WMTX 供应量的 32.4%,以及 NTX 供应量的 29.0%。
此次 NTX 增发,使其被统计到的跨链总供应量升至约 14.1 亿枚,超过了 NuNet 文档规定的 10 亿枚供应量。约 4,010 万枚非法增发的 NTX 跨链进入 Cardano,其中约 4,000 万枚流入了普通流动性池。交易记录可以追踪这些代币的路径,但一旦它们进入池中,流动性池就无法将其与合法发行的 NTX 区分开来。
FET 的问题不是非法增发,而是跨链桥能否兑付。负责释放从 Cardano 跨链而来的 FET 的以太坊兑换合约已被抽空,而 Cardano 上仍有约 8.7 亿枚 FET。根据该分析,自资金被转走以来,还没有人尝试将 FET 从 Cardano 转往以太坊,因此,尚未出现用户因兑换合约余额耗尽而等待兑付的情况。
NTX 面临的则是另一种问题:约 4,000 万枚非法增发代币已经进入 Cardano 的普通流动性池,尽管来源未经授权,池子仍会像对待其他 NTX 一样处理它们。
SingularityNET 表示,已撤销遭入侵的访问权限,停用受影响的跨链桥和兑换合约,并暂停以太坊上的 AGIX 和 NTX 转账。项目方称,相关跨链桥将继续保持离线,直到独立安全审查确认可以安全恢复。Bitquery 则发现,截至 9 月 20 日,五个授权者密钥中仍有三个未被更换。在跨链桥关闭的情况下,这些密钥是否仍可被利用,只有恢复运行后才会受到实际检验。
对于 AGIX 持有人,SingularityNET 最初表示,正在为符合条件的持有人制定一条“合法、经过验证的后续处理路径”。此后,项目方宣布将停用原有 AGIX 代币,并为受影响持有人发行替代代币,但尚未解释谁具备资格,也未说明替代代币将如何分配。以太坊上的 AGIX 转账仍处于暂停状态。
在所统计的 AGIX 中,约每十枚就有七枚是在攻击期间铸造的,因此,资格认定仍是最棘手的问题。任何替代方案,都必须决定如何处理那些在非法增发后、又通过正常市场交易流转的持仓。
Fetch.ai 表示,其合约没有受到影响。ASI Alliance 则确认,兑换合约中有价值 156 万美元的 FET 被转走,并承诺发布完整报告。但截至原文发布时,该报告仍未出现,也没有公布面向持有人,或那些支付了真实资金买入非法增发代币的订单执行者和流动性提供者的赔偿方案。
跨链桥合约接受的签名是真实有效的。合约检查了签名并执行指令,却没有核实签名所声称的跨链事件是否真的发生。NuNet 的 NTX 铸造则走了另一条路径:攻击者直接使用了代币自身的铸币权限。
一个以去中心化 AI 为愿景的联盟,却让四种代币的铸造权限,以及从兑换合约中释放 FET 的权限,都暴露在一次基础设施入侵能够触及的范围内。
如果这些项目所描绘的未来是自主运行的软件,那么,掌握密钥的软件又由谁来监督?
跨链桥和兑换合约接受了指定授权者的签名。在跨链铸币过程中,合约将这些签名视为另一条链上对应事件已经发生的证明,而没有自行核实该事件。NTX 的铸造则不同:攻击者利用其铸币权限,直接调用了代币合约中的 mint() 函数。
SingularityNET 表示,一名未经授权的第三方访问了其部分云基础设施,并借此通过跨链桥基础设施铸造代币、提取资产。Fetch.ai 则表示,自身合约未受影响。但公开声明并未解释攻击者如何获得访问权限,也没有准确说明各项权限是如何暴露的。
链上记录可以追踪这些权限所放行的交易,却无法证明攻击者如何取得访问权限,也无法确定背后由谁作出了相关安全决策。Bitquery 发现,五个跨链桥授权者地址此前从未发起交易,这与它们用于链下消息签名的用途相符。合约检查了签名。
当签名被当作证明时,谁来核实它所证明的事情是否真实?
免责声明:文章中的所有内容仅代表作者的观点,与本平台无关。用户不应以本文作为投资决策的参考。
你也可能喜欢
高盛谈加息:市场押得太狠?美联储或只需再加一次息
经济学家:CPI存在先天缺陷,道指黄金比才是真实通胀标尺

Akamai 为什么盘后暴涨超20%?Anthropic与Akamai签署116亿美元算力合同电话会全文(深度解析)

随笔:AI投资的下一步:谁能把算力变成利润?
