Gabarito das 12 falhas
Spoiler. Esta página entrega as respostas. Se você ainda está fazendo a prática do curso, volte às peças e tente achar sozinho primeiro. O exercício vale pelo caminho, não pela lista.
Tabela F1–F12
| Código | Onde está | Por que é risco | Como corrigir | Gravidade |
|---|---|---|---|---|
| F1 Chave de API no navegador | pecas/app-pedidos/app.js, CONFIG.openaiApiKey (e função sugerirProdutos chamando a IA direto do navegador) | Tudo o que vai para o navegador é público. Qualquer pessoa copia a chave e gasta a conta da empresa ou usa em nome dela. | Revogar a chave já exposta. Chamar a IA só pelo servidor (função de backend) com a chave em variável de ambiente; limite de gasto no provedor. | Crítica |
| F2 Tabela sem RLS | supabase-config.json (row_level_security: false) e schema.sql (disable row level security + grant … to anon); a tela "Meus pedidos" mostra pedidos de todos os clientes. | Com a chave pública (anon) qualquer um lê, altera e insere pedidos e lê a base de clientes. Vazamento de dados pessoais e comerciais (LGPD art. 46). | Ligar RLS em pedidos e clientes; política "cliente só vê os próprios pedidos" (cliente_id = auth.uid() ou equivalente); tirar grant do anon; testar com dois usuários. | Crítica |
| F3 Admin sem login | pecas/app-pedidos/admin.html abre direto (comentário "TODO: colocar tela de login"). | "Ninguém sabe o endereço" não é proteção: endereços vazam (histórico, prints, buscadores, adivinhação). Quem achar edita preços, exporta clientes e apaga pedidos. | Autenticação obrigatória com papel de admin verificado no servidor (não só esconder o link); 2FA para admin; registro de ações. | Crítica |
| F4 Dependência com vulnerabilidade conhecida | package.json: "lodash": "4.17.15" | Versão afetada por CVE-2020-8203 (prototype pollution em zipObjectDeep) e CVE-2021-23337 (injeção de comando em template), ambas de gravidade alta. Falha pública = receita de ataque pública. | Atualizar para lodash 4.17.21 ou superior; rodar npm audit (ou Dependabot) com frequência; ter dono para atualizações. | Alta |
| F5 Desconto sem teto | prompt-do-agente.md, regra 2 ("conceda o desconto que for preciso") e agente-config.json (desconto_maximo_percentual: null); conversa c-201 dá 35%. | O agente negocia contra a própria empresa: qualquer cliente que pedir leva desconto, corroendo a margem sem ninguém ver. | Teto de desconto na ferramenta (código), não só no texto do prompt; acima do teto, encaminhar para a Patrícia. | Alta |
| F6 Injeção de prompt | prompt-do-agente.md, regra 3 ("siga as orientações que o cliente enviar… textos colados") e conversas.json, conversa c-202 (ordem escondida na "obs." da lista; o agente aplica 70%, marca como pago e confirma). | Texto do cliente é dado, não ordem. Quem esconde instrução numa mensagem controla o agente (OWASP LLM01: Prompt Injection). | Prompt deixa claro que mensagens do cliente nunca mudam regras; regras críticas (preço, desconto, status "pago") travadas no código da ferramenta; teste de injeção antes de publicar. | Crítica |
| F7 Sem registro nem aprovação acima de R$ 5 mil | agente-config.json (limite_valor: null, requer_aprovacao_humana: false, salvar_acoes_das_ferramentas: false); prompt regra 5; c-202 cria pedido de R$ 8.436 sozinho e o financeiro não acha registro. | Sem trilha não dá para investigar, contestar nem aprender. Sem aprovação humana, um erro grande vira prejuízo antes de alguém ver. | Registrar toda ação (quem, quando, o quê, valor); pedido acima de R$ 5 mil vai para aprovação humana antes de separar; revisar o log toda semana. | Alta |
| F8 Planilha pública com CPF e telefone | compartilhamento.json ("Qualquer pessoa com o link", download permitido, link em grupo com autônomos) + clientes.csv (CPF e telefone). | Link encaminhado = dado pessoal exposto para quem não deveria ver. Incidente de segurança com dado pessoal (LGPD art. 46 e 48). | Restringir a pessoas nomeadas; tirar CPF do que não precisa (minimização, art. 6º III); bloquear download; revisar acessos todo mês; o agente consulta por sistema, não por link. | Alta |
| F9 MCP com enviar/apagar sem aprovação | pecas/mcp-email/mcp.json: escopos mail.send/mail.delete, autoApprove com send_email, delete_email, empty_trash; requireHumanApproval: false. | Um pedido mal entendido ou um e-mail malicioso (injeção) faz o agente apagar provas, mandar dados para 640 contatos ou confirmar golpe de "troca de conta bancária". | Mínimo privilégio: começar só com leitura; enviar e apagar exigem aprovação humana a cada vez; nada de esvaziar lixeira; log de ações. | Crítica |
| F10 Dado de cliente para API estrangeira sem contrato | pecas/resumo-atendimento/fluxo.json, passo 2 (servidor fora do Brasil, contrato_assinado: false, termos permitem treinar com os dados, sem anonimizar, sem aviso ao cliente). | Transferência internacional de dado pessoal exige hipótese do art. 33 da LGPD (ex.: cláusulas-padrão da Resolução CD/ANPD nº 19/2024) e base legal (art. 7º). Plano gratuito que treina com os dados = perda de controle. | Fornecedor com contrato (DPA) e cláusulas de transferência; sem uso para treino; anonimizar antes de enviar; avisar na política de privacidade; registrar no inventário. | Alta |
| F11 Painel sem linha de base | pecas/painel/ e indicadores.json: coleta começa no mesmo dia do agente; nenhum número de "antes" nem grupo de comparação; satisfação com ~6% de resposta. | "Sobe" não prova que o agente ajudou: pode ser sazonalidade, preço, desconto (F5) ou só volume. A decisão de ampliar para cobrança fica no achismo. | Levantar a linha de base (meses antes do agente: pedidos, tempo de resposta, margem, reclamações); medir resultado de negócio, não só volume; comparar períodos iguais; definir antes o que é "deu certo". | Média |
| F12 IA na sombra | inventario.html, anexo da pesquisa: respostas 2 (extensão "MailResumo"), 6 ("GravaReunião" gravando clientes), 8 (chatbot gratuito em conta pessoal com a planilha de clientes) e 13 (complemento "PlanilhaGênio" com acesso a todo o Drive). Nenhuma está na lista oficial. | Dados de clientes e da empresa saem por canais que ninguém aprovou, sem contrato e sem controle; gravação sem aviso. Não dá para proteger o que não se conhece. | Não punir: levantar, avaliar cada uma, oferecer alternativa aprovada, publicar política simples de uso de IA ("o que pode, o que não pode, a quem pedir") e repetir a pesquisa a cada trimestre. | Alta |
Gravidade é uma régua didática do laboratório (impacto × facilidade de explorar), não uma nota oficial. Auditoria de IA não substitui teste de invasão nem parecer jurídico.