Segurança e privacidade

SEGURANÇA & LGPD

Esta página não lista intenções. Cada afirmação abaixo corresponde a código em produção e a um item fechado numa auditoria interna de 13 categorias — e o que ainda não está pronto tem página própria, com nome e status.

13 de 13 categorias fechadas Banco e credenciais por cliente ROPA art. 37 completo

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.

Por que isso é diferente de um selo O que dá confiança não é a lista de controles que um fornecedor diz ter: é ele conseguir dizer quais problemas encontrou, o que fez com cada um, e o que decidiu não corrigir agora. É o que esta página faz.

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.

Maiores tabelas em produção (linhas)Volume de dados por tabela nas instâncias medidas.Maiores tabelas em produção (linhas)avaliacao.indicador1.131avaliacao.medicao735movimento_estoque585indicador377pessoa.pessoa268avaliacao.limiar258medicao245matriz_habilidade198pessoa134avaliacao.meta129financeiro.recebimento112pessoa_fisica94 Seed que chegou ao banco, por app (%)Os 12 apps de menor aderência entre o declarado nos JSONs de vitrine e o aplicado no banco medido. Acima de 100% é esperado: catálogo e essencial povoam as mesmas tabelas.Seed que chegou ao banco, por app (%)acervo54oferta91adm100cliente100conectaverso100contador100curso100demanda100estagio100estrutura100evento100infraestrutura100

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.

TLS obrigatórioProteção contra repetiçãoToken de 256 bits por instância

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çãoComo é 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.

Marca do M3 Flexor