Skill Trust Decision

meta-analysis

Coze API 令牌以轻量级 XOR+base64 混淆形式硬编码嵌入源代码(密钥同文件明文),实际等同于明文凭据随技能公开发布;另有 query_origin(主机名 SHA-256)发送至外部端点构成设备指纹风险。计算模型(coze-only)文档-行为一致,但凭据管理严重违反安全最佳实践。

Install decision first Source: ClawHub Scanned: 13 days ago
Files 77
Artifacts 37
Violations 0
Findings 7
Most direct threat evidence
Critical Credential Theft
Coze API 令牌以可逆混淆形式嵌入源代码,随技能公开发布

adapters/coze_token.py 中 EMBEDDED_SECRETS 字典内含 meta_analysis_coze 与 ct_meta2_coze 两枚 Coze 工作流令牌,用 XOR+base64 混淆,密钥 OBFUSCATION_KEY=b'meta-analysis-coze-obf-v1-9f2c' 同文件明文硬编码。任何人读取源码后可立即还原令牌:只需调用 obf_decode(blob, key)。bug_report.py 独立嵌入 ct_bugreport_coze 令牌,密钥 b'ct-bugreport-coze-obf-v1-3c9e'。SKILL.md 权限声明完全未提及凭据分发。

adapters/coze_token.py:22

Why this conclusion was reached

1/4 dimensions flagged
Pass
Declared vs actual capability

Declared resources and inferred behavior are broadly aligned.

Review
Hidden execution and egress

37 lower-risk artifacts were extracted and still need context.

Block
Attack chain and severe findings

The report includes 4 attack-chain steps and 3 severe findings.

Review
Dependencies and supply chain hygiene

1 dependency or supply-chain issues need attention.

Attack Chain

01
攻击者获取技能源码(通过 GitHub/ClawHub 下载)

Entry · adapters/coze_token.py:22

02
攻击者读取 EMBEDDED_SECRETS 和 OBFUSCATION_KEY,直接调用 obf_decode() 还原 Coze token 明文

Escalation · adapters/coze_token.py:62

03
攻击者持有 Coze API token,可:以受害者身份调用 meta-analysis 工作流(产生费用);访问 coze 端点上所有用户历史分析记录;可能横向利用 token 对接的其他 coze 工作流

Impact · adapters/coze_token.py:22

04
query_origin(主机名 SHA-256)被 coze 端点用于归因,攻击者可利用该字段建立用户设备指纹数据库

Impact · adapters/coze_client.py:207

What drove the risk score up

API 令牌以可逆混淆嵌入源代码 +35

adapters/coze_token.py 的 EMBEDDED_SECRETS 用 XOR+base64 混淆 Coze token,密钥 OBFUSCATION_KEY 同文件明文硬编码,任何能读源码者均可 3 行代码还原。含 meta_analysis_coze 与 ct_meta2_coze 两枚 token,亦含 bugreport token(bug_report.py 独立 blob)。

query_origin 使用主机名 SHA-256 构成设备指纹 +15

_default_query_origin() 计算 socket.gethostname() 的 SHA-256 并随每个分析请求 POST 到 coze 端点,可跨会话/跨技能追踪用户设备。与 SKILL.md §6 声明的「仅发送分析参数」不符,超出必要范围。

端点预授权绕过用户知情同意 +8

adapters/config.json 中 auto_approve_endpoints 预置了 3 个 coze 端点,首次调用时 _auth_gate 检查白名单直接通过,用户实际上看不到 AUTH-BLOCK 提示,知情同意机制被预置白名单绕过。

端点回退自动切换无用户确认 +4

coze_client.py 中主端点 401/403 时自动回退到 FALLBACK_ENDPOINT(ct-meta2),token 也随之切换,全程用户无感知,无告警横幅。

Most important evidence

Critical Credential Theft

Coze API 令牌以可逆混淆形式嵌入源代码,随技能公开发布

adapters/coze_token.py 中 EMBEDDED_SECRETS 字典内含 meta_analysis_coze 与 ct_meta2_coze 两枚 Coze 工作流令牌,用 XOR+base64 混淆,密钥 OBFUSCATION_KEY=b'meta-analysis-coze-obf-v1-9f2c' 同文件明文硬编码。任何人读取源码后可立即还原令牌:只需调用 obf_decode(blob, key)。bug_report.py 独立嵌入 ct_bugreport_coze 令牌,密钥 b'ct-bugreport-coze-obf-v1-3c9e'。SKILL.md 权限声明完全未提及凭据分发。

