anzhuang-suanliang
技能代码本身无恶意行为,但 SKILL.md 未声明 filesystem/ network/ shell 权限且 ensure_base.sh 自动下载安装外部依赖构成供应链风险。
为什么得出这个结论
1/4 个维度触发发现 3 项声明之外的能力或越权行为。
提取到 2 个一般风险产物,需要结合上下文判断。
没有形成明确的恶意路径。
发现 2 项需要关注的依赖或供应链线索。
风险分是怎么被拉高的
SKILL.md 声明 capability:NONE,但代码实际使用 filesystem:WRITE(输出xlsx/JSON)、shell:WRITE(subprocess 调用 ensure_base.sh)、network:READ(下载外部依赖)
ensure_base.sh 从 lisong2003-lgtm/cad-file-reader 下载依赖,虽有 SHA-256 校验但无版本 pinning,依赖外源第三方包
依赖下载失败时仅退出而非优雅降级;SHA256SUMS 下载失败时整体退出(exit 3),降级路径依赖 SKILL_NO_BASE 环境变量而非自动 fallback
最关键的证据
权限声明与实际能力严重不符
SKILL.md 和 manifest.json 均未声明 filesystem/ shell/ network 权限,但代码通过 subprocess 调用 ensure_base.sh(shell:WRITE)和 cad_validate.sh,并执行 curl 下载外部依赖(network:READ),输出文件写磁盘(filesystem:WRITE)。
SKILL.md:1 显式依赖外部来源包,无版本 pinning
ensure_base.sh 默认从 GitHub releases 下载 cad-file-reader v0.28.5(可配置 CAD_FILE_READER_VERSION),虽然有 SHA-256 完整性校验,但无版本锁定,存在依赖版本漂移或发布包被篡改的潜在风险。
scripts/ensure_base.sh:60 下载失败处理逻辑不健壮
ensure_base.sh 中 SHA256SUMS 下载失败时直接 exit 3 终止,不给用户提示可降级使用 SKILL_NO_BASE=1;curl 下载有 timeout 但无重试机制。
scripts/ensure_base.sh:73 声明能力 vs 实际能力
mep_plan.py:1300 写 xlsx; mep_scan.py:277 写 JSON mep_scan.py:27 subprocess.run ensure_base.sh; mep_plan.py:770 subprocess.run cad_validate.sh ensure_base.sh:67 curl 下载 GitHub release; ensure_base.sh:73 下载 SHA256SUMS 可疑产物与外联
https://clawhub.ai/user/lisong2003-lgtm skill-card.md:9
https://clawhub.ai/lisong2003-lgtm/skills/anzhuang-suanliang skill-card.md:35
依赖与供应链
| 包名 | 版本 | 来源 | 漏洞 | 备注 |
|---|---|---|---|---|
| cad-file-reader | >=0.28.1 (默认安装0.28.5) | GitHub releases (lisong2003-lgtm) | 否 | 从外部 GitHub 下载安装,有SHA-256校验但无版本pinning |
| ezdwg/read_cad | bundled in cad-file-reader vendor | cad-file-reader vendor | 否 | 通过 ensure_base.sh 补齐的底座依赖 |
| openpyxl | * | pip (未在requirements.txt声明) | 否 | 用于生成xlsx,代码中import但未在依赖文件声明 |
文件构成
SKILL.md scripts/ensure_base.sh skill-card.md