本文探讨了高价值Safe智能账户的安全操作指南,包括推荐的安全配置、签名过程以及人员培训等方面。文中强调了针对特定攻击的多种预防措施和安全策略,以确保高价值安全账户的有效操作和减少人为失误的风险。
“只有偏执狂才能生存” — 安迪·格罗夫
操作 Safe智能账户 需要清晰的理解以太坊的账户机制和基本的安全实践。本文将关键概念综合成一个实践指南,供安全操作员参考。最近,多部高价值安全账户遭遇了复杂的攻击,归结为朝鲜民主主义人民共和国(DPRK)的行为。尽管如此,资金损失的根本原因往往是由于缺乏知识、谨慎或意识导致的人为错误,这给被攻破的账户带来了灾难性的后果,也为DPRK带来了可观的利润 ¹。
对于尚未熟悉安全智能账户核心概念的读者,本文的第一部分 解释了在安全操作安全智能账户时必须理解的关键术语和架构组件。
推荐的安全设置满足以下条件:
签名接口:
SafeTx
类型数据会被清楚地显示。然而,由于软件钱包比硬件钱包更容易受到攻击,因此其验证应视为有效事务的确认,但绝不应排除潜在恶意的验证。多签配置:
所有者EOA操作员:
SafeTx
元交易数据的字段,理想情况下在硬件钱包的屏幕上审查。Fredrik Svantes的How to Multisig ³ 应用程序提供了针对不同威胁档案的简报清单,帮助评估安全智能账户设置的安全性。
对于特定操作员和SafeTx
,签名过程涉及元交易数据从安全应用(或任何使用的接口)转移到硬件钱包接口进行签名,然后再返回签名状态。
签名过程中 SafeTx 数据流动。
在攻击场景中,恶意的元交易数据可能会被传递到用户的端点或在端点被篡改。假设硬件钱包是防篡改的,则硬件钱包的屏幕应视为不可篡改的真实信息源。
SafeTx
EIP-712 数据解码每个所有者应理解显示在 Safe{Wallet} UI 中的每个字段的SafeTx
信息,并验证数据是否符合安全智能账户要执行的预期操作。此验证应在所有接口上执行:Safe UI、注入钱包和硬件钱包屏幕。建议对所有者进行培训,使其能够识别特定安全智能账户预期执行的最常见操作,从而能够通过审查即将签名的 SafeTx
结构数据来判断事务是否合法。
解码 ERC-20 代币转账的示例。 下面是所有者需签署简单 ERC-20 转移时所看到的内容示例。
在 Safe{Wallet} UI 中显示的 USDC ERC-20 转账元交易数据。
Safe{Wallet} UI 已经解码了 transfer
操作,并以更用户友好的方式显示。该具体交易调用 USDC 合约上的 transfer
函数,向地址(to
) 0xCE11BC2359C665aEaDAF586D5f07704EDE4F3b69
转账。它转移的金额(value
)为 1000000000
单位,这 corresponds to 1000 USDC,因为USDC代币使用6位小数表示精度。
解码的 USDC ERC-20 转账元交易。
此信息也可以通过直接观察交易数据来提取,因为它清晰地显示出需要为该特定交易签名的 SafeTx
结构的每个字段。
USDC ERC-20 转账元交易的交易数据。
对于这一具体的 SafeTx
:
SafeTx.to
字段指示该交易将调用 USDC 合约,该地址 0x1c7D4B19…
对应于 Sepolia 测试网的 USDC 合约。SafeTx.value
字段指出不会有 ETH 从安全智能账户余额转移到 USDC 合约。SafeTx.data
字段确定了在 USDC 合约上要调用的函数和参数。SafeTx.operation
字段指示正进行常规调用,而不是代理调用。SafeTx.data
字段的解释如下:
SafeTx.data
对 USDC ERC-20 转账元交易的解释。
0xa9059cbb
,这对应于常规 ERC-20 转账函数 transfer(address,uint256)
。大多数常见选择器可以在 openchain.xyz 公共数据库中检查。0xce11bc23...
。0x3b9aca00
,对应 1000000000
。在交易详情的底部,你可以看到对应于正在签名的特定 SafeTx
的 EIP-712 哈希值。
示例元交易的 EIP-712 哈希。
建议所有者 EOA 操作员学习如何解码这些数据,如在 ERC-20 转账示例中演示的那样,但重点关注其安全通常执行的具体类型的 SafeTx
交易。这将确保他们具备正确验证 SafeTx
数据的必要技能。
正如我们之前所述,安全元交易生命周期的关键部分就是元交易签名,其中每个所有者使用其 EOA 私钥对 EIP-712 SafeTx
类型数据摘要进行签名。
取决于使用的设备类型,我们可能会遇到两种不同的签名流程。
案例 A:盲签名设备。 盲签名设备仅向用户显示 EIP-712 域和消息哈希。盲签名设备使得在设备屏幕上验证签名数据成为不可能。
在 Ledger Nano S 上盲签署 EIP-712 消息的示例。
盲签名被钱包提供者视为不安全,通常会在盲目签署哈希时显示警告信息。任何仅允许盲签名的设备均应立即更换,如果打算用作安全所有者EOA。此类设备的示例包括 Trezor One 和 Ledger Nano S。
Trezor One 盲签名警告。
案例 B:显示 EIP-712 数据细分的设备。 为了操作安全智能账户的所有者EOA,只能使用显示 EIP-712 数据完整细分的设备。这些设备允许用户直接在设备屏幕上验证正在签名的数据,无需依赖任何第三方应用程序。在硬件钱包屏幕上验证每个 EIP-712 数据字段是签名之前的最后一步,也是发现潜在攻击的最后机会。此类设备的示例包括 Trezor Safe 3 和 5。**
在 Trezor Safe 3 上签名 ERC-20 SafeTx 数据的示例(EIP-712 域)。
在 Trezor Safe 3 上签名 ERC-20 SafeTx 数据的示例。
案例 C:显示 EIP-712 哈希和数据细分的设备。 这些设备同时向用户显示 EIP-712 数据的完整细分和相应的哈希,允许同时验证数据和哈希。此类设备的示例包括 Ledger Flex 和 Ledger Stax。
在 Ledger Flex 上签名交易的示例(EIP-712 哈希 + 数据细分)。重复步骤已被省略。
操作字段是在交易执行中用于指定交易应如何与目标合约交互的参数。它是一个uint8 值,包含在交易数据中,可以取两个值之一:
如在 安全智能账户代码 中所示,执行使用不同的调用指令,具体取决于操作字段。
function execute(
address to,
uint256 value,
bytes memory data,
Enum.Operation operation,
uint256 txGas
) internal returns (bool success) {
if (operation == Enum.Operation.DelegateCall) {
/* solhint-disable no-inline-assembly */
/// @solidity memory-safe-assembly
assembly {
success := delegatecall(txGas, to, add(data, 0x20), mload(data), 0, 0)
}
/* solhint-enable no-inline-assembly */
} else {
/* solhint-disable no-inline-assembly */
/// @solidity memory-safe-assembly
assembly {
success := call(txGas, to, value, add(data, 0x20), mload(data), 0, 0)
}
/* solhint-enable no-inline-assembly */
}
}
}
operation=1
的主要用例是使用 Safe 的 MultiSend 库执行批量交易。批量交易的编码方式与 SafeTx
结构不同,且更难以验证,因为它们被作为数组打包在 SafeTx.data
字段内。
SafeTx
简单简化可以减少攻击面,安全智能账户的设置和交易结构越复杂,可能的故障或利用点就越多。简单的 SafeTx
更易于阅读、验证、模拟和签署。这一点尤其重要,特别是在通过硬件钱包与安全进行交互时,屏幕上显示了即将签名的数据。
当使用 multiSend
时,SafeTx.data
字段将变成一个包含多个编码交易的大单一数据块,这使得立即识别内部调用的困难。这使得攻击者更容易在批处理内隐藏恶意操作。如果严格要求批量交易,避免使用 Safe 的 MultiSend,而应使用 MultiSendCallOnly,因为它禁止使用 delegatecall
。此外,避免直接从持有重大价值的安全执行批量交易。而是部署一个辅助 Safe,只为此目的提供必要的最低资金,并从此辅助安全执行批量交易,以降低主体安全被攻破的风险。
对于需要执行复杂交易的协议,如合约部署、升级或任何其他复杂操作,建议避免直接从安全执行这些交易。相反,使用外部 Governor 合约来在此处提出交易申请,并通过多签表决程序批准其执行。这种方法引入了链上交易承诺步骤,使元交易影响的模拟和分析更可控。它还将安全需验证的操作简化为简单的 castVote
交易。
在 Safe{Wallet} UI 中显示的简单 castVote 交易的示例。
为了尽早发现潜在攻击,建议使用第三方软件应用程序,与 Safe{Wallet} UI 一起,双重检查用户在 UI 中看到的内容是否完全与在硬件钱包中签署的内容相匹配。
OpenZeppelin 提供了一个替代应用程序,它根据特定的 SafeTx
结构计算 EIP-712 哈希,以便你可以双重检查哈希,而不完全依赖于在 Safe{Wallet} UI 中显示的数据。该工具可通过托管版本 ⁴ 或通过从 源代码库 本地运行。值得注意的是,此应用程序是 CLI 工具 safe-tx-hashes-util 的 UI 适应版本,最初由 pcaversaccio 提出。
使用 OpenZeppelin Safe Utils 生成 ERC-20 SafeTx 的 EIP-712 哈希的示例。
签署者必须确保正在签署的 SafeTx
数据准确代表要由安全执行的预期操作。域哈希和交易的消息哈希在 Safe{Wallet} UI、OpenZeppelin Safe Utils UI,以及最重要的,硬件钱包屏幕上应保持一致。
在使用如 MetaMask 或 Frame 的注入式钱包时,EIP-712 数据也会显示。
在 MetaMask(左)和 Rabby(右)中显示的 ERC-20 SafeTx
数据示例。
如果 Safe{Wallet} 前端或用户端点被攻破,交易详情或哈希可能会被伪造。屏幕可能显示正确的地址或金额,同时实际发送给你的硬件钱包签署的是其他内容。硬件钱包的屏幕应被视为真实的信息源。它离线独立工作,直接从其安全环境中显示你即将签署的内容。始终在硬件钱包上验证交易详情,这是确保没有被篡改的唯一方法。这是你最后且最可靠的安全检查点。
使用“先离线签名,再作为独立步骤执行”的流程,以确保所有签名者看到相同的交易哈希。否则,最后一个签名者将经过不同的签名流程。Safe{Wallet}支持这一点,让最后一位所需签名者选择稍后执行交易。
在硬件钱包上选择签名和执行选项,将显示触发 execTransaction
调用安全智能账户的 EOA 交易哈希,而不是显示实际正在执行的元交易的 EIP-712 SafeTx
结构。
“先离线签名,再作为独立步骤执行”的流程选择模式在 Safe{Wallet} UI。
法定人数中的至少一位签署者应为区块链安全专家。这一点至关重要,因为操作员通常缺乏强大的技术背景,可能会忽视关键检查。如果法定人数中没有专家,签署者应在签名过程中随时可以信任的专家。
根据你项目的资源和需求,运行你自己的企业实例的安全交易服务 ⁵ 以与项目的安全智能账户进行交互可能是有兴趣的。这提高了离线签名基础设施的韧性,并允许你在不完全依赖 Safe{Wallet} 基础设施的情况下执行更严格的安全策略。
为了识别高价值安全账户的特定用例需求,进行了一项数据驱动分析 ⁶,分析了2024年1月到撰写本文时(2025年3月)所有主网安全智能账户阈值为3或更高的交易,分析的交易总数超过215,000。以下是结果分析。
通过观察调用的方法,我们可以确定大约 95% 的交易是对 execTransaction
的调用,这些交易都是按照 SafeTx
元交易格式形成的。在这95%的交易中,只有15.5%是代理调用(其中 SafeTx.operation
= 1),显示出执行的安全交易绝大多数是常规调用 SafeTx
元交易。
分析中的常规调用(操作=0)与代理调用(操作=1)对比。
此外,在15.5%的代理调用中,99%以上的情况下,代理调用针对的是官方安全可信库合约。最常用的包括:
所进行的分析显示,分析的所有 SafeTx
交易中有58.5%是简单的 ERC-20 代币转账或 ETH 转移。在这些情况下,元交易数据易于验证。
所有分析过的 SafeTx 的 SafeTx.data 选择器。
通过分析 SafeTx.to
地址,我们可以识别出调用频率最高的合约。在超过33%的情况下,当 SafeTx.operation = 0
时,所调用的合约是 ERC-20 代币,USDC 或 USDT 是最常见的类型。
对所有分析过的 SafeTx 的 safeTx.to 地址的分析。
签署者被诱骗签署 SafeTx.operation = 1
,将实现升级至恶意实现。
反编译的恶意实现:https://app.dedaub.com/ethereum/address/0xfbffef83b1c172fe3bc86c1ccb036ab9f3efcaf2/decompiled
Radiant 报告称⁷ 其设备通过 DPRK 演员冒充承包商的方式,例如利用恶意 PDF 进行感染。签署者被诱骗签署一个将协议所有权转移到恶意地址的 SafeTx
。
一次高度复杂的针对DPRK黑客的定向攻击涉及改编 Secure{Wallet} 机构,加上在撰写此文时,注入了针对所利用的 Bybit 安全智能账户的恶意有效载荷。签署者被诱骗签署 SafeTx.operation = 1
交易,升级合约至恶意实现。黑客使用的一个把戏是将 SafeTx.data
的前四个字节设置为匹配ERC-20 transfer
调用的选择器,使其看起来像是合法的代币转账。然而,SafeTx.to
指向恶意实现。
反编译的恶意实现:https://app.dedaub.com/ethereum/address/0x96221423681a6d52e184d440a8efcebb105c7242/decompiled
[1]: samczsun. 揭开朝鲜威胁的面纱 https://www.paradigm.xyz/2025/03/demystifying-the-north-korean-threat
[2]: Patrick Collins Medium. 2025年十大加密货币硬件钱包 | 安全研究员评测 https://patrickalphac.medium.com/top-9-cryptocurrency-hardware-wallets-for-2025-security-researcher-review-9fcb16d771e0
[3]: Fredrik Svantes. 如何进行多签 https://howtomultisig.com/
[4]: OpenZeppelin. 安全工具 https://safeutils.openzeppelin.com/
[5]: Safe. 运行安全交易服务 https://docs.safe.global/core-api/api-safe-transaction-service
[6]: Dune OpenZeppelin. 安全智能账户分析 https://dune.com/openzeppelin/safe-analysis-2024-now
[7]: Radiant Capital Medium. Radiant Capital事件更新 https://medium.com/@RadiantCapital/radiant-capital-incident-update-e56d8c23829e
[8]: X @safe. ByBit调查更新 https://x.com/safe/status/1897663514975649938
- 原文链接: medium.com/@bazzanigianf...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!