A premissa
Auditoria própria, não autodeclaração
O M3 Flexor passou por uma auditoria interna estruturada em 13 categorias — autenticação e credenciais, autorização, injeção de SQL, execução dinâmica, XSS, CSRF, upload, configuração de produção, transporte, dependências, logging, subprocessos e LGPD. Cada achado foi classificado por severidade, recebeu um plano-dono, e foi corrigido, descartado com justificativa ou aceito como risco explícito. Hoje as 13 categorias estão fechadas — o que ainda está em aberto (página própria de transparência) são itens fora dessa lista, com nome e status próprios.
Controle de acesso
Quem vê o quê, em três camadas
Ter acesso a uma tela não é ter acesso a um registro. São três verificações independentes, e a terceira é a que costuma faltar nos sistemas de gestão.
1 · Autenticação
Todas as rotas exigem sessão autenticada — e, onde o segundo fator está ligado, sessão verificada em dois fatores. É o gate de "estar logado" — necessário, nunca suficiente.
2 · Permissão por modelo
Permissões nativas do Django por tipo de recurso, concedidas por grupo. Responde "este usuário pode editar matrícula?" — independentemente de qual matrícula.
3 · Escopo por linha
A verificação de posse: "este usuário pode editar esta matrícula?". Um helper único consulta um mapa declarado de campo-titular por modelo, em vez de depender de cada tela lembrar de filtrar.
Nos três módulos que ancoram a hierarquia de indicador — instrumento, projeto e avaliação — há ainda uma árvore de autorização multinível: o acesso é concedido por ramo da estrutura, e não por tela.
Alguns números
A auditoria não é um relatório pontual — é processo contínuo, com auxílio de IA. Um retrato recente, medido por ferramenta e não prometido:
46 apps
com dado real carregado — não tela vazia. 45 deles pertencem a um módulo comercial (o único de fora, webdata, é infraestrutura e não tem vitrine própria), e sobre eles estão declaradas 184 regras de alerta e 152 análises, apuradas contra as 418 tabelas do catálogo das duas engines.
16.849 termos
traduzidos (en/es/fr) dos 17.499 do sistema inteiro — 44 apps têm locale próprio, os demais usam o central compartilhado; o resto segue vazio ou fuzzy (marcado para revisão), fechado rodada a rodada pelo idiomas.py verify a cada app tocado.
152.129
registros de demonstração declarados nas vitrines das 12 instâncias da federação (+ ~14 mil do motor do LataciVerso), do porte mínimo (pequeno comércio, ~4,8 mil) ao maior (centro universitário, ~58,4 mil) — massa suficiente para medir performance, não só migrar limpo.
4.285 testes
declarados nas duas pernas da suíte (unittest + pytest) — contados no código por ferramenta, não prometidos. Entre eles, uma guarda anti-regressão que roda contra o mesmo baseline: se um alerta que acendia fica mudo, ou uma análise vira degenerada, o guarda falha — a robustez é medida a cada rodada, não prometida uma vez.
Isolamento
O dado de um cliente não encosta no de outro
Não é uma coluna cliente_id filtrando as mesmas tabelas. Cada cliente roda em sua própria instância, com banco, credenciais, chave de assinatura de sessão e porta próprios. Vazar a configuração de um não abre nenhum outro — e um erro de filtro numa consulta não tem como devolver dado de outra empresa, porque ele não está lá.
O que trafega entre a instância e a M3
Apenas três coisas: a versão instalada, contadores de uso e o horário da checagem. Sem dado pessoal, sem dado de negócio, sem cópia de banco. O canal serve para licença, cobrança e saúde da instalação — não para levar sua informação para fora.
Sem oráculo de existência
Fora do servidor central, essas rotas respondem 404 como se não existissem. Dentro, um token inválido e um token ausente devolvem exatamente a mesma resposta — quem sonda não descobre nem que a rota existe, nem se acertou o formato do token.
Código só por versão publicada
A instância só recebe código a partir de uma versão marcada e verificada, sem alteração local possível. O que roda no seu ambiente é rastreável até a origem.
Backup verificado, não só agendado
Cada backup tem a integridade conferida após a geração, retenção parametrizada, permissões restritas de arquivo e segredo fora da linha de comando. E a restauração foi testada de verdade, com procedimento escrito — backup que nunca foi restaurado é uma suposição.
Aplicação e transporte
O básico, feito e conferido
Injeção de SQL
Os 76 pontos exploráveis encontrados foram parametrizados ou validados, e a conexão paralela ao banco que existia fora do controle do framework foi removida por completo.
Força bruta de senha
Bloqueio após tentativas falhas, contado por usuário e por IP — travar só por IP não impede ataque distribuído, e travar só por usuário permite derrubar a conta de alguém de propósito.
Senhas
Armazenadas com PBKDF2-HMAC-SHA256, o padrão do framework, sem substituição por implementação própria. Quatro validadores de política de senha ativos, troca obrigatória no primeiro acesso e redefinição por e-mail.
Conteúdo de terceiros (XSS)
Sanitização de HTML por biblioteca dedicada, e passagem de dados do servidor para o JavaScript por mecanismo que não interpreta o conteúdo como código.
Upload de arquivo
Validação com lista branca de extensão e tipo em 23 pontos de upload — o arquivo é recusado pelo que ele é, não pelo nome que veio.
Transporte
HTTPS com redirecionamento permanente e HSTS, certificado renovado automaticamente, cabeçalhos de proteção do navegador, versão do servidor omitida e limite de requisições por IP.
Segundo fator (2FA)
Código temporário de aplicativo autenticador, exigido na entrada dos operadores administrativos e ligável por instalação. O desafio é um gate próprio na cadeia de verificação, não um passo opcional de biblioteca — a diferença importa, porque a montagem ingênua deixa a tela dizer "2FA ligado" sem exigir nada. Rotas que uma isenção "óbvia" deixaria escapar — troca de senha, administração, APIs — estão cobertas por suíte própria. Quem entra por conta corporativa federada é dispensado; superuser não é.
Configuração de produção exigível
Quem administra a instalação pode exigir a configuração correta em vez de só ser avisado sobre ela: com um interruptor no ambiente, a aplicação recusa-se a subir enquanto a chave que assina sessões e links de senha, os domínios aceitos ou o modo de depuração estiverem com valor de desenvolvimento. O padrão continua o de sempre — avisar e subir —, para que nenhuma instalação já em uso mude de comportamento sem alguém pedir; o aviso semanal por e-mail para quem administra vale nos dois modos.
Política de Segurança de Conteúdo
Ativa em modo bloqueante desde 04/09/2026: o navegador recusa script ou estilo que não venha da própria aplicação, o que reduz o estrago de um XSS que escape das camadas acima. Chegar lá exigiu tratar os 211 blocos de script embutidos em 170 telas, um a um. Duas folgas seguem declaradas com motivo, não esquecidas: a avaliação dinâmica exigida pela biblioteca de interatividade e três estilos embutidos do editor de texto de terceiros.
Formulário público
O único formulário aberto na internet tem desafio anti-robô (Cloudflare Turnstile, sem cookie de rastreamento), ligado por instalação, somado ao limite por IP. A verificação é fail-closed: token ausente, recusado ou irrespondível recusa o envio — uma indisponibilidade do provedor não vira porta aberta.
Atualização de dependências
A auditoria automática de vulnerabilidades conhecidas (pip-audit) passou de
aviso a bloqueante na esteira: build com achado sem veredito não passa. Das 7
vulnerabilidades da primeira triagem, 6 foram corrigidas (uma atualização de série e
um salto de versão maior na biblioteca de criptografia) e 1 está formalmente dispensada
— release maliciosa de 2022 num pacote usado só pela tradução interna, sem correção
publicada —, com motivo escrito e data de revisão.
Cifra do backup
O dump dos bancos e o pacote de arquivos são cifrados em AES-256-GCM (adulteração e truncamento são recusados, não lidos como dado bom) assim que a instalação tem a chave dedicada configurada — sem ela, o arquivo segue em claro e o fato fica registrado, nunca em silêncio. O nome do arquivo não muda: quem confere o backup pelo painel de acompanhamento continua enxergando normalmente. A chave em si é um passo de instalação à parte — ver "O que ainda não está pronto".
Backup verificado e avisado
Integridade conferida, permissão restrita ao dono do arquivo, e a restauração — a única prova real de que o backup serve — automatizada num comando que restaura num banco descartável, confere linha a linha o que voltou e apaga a cópia no fim. E o que faltava desde a última rodada desta página: um backup que atrasa avisa por e-mail quem cuida da instalação, sem esperar alguém abrir o painel — e uma instalação com o backup automático desligado também é avisada, todo dia, em vez de ficar em silêncio até alguém precisar restaurar e descobrir que não havia nada para restaurar.
LGPD
Conformidade com nome e artigo
Não "estamos em conformidade": aqui está o quê, onde, e sob qual dispositivo.
| Obrigação | Como é atendida hoje |
|---|---|
| Papéis e contrato art. 5º VI e VII |
A instância cliente é Controladora e a M3 é Operadora, com uma cláusula inteira do contrato de licenciamento dedicada à LGPD — bases legais, suboperadores, incidentes, retenção, transferência internacional e DPO. O aceite fica registrado com data, hora, IP, navegador e hash do documento assinado. |
| Minimização art. 6º III |
O formulário público de captação foi de 104 campos para 4, e o bloco de dado sensível saiu inteiramente da coleta anônima. Também foi fechada a possibilidade de descobrir, pelo formulário, se um CPF ou e-mail já constava na base. |
| Transparência art. 9º |
Aviso de privacidade no formulário público, e encarregado (DPO) parametrizado por instância — o canal do titular é da sua empresa, não da M3. |
| Dado sensível art. 11 II "a" |
Cor/raça, deficiência e o extrato de plano de saúde são tratados sob obrigação legal — o Censo da Educação Superior e a folha de pagamento —, e não sob consentimento genérico. O arquivo de saúde é cifrado em repouso. |
| Retenção art. 15 e 16 |
Prazo declarado por tipo de dado, com expurgo executável: lead sem conversão em 24 meses, registro de acesso em 12. O que tem guarda legal — histórico acadêmico, documento emitido, obrigação fiscal e trabalhista — é declaradamente não expurgado, e a página diz isso em vez de prometer o contrário. |
| Direitos do titular art. 18 e 19 |
Tela própria (/documento/cadastro_meu_dado/), só para o titular autenticado:
confirmação, acesso, portabilidade e compartilhamento são self-service — o
titular abre e resolve o pedido sozinho, na hora, com recibo. Correção, anonimização
e eliminação são irreversíveis e ficam retidas para o encarregado conferir
antes de executar — deleção real só do lead sem vínculo histórico; quem tem vínculo é
anonimizado. Todo pedido conta o prazo do art. 19 e emite recibo. O encarregado decide
pela sua própria tela (/documento/cadastro_pedido_titular/): vê a prévia
do que vai mudar antes de confirmar, conclui ou recusa com resposta fundamentada ao
titular, e emite o recibo de atendimento — sem linha de comando. Quem não tem login
(lead) segue pelo canal do encarregado.
é anonimização, não deleção total |
| Registro das operações art. 37 |
ROPA completo: cada dado pessoal tratado tem registrado onde mora, para que finalidade, sob qual base legal, de qual titular, por quanto tempo, e se é sensível. O registro existe — não é um documento a produzir caso a ANPD peça. |
| Relatório de impacto art. 38 |
Emitido pelo motor de documentos, um por instância: a tabela de operações de
tratamento (ROPA, art. 37) nasce do catálogo de tratamentos licenciados e é
congelada na geração — uma revisão do catálogo depois não altera
retroativamente um relatório já homologado. Nasce rascunho e só vira
vigente pela assinatura do encarregado, que dá o parecer sobre o risco
residual (o sistema apura o conteúdo técnico; a avaliação é ato do encarregado). PDF
por instância, evidências com hash SHA-256. |
| Compartilhamento art. 39 |
Cada operador externo está declarado, com o que recebe e a salvaguarda aplicada. O assistente de IA não recebe cadastro de pessoas por desenho; o envio de imagem a serviço externo exige consentimento em tela antes do upload e a imagem não é armazenada; e os painéis analíticos passaram a usar identificador opaco no lugar do nome. |
| Incidentes art. 48 |
Procedimento escrito de resposta: a M3 comunica a instância sem demora injustificada para que ela, como Controladora, avalie a comunicação à ANPD e aos titulares. |
Por que anonimização e não exclusão total. O cadastro de pessoas é referenciado por 67 relacionamentos que não apagam em cascata. Apagar o titular deixaria registros órfãos em histórico acadêmico, financeiro e documental — o que quebraria a integridade da base e a própria guarda legal desses registros. A anonimização remove a identificação preservando a integridade contábil e acadêmica, que é o comportamento correto quando há obrigação de guarda.
Processo
O que impede o problema de voltar
Corrigir uma vulnerabilidade é trabalho de um dia. Impedir que ela reapareça em seis meses, numa tela nova escrita por outra pessoa, é trabalho de processo. São oito verificações automáticas que rodam sobre o código e falham se algo regredir:
Consulta SQL
Nenhuma consulta nova entra sem parametrização.
Mapa de autorização
Todo modelo com dono tem seu campo-titular declarado.
Inventário de permissão
O mapa de qual tela exige qual permissão é regenerado e comparado a cada rodada.
Permissão por tela
Tela de escrita nova sem permissão declarada não passa.
Regressão de acesso por ID
Um ponto novo de busca por ID cru não entra sem revisão.
Cabeçalhos de segurança
A configuração de transporte não pode ser afrouxada sem que apareça.
Dado pessoal
Campo novo de dado pessoal precisa entrar no registro de tratamento.
Script e estilo embutidos
Bloco de script ou estilo escrito dentro da tela não entra — e a política de conteúdo não pode voltar ao modo de observação sem que a verificação falhe.
Além delas, há testes que verificam o comportamento por perfil: quem deve conseguir recebe 200; quem não deve recebe 403. É a diferença entre declarar a regra e provar que ela vale.
Próximo passo
Pergunte o que não está aqui
Esta página cobre o que a auditoria mediu. Se a sua área de tecnologia ou o seu jurídico precisar de detalhe — o registro de tratamento por tabela, a cláusula de LGPD do contrato, o procedimento de incidente ou o de backup —, esses documentos existem e podem ser apresentados.