灵族 (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-server → env.Z_AI_API_KEY
- web-search-prime → headers.Authorization: Bearer
- web-reader → headers.Authorization: Bearer
- zread → headers.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 完整仓库访问权限
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 代码
用户提供的 evaluate_code 直接传入 exec()。攻击者可通过 MCP 调用执行任意系统命令。
修复: 使用受限沙箱(如 RestrictedPython),或仅允许数学表达式解析器。
C-07: 灵克 shell=True 命令注入
位置: /home/ai/LingClaude/lingclaude/engine/bash.py:83
影响: AI 生成的命令直接在 shell 中执行
虽然有命令黑名单,但黑名单可被编码技巧、变量展开、命令链绕过。
修复: 改用 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。
H-12: 灵通问道文件知识库 Symlink 遍历
位置: 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.py 和 cli/main.py 的 episode_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
问题
- 单点故障:
~/.ling_keys.env泄露 = 全族凭证泄露 - 无加密: 所有密钥明文存储
- 无审计: 密钥访问无日志
- 无轮换: 无自动密钥轮换机制
- crush.json 重复: 同一密钥出现在多个位置
推荐架构
~/.config/ling_secrets/ (chmod 700)
├── keys.enc (加密存储)
└── master.key (可选: TPM/YubiKey 保护)
各项目 → ling_secrets.get("GLM_API_KEY") → 解密返回
→ 访问审计日志
→ 自动轮换提醒
审计结论
最紧迫的问题 (必须在24小时内修复)
.git-credentials明文 Token — GitHub PAT 授予完整仓库访问,已在文件中明文存储crush.json明文 API Key — 5处 ZhiPu Key + 5个备份文件vapid_private_key.pem提交到 git — Web Push 私钥永久泄露- LingMinOpt remote URL 含 token — Gitea 凭证暴露
最危险的代码漏洞
- 灵极优
exec()— MCP 工具可执行任意 Python - 灵克
shell=True— AI 生成命令直接 shell 执行 - 灵通问道 CosyVoice 路径遍历 — 可读服务器任意文件
- 灵Flow sandbox
exec()— 无有效沙箱限制
安全亮点
- ✅ 灵信 — 全族最安全的项目,仅从环境变量读取密钥
- ✅ 灵扬 — 干净的 API Key 管理
- ✅ 无
.env文件在项目目录中 — 全部集中存储 - ✅
episode_id正则验证 — 灵通问道 CLI 和 optimizer 都有 - ✅ 灵克
/exec已禁用 — API 端点返回 503 - ✅ 灵依
_shell_exec已禁用 — MCP 工具返回错误
审计完成时间: 2026-04-13 下次审计建议: 修复 Phase 1 + Phase 2 后 (约 2026-04-16)