跳转至

灵族 (Ling Family) 全族安全审计报告

审计日期: 2026-04-13 审计范围: 12个项目 + 共享基础设施 审计维度: 凭证管理、代码注入、网络安全、输入验证、文件权限、密钥泄露 审计人: 灵通+ (LingFlow+)


执行摘要

风险等级 数量 说明
🔴 CRITICAL 7 凭证泄露、私钥提交、任意代码执行
🟠 HIGH 14 shell=True、exec()、path traversal、SSRF、弱密码哈希
🟡 MEDIUM 18 硬编码内部IP、HTTP明文通信、连接泄漏、无限缓存
🟢 LOW 11 死代码、命名不一致、未使用导入

整体评级: ⚠️ 共享基础设施存在严重凭证泄露风险,多个项目存在代码注入漏洞。需要立即修复7个CRITICAL问题。


审计范围

项目 路径 角色 安全风险
LingFlow+ /home/ai/LingFlow_plus 协调者 🟡 MEDIUM
LingFlow /home/ai/LingFlow 工作流引擎 🟠 HIGH
LingClaude /home/ai/LingClaude 灵克 🟠 HIGH
LingYi /home/ai/LingYi 灵依 🟡 MEDIUM
LingMessage /home/ai/LingMessage 灵信 🟢 LOW
LingYang /home/ai/LingYang 灵扬 🟢 LOW
LingMinOpt /home/ai/LingMinOpt 灵极优 🟠 HIGH
LingResearch /home/ai/lingresearch 灵妍 🟡 MEDIUM
LingTongAsk /home/ai/lingtongask 灵通问道 🟠 HIGH
ZhiBridge /home/ai/zhineng-bridge 智桥 🔴 CRITICAL
Ling-term-mcp /home/ai/Ling-term-mcp 终端MCP 未扫描(外部工具)
共享基础设施 ~/.config/crush/, ~/.ling_lib/, etc. 🔴 CRITICAL

🔴 CRITICAL (7个)

C-01: crush.json 明文 API Key (5处)

位置: /home/ai/.config/crush/crush.json + 3个备份文件 影响: 全族12个agent的AI接口凭证

ZhiPu GLM API key 以明文存储在 crush.json 的5个位置: - zai-mcp-serverenv.Z_AI_API_KEY - web-search-primeheaders.Authorization: Bearer - web-readerheaders.Authorization: Bearer - zreadheaders.Authorization: Bearer - zai provider → api_key

3个备份文件 (crush.json.backup.*, crush.json.bak.*) 也包含相同密钥。

修复: 改用环境变量引用 ${Z_AI_API_KEY},删除备份文件,轮换密钥。


C-02: .git-credentials 明文 Git Token

位置: /home/ai/.git-credentials 影响: GitHub + Gitea 完整仓库访问权限

https://ky-guangda:<token>@zhinenggitea.iepose.cn
https://guangda88:ghp_<PAT>@github.com

GitHub PAT (ghp_ 格式) 授予完整仓库访问权限。

修复: 改用 git-credential-cache 或 OS keychain。立即轮换 GitHub PAT


C-03: LingMinOpt Git Remote URL 包含明文 Token

位置: /home/ai/LingMinOpt/.git/config 影响: Gitea 仓库访问凭证

remote.origin.url = http://ky-guangda:6484c39bfe0c7cdf514309515eaa5a814510236a@zhinenggitea.iepose.cn/...

修复: 从URL中移除token,改用 credential helper。轮换token。


C-04: 智桥 VAPID 私钥提交到代码仓库

位置: /home/ai/zhineng-bridge/relay-server/vapid_private_key.pem 影响: Web Push 认证私钥泄露

EC P-256 私钥以明文 PEM 格式提交到 git 仓库。任何有仓库访问权限的人都能伪造推送通知。

修复: 从仓库删除,加入 .gitignore,轮换密钥对,使用环境变量或 secrets manager。


C-05: 智桥 k8s/secrets.yaml 默认密码

位置: /home/ai/zhineng-bridge/k8s/secrets.yaml 影响: 生产环境安全密钥

ZHINENG_BRIDGE_SECURITY_SECRET_KEY: "Q0hBTkdFX01FX0lOX1BST0RVQ1RJT04="
# base64 decode = "CHANGE_ME_IN_PRODUCTION"

修复: 生成强随机密钥,通过 CI/CD 注入,不提交实际值到仓库。


C-06: 灵极优 exec() 任意代码执行

