安全决策报告

birth-system-manager

技能存在文档欺骗行为:SKILL.md 承诺绝不显示私钥,但 decrypt-wallet.js 实际将私钥明文输出到 stdout;同时 pack.js 在生成的迁移文档中泄露密码和系统指纹。

安装决策优先 来源: ClawHub 扫描时间: 2026/6/21
文件 11
IOC 4
越权项 0
发现 6
最直接的威胁证据
01
用户调用 decrypt wallet 功能 初始入口 · SKILL.md
02
decrypt-wallet.js 将私钥明文打印到 stdout,攻击者通过日志/TTY 截获 权限提升 · decrypt-wallet.js
03
攻击者获得私钥后可完全控制关联的钱包地址 最终危害 · decrypt-wallet.js

为什么得出这个结论

1/4 个维度触发
通过
声明与实际能力

声明资源与推断能力基本一致。

复核
隐藏执行与外联

提取到 4 个一般风险产物,需要结合上下文判断。

阻止
攻击链与高危发现

报告包含 3 步攻击链,另有 2 项高危或严重发现。

复核
依赖与供应链卫生

发现 2 项需要关注的依赖或供应链线索。

攻击链

01
用户调用 decrypt wallet 功能

初始入口 · SKILL.md:1

02
decrypt-wallet.js 将私钥明文打印到 stdout,攻击者通过日志/TTY 截获

权限提升 · decrypt-wallet.js:85

03
攻击者获得私钥后可完全控制关联的钱包地址

最终危害 · decrypt-wallet.js:85

风险分是怎么被拉高的

文档欺骗 - 私钥泄露 +20

SKILL.md 第 55 行承诺'NEVER show full private key',但 decrypt-wallet.js 第 85-87 行直接打印私钥到 stdout

密码和系统指纹泄露 +15

pack.js 第 18 行默认密码 + 第 82-91 行在 MIGRATION.md 中写入密码和 hostname/platform/arch/node_version

私钥明文存储 +10

generate-birth-id.js 第 52 行将 private_key 明文存入 birth-info.json

最关键的证据

高危 文档欺骗

文档承诺不显示私钥,实际直接明文输出

SKILL.md 第 55 行明确声明'Return ONLY wallet address and success message, NEVER show full private key',但 decrypt-wallet.js 第 85-87 行当 DECRYPT_OUTPUT_TO_FILE 不为 true 时直接将私钥打印到控制台 stdout。这是明确的文档-行为差异(doc-behavior mismatch)。

decrypt-wallet.js:85
修改 decrypt-wallet.js 默认行为,移除直接输出私钥到 stdout 的逻辑,改为仅在用户明确确认时才输出。
高危 凭证窃取

迁移包泄露密码和系统指纹

pack.js 在生成 MIGRATION.md 时将密码明文写入(第 82-91 行),并在 marker.metadata 中包含 hostname、platform、arch、node_version 等敏感系统信息。这些信息会被打包进 .tar.gz 并可能传输到其他机器。

pack.js:82
从 MIGRATION.md 中移除密码明文,改为提示用户从安全渠道获取。将系统指纹信息移到单独的 metadata.json 而非在迁移文档中暴露。
中危 敏感访问

私钥明文存储在 birth-info.json

generate-birth-id.js 第 52 行将 private_key 明文存入 birthData 对象并保存到 ~/.openclaw/birth-info.json。虽然有注释说'in production, this should be encrypted',但代码没有实现加密。

generate-birth-id.js:52
实现私钥加密存储,使用用户提供的密码通过 scrypt 派生密钥后 AES-256-CBC 加密。
中危 权限提升

unpack.js 使用 execSync 执行 shell 命令

unpack.js 第 19 行使用 execSync 执行 tar 命令提取压缩包,虽然是本地 tar 操作,但如果用户传入的 packagePath 被恶意控制,可能导致路径遍历攻击。

unpack.js:19
对 packagePath 和 targetDir 进行路径规范化检查,防止 ../ 路径遍历攻击。
中危 敏感访问

创建可执行环境脚本

unpack.js 第 55-68 行在目标目录创建 .openclaw-setup.sh 并设置 0o755 权限,包含固定内容 'export IS_CLONE=true'。这可能在某些场景下被利用。

unpack.js:55
评估是否需要创建此脚本,或改为仅在日志中提示用户手动执行。
低危 供应链

pack.js 依赖 archiver 库但无版本锁定声明

pack.js 第 5 行使用 archiver 库进行打包,但项目没有 package.json 文件声明依赖版本。

pack.js:5
添加 package.json 文件并锁定依赖版本。

声明能力 vs 实际能力

文件系统 通过
声明 NONE
推断 WRITE
多个脚本读写 ~/.openclaw/birth-info.json
命令执行 通过
声明 NONE
推断 WRITE
unpack.js:19 使用 execSync 执行 tar 命令
环境变量 通过
声明 NONE
推断 READ
读取 IS_CLONE、BIRTH_PRIVATE_KEY_PASSWORD 等环境变量

可疑产物与外联

中危 钱包地址
0xF80042413226cf4a5F1b7de458Cf0EEd19237662

README.md:86

中危 外部 URL
https://docs.openclaw.ai

pack.js:272

中危 外部 URL
https://clawhub.ai/user/vg555558

skill-card.md:7

中危 外部 URL
https://clawhub.ai/vg555558/birth-system-manager

skill-card.md:27

依赖与供应链

包名版本来源漏洞备注
ethers * bundled_with_openclaw 依赖 OpenClaw 捆绑版本,无独立 package.json
archiver * require 无版本锁定,通过 require 直接引用

文件构成

11 个文件 · 1775 行
JavaScript 7 个文件 · 1488 行Markdown 3 个文件 · 282 行JSON 1 个文件 · 5 行
需关注文件 · 6
pack.js JavaScript · 395 行
迁移包泄露密码和系统指纹 · pack.js 依赖 archiver 库但无版本锁定声明 · https://docs.openclaw.ai
README.md Markdown · 144 行
0xF80042413226cf4a5F1b7de458Cf0EEd19237662
generate-birth-id.js JavaScript · 164 行
私钥明文存储在 birth-info.json
unpack.js JavaScript · 125 行
unpack.js 使用 execSync 执行 shell 命令 · 创建可执行环境脚本
decrypt-wallet.js JavaScript · 103 行
文档承诺不显示私钥,实际直接明文输出
skill-card.md Markdown · 42 行
https://clawhub.ai/user/vg555558 · https://clawhub.ai/vg555558/birth-system-manager
其他文件 · fix-clone.js · clone-init.js · whoami.js · SKILL.md · _meta.json

安全亮点

技能功能合理,用于 AI agent 身份和克隆管理
使用 ethers.js 进行密码学签名验证
迁移包使用 AES-256-CBC 加密钱包数据
无外部网络请求(声称的 local-only 行为在网络层面得到遵守)
代码结构清晰,有完整的错误处理