# 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.