位置: /home/ai/LingMinOpt/lingminopt/mcp_server.py:61 影响: MCP 工具可执行任意 Python 代码

exec(f"def _evaluate(params):\n    {evaluate_code}", local_vars)

用户提供的 evaluate_code 直接传入 exec()。攻击者可通过 MCP 调用执行任意系统命令。

修复: 使用受限沙箱(如 RestrictedPython),或仅允许数学表达式解析器。


C-07: 灵克 shell=True 命令注入

位置: /home/ai/LingClaude/lingclaude/engine/bash.py:83 影响: AI 生成的命令直接在 shell 中执行

subprocess.run(command, shell=True, ...)

虽然有命令黑名单,但黑名单可被编码技巧、变量展开、命令链绕过。

修复: 改用 subprocess.run(cmd_list, shell=False),或使用更严格的白名单执行策略。


🟠 HIGH (14个)

H-01: 灵通问道 CosyVoice 路径遍历

位置: /home/ai/lingtongask/src/audio/cosyvoice.py:225 问题: _upload_audio()Path(audio_path) 无净化,read_bytes() 读取任意文件。

H-02: 灵通问道 CosyVoice SSRF

位置: /home/ai/lingtongask/src/audio/cosyvoice.py clone_voice() 问题: 用户控制的 audio_url 直接传给 DashScope API。

H-03: 灵通问道 GPT-SoVITS 明文 HTTP + 硬编码IP

位置: /home/ai/lingtongask/src/audio/gptsovits.py 问题: http://192.168.2.2:9880 泄露内部网络拓扑,明文传输。

H-04: 灵通问道 Prompt 注入

位置: src/generator/topic.py:128, src/generator/script.py:284 问题: 用户输入直接拼入 AI prompt,无长度限制或内容过滤。

H-05: 灵通问道 unawait 协程

位置: src/audio/tts.py:75, 136 问题: MockTTSProvider 回退缺少 await,返回协程对象导致下游崩溃。

H-06: 灵通问道 发布器静默成功

位置: src/publisher/platform.py:143-352 问题: 7个平台存根全部返回 True,调用方误以为已发布。

H-07: 灵Flow sandbox exec()

位置: /home/ai/LingFlow/lingflow/common/sandbox.py:379 问题: exec(compiled_code, globals_dict, locals_dict) 执行任意代码。

H-08: 灵Flow API 硬编码密钥

位置: /home/ai/LingFlow/lingflow-api/tests/test_api.py:20, examples/example1_python_client.py:8 问题: API_KEY = "dev-key-12345" 明文硬编码。

H-09: 智桥 backend_secret 默认 None

位置: /home/ai/zhineng-bridge/relay-server/server.py:39 问题: backend_secret: str = None — 无认证默认。

H-10: 灵妍硬编码数据库密码

位置: /home/ai/lingresearch/scripts/export_sessions_from_crush.py:42 问题: password="password" — 明文数据库密码。

H-11: 灵依弱密码哈希

位置: /home/ai/LingYi/src/lingyi/_web_app_auth.py:129 问题: bcrypt 不可用时回退到无盐 SHA-256。

位置: src/knowledge/base.py:97 问题: rglob("*.md") 跟随符号链接,可读取任意目录。

H-13: 灵通问道事件循环阻塞 (4处)

位置: CosyVoice (60s), Fish Audio (sync SDK), pydub (CPU密集), Doubao WebSocket 竞争 问题: 同步调用冻结整个事件循环。

H-14: 全族连接泄漏 (11处)

位置: lingtongask tts.py (OpenAI), gptsovits.py (aiohttp), bilibili.py (6个httpx), wechat_mp.py (5个httpx) 问题: 每次请求重建 HTTP 客户端,无连接池。


🟡 MEDIUM (18个精选)

