Resumo Executivo
Auditoria tecnica do sistema CargoFleet — 5 rodadas de analise completa. Realizada em 14-16 Mar 2026.
Navegue pelas secoes no menu lateral para explorar cada area em detalhe. Os numeros abaixo refletem o total consolidado de todas as rodadas.
Roteiro recomendado
132
Total de achados
5 rodadas de analise
19
Critical
Risco imediato
42
High
Alta prioridade
50
Medium
Monitorar
21
Low
Baixo risco
1. Resumo Executivo
O CargoFleet e uma plataforma SaaS multitenancy de gerenciamento de fretes, construida sobre ABP Commercial 9.0 (.NET 9), com frontend Angular 17 + Ionic 8 e infraestrutura em AWS EKS (producao) e k3s (desenvolvimento). A auditoria identificou cinco achados de severidade Critical, todos confirmados diretamente no codigo-fonte, que expõem credenciais de producao e comprometem o controle de acesso da API.
Varredura final (2026-03-14): A varredura final identificou 24 achados de infraestrutura (5 Critical, 7 High, 8 Medium, 4 Low) e 4 achados de frontend (1 High, 2 Medium, 1 Low). O achado mais grave e a presenca de senha de certificado OpenIddict e ABP License Code em arquivos docker-compose versionados (INFRA-01, INFRA-02).
Verificacao profunda (2026-03-15): A quarta rodada com 5 agentes especializados identificou 2 novos achados Critical (DefaultPassPhrase do ABP hardcoded e senha do certificado OpenIddict hardcoded em codigo C#), 14 High (falhas de seguranca mobile, handlers inativos, ausencia de auth guards no frontend, indices ausentes), 7 Medium e 6 Low. HIGH-01 reclassificado para Critical e SEC2-08 para High.
O problema mais grave e a presenca de multiplas credenciais de producao em texto plano no repositorio Git: o token permanente da Meta/WhatsApp Graph API, a senha do PostgreSQL com usuario superusuario, a senha hardcoded da integracao com o microservico CargaAdicional, e chaves Firebase em tres plataformas distintas. Combinados com a politica CORS que permite qualquer origem (AllowAnyOrigin()), esses problemas representam risco imediato de comprometimento do ambiente de producao.
Do ponto de vista arquitetural, o sistema apresenta violacoes de camada confirmaveis: FirebaseAdmin referenciado no projeto Domain, e Application.Contracts referenciando diretamente Domain (em vez de apenas Domain.Shared). Os background workers criticos (ProcessarOfertasWorker, AtualizarOfertasWorker) executam em loop quase-continuo (Timer.Period = 1ms) sem limite de concorrencia entre tenants, e o Redis de producao esta configurado com limite de memoria de 2 MB — insuficiente para qualquer carga real e suficiente para derrubar DataProtection keys e distributed locks.
A divida tecnica acumulada inclui: ausencia total de execucao de testes no CI/CD, mismatch de versao entre ABP backend (9.0.0) e ABP frontend (8.3.3), validacao de origem/destino de rotas comentada (ValidarOrigemDestino()), worker legado (RegistrarOfertasWorker) com codigo ativo mas comentado, e ausencia de indices criticos na tabela AppOfertas. O sistema nao possui HPA nem mais de uma replica para nenhum componente em producao.
A auditoria foi realizada exclusivamente sobre o codigo-fonte do repositorio. Nao houve acesso ao ambiente de producao, logs ativos ou banco de dados. Todos os achados devem ser validados com o time tecnico antes de qualquer acao.
Segunda passagem (2026-03-14): A analise aprofundada da logica de negocio revelou problemas arquiteturais adicionais de severidade critica. O mais grave e a existencia de dois workers concorrentes (RegistrarOfertasWorker e ProcessarOfertasWorker) processando as mesmas ofertas Galileu simultaneamente, com logicas distintas e endpoints diferentes na API externa — o que pode causar aceites duplicados e estados inconsistentes. Agrava a situacao o fato de que o RegistrarOfertasWorker possui uma logica de autenticacao invertida (lanca excecao quando auth e bem-sucedida), o que se estiver ativo em producao significa falha sistematica em todos seus ciclos. A segunda passagem identificou tambem senhas em texto plano circulando em eventos internos (GalileuCredentialCreatedEto com campo Senha antes da criptografia), exposicao do campo de senha criptografada em DTOs de resposta da API, injection via Dynamic LINQ no parametro sorting sem whitelist de campos, e ausencia total de [Authorize] no DeviceTokenController. No total, a segunda passagem adicionou 2 achados Critical novos, 5 High, 7 Medium e 3 Low na dimensao de seguranca, mais 14 problemas arquiteturais (P-01 a P-14) e uma dezena de gargalos de performance confirmados.
Contexto operacional confirmado pelo usuario
| Fato | Valor | Impacto na auditoria |
|---|---|---|
| Repositorio | Privado, acesso restrito a equipe de dev | Reduz urgencia de secrets expostos, mas nao elimina risco |
| Tenants ativos | 22 (meta: 150 no auge) | Workers paralelos ainda suportaveis; com 150 tenants, Redis 2MB e Task.WhenAll sem limite serao criticos |
Senha admin 1q2w3E* | Confirmada em uso em producao | CRIT-03 reclassificado para urgencia maxima — conta admin comprometida |
| Scraper | Desativado permanentemente | Codigo comentado deve ser removido do repositorio |
URL Galileu nestle-br | URL real de producao, todos os tenants usam | Multitenancy Galileu e por login/senha, nao por URL. URL hardcoded impede troca sem redeploy |
| Rotacao de secrets | Nao existe processo de rotacao | Risco acumulado — mesmos secrets desde a criacao do sistema |
Acoes por fase
Sistema em producao
| ID | Titulo | |
|---|---|---|
| CRIT-01 | Token permanente Meta/WhatsApp API hardcoded no repositorio | ver → |
| CRIT-02 | Credenciais PostgreSQL (superusuario) em texto plano em 3 arquivos | ver → |
| CRIT-03 | Senha hardcoded da integracao CargaAdicional em appsettings.json | ver → |
| CRIT-04 | CORS AllowAnyOrigin() em producao | ver → |
| CRIT-05 | Chaves Firebase expostas em tres plataformas no repositorio | ver → |
| SCALE-C1 | Redis maxmemory 2MB em producao | ver → |
| SCALE-C2 | ProcessarOfertasWorker sem limite de concorrencia entre tenants | ver → |
| P-01 | Dois workers concorrentes processando as mesmas ofertas (RACE CONDITION SISTEMICA) | ver → |
2. Stack Identificada
| Componente | Tecnologia | Versao | Evidencia |
|---|---|---|---|
| Runtime backend | .NET | 9.0 | cargo_fleet.Domain.csproj linha 6 |
| Framework backend | ABP Commercial | 9.0.0 | cargo_fleet.Domain.csproj dependencias |
| ORM | Entity Framework Core + PostgreSQL | 9.0.0 | cargo_fleet.EntityFrameworkCore.csproj |
| Auth | OpenIddict Pro (via ABP) | 9.0.0 | cargo_fleet.Domain.csproj |
| Multitenancy | Volo.Saas | 9.0.0 | cargo_fleet.Domain.csproj |
| Scryber.Core | 8.0.0.1-beta | cargo_fleet.Application.csproj | |
| Excel | MiniExcel | 1.34.2 | cargo_fleet.Application.csproj |
| Cache e locks | Redis + DistributedLock.Redis | 9.0.0 / 1.0.2 | cargo_fleetHttpApiHostModule.cs linhas 10-11 |
| Logging | Serilog.AspNetCore | 8.0.0 | cargo_fleet.HttpApi.Host.csproj |
| Push backend | FirebaseAdmin | 3.3.0 | cargo_fleet.Domain.csproj linha 16 |
| Framework frontend | Angular | 17.3.x | angular/package.json linha 21 |
| ABP frontend | ABP Angular (maioria) | 8.3.3 | angular/package.json linhas 15-18 |
| ABP frontend (excecao) | @abp/ng.tenant-management | ^9.0.2 | angular/package.json linha 19 |
| Mobile framework | Ionic | ^8.5.3 | angular/package.json linha 43 |
| Bridge nativo | Capacitor | 7.2.0 | angular/package.json linhas 33-35 |
| Biometria | capacitor-biometric-auth | ^9.0.0 | angular/package.json linha 31 |
| Armazenamento seguro | capacitor-secure-storage | ^6.0.1 | angular/package.json linha 32 |
| Push frontend | firebase JS SDK | ^11.9.1 | angular/package.json linha 55 |
| Conteineres | Docker | - | aspnet-core/etc/docker/docker-compose.yml |
| Orquestracao (prod) | Kubernetes / AWS EKS | - | .github/kubernetes/production/ |
| Orquestracao (dev) | k3s / Traefik | - | .github/kubernetes/ingress-k3s-gemini.yml |
| CDN | Cloudflare | - | Dominios observados via HAR |
| CI/CD | GitHub Actions | 3 pipelines | .github/workflows/ |
| Versao API | 1.3.1 | - | Informado na auditoria |
MISMATCH CONFIRMADO: A maioria dos pacotes @abp/ng.* esta em ~8.3.3, enquanto o backend usa 9.0.0. A excecao e @abp/ng.tenant-management em ^9.0.2, criando inconsistencia dentro do proprio frontend. Isso representa risco de incompatibilidade de contrato de API.
Notas da auditoria