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

163 lines
7.7 KiB
Markdown

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