Files
course-plat/docs/SECURITY_AUDIT_2026-05-18.md
2026-08-31 14:10:20 -03:00

7.7 KiB

Auditoria de Seguranca - course-plat

Data: 2026-05-18 Escopo: Analise completa de autenticacao, autorizacao e vulnerabilidades de seguranca


CRITICO (Exploracao Imediata Possivel)

1. Middleware de Protecao de Rotas INATIVO

Arquivo: src/proxy.js

O middleware existe mas nao ha src/middleware.js no projeto. O Next.js so reconhece middleware nos caminhos padrao (src/middleware.js ou middleware.js na raiz). Toda a protecao de rotas por pagina esta desativada. Qualquer usuario pode acessar /admin/dashboard diretamente sem login.

2. updateUserData - Escalacao de Privilegio TOTAL (sem auth)

Arquivo: src/app/lib/users/updateUserAction.js:11

  • "use server" com ZERO verificacao de autenticacao
  • Qualquer cliente (nao autenticado) pode modificar qualquer usuario, incluindo alterar o campo roles para ["admin"]
  • Impacto: Um atacante pode se conceder acesso admin completo

3. examActions.js - 18 funcoes SEM autenticacao

Arquivo: src/app/lib/actions/examActions.js (1102 linhas)

Funcao Linha Impacto
getExamTemplates 82 Vazar todas as questoes + respostas corretas de provas
getExamTemplateById 104 Ver gabarito completo de qualquer prova
updateExamTemplate 155 Alterar respostas corretas de qualquer prova
deleteExamTemplate 184 Deletar qualquer modelo de prova
duplicateExamTemplate 218 Duplicar e ver conteudo de qualquer prova
getExamAssignments 256 Ver todas as atribuicoes de prova
getExamAssignmentById ~298 Ver detalhes completos de atribuicao
createExamAssignment ~330 Criar atribuicoes para qualquer turma
updateExamAssignment ~350 Modificar atribuicoes de prova
deleteExamAssignment ~370 Deletar atribuicoes
archiveExamAssignment ~390 Arquivar/desarquivar
getExamAttempts ~410 Ver todas as respostas e notas de todos os alunos
getExamAttemptById ~430 Ver detalhes de qualquer tentativa
createExamAttempt ~450 Criar tentativas impersonando qualquer aluno
submitExamAttempt ~470 Submeter respostas por qualquer tentativa
getExamStatistics ~500 Ver estatisticas gerais
getStudentExamStatistics ~520 Ver historico de qualquer aluno
getClasses ~540 Listar todas as turmas

4. Server Actions administrativas sem autenticacao

15 funcoes com "use server" e ZERO verificacao de login:

Funcao Arquivo Impacto
updateUserData users/updateUserAction.js Escalacao de privilegio para admin
saveUserData users/createWardUserAction.js Criar contas de aluno sem auth
saveProductAction products/actions.js Criar/modificar produtos e precos
deleteProductAction products/actions.js Deletar qualquer produto
saveClassAction classes/saveClassAction.js Criar/modificar turmas
toggleClassStatus classes/toggleClassStatus.js Arquivar/ativar qualquer turma
deleteClass classes/deleteClass.js Deletar qualquer turma
deleteClassTypeAction classes/deleteClassType.js Deletar tipo de turma
saveClassLink classes/saveClassLinkAction.js Alterar link de aula
saveClassTypeAction classes/saveClassTypeAction.js Criar/modificar tipos de turma
saveCategoryAction categories/saveCategoryAction.js Criar/modificar categorias
deleteCategory categories/deleteCategory.js Deletar categorias
deleteFile generalActions/deleteFile.js Deletar qualquer arquivo do DB e S3
updateExamTemplate examActions.js Alterar gabaritos de provas
submitExamAttempt examActions.js Submeter respostas por qualquer tentativa

ALTO (Risco Significativo)

5. IDOR em /api/orders/[id]

Arquivo: src/app/api/orders/[id]/route.js

Qualquer usuario autenticado pode ver qualquer pedido por ID, sem verificacao de propriedade.

