Raio-X da Plataforma Ayub
Diagnóstico técnico completo do software entregue pelo fornecedor — Frontend + Backend
Cliente Ayub Clínica Odontológica
Data 26 de Maio de 2026
Arquivos analisados 551 (2 repos)
Por Digital AI — Consultoria
NÃO APTO PARA PRODUÇÃO O fornecedor entregou um backend bem arquitetado com apenas ~20% do frontend implementado, múltiplas vulnerabilidades críticas (incluindo dados reais de pacientes no repositório) e sem configuração adequada de deploy. 6 brechas críticas · Violação direta da LGPD.
Estágio Atual do Projeto
Backend API
75%
Rails 6.1 · 32 tabelas · 60+ endpoints
Frontend UI
20%
Nuxt 3 · apenas módulos básicos
Segurança
40%
6 críticas · 4 altas · 3 médias
Deploy / Infra
40%
Docker incompleto · sem SSL
Stack Tecnológica
Backend (Rails API)
Linguagem
Ruby ~> 3.0  [EOL mar/2024]
Framework
Rails 6.1.7  [EOL]
Banco
PostgreSQL 16
Autenticação
Devise 4.2 + JWT
Serialização
ActiveModel::Serializers
Storage
Active Storage local
Docs API
Swagger / Rswag
Admin Panel
rails_admin 3.1
Testes
RSpec — cobertura baixa
Frontend (Nuxt 3)
Framework
Nuxt 3.13 (Vue 3.4)
UI Kit
Vuetify 3.5
Estado
Pinia + persistedstate
Calendário
FullCalendar 6.1
Gráficos
ApexCharts
HTTP
axios 1.6
TypeScript
5.5
Dockerfile
AUSENTE
API URL
Hardcoded — pedrost.com
Banco de Dados — 32 Tabelas Implementadas
customers
Pacientes completos com plano de saúde, preferências, relacionamentos
appointments
Consultas com sinais vitais (pressão, FC, saturação O2)
odontograms / teeth
Odontograma completo — 32 dentes por paciente com status
anamneses / alerts
Histórico médico, alergias, medicamentos e alertas automáticos
clinical_sheets
Fichas de atendimento clínico por sessão e profissional
treatment_plans
Planos de tratamento com itens e % de conclusão
dental_xrays
Radiografias com upload de imagem via Active Storage
budgets / procedures
Orçamentos com procedimentos mapeados por dente
payment_plans
Parcelamentos com parcelas individuais e controle de status
accounting_entries
Lançamentos contábeis (receitas e despesas da clínica)
leads / interactions
CRM com pipeline de vendas e histórico de contatos
smart_boards
Kanban para gestão visual de pacientes e leads
goals
Metas da clínica com métricas e período mensal/anual
products / stock
Estoque de materiais e movimentações de entrada/saída
lab_cases
Casos enviados ao laboratório com acompanhamento
tags / taggings
Tags polimórficas para categorizar qualquer entidade
message_templates
Templates de mensagens WhatsApp e e-mail
clinics / users / jwt
Multi-tenancy, usuários e blacklist de tokens JWT
Status das Funcionalidades — Frontend vs Backend
Login / Logout
Autenticação JWT funcional
OK
Cadastro de Pacientes
Lista, busca, cadastro e edição
OK
Agenda (Calendário)
FullCalendar com criação de consultas
OK
Orçamentos
Com seleção de dentes e procedimentos
OK
Retornos
Apenas listagem, sem ações
PARCIAL
Dashboard
Componente com dados mockados
PARCIAL
Odontograma
Core da clínica — sem interface
AUSENTE
Anamnese
Prontuário médico — obrigatório por lei
AUSENTE
Fichas Clínicas
Histórico de atendimentos do paciente
AUSENTE
Planos de Tratamento
Planejamento e acompanhamento
AUSENTE
Financeiro Completo
Planos de pagamento, parcelas, contabilidade
AUSENTE
CRM / Leads
Pipeline comercial e WhatsApp
AUSENTE
Kanban / Smart Boards
Gestão visual de pacientes
AUSENTE
Estoque / Laboratório
Controle de materiais e casos de lab
AUSENTE
Auditoria de Segurança
⚠ RESULTADO: 6 CRÍTICAS · 4 ALTAS · 3 MÉDIAS — Não pode processar dados de pacientes assim.
Vulnerabilidades Críticas
CRITICO-01 CRÍTICO
Senha armazenada em cookie em texto plano
A senha digitada pelo usuário é salva diretamente em um cookie persistido no navegador. Qualquer script XSS, extensão maliciosa ou acesso físico ao computador consegue ler as senhas de todos os usuários.
stores/useAuthStore/index.ts:11 · handlers/login.ts:16
CRITICO-02 CRÍTICO
master.key (chave mestra de criptografia) commitada no repositório
O arquivo config/master.key está no repositório com a linha de exclusão comentada no .gitignore. Esta chave decripta credentials.yml.enc, expondo JWT secret e todos os secrets da aplicação. Qualquer pessoa com acesso ao código pode forjar tokens de autenticação.
config/master.key → eaeb1c2ef74ddef8cdd776a8568a70c6
CRITICO-03 CRÍTICO
CORS completamente aberto — aceita qualquer origem (origins *)
origins '*' com todos os métodos HTTP e header Authorization exposto permite que qualquer site malicioso faça requisições autenticadas ao backend em nome do usuário logado.
config/initializers/cors.rb
CRITICO-04 CRÍTICO
Backup do banco com dados reais de pacientes no repositório — LGPD
O arquivo db/backup.sql contém dados reais de pacientes (CPFs, nomes, histórico médico) e é montado como volume de inicialização do PostgreSQL. Violação direta da LGPD — dados sensíveis de saúde com proteção reforçada (Art. 11, Lei 13.709/2018).
db/backup.sql → docker-compose.yaml:13
CRITICO-05 CRÍTICO
Autenticação desabilitada com RAILS_ENV=development (Dockerfile usa development)
O Dockerfile define RAILS_ENV=development como padrão. Em modo development a autenticação é substituída por usuário automático criado na hora. Um docker run direto sem env vars expõe toda a API sem autenticação.
Dockerfile:6 · base_controller.rb:13-14
CRITICO-06 CRÍTICO
Registro público permite escolher qualquer clinic_id
O endpoint POST /users/sign_up aceita clinic_id como parâmetro sem validação. Qualquer pessoa pode criar conta e se vincular a qualquer clínica, acessando todos os dados dos pacientes.
users/registrations_controller.rb:33
Vulnerabilidades Altas e Médias
IDSeveridadeProblemaArquivo
ALTO-01ALTOJWT decodificado sem especificar algoritmo (algorithm confusion)base_controller.rb:55
ALTO-02ALTOJWT com validade de 15 dias — excessivo para dados de saúdedevise.rb:28
ALTO-03ALTOURL da API hardcoded para domínio pessoal do dev (pedrost.com)nuxt.config.ts:5
ALTO-04ALTOStack trace completo exposto na resposta HTTP de erro 500base_controller.rb:35
MEDIO-01MÉDIOconsole.log com tokens de autenticação nos server routesserver/api/users/[...].ts:16
MEDIO-02MÉDIOSem lockout de conta após tentativas de login falhasdevise.rb:207-224
MEDIO-03MÉDIOSECRET_KEY_BASE não configurado como env var para produção
Status de Deploy
Backend
Dockerfile⚠ Parcial — RAILS_ENV errado
docker-compose✓ PostgreSQL 16 configurado
SSL / HTTPS✗ force_ssl comentado
SECRET_KEY_BASE✗ não configurado
Active Storage⚠ Local — arquivos perdidos
Ruby version⚠ 3.0 EOL desde mar/2024
Rails version⚠ 6.1 EOL — sem atualizações
CI/CD Pipeline✗ Ausente
Frontend
Dockerfile✗ Ausente — não existe
.env.example✗ Ausente — não existe
API URL✗ Hardcoded pedrost.com
Build script✓ nuxt build presente
Modo SSR✓ Nuxt 3 SSR configurado
Lock file⚠ Duplo: yarn + pkg-lock
CI/CD Pipeline✗ Ausente
Testes✗ Zero testes
Plano de Ação
🚨 Bloqueantes — Obrigatório Antes de Qualquer Deploy
#AçãoPrioridadeEsforço
1Remover armazenamento de senha em cookie (CRITICO-01)BLOQUEANTE2h
2Remover master.key do git + rotacionar todos os secrets (CRITICO-02)BLOQUEANTE4h
3Remover db/backup.sql + limpar histórico git (CRITICO-04)BLOQUEANTE4h
4Restringir CORS para domínios específicos (CRITICO-03)BLOQUEANTE1h
5Remover clinic_id dos parâmetros de cadastro público (CRITICO-06)BLOQUEANTE2h
6Corrigir Dockerfile: RAILS_ENV=production como padrão (CRITICO-05)BLOQUEANTE30min
🔴 Alta Prioridade — Para Deploy Seguro
#AçãoEsforço
7Criar Dockerfile para o frontend + configurar URL via env var2h
8Habilitar force_ssl = true em production.rb15min
9Configurar Active Storage para S3 ou volume persistente4h
10Configurar SECRET_KEY_BASE via variável de ambiente1h
11Adicionar algoritmo na decodificação JWT (algorithms: [HS256])1h
12Reduzir validade JWT para 1–4h + implementar refresh token1 dia
🟡 Funcionalidades Faltando no Frontend
MóduloImpactoEsforço Estimado
Odontograma (interface)ALTO5–8 dias
Anamnese (interface)ALTO2–3 dias
Fichas ClínicasALTO3–4 dias
Planos de TratamentoALTO3–4 dias
Módulo Financeiro CompletoALTO8–12 dias
CRM / LeadsMÉDIO5–8 dias
Smart Boards / KanbanMÉDIO3–5 dias
Estoque + LaboratórioMÉDIO4–6 dias
Estimativa total: ~2 dias para bloqueantes · ~1 semana para deploy seguro · ~3–4 meses para plataforma completa
Conclusão e Recomendação
✓ O que foi entregue de valor
Modelagem de banco rica e bem pensada. Arquitetura multi-tenant correta. Swagger presente. Admin panel funcional. Base técnica sólida — o backend está bem arquitetado.
✗ O que não foi entregue
~80% da interface de usuário. Segurança mínima para dados de saúde. Configuração de deploy para produção. Testes adequados. Documentação de setup.

A entrega do fornecedor representa uma plataforma incompleta com riscos críticos de segurança. A situação mais grave é a presença de dados reais de pacientes no repositório (db/backup.sql), que constitui violação direta da LGPD — especialmente sensível por tratar-se de dados de saúde, com proteção reforçada na legislação brasileira (Art. 11 da Lei 13.709/2018).

O sistema NÃO deve ser implantado em produção sem antes corrigir os 6 itens bloqueantes. A Digital AI recomenda um contrato de continuidade de desenvolvimento para completar as funcionalidades faltantes e garantir conformidade com LGPD e padrões de segurança para dados de saúde.