Files
OmniRoute/docs/i18n/pt/SECURITY.md
Diego Rodrigues de Sa e Souza b637350680 fix(docs): re-sync the 65 documentation mirror sets; section-level docs pipeline; drift gate blocking (#13940)
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
2026-09-17 02:55:31 -03:00

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:

  1. NÃO abra uma issue pública no GitHub
  2. Utilize os Avisos de Segurança do GitHub
  3. 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_KEY nã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
E-mail 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 .env para imagens Docker
  • Utilize .dockerignore para excluir ficheiros sensíveis
  • Defina AUTH_COOKIE_SECURE=true quando 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 audit regularmente (npm run audit:deps abrange main + electron)
  • Mantenha as dependências atualizadas
  • O projeto utiliza husky + lint-staged para 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:

  1. Nunca faça commit de segredos.env é ignorado pelo Git; .env.example é o modelo (sem literais, apenas comentários — consulte PUBLIC_CREDS.md abaixo)
  2. Nunca utilize eval(), new Function() ou eval implícito — o ESLint assegura o cumprimento desta regra
  3. Nunca contorne os hooks do Husky (--no-verify, --no-gpg-sign) sem a aprovação explícita do operador
  4. Nunca escreva SQL diretamente nas rotas — utilize sempre src/lib/db/ (parametrizado)
  5. Valide sempre as entradas com Zodsrc/shared/validation/schemas.ts
  6. Sanitize sempre os cabeçalhos upstream — lista de bloqueio em src/shared/constants/upstreamHeaders.ts
  7. Encripte as credenciais armazenadas — AES-256-GCM através de src/lib/db/encryption.ts
  8. Identificadores OAuth públicos upstream através de resolvePublicCred() — nunca incorpore os literais AIza… / GOCSPX-… / …apps.googleusercontent.com no código-fonte. Consulte docs/security/PUBLIC_CREDS.md.
  9. Respostas de erro através de buildErrorBody() / sanitizeErrorMessage() — nunca inclua err.stack / err.message sem tratamento nos corpos das respostas HTTP / SSE / executor / MCP. Consulte docs/security/ERROR_SANITIZATION.md.
  10. Valores de runtime de exec() / spawn() através da opção env — 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.
  11. 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