adapters/coze_token.py:22
删除 EMBEDDED_SECRETS;仅通过 COZE_META_TOKEN 环境变量注入 token;coze_token.py 改为纯读取层;将 coze_token.py 从发布包中排除(加入 .gitignore / clawhub-ignore)
High Data Exfil

query_origin(主机名 SHA-256)随每个请求发送至外部端点,构成设备指纹

_default_query_origin() 将 socket.gethostname() 的 SHA-256 哈希作为 query_origin 字段随每个分析请求 POST 到 coze 端点(2026-08-29 修复空归因时引入)。主机名通常包含用户真实身份信息(如姓名/部门/设备名),SHA-256 后仍可通过彩虹表或社工关联还原。跨会话、跨技能持久发送同一哈希,可实现用户设备追踪。SKILL.md §6 仅声明「主机名哈希用于归因/限流」,未提及指纹追踪风险。

adapters/coze_client.py:207
将 query_origin 替换为会话级匿名 UUID 或随机一次性标识,不使用主机名;或完全移除 query_origin 字段
High Priv Escalation

预置端点白名单绕过用户知情同意机制

adapters/config.json 中 auto_approve_endpoints 预置了 3 个 coze 端点(ct-meta2、ct-meta、ct-bugreport),_auth_gate() 检查时这些端点直接返回 True,用户永远看不到 AUTH-BLOCK 提示。这使得 SKILL.md §6 声明的「首次出站须用户确认」机制对预置端点失效,实际成为先斩后奏。

adapters/config.json:1
从 config.json 中移除预置端点;首次调用任何端点时强制用户确认;将白名单改为仅存储用户明确授权的端点
Medium Supply Chain

pip install 无版本锁定的可选依赖

requirements.txt 中 cairosvg 注释为可选依赖(用于 PNG 输出),但未指定版本范围。虽然 SKILL.md 声明「cairosvg: OPTIONAL」,但 pip install 无版本锁定存在依赖混淆风险(同一系统多技能共存时可能拉取最新版导致兼容问题)。

requirements.txt:16
如保留 cairosvg,添加版本范围如 cairosvg>=2.0.0
Medium Doc Mismatch

SKILL.md 权限声明遗漏环境变量读取

SKILL.md permissions.block 中未声明读取环境变量,但代码实际读取 COZE_META_ENDPOINT、COZE_META_TOKEN、COZE_META_TIMEOUT、COZE_META_MIN_INTERVAL、COZE_META_DEDUP_WINDOW、COZE_META_DEDUP_WINDOW、CTSS_LOCALE/CTSS_LANG 等多个环境变量。这构成权限声明不完整。

SKILL.md:40
在 permissions 中添加 environment: "read" 声明,列出所有读取的环境变量名
Low Doc Mismatch

bug_report.py 跨技能调用命令字符串未在 SKILL.md 中声明

_build_ct_handoff() 生成调用 ct-literature 技能的 shell 命令字符串,literature_probe.py 的 main() 也可被 agent 调用。这些隐式跨技能调用能力未在 SKILL.md 中声明。

adapters/literature_probe.py:117
在 SKILL.md 中声明对 ct-literature 技能的引用依赖
Low Sensitive Access

端点自动回退用户无感知

主端点返回 401/403 时,coze_client.py 自动回退到 FALLBACK_ENDPOINT 并切换 token,全程仅在 parsed['_coze_endpoint_notice'] 设置标记,由 rendering.py HTML 横幅呈现,用户可能错过。

adapters/coze_client.py:440
回退发生时通过 stderr 主动输出告警,在 HTML 报告中醒目提示

Declared capability vs actual capability

Filesystem Pass
Declared WRITE
Inferred WRITE
SKILL.md: filesystem='writes only to the current working directory (meta_analysis/ and output/)'; 代码写 output/、HTML 报告、last_run.json 等,符合声明
Network Pass
Declared READ
Inferred READ+WRITE
SKILL.md: 'params/summary stats sent to coze'; 声明为接收结果(READ),实际同时 POST 分析数据+query_origin(WRITE);literature_probe.py GET Europe PMC(READ);bug_report.py POST 脱敏报告(WRITE)
Shell Pass
Declared NONE
Inferred NONE
核心执行路径无 shell 调用;本地 R 引擎已从运行路径移除(移至 adapters/_dev/,git 忽略)
Environment Pass
Declared NONE
Inferred READ
coze_client.py、run_analysis.py 读取 COZE_META_ENDPOINT、COZE_META_TOKEN、COZE_META_TIMEOUT、COZE_META_MIN_INTERVAL、COZE_META_DEDUP_WINDOW、COZE_META_DEDUP_WINDOW、CTSS_LOCALE 等环境变量;bug_report.py 读取 CTSS_LOCALE/CTSS_LANG;均未在 SKILL.md permissions 中声明
Skill Invoke Pass
Declared NONE
Inferred WRITE
bug_report.py 的 _build_ct_handoff() 生成调用 ct-literature 技能的 shell 命令字符串(不直接执行,由 agent 复述给用户),属于隐式跨技能调用能力,未在 SKILL.md 中声明