ID 项目 位置 问题
M-01 全族 ~/.ling_keys.env 10+ API Key 中央存储,需验证权限600
M-02 全族 ~/.lingflow-plus/api_keys.json API Key 文件权限需检查
M-03 灵通问道 .env.example x2 25+ 凭证变量模板,两文件不同步
M-04 灵通问道 mcp_server/tools/tts.py API Key 作为函数参数(日志泄露风险)
M-05 灵通问道 mcp_server/tools/quality.py episode_id 未验证传入黑盒函数
M-06 灵通问道 voices/registry.json 声音配置在仓库中(非敏感但可改进)
M-07 灵通问道 video.py:322, enhanced_video.py:691 ffmpeg concat 文件名注入风险
M-08 灵通问道 publisher/wechat_mp.py Token 拼接在 URL query string
M-09 灵通问道 Cookie 文件权限 4个 Playwright 发布器默认0644
M-10 灵依 _council_config.py 8个硬编码 localhost URL
M-11 灵依 web_app.py:43 API Key 加载为模块全局变量
M-12 灵克 api.py:211 sys.path.insert 硬编码跨项目路径
M-13 智桥 10个 scripts/ 硬编码内部IP: 10.113.22.99, 100.66.1.8, 192.168.2.1
M-14 智桥 http_server.py:188 OAuth callback 使用 HTTP 非 HTTPS
M-15 灵妍 intent_router.py:14 http://localhost:8002/classify 硬编码
M-16 灵通问道 tts.py, enhanced_tts.py O(n²) bytes 拼接,应使用 b"".join()
M-17 灵通问道 knowledge/base.py 缓存无限增长,无淘汰策略
M-18 灵通问道 22处 except: 捕获 KeyboardInterrupt

🟢 LOW (11个精选)

ID 项目 问题
L-01 灵通问道 测试覆盖率 ~3%(45个源文件,仅5个有效断言)
L-02 灵通问道 27个根目录一次性脚本未归档
L-03 灵通问道 pyproject.toml 入口点指向错误模块
L-04 灵通问道 两个 .env.example 文件不同步
L-05 灵信 所有密钥引用都是测试夹具,签名密钥仅从环境变量加载 ✅
L-06 灵扬 GITHUB_TOKEN 仅从环境变量读取 ✅
L-07 灵克 /exec 端点已禁用 (HTTP 503) ✅
L-08 灵依 _shell_exec 工具已禁用 ✅
L-09 灵克 _validate_path() 检查路径遍历 ✅
L-10 灵通问道 optimizer.pycli/main.pyepisode_id 有正则验证 ✅
L-11 全族 无项目目录中存在 .env 文件(全部集中存储)✅

敏感文件清单

文件 类型 权限 风险
~/.config/crush/crush.json ZhiPu API Key x5 664 🔴 CRITICAL
~/.config/crush/crush.json.backup.* 同上 x3 664 🔴 CRITICAL
~/.config/crush/crush.json.bak.* 同上 x2 664 🔴 CRITICAL
~/.git-credentials GitHub PAT + Gitea Token 🔴 CRITICAL
~/.ling_keys.env 10+ API Key (中央存储) 600 🟠 HIGH
~/.lingflow-plus/api_keys.json API Key 600 🟠 HIGH
~/.ssh/id_ed25519 SSH 私钥 🟠 HIGH
~/.lingyi/.web_tokens 185个会话 Token 🟡 MEDIUM
~/.docker/.token_seed Docker Registry Seed 🟡 MEDIUM
zhineng-bridge/relay-server/vapid_private_key.pem VAPID 私钥 🔴 CRITICAL
zhineng-bridge/k8s/secrets.yaml K8s 默认密钥 🔴 CRITICAL
LingMinOpt/.git/config Gitea Token in URL 🔴 CRITICAL
zhineng-bridge/config/frpc.ini FRP Token (placeholder) 🟡 MEDIUM

按项目安全评分

智桥 (ZhiBridge)      ██████████ 10/10  🔴  最危险 — 私钥提交、默认密码、无认证
灵通问道 (LingTongAsk) ████████░░ 8/10   🟠  多个注入向量、凭证泄露
灵极优 (LingMinOpt)    ███████░░░ 7/10   🟠  exec() 任意代码执行
灵Flow (LingFlow)      ██████░░░░ 6/10   🟠  sandbox exec、硬编码密钥
灵克 (LingClaude)      ██████░░░░ 6/10   🟠  shell=True 命令注入
灵妍 (LingResearch)    ████░░░░░░ 4/10   🟡  硬编码密码、明文HTTP
灵依 (LingYi)          ████░░░░░░ 4/10   🟡  弱密码哈希、全局Key
灵通+ (LingFlow+)      ███░░░░░░░ 3/10   🟡  协调者,风险传导
灵信 (LingMessage)     █░░░░░░░░░ 1/10   🟢  最安全 — 仅环境变量
灵扬 (LingYang)        █░░░░░░░░░ 1/10   🟢  最安全 — 仅环境变量

修复优先级路线图

Phase 1: 止血 (立即,1-2小时)

