ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

OmniRoute 安全策略完全解读:漏洞响应流程、多层防御架构与生产加固实践

OmniRoute 安全策略完全解读:漏洞响应流程、多层防御架构与生产加固实践 OmniRoute 安全策略完全解读漏洞响应流程、多层防御架构与生产加固实践【免费下载链接】OmniRouteNever stop coding. Free MIT AI gateway: one endpoint, 352 providers (150 free), 1200 models Kimi, Claude, GPT, Gemini, GLM, DeepSeek, MiniMax. Works with Claude Code, Codex, Cursor, OpenCode, Cline Copilot. Quota-aware auto-fallback, RTKCaveman compression saves 15-95% tokens, MCP/A2A, Desktop/PWA. Built by 550 contributors项目地址: https://gitcode.com/GitHub_Trending/om/OmniRoute本文以仓库根目录 SECURITY.md 及其 i18n 多语言版本如 docs/i18n/ko/SECURITY.md为骨架结合src/lib/db/encryption.ts、src/lib/guardrails/等源码实现系统拆解 OmniRoute 这款免费 MIT 协议的 AI 网关的安全模型从漏洞披露机制、支持版本策略到认证授权、静态加密、提示注入防护、PII 脱敏、网络安全、弹性可用性、合规审计再到 Docker 部署与供应链安全。读完你将掌握 OmniRoute 的完整安全架构能够按官方规范配置生产级密钥、启用各项防护开关并理解每道防线背后的代码级原理。一、漏洞报告与响应负责任披露流程OmniRoute 采用**负责任披露Responsible Disclosure**机制安全研究人员发现漏洞时须遵循以下流程严禁在公开 GitHub Issue 中提交漏洞避免 0-day 信息过早泄露给攻击者通过GitHub Security Advisories渠道提交项目方为 diegosouzapw/OmniRoute 的 advisories 新建入口报告中须完整包含三要素漏洞描述description、复现步骤reproduction steps、潜在影响potential impact。作为对照docs/security/SUPPLY_CHAIN.md 等文档进一步阐述了项目在供应链与依赖层面如何配合该披露机制进行自查。官方给出的响应时间线承诺如下阶段目标时间确认收到Acknowledgment48 小时分类与评估Triage Assessment5 个工作日补丁发布Patch Release严重级别14 个工作日支持版本策略仓库根 SECURITY.md 明确定义了版本支持矩阵i18n 翻译版可能滞后以根文档为准版本支持状态3.8.x✅ 积极维护Active3.7.x✅ 仅安全修复Security 3.7.0❌ 不再支持Unsupported这意味着低于 3.7.0 的部署不会收到安全补丁生产环境应始终运行受支持版本。二、多层安全架构总览请求生命周期中的每道防线OmniRoute 将安全能力组织为一条深度防御管线根文档给出的示意如下Request → CORS → Authz pipeline (classify → policies → enforce) → Guardrails (PII masker, prompt injection, vision bridge) → Rate Limiter → Circuit Breaker → Cooldown → Model Lockout → Provider从请求进入网关到最终到达上游 Provider依次经过CORS跨域来源校验决定哪些 Web 客户端允许调用Authz pipeline路由分类PUBLIC / CLIENT_API / MANAGEMENT→ 策略匹配 → 强制执行的授权管线详见 docs/architecture/AUTHZ_GUIDE.mdGuardrails 框架PII 脱敏、提示注入检测、视觉/音频/视频桥接等热插拔防护件见下文第五节Rate Limiter按 Provider 限流Circuit Breaker三态熔断器阻断故障上游的级联失败Cooldown / Model Lockout冷却期与模型锁定防止短时间内反复重试同一故障目标。该弹性防线熔断、冷却、锁定的完整设计见 docs/architecture/RESILIENCE_GUIDE.md。三、认证与授权体系根文档的认证授权能力矩阵如下特性实现方式Dashboard 登录基于密码的认证签发 JWT 令牌存放于 HttpOnly CookieAPI Key 认证HMAC 签名密钥带 CRC 校验OAuth 2.0 PKCEProvider 浏览器/设备 OAuthClaude、Codex、Gemini、Cursor 等支持 PKCE 的端点优先使用Devin 凭据为仅导入模式Token 刷新OAuth 令牌过期前自动刷新安全 CookieAUTH_COOKIE_SECUREtrue面向 HTTPS 环境Authz Pipeline路由分类 PUBLIC / CLIENT_API / MANAGEMENT见 docs/architecture/AUTHZ_GUIDE.mdRoute Guard Tiers管理路由的三层模型LOCAL_ONLY / ALWAYS_PROTECTED / MANAGEMENT见 docs/security/ROUTE_GUARD_TIERS.mdManage-Scope MCP远程/api/mcp/*访问需携带manage作用域的 API Key/api/cli-tools/runtime/*保持严格 loopbackMCP Scopes32 个细粒度作用域read:health、write:combos、execute:completions等见 docs/frameworks/MCP-SERVER.md设计要点为什么是分层授权从源码结构看OmniRoute 将「登录态Dashboard JWT」与「机器对机器API Key」两类身份分开治理JWT 面向浏览器 UI通过 HttpOnly Cookie 降低 XSS 窃取令牌的风险API Key 面向 Claude Code、Codex、Cursor 等外部客户端采用 HMAC 签名 CRC 校验既能防篡改也能快速识别无效密钥。MCP 工具调用则通过 32 个作用域做最小权限拆分避免一个密钥拥有全部工具权限。四、静态数据加密AES-256-GCM scrypt 的字段级加密4.1 加密模型与存储格式OmniRoute 对 SQLite 中存储的所有敏感凭据进行字段级加密覆盖API keys、access tokens、refresh tokens、ID tokens。算法组合为AES-256-GCM认证加密AEAD密文自带完整性校验防篡改scrypt基于口令的密钥派生KDF抗 GPU 暴力破解。版本化密文格式为enc:v1:iv:ciphertext:authTag其中 iv 为 16 字节随机初始化向量hex 编码authTag 为 16 字节完整 GCM 认证标签。关键实现细节GCM 认证标签长度被固定钉死为 16 字节并在createDecipheriv时显式传入authTagLength。这从源码层面封堵了 GCM 标签截断伪造向量对应 Semgrep 规则gcm-no-tag-length见 src/lib/db/encryption.ts。4.2 密钥派生与版本演进从 src/lib/db/encryption.ts 的注释与实现可以看出项目在 v3.7.9 经历了重要的密钥派生变更主密钥Primary使用静态盐omniroute-field-encryption-v1通过scryptSync派生旧密钥Legacy曾使用动态盐sha256(secret)的前 16 字节派生。早期两套派生并行导致健康检查路径与主 API 路径推导出不同密钥引发「持续解密失败、循环重加密、CPU 飙升」等级联问题。修复后静态盐成为唯一主派生方式解密失败时自动回退尝试旧密钥并对旧密文执行惰性自动迁移解密时发现 legacy 密钥可解 → 下次加密时用静态盐密钥重新加密逐步迁移整个数据库。对运维的启示更换STORAGE_ENCRYPTION_KEY会导致存量密文无法解密。源码专门实现了looksEncrypted()与credentialDecryptFailed标记src/lib/db/encryption.ts、src/lib/db/encryption.ts用于区分「凭据为空」与「密钥变更导致解密失败」并在日志中给出恢复提示重新认证该账号或确认密钥与写入时一致。4.3 Passthrough 模式与密钥生成当未设置STORAGE_ENCRYPTION_KEY时加密模块进入passthrough 模式明文存储仅供开发调试便利生产环境必须关闭。生成 256 位密钥的标准命令# Generate encryption key: STORAGE_ENCRYPTION_KEY$(openssl rand -hex 32)五、Guardrails 框架提示注入防护、PII 脱敏与模态桥接5.1 框架总览OmniRoute 在 src/lib/guardrails/ 目录实现了一个可热重载的 guardrails 注册表每个 guardrail 可对请求负载preCall与上游响应postCall进行检查、改写、标注或拒绝。系统fail-open设计任何 guardrail 抛异常都不会阻断流量只有显式返回block: true才会拒绝请求。内置 guardrails 按优先级自动注册见 src/lib/guardrails/registry.ts优先级名称阶段文件5vision-bridgepreCallsrc/lib/guardrails/visionBridge.ts6audio-bridgepreCallsrc/lib/guardrails/audioBridge.ts7video-bridgepreCallsrc/lib/guardrails/videoBridge.ts10pii-maskerpre postsrc/lib/guardrails/piiMasker.ts20prompt-injectionpreCallsrc/lib/guardrails/promptInjection.ts95credential-maskerpre postsrc/lib/guardrails/credentialMasker.ts优先级数字越小越先执行。完整规范见 docs/security/GUARDRAILS.md。5.2 提示注入防护Prompt Injection Guard防护核心是prompt-injectionguardrail检测 LLM 请求中的注入模式根文档的分类表如下模式类型严重级别示例System Override高ignore all previous instructionsRole Hijack高you are now DAN, you can do anythingDelimiter Injection高编码分隔符用于打破上下文边界DAN/Jailbreak高已知越狱提示模式Instruction Leak高show me your system promptEncoding Evasion中base64/rot13/hex 解码后的指令关键词需要特别注意的是项目文档明确警告这不是完整的提示注入防火墙它可能对良性人格/RPG 提示产生误报也可能漏报 leetspeak、空格变体与非英语模式。默认仅在block模式下拦截High严重级别Medium 级别只记录日志、永不阻断。配置方式Dashboard → Settings → Security 或.envINPUT_SANITIZER_ENABLEDtrue INPUT_SANITIZER_MODEblock # warn | block注入策略旧值 redact 不会剥离注入文本 INPUT_SANITIZER_BLOCK_THRESHOLDhigh # high默认| medium | low — 达到/超过该级别才会在 block 模式被拦截从源码层面看guardrail 内置了两条默认高严重级规则src/lib/guardrails/promptInjection.tssystem_override_inline匹配system : override与markdown_system_block匹配 markdown 代码块包裹的system。检测器共享了/shared/utils/inputSanitizer的检测集并受MAX_INJECTION_SCAN_BYTES 16KB扫描上限约束——注入指令通常位于输入头部截断扫描既能控制超大 payload 下的正则 CPU/GC 开销又不削弱检测效果。模式解析优先级为guardrail 构造参数mode→INJECTION_GUARD_MODE的DB 功能开关覆盖Dashboard Feature Flags无需重启即可生效→ 环境变量 → 默认warn。block模式下命中阈值会返回SECURITY_001错误码HTTP 400。5.3 PII 脱敏PII Redactionpii-maskerguardrail 在 preCall请求出站前与 postCall响应回传前双阶段运行自动检测并可选脱敏个人身份信息PII 类型模式替换值Emailuserdomain.com[EMAIL_REDACTED]CPF巴西123.456.789-00[CPF_REDACTED]CNPJ巴西12.345.678/0001-00[CNPJ_REDACTED]信用卡4111-1111-1111-1111[CC_REDACTED]手机号55 11 99999-9999[PHONE_REDACTED]SSN美国123-45-6789[SSN_REDACTED]PII_REDACTION_ENABLEDtrue # 请求 PII 重写与 INPUT_SANITIZER_MODE 相互独立 PII_RESPONSE_SANITIZATIONtrue # 可选对返回客户端的 Provider 响应中的 PII 脱敏关键语义PII_REDACTION_ENABLED仅控制 PII 脱敏与提示注入策略INPUT_SANITIZER_MODE完全独立旧版redact模式并不会剥离注入文本。此外credential-masker优先级 95还负责对出站负载与上游响应中的 API Key / 密钥令牌模式进行脱敏防止粘贴进提示词中的凭据泄漏给上游 Provider 或回流客户端——该 guardrail 为显式 opt-in需设置CREDENTIAL_REDACTION_ENABLEDtrue才启用。5.4 模态桥接Vision/Audio/Video Bridgevision-bridge能把发给非视觉模型的图片请求透明改造为文本描述或重路由到视觉模型同时内置了图片 URL 的SSRF 防护audio-bridge与video-bridge同理处理音频与视频模态。这部分配置modalityBridge*系列键走 DB 持久化设置而非环境变量详见 docs/security/GUARDRAILS.md 与 docs/frameworks/PLAYGROUND_STUDIO.md。5.5 自定义 Guardrail 与按请求豁免任何场景可继承BaseGuardrail注册自定义防护件注册表按规范化名称去重并按优先级重排src/lib/guardrails/registry.ts。按请求豁免可通过x-omniroute-disabled-guardrails请求头或 API Key 的disabledGuardrails字段、请求体metadata.disabledGuardrails实现豁免名单支持数组或逗号分隔字符串名称统一规范化为 kebab-case。六、网络安全层特性说明CORS显式跨域白名单CORS_ALLOWED_ORIGINS兼容旧变量CORS_ORIGIN默认*IP FilteringDashboard 中配置 IP 段白名单/黑名单Rate Limiting按 Provider 限流配合自动退避Anti-Thundering Herd反惊群Mutex 每连接锁防止级联 502TLS Fingerprint浏览器级 TLS 指纹伪装降低机器人检测概率法律/伦理注意事项见 docs/security/STEALTH_GUIDE.mdCLI Fingerprint按 Provider 定制 header/body 顺序匹配原生 CLI 签名特征其中反惊群机制与熔断器共同构成弹性防线当某个上游 Provider 出现故障时网关不会让所有并发请求同时砸向故障点而是通过互斥锁让第一个请求探测其余请求等待或快速失败避免雪崩。七、弹性与可用性特性说明Circuit Breaker三态熔断器Closed → Open → Half-Open按 Provider 隔离状态持久化到 SQLiteRequest Idempotency5 秒去重窗口丢弃重复请求Exponential Backoff自动重试延迟指数递增Health DashboardProvider 实时健康监控熔断器状态持久化意味着进程重启后依然记得各上游的健康状态不会因重启而瞬间放行已知故障 Provider。结合上文的 Cooldown 与 Model Lockout形成「熔断 → 冷却 → 锁定」的三级保护详细设计见 docs/architecture/RESILIENCE_GUIDE.md。八、合规与审计特性说明日志保留超过CALL_LOG_RETENTION_DAYS自动清理调用日志No-Log 选择退出每个 API Key 可设noLog标志完全禁用该密钥的请求日志审计日志管理操作记录在audit_log表MCP 审计所有 MCP 工具调用通过 SQLite 审计Zod 校验所有 API 输入在模块加载时经 Zod v4 schema 校验src/shared/validation/schemas.ts日志保留策略、noLog与审计表的详细说明见 docs/security/COMPLIANCE.md。Zod 校验的价值在于模块加载期即拦截畸形输入将数据合法性检查前置到路由执行之前。九、必需环境变量Fail-Fast 启动策略所有密钥必须在服务启动前配置完成。服务器采用fail-fast策略缺失或弱口令直接拒绝启动。# REQUIRED — server will not start without these: JWT_SECRET$(openssl rand -base64 48) # min 32 chars API_KEY_SECRET$(openssl rand -hex 32) # min 16 chars # RECOMMENDED — enables encryption at rest: STORAGE_ENCRYPTION_KEY$(openssl rand -hex 32)JWT_SECRETDashboard 登录会话的 JWT 签名密钥最短 32 字符API_KEY_SECRETAPI Key 的 HMAC 签名与 CRC 校验密钥最短 16 字符STORAGE_ENCRYPTION_KEY静态加密主密钥建议 32 字节随机值见第四节。服务器会主动拒绝已知弱值如changeme、secret、password。完整环境变量参考见 docs/reference/ENVIRONMENT.md模板见 .env.example。十、Docker 生产部署安全基线根文档给出生产容器化部署的硬性要求生产环境使用非 root 用户运行密钥以只读卷挂载严禁将.env文件复制进 Docker 镜像使用.dockerignore排除敏感文件处于 HTTPS 反向代理之后时设置AUTH_COOKIE_SECUREtrue。官方推荐的加固启动命令docker run -d \ --name omniroute \ --restart unless-stopped \ --read-only \ -p 20128:20128 \ -v omniroute-data:/app/data \ -e JWT_SECRET$(openssl rand -base64 48) \ -e API_KEY_SECRET$(openssl rand -hex 32) \ -e STORAGE_ENCRYPTION_KEY$(openssl rand -hex 32) \ diegosouzapw/omniroute:latest其中--read-only将容器根文件系统设为只读配合独立数据卷omniroute-data:/app/data实现「代码不可写、数据隔离」的最小攻击面。实际部署时可参照 docker-compose.yml 与 contrib/vps/compose.yaml 调整。十一、依赖与供应链安全根文档的依赖安全要求包括定期执行npm audit项目脚本npm run audit:deps同时覆盖主包与 electron 包保持依赖持续更新使用huskylint-staged做 pre-commit 检查lint-staged check-docs-sync check:any-budget:t11CI 流水线在每次 push 时运行 ESLint 安全规则no-eval、no-implied-eval、no-new-func设为 errorProvider 常量在模块加载时经 Zod 校验默认采用安全优先库dompurify/isomorphic-dompurify防 XSS、joseJWT、better-sqlite3参数化查询无 SQLi 风险、bcryptjs密码哈希。供应链扫描发现与最小化构建根文档还公开披露了供应链扫描器Socket.dev / Snyk 等的一个特殊发现发布的omniroutenpm 产物打包了 Next.jsoutput: standalone构建所有路由处理器包括 MITM、Zed import、Cloud Sync、嵌入式服务监管等特权功能都会进入.next/server/*.js压缩 chunk启发式扫描器常将其与恶意软件签名误匹配。仓库通过根目录 socket.yml 显式排除tests/、docs/等未发布目录确保扫描只针对真实交付给用户的代码路径并逐项维护维护者证明文档 docs/security/SOCKET_DEV_FINDINGS.md含源文件 ↔ 被标记 chunk ↔ 行为 ↔ 缓解措施映射。无法放松告警的管道可采用最小化构建OMNIROUTE_BUILD_PROFILEminimal npm run build将四个敏感模块替换为运行时返回 HTTP 503feature-disabled的 stub使特权代码路径物理上不出现在产物中。十二、硬性安全规则Hard Security Rules根文档列出由工具链与评审强制执行的 11 条硬性规则是贡献者与自托管运维都应当知晓的红线绝不提交密钥——.env已 gitignore.env.example仅为无字面量的模板见 docs/security/PUBLIC_CREDS.md绝不在代码中使用eval()、new Function()或隐式 eval——ESLint 强制未获运维明确批准不得绕过 Husky 钩子--no-verify、--no-gpg-sign路由中禁止裸写 SQL——一律经 src/lib/db/ 参数化访问所有输入必须经 Zod 校验上游 header 必须净化——黑名单位于 src/shared/constants/upstreamHeaders.ts凭据静态加密——AES-256-GCM见 src/lib/db/encryption.ts公开上游 OAuth 标识符必须经resolvePublicCred()解析源码中严禁内嵌AIza…/GOCSPX-…等字面量错误响应必须经buildErrorBody()/sanitizeErrorMessage()——严禁将原始err.stack/err.message泄露进 HTTP / SSE / executor / MCP 响应体见 docs/security/ERROR_SANITIZATION.mdexec()/spawn()的运行时值必须经env选项传入严禁字符串拼接外部路径或不信任值进 shell 脚本优先使用安全默认库Helmet.js、DOMPurify、ssrf-req-filter、safe-regex、Google Tink不要重复造轮子。对 Agent 与 AI 工具的约束还可见于 CLAUDE.md。若需通过 git clone 获取仓库进行安全审计可使用git clone https://gitcode.com/GitHub_Trending/om/OmniRoute。十三、安全相关文档地图主题文档授权管线docs/architecture/AUTHZ_GUIDE.mdGuardrails 框架docs/security/GUARDRAILS.md审计日志与保留docs/security/COMPLIANCE.md公开上游凭据模式docs/security/PUBLIC_CREDS.md错误响应净化docs/security/ERROR_SANITIZATION.md供应链扫描证明docs/security/SOCKET_DEV_FINDINGS.md熔断器 冷却 锁定docs/architecture/RESILIENCE_GUIDE.mdTLS 指纹法律/伦理声明docs/security/STEALTH_GUIDE.mdMCP 作用域模型docs/frameworks/MCP-SERVER.md路由守卫分层docs/security/ROUTE_GUARD_TIERS.md环境变量全量参考docs/reference/ENVIRONMENT.md总结OmniRoute 的安全体系可以概括为四个层次的纵深防御入口层CORS Authz pipeline Route Guard Tiers 路由分类、内容层guardrails 框架对请求/响应的注入检测、PII 脱敏、凭据掩蔽与模态桥接、凭据层HMAC API Key、OAuth 2.0 PKCE、AES-256-GCM 静态加密 scrypt 密钥派生、运行层限流、三态熔断、反惊群、冷却锁定、审计日志与 Zod 输入校验。对自托管用户而言最关键的三个动作是启动前生成并妥善保管JWT_SECRET、API_KEY_SECRET、STORAGE_ENCRYPTION_KEY三个密钥按需要开启INPUT_SANITIZER_MODEblock与PII_REDACTION_ENABLEDtrue生产部署遵循非 root、只读容器、密钥只读挂载的 Docker 基线。【免费下载链接】OmniRouteNever stop coding. Free MIT AI gateway: one endpoint, 352 providers (150 free), 1200 models Kimi, Claude, GPT, Gemini, GLM, DeepSeek, MiniMax. Works with Claude Code, Codex, Cursor, OpenCode, Cline Copilot. Quota-aware auto-fallback, RTKCaveman compression saves 15-95% tokens, MCP/A2A, Desktop/PWA. Built by 550 contributors项目地址: https://gitcode.com/GitHub_Trending/om/OmniRoute创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表