Suspicious artifacts and egress

Medium External URL
https://www.ebi.ac.uk/europepmc/webservices/rest/search

AGENTS.md:47

Medium External URL
https://keepachangelog.com/en/1.0.0/

CHANGELOG.md:3

Medium External URL
https://semver.org/

CHANGELOG.md:3

Medium External URL
https://ct-meta.coze.site/run

CHANGELOG.md:80

Medium External URL
https://example.invalid/run

CHANGELOG.md:80

Medium External URL
https://ct-meta2.coze.site/run

CHANGELOG.md:571

Medium External URL
https://ct-bugreport.coze.site/run

CHANGELOG.md:749

Medium External URL
https://ct-meta.coze.site/run(2026-08-26

adapters/coze_client.py:15

Medium External URL
https://ct-meta2.coze.site/run,token

adapters/coze_client.py:18

Medium External URL
https://ct-meta.coze.site/run)执行云端

adapters/coze_client.py:26

Medium External URL
https://ct-meta.coze.site/run(如被旧配置覆盖,

adapters/coze_client.py:346

Medium External URL
https://ct-meta.coze.site/run(已发布的

adapters/coze_integration_test.py:4

Dependencies and supply chain

PackageVersionSourceKnown vulnNotes
cairosvg * pip No optional;无版本锁定(仅 PNG 输出模式需要)
(stdlib only) N/A stdlib No 核心脚本仅用 urllib/json/os/re/socket/threading/time;无第三方依赖

File composition

77 files · 14906 lines
Markdown 45 files · 7557 linesPython 21 files · 6096 linesJSON 8 files · 1215 linesOther 1 files · 21 linesText 1 files · 17 lines
Files of concern · 6
adapters/coze_token.py Python · 158 lines
Coze API 令牌以可逆混淆形式嵌入源代码,随技能公开发布
adapters/config.json JSON · 7 lines
预置端点白名单绕过用户知情同意机制
CHANGELOG.md Markdown · 1284 lines
https://keepachangelog.com/en/1.0.0/ · https://semver.org/ · https://ct-meta.coze.site/run · https://example.invalid/run · https://ct-meta2.coze.site/run · https://ct-bugreport.coze.site/run · [email protected]
adapters/rendering.py Python · 1048 lines
http://www.w3.org/2000/svg
adapters/coze_client.py Python · 850 lines
query_origin(主机名 SHA-256)随每个请求发送至外部端点,构成设备指纹 · 端点自动回退用户无感知 · https://ct-meta.coze.site/run(2026-08-26 · https://ct-meta2.coze.site/run,token · https://ct-meta.coze.site/run)执行云端 · https://ct-meta.coze.site/run(如被旧配置覆盖,
SKILL.md Markdown · 191 lines
SKILL.md 权限声明遗漏环境变量读取
Other files · build_request.py · excel_style.py · README_zh-CN.md · drug_name_map.json · bug_report.py · README.md

Security positives

计算模型设计清晰:coze-only,无本地 R 引擎在运行路径,数值判断完全由云端 R 完成,LLM 不改写数值结论
sanitize_payload() 对出站 payload 进行 PII 脱敏(身份证/手机号/邮箱),设计合理
本地文件系统写入范围明确限定在 meta_analysis/ 和 output/ 子目录,与声明一致
无 shell 命令执行,代码注入风险低
bug_report.py 采用硬白名单 REPORT_SCHEMA,数据外泄风险受控
端点健康检查(health())使用 probe 标记 + debug 归因,避免生产日志污染
短窗幂等去重(_dedUP_CACHE)设计合理,防止重复请求
端点回退有备用路径设计,可用性有保障
literature_probe.py 仅依赖标准库,无第三方依赖供应链风险
文档结构完整,多语言(中英双语)支持,变更日志详尽