安全决策报告

cn-llm-router

核心功能安全的 LLM 路由工具,存在 2 处轻微瑕疵:calibrate.py 中受控的 eval() 使用(测试代码)和文档未提及的阴影功能。整体无恶意行为,密钥管理规范。

安装决策优先 来源: ClawHub 扫描时间: 2026/8/24
文件 38
IOC 15
越权项 0
发现 3

为什么得出这个结论

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

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

复核
隐藏执行与外联

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

通过
攻击链与高危发现

没有形成明确的恶意路径。

通过
依赖与供应链卫生

依赖结构存在,但暂未看到明显高危告警。

风险分是怎么被拉高的

受控 eval() 使用 +15

_core/calibrate.py:97,113 调用 eval(case['check'])(response),但 check 来自预定义测试用例(非外部输入),风险受控

阴影功能 +5

calibrate.py(能力实测校准器)未在 SKILL.md 声明,文档-行为存在小差异

最关键的证据

中危 代码执行

calibrate.py 使用 eval() 执行测试检查逻辑

_core/calibrate.py 第 97 和 113 行存在 eval(case['check'])(response) 调用。check 来自预定义的 CLASSIFICATION_CASES/CODE_CASES/LONG_CASES(非外部输入),但 eval() 本身存在理论风险。

_core/calibrate.py:97,113
建议改用 AST parse 验证或白名单函数池(如仅允许 'lambda r: ... in r ...' 模式),避免通用 eval()
低危 文档欺骗

SKILL.md 未声明 calibrate.py 校准工具

v2.5.0 新增的 calibrate.py(能力实测校准器)是阴影功能,SKILL.md 未提及。这是开发工具而非核心功能,但应补充说明。

_core/calibrate.py:1
在 SKILL.md 第七节或 FAQ 中补充说明 calibrate.py 的存在和用途
提示 敏感访问

缓存/SQLite 文件存储在用户主目录

cache.db 和 calls.db 默认存储在 ~/.cn_llm_router/ 目录,包含用户 query 和模型响应(无密钥)。SKILL.md 已声明,数据本地存储不外传。

scripts/cache.py:16
无需行动,已在 SKILL.md 中声明,用户可随时 cache clear 删除

声明能力 vs 实际能力

网络访问 通过
声明 READ
→
推断 READ
urllib.request.urlopen 调用各厂商官方 API
文件系统 通过
声明 WRITE
→
推断 WRITE
cache.py/cost_tracker.py 写入本地 SQLite,report.py 导出 HTML
环境变量 通过
声明 READ
→
推断 READ
config.py:get_key() 仅读取环境变量读取 API Key
命令执行 通过
声明 NONE
→
推断 NONE
无 subprocess/os.system 调用

可疑产物与外联

中危 外部 URL
https://skillhub.cn/skill/cn-llm-router

SKILL.md:364

中危 外部 URL
https://qianfan.baidubce.com/v2

_core/adapters/ernie.py:12

中危 外部 URL
https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials

_core/adapters/ernie.py:70

中危 外部 URL
https://api.deepseek.com

references/models.yaml:21

中危 外部 URL
https://dashscope.aliyuncs.com/compatible-mode/v1

references/models.yaml:45

中危 外部 URL
https://open.bigmodel.cn/api/paas/v4

references/models.yaml:84

中危 外部 URL
https://api.moonshot.cn/v1

references/models.yaml:115

中危 外部 URL
https://api.hunyuan.cloud.tencent.com/v1

references/models.yaml:146

中危 外部 URL
https://ark.cn-beijing.volces.com/api/v3

references/models.yaml:185

中危 外部 URL
https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions_pro

references/models.yaml:208

中危 外部 URL
https://api.minimax.chat/v1

references/models.yaml:248

中危 外部 URL
https://api.lingyiwanwu.com/v1

references/models.yaml:271

依赖与供应链

包名版本来源漏洞备注
websocket-client 可选(不装不影响功能) pip 否 仅讯飞星火 WebSocket 传输用,不装时其余 11 家完全正常
sentence-transformers 可选(模糊缓存增强) pip 否 模糊缓存可选依赖,未安装时降级为 difflib,零强制依赖

文件构成

38 个文件 · 6371 行
Python 30 个文件 · 5052 行Markdown 2 个文件 · 747 行YAML 1 个文件 · 421 行JSON 5 个文件 · 151 行
需关注文件 · 4
SKILL.md Markdown · 688 行
https://skillhub.cn/skill/cn-llm-router · [email protected]
references/models.yaml YAML · 421 行
https://api.deepseek.com · https://dashscope.aliyuncs.com/compatible-mode/v1 · https://open.bigmodel.cn/api/paas/v4 · https://api.moonshot.cn/v1 · https://api.hunyuan.cloud.tencent.com/v1 · https://ark.cn-beijing.volces.com/api/v3 · https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions_pro · https://api.minimax.chat/v1 · https://api.lingyiwanwu.com/v1 · https://api.baichuan-ai.com/v1 · https://api.stepfun.com/v1
_core/calibrate.py Python · 252 行
calibrate.py 使用 eval() 执行测试检查逻辑 · SKILL.md 未声明 calibrate.py 校准工具
scripts/cache.py Python · 193 行
缓存/SQLite 文件存储在用户主目录
其他文件 · router.py · test_router.py · mock_engine.py · mock_data.json · cost_tracker.py · cost_tracker.py +2

安全亮点

核心纯标准库实现(仅讯飞星火可选 websocket-client),无第三方依赖供应链风险
密钥管理规范:仅从环境变量读取,无硬编码、不落盘、不打包
网络请求仅发往各厂商官方域名,无第三方通信
SKILL.md 安全声明完整:无 eval/exec/subprocess/pickle,零风险文件类型
文档结构清晰,功能边界明确(第八节明确列出「不做」的事)
本地 SQLite 数据库(成本/缓存)不上传,数据完全本地化
update_check.py 联网失败静默跳过,不阻塞主流程