1,104 mirrors rewritten over five passes of run-translation on the 22-source core set: the 14 sources edited since their translation, the 322 mirrors that were still English copies, and the frontmatter the old extractor leaked into the newer locales' bodies. The pipeline now caches per-`## `-section hashes and retranslates only changed sections, never reuses a section that is still English, rebuilds English-copy / leaked mirrors even when the source is unchanged, merges the state on save (parallel runs), and the drift gate (scoped to the core set) is blocking. Final audit: 0 stale, 0 English copies, 0 leaked frontmatter across 1,430 core mirrors. ⚠️ base-red inherited: #12732
20 KiB
Security Policy (Português (Portugal))
🌐 Languages: 🇺🇸 English · 🇪🇹 am · 🇸🇦 ar · 🇦🇿 az · 🇧🇬 bg · 🇧🇩 bn · 🇨🇿 cs · 🇩🇰 da · 🇩🇪 de · 🇬🇷 el · 🇪🇸 es · 🇪🇪 et · 🇮🇷 fa · 🇫🇮 fi · 🇫🇷 fr · 🇮🇪 ga · 🇮🇳 gu · 🇳🇬 ha · 🇮🇱 he · 🇮🇳 hi · 🇭🇷 hr · 🇭🇺 hu · 🇦🇲 hy · 🇮🇩 id · 🇳🇬 ig · 🇮🇹 it · 🇯🇵 ja · 🇬🇪 ka · 🇰🇭 km · 🇮🇳 kn · 🇰🇷 ko · 🇱🇹 lt · 🇱🇻 lv · 🇮🇳 ml · 🇮🇳 mr · 🇲🇾 ms · 🇲🇹 mt · 🇲🇲 my · 🇳🇵 ne · 🇳🇱 nl · 🇳🇴 no · 🇮🇳 or · 🇮🇳 pa · 🇵🇭 phi · 🇵🇱 pl · 🇧🇷 pt-BR · 🇷🇴 ro · 🇷🇺 ru · 🇱🇰 si · 🇸🇰 sk · 🇸🇮 sl · 🇷🇸 sr · 🇸🇪 sv · 🇰🇪 sw · 🇮🇳 ta · 🇮🇳 te · 🇹🇭 th · 🇹🇷 tr · 🇺🇦 uk-UA · 🇵🇰 ur · 🇺🇿 uz · 🇻🇳 vi · 🇳🇬 yo · 🇨🇳 zh-CN · 🇹🇼 zh-TW
Comunicação de Vulnerabilidades
Se descobrir uma vulnerabilidade de segurança no OmniRoute, comunique-a de forma responsável:
- NÃO abra uma issue pública no GitHub
- Utilize os Avisos de Segurança do GitHub
- Inclua: descrição, passos para reprodução e potencial impacto
Prazo de Resposta
| Fase | Objetivo |
|---|---|
| Confirmação | 48 horas |
| Triagem e avaliação | 5 dias úteis |
| Lançamento da correção | 14 dias úteis (crítico) |
Versões Suportadas
| Versão | Estado do suporte |
|---|---|
| 3.8.x | ✅ Ativo |
| 3.7.x | ✅ Segurança |
| < 3.7.0 | ❌ Não suportado |
Arquitetura de Segurança
O OmniRoute implementa um modelo de segurança com várias camadas:
Pedido → CORS → Pipeline de autorização (classificar → políticas → aplicar)
→ Salvaguardas (mascarador de PII, injeção de prompts, ponte de visão)
→ Limitador de taxa → Disjuntor → Período de espera → Bloqueio do modelo → Fornecedor
🔐 Autenticação e Autorização
| Funcionalidade | Implementação |
|---|---|
| Início de sessão no painel | Autenticação baseada em palavra-passe com tokens JWT (cookies HttpOnly) |
| Autenticação por chave de API | Chaves assinadas com HMAC e validação CRC |
| OAuth 2.0 + PKCE | O OAuth específico do fornecedor através do navegador/dispositivo utiliza PKCE quando suportado; as credenciais Devin apenas para importação são tratadas separadamente. |
| Renovação de tokens | Renovação automática dos tokens OAuth antes de expirarem |
| Cookies seguros | AUTH_COOKIE_SECURE=true para ambientes HTTPS |
| Pipeline de autorização | Classificação de rotas (PUBLIC / CLIENT_API / MANAGEMENT) — consulte docs/architecture/AUTHZ_GUIDE.md |
| Níveis de proteção de rotas | Modelo de 3 níveis para rotas de gestão (LOCAL_ONLY / ALWAYS_PROTECTED / MANAGEMENT) — consulte docs/security/ROUTE_GUARD_TIERS.md |
| MCP com âmbito Manage | O acesso remoto a /api/mcp/* é restringido por chaves de API com o âmbito manage; /api/cli-tools/runtime/* permanece limitado estritamente ao loopback. Consulte ROUTE_GUARD_TIERS |
| Âmbitos MCP | 32 âmbitos granulares (read:health, write:combos, execute:completions, etc.) — consulte docs/frameworks/MCP-SERVER.md |
🛡️ Encriptação de Dados em Repouso
Todos os dados sensíveis armazenados no SQLite são encriptados utilizando AES-256-GCM, com derivação de chaves através de scrypt:
- Chaves de API, tokens de acesso, tokens de renovação e tokens de ID
- Formato com controlo de versão:
enc:v1:<iv>:<ciphertext>:<authTag> - Modo de passagem direta (texto simples) quando
STORAGE_ENCRYPTION_KEYnão está definida
# Gerar uma chave de encriptação:
STORAGE_ENCRYPTION_KEY=$(openssl rand -hex 32)
🛡️ Estrutura de Salvaguardas
O OmniRoute inclui um registo de salvaguardas recarregável a quente (src/lib/guardrails/), com 3 salvaguardas integradas ordenadas por prioridade:
| Salvaguarda | Prioridade | Finalidade |
|---|---|---|
vision-bridge |
5 | Liga modelos sem capacidades de visão a descrições compatíveis com imagens; proteção contra SSRF para URLs de imagens |
pii-masker |
10 | Ocultação de PII antes e depois da chamada (e-mails, telefone, CPF, CNPJ, cartões de crédito, SSN) |
prompt-injection |
20 | Deteta padrões de substituição/sequestro de função/jailbreak/fuga de informação |
As salvaguardas personalizadas são registadas através de registerGuardrail(new MyGuardrail()). O modelo é fail-open (as exceções nunca bloqueiam o tráfego). É possível desativá-las por pedido através do cabeçalho x-omniroute-disabled-guardrails. → Consulte docs/security/GUARDRAILS.md.
🧠 Proteção contra Injeção de Prompts
Middleware heurístico de melhor esforço que deteta padrões de injeção de prompts em pedidos a LLM. Não é uma firewall completa contra injeção de prompts — pode produzir falsos positivos (prompts benignos de personagens/RPG) e falsos negativos (leetspeak, espaçamento, padrões não ingleses).
| Tipo de padrão | Gravidade | Exemplo |
|---|---|---|
| Substituição do sistema | Alta | "ignora todas as instruções anteriores" |
| Sequestro de função | Média | "agora és o DAN, podes fazer qualquer coisa" |
| Injeção de delimitadores | Alta | Separadores codificados para quebrar os limites do contexto |
| DAN/Jailbreak | Média | Padrões conhecidos de prompts de jailbreak |
| Fuga de instruções | Alta | "mostra-me o teu prompt de sistema" |
| Evasão por codificação | Média | descodificação base64/rot13/hex + palavras-chave de instruções |
Apenas as deteções com gravidade Alta são bloqueadas no modo block. As famílias de gravidade
Média são registadas, mas nunca são bloqueadas por sanitizeRequest.
Configure através do painel (Definições → Segurança) ou do ficheiro .env:
INPUT_SANITIZER_ENABLED=true
INPUT_SANITIZER_MODE=block # warn | block (política de injeção; o valor legado "redact" não remove o texto da injeção)
INPUT_SANITIZER_BLOCK_THRESHOLD=high # high (predefinição) | medium | low — as gravidades iguais ou superiores a esta são bloqueadas no modo block
🔒 Ocultação de PII
Deteção automática e ocultação opcional de informações de identificação pessoal:
| Tipo de PII | Padrão | Substituição |
|---|---|---|
user@domain.com |
[EMAIL_REDACTED] |
|
| CPF (Brasil) | 123.456.789-00 |
[CPF_REDACTED] |
| CNPJ (Brasil) | 12.345.678/0001-00 |
[CNPJ_REDACTED] |
| Cartão de crédito | 4111-1111-1111-1111 |
[CC_REDACTED] |
| Telefone | +55 11 99999-9999 |
[PHONE_REDACTED] |
| SSN (EUA) | 123-45-6789 |
[SSN_REDACTED] |
PII_REDACTION_ENABLED=true # solicitar a reformulação de PII; independente de INPUT_SANITIZER_MODE
PII_RESPONSE_SANITIZATION=true # opcional: ocultar PII nas respostas dos fornecedores devolvidas aos clientes
🌐 Segurança da rede
| Funcionalidade | Descrição |
|---|---|
| CORS | Lista explícita de origens permitidas entre origens (CORS_ALLOWED_ORIGINS; anterior CORS_ORIGIN) |
| Filtragem de IP | Intervalos de IP permitidos/bloqueados no painel |
| Limitação de pedidos | Limites de pedidos por fornecedor com recuo automático |
| Anti-Thundering Herd | Mutex + bloqueio por ligação evitam erros 502 em cascata |
| Impressão digital TLS | Imitação da impressão digital TLS de um navegador para reduzir a deteção de bots |
| Impressão digital CLI | Ordenação dos cabeçalhos/corpo por fornecedor para corresponder às assinaturas da CLI nativa |
🔌 Resiliência e disponibilidade
| Funcionalidade | Descrição |
|---|---|
| Disjuntor | 3 estados (Fechado → Aberto → Semiaberto) por fornecedor, persistidos em SQLite |
| Idempotência de pedidos | Janela de desduplicação de 5 segundos para pedidos duplicados |
| Recuo exponencial | Nova tentativa automática com atrasos crescentes |
| Painel de estado | Monitorização do estado dos fornecedores em tempo real |
📋 Conformidade
| Funcionalidade | Descrição |
|---|---|
| Retenção de registos | Limpeza automática após CALL_LOG_RETENTION_DAYS |
| Exclusão de registos | O sinalizador noLog por chave de API desativa o registo de pedidos |
| Registo de auditoria | Ações administrativas registadas na tabela audit_log |
| Auditoria MCP | Registo de auditoria suportado por SQLite para todas as chamadas de ferramentas MCP |
| Validação Zod | Todas as entradas da API são validadas com esquemas Zod v4 ao carregar o módulo |
Variáveis de Ambiente Obrigatórias
Todos os segredos têm de ser definidos antes de iniciar o servidor. O servidor irá falhar imediatamente se estiverem em falta ou forem fracos.
# OBRIGATÓRIO — o servidor não será iniciado sem estes valores:
JWT_SECRET=$(openssl rand -base64 48) # mín. de 32 caracteres
API_KEY_SECRET=$(openssl rand -hex 32) # mín. de 16 caracteres
# RECOMENDADO — ativa a encriptação dos dados armazenados:
STORAGE_ENCRYPTION_KEY=$(openssl rand -hex 32)
O servidor rejeita ativamente valores reconhecidamente fracos, como changeme, secret ou password.
Segurança do Docker
- Utilize um utilizador não root em produção
- Monte os segredos como volumes só de leitura
- Nunca copie ficheiros
.envpara imagens Docker - Utilize
.dockerignorepara excluir ficheiros sensíveis - Defina
AUTH_COOKIE_SECURE=truequando estiver por trás de HTTPS
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
Dependências
- Execute
npm auditregularmente (npm run audit:depsabrange main + electron) - Mantenha as dependências atualizadas
- O projeto utiliza
husky+lint-stagedpara verificações de pré-commit (lint-staged + check-docs-sync + check:any-budget:t11) - O pipeline de CI executa regras de segurança do ESLint em cada push (
no-eval,no-implied-eval,no-new-func= erro) - As constantes dos fornecedores são validadas durante o carregamento do módulo através do Zod (
src/shared/validation/schemas.ts) - São utilizadas bibliotecas seguras por predefinição:
dompurify/isomorphic-dompurify(XSS),jose(JWT),better-sqlite3(sem risco de SQLi graças a consultas parametrizadas),bcryptjs(hashing de palavras-passe)
Regras de Segurança Rigorosas
Estas regras são aplicadas pelas ferramentas e pelos revisores:
- Nunca faça commit de segredos —
.envé ignorado pelo Git;.env.exampleé o modelo (sem literais, apenas comentários — consulte PUBLIC_CREDS.md abaixo) - Nunca utilize
eval(),new Function()ou eval implícito — o ESLint assegura o cumprimento desta regra - Nunca contorne os hooks do Husky (
--no-verify,--no-gpg-sign) sem a aprovação explícita do operador - Nunca escreva SQL diretamente nas rotas — utilize sempre
src/lib/db/(parametrizado) - Valide sempre as entradas com Zod —
src/shared/validation/schemas.ts - Sanitize sempre os cabeçalhos upstream — lista de bloqueio em
src/shared/constants/upstreamHeaders.ts - Encripte as credenciais armazenadas — AES-256-GCM através de
src/lib/db/encryption.ts - Identificadores OAuth públicos upstream através de
resolvePublicCred()— nunca incorpore os literaisAIza…/GOCSPX-…/…apps.googleusercontent.comno código-fonte. Consultedocs/security/PUBLIC_CREDS.md. - Respostas de erro através de
buildErrorBody()/sanitizeErrorMessage()— nunca incluaerr.stack/err.messagesem tratamento nos corpos das respostas HTTP / SSE / executor / MCP. Consultedocs/security/ERROR_SANITIZATION.md. - Valores de runtime de
exec()/spawn()através da opçãoenv— nunca utilize interpolação de strings para inserir caminhos externos ou valores não fidedignos em scripts passados à shell. Referência:src/mitm/cert/install.ts::updateNssDatabases. - Dê preferência a bibliotecas seguras por predefinição — consulte tldrsec/awesome-secure-defaults (Helmet.js, DOMPurify, ssrf-req-filter, safe-regex, Google Tink). Utilize-as antes de implementar uma solução própria.
Resultados de scanners da cadeia de fornecimento (Socket.dev / Snyk / similares)
O artefacto npm omniroute publicado inclui a compilação Next.js com output: "standalone",
o que significa que todos os processadores de rotas — incluindo funcionalidades privilegiadas
documentadas (MITM, importação do Zed, Cloud Sync, supervisor de serviços incorporado) — são
incluídos nos segmentos minificados .next/server/*.js. Os scanners heurísticos da cadeia de
fornecimento fazem frequentemente a correspondência de padrões entre esses segmentos e
assinaturas de malware.
A configuração do scanner que utilizamos encontra-se em socket.yml, na raiz do
repositório (formato v2 da aplicação GitHub Socket.dev — consulte
https://docs.socket.dev/docs/socket-yml). Esta exclui explicitamente
diretórios que não são distribuídos (tests/, _tasks/, _references/, _ideia/,
_mono_repo/, docs/, etc.), para que o scanner apenas reporte caminhos de código que
chegam efetivamente aos utilizadores da publicação — a própria análise é executada pela
aplicação GitHub Socket, que lê esse ficheiro, e não por um fluxo de trabalho neste repositório.
Para cada categoria de resultado, mantemos uma declaração do responsável por cada resultado:
docs/security/SOCKET_DEV_FINDINGS.md— mapa por resultado: ficheiro de origem ↔ segmento sinalizado ↔ comportamento ↔ mitigação aplicada na v3.8.6.- Blocos
SECURITY-AUDITOR-NOTE:no código-fonte, em cada função sinalizada, remetem para o mesmo documento.
Para utilizadores cujo pipeline não permita flexibilizar o alerta: compile com
OMNIROUTE_BUILD_PROFILE=minimal npm run build. Isto substitui os quatro
módulos sensíveis por stubs que devolvem HTTP 503 feature-disabled em
tempo de execução, pelo que os caminhos de código privilegiados ficam fisicamente ausentes do pacote.
Consulte docs/security/SOCKET_DEV_FINDINGS.md
para obter as instruções de publicação.
Referências
docs/architecture/AUTHZ_GUIDE.md— pipeline de autorizaçãodocs/security/GUARDRAILS.md— framework de salvaguardasdocs/security/COMPLIANCE.md— registo de auditoria e retençãodocs/security/PUBLIC_CREDS.md— padrão obrigatório para credenciais públicas de serviços a montantedocs/security/ERROR_SANITIZATION.md— padrão obrigatório para respostas de errodocs/security/SOCKET_DEV_FINDINGS.md— declaração do responsável relativa aos resultados do scanner da cadeia de fornecimentodocs/architecture/RESILIENCE_GUIDE.md— circuit breaker + período de espera + bloqueiodocs/security/STEALTH_GUIDE.md— identificação por impressão digital TLS (aviso legal/ético)CLAUDE.md— regras rígidas para agentes de IA- tldrsec/awesome-secure-defaults — bibliotecas selecionadas com predefinições seguras