# 问题 操作 影响
1 C-02 .git-credentials 改用 credential-cache,轮换 GitHub PAT 全族
2 C-03 LingMinOpt remote 从 URL 移除 token,用 credential helper 1项目
3 C-01 crush.json API Key 改用环境变量引用,删除备份文件 全族
4 C-04 VAPID 私钥 从仓库删除,加入 .gitignore,轮换密钥 智桥
5 C-05 k8s/secrets 生成强随机密钥,不提交实际值 智桥

Phase 2: 代码注入修复 (1-3天)

# 问题 操作
6 C-06 exec() 灵极优 MCP 改用受限沙箱
7 C-07 shell=True 灵克 BashEngine 改用 shell=False + 白名单
8 H-07 sandbox exec 灵 Flow sandbox 加强限制
9 H-01 path traversal 灵通问道 cosyvoice 路径净化
10 H-02 SSRF 灵通问道 clone_voice URL 白名单
11 H-04 Prompt 注入 输入长度限制 + 内容过滤

Phase 3: 安全加固 (1周)

# 问题 操作
12 H-03 硬编码IP 改用环境变量
13 H-11 弱密码哈希 灵依移除 SHA-256 回退,要求 bcrypt
14 H-09 无认证 智桥 backend_secret 改为必需参数
15 H-10 硬编码密码 灵妍改用环境变量
16 H-14 连接泄漏 统一 HTTP 客户端复用模式
17 M-08 Token in URL 微信发布器改用 Header 认证
18 M-09 Cookie 权限 统一 0o600

Phase 4: 代码质量 (持续)

# 问题 操作
19 L-01 测试覆盖率 灵通问道从 3% 重建测试
20 M-18 裸 except 替换为具体异常类型
21 M-16 O(n²) 改用 b"".join()
22 L-03 入口点 修复 pyproject.toml

全族凭证架构评估

当前架构

~/.ling_keys.env (中央存储, chmod 600 ✅)
    ├── GLM_CODING_PLAN_KEY, GLM_API_KEY, GLM_47_CC_KEY
    ├── DASHSCOPE_API_KEY
    ├── DEEPSEEK_API_KEY, DOUBAO_API_KEY
    ├── QWEN_API_KEY, KIMI_API_KEY
    ├── MINIMAX_API_KEY, SPARK_API_KEY
    └── FISH_AUDIO_API_KEY, etc.

~/.config/crush/crush.json (AI Provider 配置)
    └── 明文 Z_AI_API_KEY x5 ❌

~/.git-credentials (Git 认证)
    └── GitHub PAT + Gitea Token ❌

~/.ling_lib/ling_key_store.py (加载器)
    └── 动态导入 .ling_keys.env + 单 Key 文件

各项目 → import ling_key_store → 获取 Key

问题

  1. 单点故障: ~/.ling_keys.env 泄露 = 全族凭证泄露
  2. 无加密: 所有密钥明文存储
  3. 无审计: 密钥访问无日志
  4. 无轮换: 无自动密钥轮换机制
  5. crush.json 重复: 同一密钥出现在多个位置

推荐架构

~/.config/ling_secrets/ (chmod 700)
    ├── keys.enc (加密存储)
    └── master.key (可选: TPM/YubiKey 保护)

各项目 → ling_secrets.get("GLM_API_KEY") → 解密返回
                                          → 访问审计日志
                                          → 自动轮换提醒

审计结论

最紧迫的问题 (必须在24小时内修复)

  1. .git-credentials 明文 Token — GitHub PAT 授予完整仓库访问,已在文件中明文存储
  2. crush.json 明文 API Key — 5处 ZhiPu Key + 5个备份文件
  3. vapid_private_key.pem 提交到 git — Web Push 私钥永久泄露
  4. LingMinOpt remote URL 含 token — Gitea 凭证暴露

最危险的代码漏洞

  1. 灵极优 exec() — MCP 工具可执行任意 Python
  2. 灵克 shell=True — AI 生成命令直接 shell 执行
  3. 灵通问道 CosyVoice 路径遍历 — 可读服务器任意文件
  4. 灵Flow sandbox exec() — 无有效沙箱限制

安全亮点

  1. 灵信 — 全族最安全的项目,仅从环境变量读取密钥
  2. 灵扬 — 干净的 API Key 管理
  3. .env 文件在项目目录中 — 全部集中存储
  4. episode_id 正则验证 — 灵通问道 CLI 和 optimizer 都有
  5. 灵克 /exec 已禁用 — API 端点返回 503
  6. 灵依 _shell_exec 已禁用 — MCP 工具返回错误

审计完成时间: 2026-04-13 下次审计建议: 修复 Phase 1 + Phase 2 后 (约 2026-04-16)