安全模型
威胁模型、策略执行、加密密钥和并发保证。
威胁模型
Seashail 假设智能体进程可能是恶意的或已被攻破。二进制文件是安全边界:
- 智能体可以请求读取操作并提出写操作。
- Seashail 对每一个写操作强制执行策略引擎。
- 密钥材料静态加密,仅在签名时解密。
密钥存储
- 生成钱包使用沙米尔秘密分享(2-of-3)。
- 导入钱包使用 AES-256-GCM 静态加密,密钥由密码短语派生。
策略引擎
每一个写操作都通过以下方式把守:
- 单笔交易美元上限
- 每日美元上限(UTC)
- 滑点上限(兑换)
- 接收方白名单(发送)
- 合约白名单(兑换)
- 操作开关
- 通过 MCP 交互确认的分级审批
并发 / 多智能体
MCP 基于 stdio,因此多个客户端会生成多个 seashail mcp 进程。为避免状态分裂,seashail mcp 代理到一个拥有密钥存储的单例本地守护进程。
保证:
- 守护进程在
data_dir/seashail-daemon.lock处持有独占文件系统锁,确保只有一个进程拥有密钥/状态。 - 所有连接的客户端共享同一个内存中的密码短语会话。
- 所有状态变更在守护进程内部串行化以确保正确性。
威胁分析
Seashail 假设智能体可能已被攻破或是恶意的。本节记录具体的攻击场景、其影响以及 Seashail 的防御措施。
恶意智能体进程
攻击场景: 已被攻破或恶意的智能体试图通过提交未经授权的交易来盗取用户资金。
影响: 如果成功,钱包资金将全部损失。
缓解措施:
- 策略引擎对所有写操作强制执行单笔交易和每日美元上限
- 通过 MCP 交互确认的分级审批系统要求用户对高价值或高风险交易进行确认
- 接收方地址和合约交互的白名单
- 操作开关让用户能够全局禁用特定交易类型
- 诈骗地址黑名单和 OFAC SDN 拦截阻止向已知危险地址发送
残余风险: 如果社会工程学有效,用户可能在交互确认期间批准恶意交易。策略上限可以限制但不能消除风险。
智能体日志泄露
攻击场景: 智能体对话历史(由 LLM 提供商或本地缓存存储)包含私钥或密码短语。
影响: 能访问日志的攻击者可以重建密钥并盗取资金。
缓解措施:
- MCP 交互确认协议:Seashail 通过 MCP 直接向用户提示,密钥/密码短语永远不会发送给智能体
- 工具 schema 明确拒绝任何密钥材料的
secret参数 - 私钥永远不会出现在工具响应中(只有公开地址和交易哈希)
- 密码短语在丢弃时使用 zeroize 从内存中清零
残余风险: 用户可能手动将密码短语粘贴到智能体对话中,绕过交互确认。文档警告可以缓解但无法防止用户错误。
状态分裂
攻击场景: 多个 Seashail 进程同时修改密钥存储,导致损坏或双重支付。
影响: 密钥存储损坏、交易失败、nonce 冲突可能导致资金损失。
缓解措施:
- 独占文件系统锁(
seashail-daemon.lock)确保只有一个守护进程拥有密钥存储 - 所有 MCP 客户端代理到单例守护进程,而不是直接访问密钥存储
- 锁获取失败会导致优雅错误而非并发访问
残余风险: 在持锁期间强制终止守护进程可能留下过期的锁文件。Seashail 通过进程 ID 验证检测过期锁并重新获取。
密码短语盗取
攻击场景: 攻击者通过进程内存转储或调试器获取内存中的密码短语。
影响: 攻击者可以解密密钥存储并签署任意交易。
缓解措施:
- 密码短语会话具有可配置的 TTL(默认:1 小时),强制重新认证
- 密码短语在会话过期或守护进程关闭时立即使用 zeroize 从内存中清零
- 环境变量选项(
SEASHAIL_PASSPHRASE)被明确说明为高风险且不推荐 - 内存不会被交换到磁盘(对敏感缓冲区使用 mlock)
残余风险: 具有内核级访问权限或在活跃会话期间拥有调试器权限的攻击者可以提取密码短语。物理安全和操作系统级别的保护是用户的责任。
远程交易注入
攻击场景: 恶意聚合器(兑换提供商、NFT 市场适配器)返回的交易字节将资金转移到攻击者控制的地址,而不是预期的接收方。
影响: 资金发送到错误地址,无法恢复。
缓解措施:
require_user_confirm_for_remote_tx策略字段在签署远程构建的交易之前强制交互确认- 聚合器端点的白名单(仅信任的提供商)
- 广播前的交易模拟检测可疑的余额变化
- Seashail 根据工具参数解析和验证交易结构
残余风险: 通过模拟的复杂攻击(例如时间延迟漏洞利用、预言机操控)在用户交互确认期间批准后可能成功。对于复杂操作,聚合器信任是不可避免的。
钓鱼 / 诈骗地址
攻击场景: 智能体被欺骗向钓鱼地址或已知诈骗合约发送资金。
影响: 转移的资金永久损失。
缓解措施:
- 诈骗地址黑名单(已签名、自动更新)拒绝已知危险地址
- OFAC SDN 列表拦截受制裁地址
- 接收方白名单(如果已配置)拒绝所有非白名单地址
- 通过交互确认的用户确认提供最后一道防线
残余风险: 尚未进入黑名单的零日诈骗可能成功。仅白名单模式可消除此风险,但会降低灵活性。
过度支出
攻击场景: 失控的智能体提交数百笔交易,耗尽钱包。
影响: 资金被意外耗尽。
缓解措施:
- 单笔交易美元上限(例如
max_usd_per_tx=1000) - 每日美元上限在 UTC 午夜重置(例如
max_usd_per_day=5000) - 操作开关全局禁用特定交易类型
- 策略引擎限速(尚未实现)
残余风险: 如果用户设置了较高的限额,智能体可以在每日上限内耗尽资金。上限是用户配置的便利性与安全性之间的权衡。
未知美元价值漏洞
攻击场景: 智能体通过交易无法定价或价格过时的代币欺骗策略引擎,使策略无法将其转换为美元。
影响: 交易绕过基于美元的策略上限。
缓解措施:
deny_unknown_usd_value=true(失败关闭)拒绝无法确定美元价值的交易- 来自多个来源的价格源(Binance、Jupiter、链上预言机)
- 过时检查拒绝超过 5 分钟的价格
- 手动美元覆盖需要明确的用户确认
残余风险: 如果启用了失败关闭,价格预言机故障可能阻止合法交易。用户必须在安全性(拒绝未知)和可用性(允许未知并手动审查)之间做出选择。
密钥丢失
攻击场景: 用户丢失密码短语和所有备份密钥分片,使密钥存储永久无法访问。
影响: 受影响钱包中所有资金的永久性、不可恢复的损失。
缓解措施:
- 生成钱包的沙米尔秘密分享(2-of-3):丢失一个密钥分片不是致命的
- 钱包创建期间通过 MCP 工具导出备份密钥分片
- 设置期间关于非托管性质的明确警告
list_wallets提醒用户验证备份
残余风险: 如果用户丢失 3 个密钥分片中的 2 个或忘记导入钱包的密码短语,资金将无法恢复。设计上不存在后门。
杠杆爆仓
攻击场景: 永续合约仓位以过高杠杆开仓,导致快速爆仓。
影响: 爆仓造成抵押品损失。
缓解措施:
max_leverage策略字段限制每个仓位的杠杆(例如5x)max_usd_per_position限制总名义价值perps_enabled=false完全禁用永续合约- 仓位工具响应中包含爆仓价格供用户审查
残余风险: 高波动性可能在策略上限内导致爆仓。永续合约本质上是高风险的;策略可以降低但不能消除杠杆风险。
密钥托管对比
了解 Seashail 安全模型在与其他方案对比的背景下更容易理解:
| 方面 | Seashail | 浏览器钱包 | 云托管 |
|---|---|---|---|
| 密钥位置 | 本地加密密钥存储 | 浏览器扩展存储 | 远程服务器(提供商控制) |
| 智能体访问 | 策略把守的 MCP 工具 | 直接签名(用户点击) | 带提供商持有密钥的 API |
| 多设备 | 守护进程协调多个 MCP 客户端 | 每个浏览器实例独立 | 跨所有设备集中管理 |
| 恢复 | 沙米尔秘密分享 2-of-3 + 密码短语 | 助记词(12/24 个词) | 提供商恢复流程(邮件、双因素认证) |
| 风险模型 | 智能体受策略约束,用户是最终审批者 | 用户必须手动验证每笔交易 | 提供商是拥有完整密钥访问权的可信第三方 |
| 威胁面 | 被攻破的智能体 + 用户审批错误 | 恶意 DApp + 钓鱼 | 提供商安全漏洞或内部威胁 |
| 最适合 | 有安全护栏的自主智能体 | 手动 DeFi 使用 | 优先考虑便利性而非托管的用户 |
关键洞见:Seashail 假设智能体被攻破,但通过策略执行和交互确认进行防御。浏览器钱包假设用户对每笔交易保持警惕。云托管假设提供商的可信度。
有关执行此安全边界的守护进程/代理架构的更多信息,请参阅架构概述。