meta-analysis
Coze API 令牌以轻量级 XOR+base64 混淆形式硬编码嵌入源代码(密钥同文件明文),实际等同于明文凭据随技能公开发布;另有 query_origin(主机名 SHA-256)发送至外部端点构成设备指纹风险。计算模型(coze-only)文档-行为一致,但凭据管理严重违反安全最佳实践。
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 为什么得出这个结论
1/4 个维度触发声明资源与推断能力基本一致。
提取到 37 个一般风险产物,需要结合上下文判断。
报告包含 4 步攻击链,另有 3 项高危或严重发现。
发现 1 项需要关注的依赖或供应链线索。
攻击链
初始入口 · adapters/coze_token.py:22
权限提升 · adapters/coze_token.py:62
最终危害 · adapters/coze_token.py:22
最终危害 · adapters/coze_client.py:207
风险分是怎么被拉高的
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)。
_default_query_origin() 计算 socket.gethostname() 的 SHA-256 并随每个分析请求 POST 到 coze 端点,可跨会话/跨技能追踪用户设备。与 SKILL.md §6 声明的「仅发送分析参数」不符,超出必要范围。
adapters/config.json 中 auto_approve_endpoints 预置了 3 个 coze 端点,首次调用时 _auth_gate 检查白名单直接通过,用户实际上看不到 AUTH-BLOCK 提示,知情同意机制被预置白名单绕过。
coze_client.py 中主端点 401/403 时自动回退到 FALLBACK_ENDPOINT(ct-meta2),token 也随之切换,全程用户无感知,无告警横幅。
最关键的证据
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 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 预置端点白名单绕过用户知情同意机制
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 pip install 无版本锁定的可选依赖
requirements.txt 中 cairosvg 注释为可选依赖(用于 PNG 输出),但未指定版本范围。虽然 SKILL.md 声明「cairosvg: OPTIONAL」,但 pip install 无版本锁定存在依赖混淆风险(同一系统多技能共存时可能拉取最新版导致兼容问题)。
requirements.txt:16 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 bug_report.py 跨技能调用命令字符串未在 SKILL.md 中声明
_build_ct_handoff() 生成调用 ct-literature 技能的 shell 命令字符串,literature_probe.py 的 main() 也可被 agent 调用。这些隐式跨技能调用能力未在 SKILL.md 中声明。
adapters/literature_probe.py:117 端点自动回退用户无感知
主端点返回 401/403 时,coze_client.py 自动回退到 FALLBACK_ENDPOINT 并切换 token,全程仅在 parsed['_coze_endpoint_notice'] 设置标记,由 rendering.py HTML 横幅呈现,用户可能错过。
adapters/coze_client.py:440 声明能力 vs 实际能力
SKILL.md: filesystem='writes only to the current working directory (meta_analysis/ and output/)'; 代码写 output/、HTML 报告、last_run.json 等,符合声明 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 调用;本地 R 引擎已从运行路径移除(移至 adapters/_dev/,git 忽略) 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 中声明 bug_report.py 的 _build_ct_handoff() 生成调用 ct-literature 技能的 shell 命令字符串(不直接执行,由 agent 复述给用户),属于隐式跨技能调用能力,未在 SKILL.md 中声明 可疑产物与外联
https://www.ebi.ac.uk/europepmc/webservices/rest/search AGENTS.md:47
https://keepachangelog.com/en/1.0.0/ CHANGELOG.md:3
https://semver.org/ CHANGELOG.md:3
https://ct-meta.coze.site/run CHANGELOG.md:80
https://example.invalid/run CHANGELOG.md:80
https://ct-meta2.coze.site/run CHANGELOG.md:571
https://ct-bugreport.coze.site/run CHANGELOG.md:749
https://ct-meta.coze.site/run(2026-08-26 adapters/coze_client.py:15
https://ct-meta2.coze.site/run,token adapters/coze_client.py:18
https://ct-meta.coze.site/run)执行云端 adapters/coze_client.py:26
https://ct-meta.coze.site/run(如被旧配置覆盖, adapters/coze_client.py:346
https://ct-meta.coze.site/run(已发布的 adapters/coze_integration_test.py:4
依赖与供应链
| 包名 | 版本 | 来源 | 漏洞 | 备注 |
|---|---|---|---|---|
| cairosvg | * | pip | 否 | optional;无版本锁定(仅 PNG 输出模式需要) |
| (stdlib only) | N/A | stdlib | 否 | 核心脚本仅用 urllib/json/os/re/socket/threading/time;无第三方依赖 |
文件构成
adapters/coze_token.py adapters/config.json CHANGELOG.md adapters/rendering.py adapters/coze_client.py SKILL.md