Web3链上命令安全防护:tirith如何拦截私钥泄露与链上资产外泄风险
【免费下载链接】tirithTerminal security for developers and AI agents. Intercepts homograph URLs, pipe-to-shell, ANSI injection, obfuscated payloads, data exfiltration, and malicious AI skills/configs before they execute.项目地址: https://gitcode.com/gh_mirrors/tir/tirith
tirith 是一款面向开发者与 AI 智能体的终端安全工具,它的 Web3 命令防护(Web3 command guard)能把 Cast、Forge、Hardhat、Solana、Anchor 等链上命令当作"语法"来解析,在命令执行前识别私钥明文、助记词泄露、非受信 RPC 端点与数据外传行为——在你敲下回车的那一刻之前,就把风险拦下来。
为什么终端是 Web3 开发者的"高危入口"?🔐
链上资产的失窃,往往不是黑客攻破了区块链,而是工程师在终端里做了一件"顺手的小事":
- 把私钥直接写在命令行参数里(
--private-key 0x...)——它会被写入 shell 历史、进程列表和所有日志 - 把助记词(mnemonic)粘进参数——12/24 个单词一出口,钱包即失守
- 向非受信的 RPC 端点发送交易——端点伪装成官方节点即可截流
- 读取 Solana
id.json、Ethereum keystore 等钱包文件后,顺手curl上传到远端
浏览器早就有弹窗拦截这类行为,而终端默认什么都放行。tirith 就站在终端的"大门"上:命令被拦截检查、干净命令零打扰。
tirith 如何理解你的链上命令?
与链上分析工具不同,Web3 命令防护不读链状态、不模拟交易、不评分地址,它做的是更前置的事:把你要执行的命令解析成结构化的"事实"(工具族、操作类型、签名者角色、RPC 引用、安全开关状态),再与你的可信策略比对。
解析器位于 crates/tirith-core/src/rules/web3/,规则判定逻辑在 crates/tirith-core/src/rules/web3_gate.rs。核心只有3 条规则,职责清晰:
| 规则 ID | 触发场景 | 严重级别 |
|---|---|---|
web3_signer_risk | 命令参数中出现明文私钥、keypair 或助记词 | Critical(直接拦截) |
web3_state_changing_command | 命令会写链上状态;若同时关闭安全校验(--skip-simulation、--force等) | Medium / High |
web3_network_policy_violation | 目标 RPC 端点或签名者被web3_guard策略拒绝 | High |
💡 设计取舍很克制:一次普通的写链操作只是 Medium 提示,只有当同一条命令同时关掉安全开关时才升级为 High——因为那才是"错误"变成"不可逆"的形状。
拦截私钥泄露:最危险的行为直接 BLOCK 🛑
这是防护中最"不留情面"的一环。当命令参数里出现原始签名材料时:
cast send ... --private-key 0x...→web3_signer_riskCritical,动作blockcast send ... --mnemonic "..."→ 同样 Critical + 拦截
tirith 对助记词的识别不是简单的"数单词个数",而是用真实的BIP-39 校验和算法验证(实现见 crates/tirith-core/src/sensitive_assets.rs 中的is_valid_bip39_mnemonic),能精确识别钱包路径、keystore 文档、浏览器钱包存储、Solana keypair 数组与 EVM 私钥标量。
一个关键细节:"钥匙在敲下的那一刻就已泄露"——它可被从进程表、shell 历史和任何捕获了命令的日志中读取,因此没有任何策略设置能把明文私钥设为"允许"。策略配置里根本无法把 raw key 写进白名单,这类写法会被直接拒绝。
回归用例可参考 tests/fixtures/web3.toml,例如c10_web3_raw_private_key_is_critical就固定了"明文私钥必须 Critical"这一契约。
拦截链上资产外泄:源→目标关联分析 🕵️
识别出钱包文件只是第一步,tirith 还会做源到目标的血缘关联(source-to-sink correlation):
- 仅读取自己的钱包文件?→ 放行,零告警(安全工具不该让正常操作闭嘴)
- 读取受审钱包源 + 流向已证明的远端上传目标(
curl -d @...、wget --post-file等)?→ 判定data_exfiltration外泄 - 中间经过 base64、hex、
gzip/xz压缩、openssl enc/gpg加密等"中转跳板"?→ 血缘仍然追踪
配套的强制脱敏机制则保证:无论告警、审计日志还是 SARIF 输出,识别出的密钥值与敏感路径都会被抹除——报告本身不会成为二次泄露的渠道。所有 Web3 告警只呈现"工具、操作、签名者种类"这类封闭词汇,从不携带密钥、地址或原始命令。
5 分钟配置 web3_guard:声明你的可信边界 📋
检测规则开箱即用,而网络策略需要在策略文件中声明(用户级~/.config/tirith/policy.yaml或组织策略根):
- 声明可信网络:按真实的链身份(EVM chain id,或 Solana 集群+创世哈希)绑定 RPC 端点,伪造的"fork 冒名主网"无法得逞
- 限定允许的签名者:仅接受
hardware_wallet、keystore_file、keypair_file、account_alias、unlocked_node - 配置
deny_rpc拒绝名单:明确禁用的端点及其子域名策略 - 设置未分类端点的动作(
action_unclassified_rpc):注意它不是"恶意判定",而是"策略无法担保"的提示 - 端点用结构化匹配而非正则/URL 字符串:固定字段天然避免
https://rpc.example误匹配https://rpc.example.attacker.tld的经典坑
完整配置示例与字段说明见 docs/security/web3-command-guard.md,现成的策略模板可参考 crates/tirith/assets/configs/policy_templates/。
⚠️仓库级策略"只能收紧、不能授权":项目内检入的.tirith/policy.yaml中,网络、签名者等"授权类"字段会被直接丢弃,而deny_rpc等拒绝类字段按并集合并——因为仓库文件在威胁模型里本就是攻击者可控的。
体验指南:安装后如何验证防护生效?🚀
brew install tirith eval "$(tirith init --shell zsh)" # 或 bash / fish然后跑几个"探测命令"观察行为差异:
| 你输入的命令 | tirith 的反应 |
|---|---|
cast send <addr> --value 1ether --rpc-url <endpoint> | ⚠️ Medium 警告:写链上状态 |
cast send <addr> --private-key 0x... | 🚫 Critical 拦截:签名者风险 |
solana program deploy --url devnet ... | ✅ 放行:devnet/testnet/local 精确别名直接豁免 |
git status、ls -la等日常命令 | 完全静默 |
注意 devnet 豁免是精确别名匹配而非子串测试——攻击者提供的my-devnet-proxy.example不在豁免名单内。升级后的默认行为变化与灰度节奏,详见运维手册 docs/web3-task-rollout.md。
小结 🎯
tirith 的 Web3 命令防护给出的答案很朴素:不假装理解链上世界,只在你敲下命令前把好三道关——签名者材料是否明文暴露、写链操作是否叠加了危险开关、目标端点是否在可信名单内。配合钱包资产识别与源到目标的外泄关联,它把"私钥泄露"和"资产外传"这两类最高危的链上事故,拦截在了执行之前。
📚延伸阅读:Web3 命令防护完整文档 · 能力覆盖清单 · 威胁模型
【免费下载链接】tirithTerminal security for developers and AI agents. Intercepts homograph URLs, pipe-to-shell, ANSI injection, obfuscated payloads, data exfiltration, and malicious AI skills/configs before they execute.项目地址: https://gitcode.com/gh_mirrors/tir/tirith
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考