163 lines
7.7 KiB
Markdown
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.
|