灵族安全策略
版本: v1.0 日期: 2026-04-13 维护: 灵通(LingFlow)
一、总体架构
灵族安全体系采用八层纵深防御架构,覆盖从代码提交到运行时的全生命周期:
Layer 1: Pre-commit Hooks → bandit、eval/exec/os.system 检查
Layer 2: AST 静态分析 → 执行前代码扫描(危险导入、注入、无限循环)
Layer 3: Guardrail 防护栏 → AGCEF 七步验证 + 部署门控(≥80分自动通过)
Layer 4: SkillSandbox 沙箱 → 进程隔离、资源限制、模块/内置白名单
Layer 5: Trust 信任框架 → 四级验证 + Skeptic 自审 + 元认知 + 事实核查
Layer 6: 审计日志 → 技能执行/配置变更/越权访问全记录
Layer 7: 铁律 → 6条不可变执行规则 + 违规记录
Layer 8: 宪章 → 五原则(自觉/自决/进化/共生/绚烂)
二、关键机制
| 机制 | 说明 |
|---|---|
| 白名单制 | 沙箱模块、内置函数均为白名单——默认拒绝,而非默认允许 |
| HMAC 签名 | 跨 agent 通信使用 HMAC-SHA256 签名(SEC-ID-001) |
| 进程隔离 | 技能代码在独立进程中运行,超时自动 terminate → kill 升级 |
| 元认知门控 | 任务执行前必须声明能力等级,不足则拒绝启动 |
| Skeptic 自审 | AI 声明经自动化质疑机制验证,带置信度评分 |
| 数据真实性 | 任何 UI 字段必须回答"数据来源"和"谁更新它" |
三、各层详解
Layer 1: Pre-commit 安全钩子
| 钩子 | 作用 |
|---|---|
| bandit | 安全 linter,扫描 lingflow/ |
| check-eval-usage | 检测不安全的 eval() 调用 |
| check-os-system | 检测 os.system() 调用,建议用 subprocess.run() |
| check-added-large-files | 限制文件大小 500KB |
| debug-statements | 捕获残留的 pdb/breakpoint |
Layer 2: AST 安全分析器
基于 Python AST 的静态代码分析,执行前扫描:
| 检查项 | 严重级别 |
|---|---|
| 非白名单导入 | CRITICAL |
| 危险内置函数(eval/exec/compile/open/import) | CRITICAL |
| 危险模块访问(os.system/subprocess/socket/pickle) | CRITICAL |
| 危险属性(dict/class/globals/code) | HIGH |
| while True 循环 | HIGH |
| f-string 代码注入 | CRITICAL |
| 字符串拼接绕过尝试 | HIGH |
| 裸 except 子句 | MEDIUM |
Layer 3: Guardrail 防护栏
AGCEF 七步验证协议:
- 语法检查 — AST 解析、缩进、行长度
- 策略匹配 — 硬编码密码/密钥、SQL 注入、XSS、弱加密、调试信息
- 语义检查 — 裸 except、exec/eval、缺失 docstring
- 风险评估 — 加权评分(策略40%、语义30%、风险20%、语法10%)
- 合规检查
- 部署门控 — ≥80 自动通过,50-80 人工审查,<50 拒绝
- 审计记录
Layer 4: SkillSandbox 沙箱
进程级隔离执行环境:
- 进程隔离:
multiprocessing.Process独立进程 - 超时: 默认 30s,可配置
- 内存限制: 默认 100MB
- 递归深度: 最大 100 层
- 循环迭代: 最大 1,000,000 次
- 超时处理: terminate → kill 升级策略
模块白名单(四层):
| 层级 | 允许的模块 |
|---|---|
| SAFE_CORE | typing, dataclasses, datetime, math, json, collections, functools, itertools, hashlib, re, csv |
| SAFE_IO | pathlib, os.path, json, yaml, importlib |
| SAFE_RUNTIME | logging, asyncio, threading, queue |
| SAFE_LINGFLOW | lingflow.trust |
内置函数白名单: abs, all, any, bool, dict, enumerate, filter, float, int, isinstance, len, list, map, max, min, range, reversed, round, set, sorted, str, sum, tuple, zip(共 22 个)
Layer 5: Trust 信任框架
四级验证管道:
| 组件 | 功能 |
|---|---|
| FileContentVerifier | 文件内容验证 |
| CommandOutputVerifier | 命令输出验证 |
| DirectoryStructureVerifier | 目录结构验证 |
| GitDiffVerifier | Git 差异验证 |
| Skeptic | 自审机制——质疑 AI 声明,带置信度评分 |
| CapabilityTracker | 元认知——能力等级跟踪(MASTERED/PARTIAL/FAMILIAR/UNKNOWN) |
| FactChecker | 事实核查——防止基础设施幻觉 |
Layer 6: 审计日志
| 事件类型 | 方法 |
|---|---|
| 技能执行 | log_skill_execution() |
| 配置变更 | log_config_change() |
| 越权访问 | log_access_violation() |
| 沙箱违规 | log_sandbox_violation() |
| 权限拒绝 | log_permission_denied() |
日志轮转: 10MB/文件,保留 5 份备份。
Layer 7: 铁律
六条不可变执行规则 + 一条元铁律:
| # | 铁律 | 说明 |
|---|---|---|
| 1 | 先验证再断言 | 没有验证就说等于撒谎 |
| 2 | 客户需求是根节点 | 偏离 = 零容忍 |
| 3 | 遗忘前做反事实推理 | 基于拓扑,非时间 |
| 4 | 先学现成方案 | 不要重新发明轮子 |
| 5 | 生态智慧 | 知道兄弟们有什么工具 |
| 6 | 充分理解再动手 | 急躁 = 浪费 |
元铁律: 先确认再行动。
违规记录存入 lingflow/trust/violations/,含根因分析。
Layer 8: 宪章
五条宪章原则,约束所有灵族成员行为:
- 自觉: 知道自己知道什么、不知道什么
- 自决: 看到问题就行动,但不是越权
- 进化: 每个 bug 指向一个防御缺口
- 共生: 通过显式协议协作
- 绚烂: 统一的宪法,不统一的思想
四、安全基线(9 项)
| ID | 类别 | 规则 |
|---|---|---|
| SEC-ID-001 | 身份认证 | HMAC-SHA256 跨 agent 签名 |
| SEC-CMD-001 | 命令执行 | 白名单制,非黑名单 |
| SEC-CRED-001 | 凭据管理 | chmod 600 + 环境变量 |
| SEC-AUTH-001 | 网络认证 | API Key + CORS |
| SEC-MCP-001 | MCP 工具安全 | LOW→CRITICAL 风险分级 |
| SEC-CFG-001 | 配置隔离 | 爆炸半径控制 |
| SEC-EXEC-001 | 执行惯性 | 硬中断 + 重启循环检测 |
| SEC-DATA-001 | 数据完整性 | 已验证的数据必须真正被验证 |
| SEC-MON-001 | 监控 | 审计日志 + 异常检测 |
五、已知风险与待改进项
基于 v3.3.0+ 深度审计:
| 优先级 | 问题 | 状态 |
|---|---|---|
| P0 | 沙箱 exec() 逃逸风险 |
需加固 |
| P0 | conditional-branch 双重 eval() |
需移除 |
| P1 | SAFE_BUILTINS 嵌套字典结构错误 | 需修复 |
| P1 | 测试代码中的 SQL 注入示例 | 需标记 |
| P1 | 危险模式的字符串匹配绕过 | 改用 AST |
| P1 | 序列化测试中的 pickle.dumps | 改用 JSON |
| P2 | subprocess.run 参数验证 | 需白名单 |
| P2 | 超时时进程树未完全终止 | 需用进程组 |
| P2 | YAML 配置缺少类型验证 | 需加 schema |
缺失措施: 依赖扫描、密钥管理、输入验证增强。
已完成的跨 Agent 安全改进 (2026-04-13)
以下改进由灵通主导,覆盖 LingFlow 和 LingFlow_plus:
429 限流策略加固
| 改进 | 说明 |
|---|---|
_RetryDecision 数据类 |
统一 call() 和 call_stream() 的重试决策逻辑 |
_handle_retryable_error() |
共享错误分派器,消除 200+ 行重复代码 |
status_code 属性检查 |
_is_rate_limit_error() / _is_quota_error() / _is_auth_error() 现在检查异常的 status_code 属性,不再仅依赖错误消息字符串 |
_extract_error_body() |
统一从异常中提取错误体(支持 dict / str / None) |
| 诊断日志 | 429 分类路径添加 logging,便于运行时验证 |
死代码清理
| 删除文件 | 原因 |
|---|---|
lingflow_plus/glm_retry.py |
从未被生产代码导入,llm_client.py 有自有的内联重试逻辑 |
lingflow/utils/rate_limiter.py |
从未被 LingFlow 任何模块导入,constraints.py 有实际使用的 RateLimiter |
| 5 个孤立测试文件 | 对应已删除模块的测试 |
TokenEstimator 集成
| 文件 | 改动 |
|---|---|
lingflow_plus/coordinator.py |
_estimate_tokens 改用 TokenEstimator.count_tokens()(tiktoken cl100k_base) |
lingflow_plus/scheduler.py |
_post_dispatch 的 token 消耗记录改用 TokenEstimator 替代 len(text) * 4 |
原 len(text) * 4 启发式估算偏差大(单字符文本如 "a" * 100 估算 400 tokens,实际 ~13 tokens)。tiktoken 提供更精确的计数。
任务级错误隔离
| 文件 | 改动 |
|---|---|
lingflow/coordination/coordinator.py |
_execute_one_task() 添加 try/except,防止 agent 异常穿透 asyncio.gather |
lingflow/coordination/coordinator.py |
_process_task_results() 将裸异常转为 TaskResult(success=False),不再静默丢弃 |
修复前:单个 agent 异常会导致 orchestrator 的 while 循环条件 len(completed) + len(failed) < len(tasks) 永远无法满足,造成挂起。
六、相关文档
| 文档 | 路径 |
|---|---|
| 安全策略 | SECURITY.md |
| 沙箱实现 | lingflow/common/sandbox.py |
| AST 安全分析器 | lingflow/common/security_analyzer.py |
| 防护栏 | lingflow/guardrail/__init__.py |
| 信任框架 | lingflow/trust/verifier.py |
| 元认知 | lingflow/trust/metacognition.py |
| 事实核查 | lingflow/trust/fact_checker.py |
| 违规记录器 | lingflow/trust/violation_recorder.py |
| 审计日志 | lingflow/common/audit_logger.py |
| 铁律 | docs/IRON_LAWS.md |
| 宪章 | docs/CHARTER.md |
| 安全审计报告 | docs/SECURITY_AUDIT_REPORT.md |
| 深度审计报告 | docs/reports/audits/SECURITY_AUDIT_REPORT.md |