安全测试记录 — v0.4.3 — 2026-10-17

范围与结论
本次为开发过程中的代码审查、定向攻击测试和浏览器回归，不是独立机构审计，不证明没有未知漏洞。只使用公开测试助记词及模拟 RPC；未接触真实助记词、未广播真实交易。
允许的签名范围仍是 ETH 原生转账、标准 ERC20 transfer、BTC 单账户 P2WPKH、TRX 和标准 TRC20 transfer。没有增加 DeFi、任意消息签名、授权或 WalletConnect。

发现及修复
1. 异步签名期间的取消边界：切后台使审核失效后，已启动的异步签名仍可能返回并显示结果。现在签名后再次核对会话 epoch，失效则丢弃结果；finally 清理派生节点。测试用独立编译的插桩页面暂停签名、触发后台事件、恢复执行，确认无输出且节点 privateKey 为 null。插桩页面不发布。
2. 10 分钟期限原先只依赖系统时钟；回拨时间可能延长保留。现在同时使用系统时钟和 performance.now 单调计时，任一到期即失效。浏览器暂停/设备休眠期间不能保证 JavaScript 实时运行，恢复后才有机会清理。
3. 页面渲染报错路径补充取消待审核状态，避免保存已失效的节点引用。
4. HTTPS 部署的签名页面禁止输入密文/密码及解锁，只允许预览和下载；本地 file: 才能解锁。这是防误操作措施，恶意网站仍能删除它。

攻击验证
- ETH 和 TRON：零附带原生币的 approve、increaseAllowance、decreaseAllowance、setApprovalForAll、transferFrom、permit/类似授权、multicall、未知 selector，均在读取签名密钥前拒绝。部分变体采用恶意 selector 载荷，非所有协议的完整 ABI 覆盖。
- ETH：拒绝非规范 transfer、额外尾随字节、截断、高位地址污染、type-4 授权交易和创建合约。收款人、金额、nonce、gas、费用上限、chainId、签名者篡改均无法通过原请求比对。
- ETH：外部摘要中伪造的金额、收款人、符号不替代 raw 交易解析。
- BTC：校验完整前序交易和 witness UTXO 一致，拒绝伪造值/脚本、弱 sighash、额外输出；验证签名后所有输入输出不变。
- TRON：拒绝未知/重复 protobuf 字段、权限字段、过期和错误付款人；广播对象由签名原始字节重建，伪造 JSON 展示字段不能改变实际广播对象。与 TronWeb 离线签名对照。
- 连接：新 nonce 阻止旧连接证明重放，修改来源、过期、错误地址、伪造签名及源码哈希不匹配均拒绝。声明的网站来源不等于已认证的真实网站。
- 二维码：混包、损坏、重复帧及乱序验证；浏览器验证扫码自动连接和手动粘贴路径。

密钥生命周期
- 解密：自有密码字节缓冲、组合 KDF 输入、明文字节缓冲在 finally 清零；注入 importKey、deriveKey、decrypt、UTF-8 解码失败及成功路径验证。
- 派生：seed 清零；逐级清理父节点；注入 deriveChild 异常确认当前父节点释放。
- 签名：ETH/TRON 导出的私钥字节副本在成功、错误密钥和地址不匹配路径清零；上层 finally 清理最终 HD 节点。BTC 使用节点签名，节点由上层统一清理。
- 取消、后台、页面离开、超时使审核失效。输入密码等按用户选择最长在页面保留 10 分钟，期间可立即锁定清空。未写入 localStorage、IndexedDB、cookie 或服务工作线程。
- 无法保证清零 JavaScript 不可变字符串、WebCrypto/CryptoKey、第三方密码库内部副本、浏览器/系统交换内存、崩溃转储或被恶意程序读取的副本。“置空引用”不等于物理内存擦除。

版本和文件完整性
源码 SHA-256 覆盖按固定顺序编码的 build.mjs、package.json、package-lock.json、src 文件名/长度/内容，见 release.json。双方构建嵌入此值，并将值纳入连接签名挑战；不一致拒绝连接。源码哈希不是 HTML 整文件哈希。
完整离线 HTML 的 SHA-256 在 release.json、SHA256SUMS、在线端版本详情和验证并打开.command 中固定。它不能写入该 HTML 自身，否则改变被计算的文件。
先从可信渠道保存核验命令中的哈希，之后断网，用系统 shasum 或验证脚本核验文件再打开。脚本或哈希与网页一起被攻击者替换时，这种核验同样会失去可信基础；需要独立保管哈希。
连接哈希是版本一致性检查，不是远程证明：篡改后的页面可以谎报正确值。页面 CSP 也不能抵抗能修改整个 HTML 的攻击者。文件核验到打开之间和打开之后仍依赖主机可信。

仍存在的安全边界
- 每天使用的 Mac、浏览器扩展、恶意软件、截屏/键盘记录和已被感染的系统超出本程序防护范围；本方案不能达到 Ledger/Trezor 独立安全硬件的隔离保证。
- 相同 transfer selector 不保证自定义合约只转账；恶意/可升级合约可能有额外行为。ETH 空 data 转到合约地址也可能执行接收函数，离线无法判断目标代码。
- 自定义币名称和 decimals 是不可信元数据，需独立核对地址及小数位。RPC 返回余额、费用与链上状态可能被恶意节点伪造。
- TRON 原始交易不绑定 chainId，离线不能证明引用区块属于哪条链；Energy 预算不是全部费用上限。
- SHA256SUMS、CSP、依赖漏洞扫描都不是独立安全审计。公开测试种子仅用于测试，不能用于保存资产。
- 下载提供的 BIP39 和 AES-GCM HTML 是用户原文件的原样副本。本次验证 AES 格式兼容性、文件哈希和静态输入初值，不代表完整审计其所有功能或供应链。

执行入口
npm test
npm run build
npm run test:browser
BROWSER=webkit npm run test:browser
node test/security-browser.mjs
BROWSER=webkit node test/security-browser.mjs
npm audit --omit=dev
具体发布哈希见该版本 release.json / SHA256SUMS，发布包不包含插桩页面及测试文件。