6. Vazamento de Informacoes em /api/health

Arquivo: src/app/api/health/route.js - Totalmente publico

Expoe: status do MongoDB, contagem de usuarios, tipo de storage, endpoint S3, bucket name, NODE_ENV, NEXTAUTH_URL.

7. Endpoint de Debug em Producao

Arquivo: src/app/api/debug-token/route.js

Qualquer usuario autenticado pode ver sessao completa, roles e status admin.

8. Aulas sem verificacao de membros

Arquivo: src/app/api/classes/[id]/lessons/route.js (GET)

Qualquer usuario autenticado pode ver aulas de qualquer turma, sem verificar se e membro.

9. Headers de Debug no Middleware

Arquivo: src/proxy.js:92-96

Headers x-debug-roles, x-debug-is-logged-in, x-debug-default-route vazam informacoes de autenticacao em toda resposta.


MEDIO

10. Ausencia de Headers de Seguranca

Arquivo: next.config.mjs

Nenhum header de seguranca configurado:

  • Sem Content-Security-Policy
  • Sem X-Frame-Options
  • Sem X-Content-Type-Options
  • Sem Strict-Transport-Security
  • Sem Referrer-Policy

11. Vazamento de Erros Internos

Multiplas funcoes retornam erros raw ao cliente: Erro: ${err}, error.message - podem vazar stack traces, detalhes de conexao DB, etc.

12. console.log com Dados Sensiveis

examActions.js usa console.log para imprimir respostas de alunos e dados de questoes no log do servidor.

13. Upload de Arquivo sem Restricao de Entidade

Arquivo: src/app/lib/generalActions/saveFileAction.js

Qualquer usuario autenticado pode vincular arquivos a qualquer entidade (qualquer turma, tipo de turma, etc.).

14. Limite de Upload Muito Alto

Arquivo: next.config.mjs:11

bodySizeLimit: '200mb' permite uploads de ate 200MB, facilitando ataques de negacao de servico.

15. Recibos como Base64 no MongoDB

submitOrderPaymentAction armazena recibos como data URI base64 diretamente no documento do banco, causando growth descontrolado do DB.


Resumo Quantitativo

Severidade Quantidade Descricao
CRITICO 15 Server actions sem autenticacao nenhuma
ALTO 12 Autenticado mas sem verificacao de role/autorizacao
MEDIO 5 Autenticado e com role mas outros problemas
OK 27 Protegido corretamente com auth + autorizacao
Total de funcoes auditadas 68

Plano de Correcao (Prioridade Decrescente)

  1. Renomear src/proxy.js para src/middleware.js - Ativa a protecao de rotas por pagina
  2. Adicionar auth() + verificacao de role em TODAS as 15 server actions criticas - Usar o padrao de requireRole("admin") ou requireAuth() do authorization.js
  3. Refazer examActions.js - Todas as funcoes precisam de auth. Leitura de templates nao deve retornar isCorrect. Considerar consolidar com examFlowActions.js (que ja tem seguranca correta)
  4. Adicionar verificacao de propriedade em /api/orders/[id]
  5. Proteger /api/health com autenticacao admin ou remover dados sensiveis
  6. Remover /api/debug-token em producao
  7. Remover headers de debug do middleware
  8. Adicionar headers de seguranca no next.config.mjs
  9. Sanitizar mensagens de erro antes de enviar ao cliente
  10. Remover console.log com dados sensiveis
  11. Reduzir bodySizeLimit para algo mais razoavel (ex: 10MB)
  12. Adicionar verificacao de membership em GET lessons

Comparativo: examActions.js vs examFlowActions.js

examFlowActions.js demonstra praticas de seguranca corretas (auth + role + class membership checks em todas as 6 funcoes), enquanto examActions.js (21 funcoes) tem quase nenhuma autenticacao ou autorizacao. Sugere-se que examFlowActions.js foi escrito depois como substituicao mais segura, mas as funcoes inseguras em examActions.js nunca foram removidas ou protegidas.