A abordagem padrão de gravação de sessão é tirar uma captura de tela a cada poucos segundos. O resultado é um índice cheio de quadros semelhantes entre si — o usuário lendo a página, o usuário lendo a página, o usuário ainda lendo a página — com os eventos realmente importantes intercalados em algum lugar entre dois instantâneos que chegam tarde demais e mostram apenas o resultado.
A captura periódica também perde a resposta à pergunta mais importante de qualquer auditoria ou investigação: o que o usuário fez? Um instantâneo tirado 1,5 segundo após um clique não mostra no que foi clicado. Um instantâneo tirado 3 segundos após um envio de formulário não mostra o que foi digitado. A trilha de auditoria tem eventos sem contexto; as capturas de tela têm contexto sem eventos. Ligá-los é trabalho manual que escala mal com o número de sessões.
O ZeroLeak usa uma abordagem diferente. As capturas de tela são disparadas pelos próprios eventos, não por um temporizador. As navegações capturam duas capturas de tela — a página antes do clique e o depois do carregamento da nova página — de modo que causa e efeito são preservados como um par. Em cada captura é desenhada a posição do mouse, para que se veja no que foi clicado. As entradas de teclado são acumuladas em buffer em palavras legíveis. Por baixo, o vídeo é gravado continuamente, de modo que as lacunas entre os eventos capturados ainda podem ser reproduzidas se necessário.
Para cada sessão, três subsistemas de gravação funcionam em paralelo: capturas de tela disparadas por evento em momentos críticos, vídeo FFmpeg contínuo na taxa de quadros configurada, e registro de eventos estruturado com entrada de teclado em buffer por palavra e atividade completa de área de transferência. Cada um pode ser ativado e desativado por serviço protegido; por padrão, os três funcionam juntos, de modo que a reconstrução é sempre possível.
As capturas são disparadas pelas ações reais do usuário — cliques, navegações de página, envios de tecla, envios de formulário, operações de área de transferência. Sem polling baseado em tempo que enche o disco com quadros vazios. Cada captura de tela registra um momento importante; o índice é curto e informativo, não longo e ruidoso.
Em cada captura de tela, a posição do mouse é marcada com um indicador visível — um ponto vermelho nas coordenadas exatas do clique ou do hover. Você vê no que o usuário clicou, não a página resultante do clique. Reconstrução de intenção em um único quadro, não um quebra-cabeça de vários quadros.
Quando o usuário navega, duas capturas de tela são feitas — uma da página antes do clique, outra da página de destino após o conteúdo novo carregar totalmente. Causa e efeito são preservados como um par. O revisor vê 'o usuário clicou no link X, a página seguinte que carregou foi Y' como dois quadros adjacentes.
Eventos de tecla individuais se acumulam em um buffer que é descarregado em espaço, enter, tab ou pausa curta. O resultado se lê como o texto que o usuário digitou, não como um despejo de eventos tecla a tecla. Os backspaces são preservados como marca [BS], para que as correções sejam visíveis. As teclas repetidas (mantidas pressionadas) são filtradas. As operações de área de transferência são registradas separadamente com seu conteúdo real.
Cada mecanismo de captura é configurável de forma independente por serviço protegido e funciona sem impacto de desempenho na sessão do usuário. Os três fluxos (capturas de tela, vídeo, registro de eventos) são alinhados por carimbo de data e hora, de modo que o revisor pode transitar entre eles sem dificuldade.
As capturas de tela são disparadas em cliques do usuário, navegações (com par de antes e depois), envios de formulário, envios de tecla (Enter), operações de área de transferência (copiar, recortar, colar), capturas disparadas manualmente a partir do console do operador e em vários outros tipos de evento importantes. A lista completa de eventos é configurável por serviço protegido.
Na navegação, a captura de tela de destino é feita apenas após a nova página terminar de carregar — aguardando o esvaziamento da rede mais um curto atraso adicional de renderização. A captura de tela feita mostra a página exatamente como o usuário realmente a veria, não um estado intermediário carregado pela metade.
Sob as capturas de tela disparadas por evento, a sessão é gravada continuamente em vídeo usando o x11grab do FFmpeg. A taxa de quadros é configurável (10 fps por padrão para arquivos compactos; taxas mais altas disponíveis para captura de alto detalhe). O vídeo é segmentado para streaming e replay seguros; os segmentos são marcados por carimbo de data e hora para alinhar-se com os fluxos de capturas de tela e de registro de eventos.
Os eventos de tecla se acumulam em um buffer que é descarregado nas fronteiras de palavra (espaço, enter, tab) ou após uma curta pausa ociosa. A string descarregada se lê como texto — 'olá mundo [BS][BS][BS][BS][BS]oi mundo' — preservando a intenção e as correções do usuário sem o ruído de cada evento keydown individual.
As operações de copiar, recortar e colar são registradas separadamente das entradas de teclado, incluindo o conteúdo real da área de transferência envolvido. Um revisor vê exatamente o que foi copiado e o que foi colado, não apenas que ocorreu um evento de área de transferência.
As capturas de tela são numeradas sequencialmente (0001, 0002, ...) e armazenadas com carimbo de data e hora e metadados de evento. O console do operador as lista junto com o evento que as disparou, de modo que o revisor pode pular diretamente para o momento de interesse — por exemplo, todas as capturas disparadas por área de transferência em uma sessão ou o par de navegação em torno de uma URL específica.
Além das capturas de tela e do vídeo, um registro de eventos estruturado captura o histórico de interação do usuário com contexto completo. Cada evento tem um tipo, um carimbo de data e hora, uma referência de captura de tela associada (quando aplicável) e seu payload relevante. É isso que torna o registro não apenas visualmente percorrível, mas pesquisável e analiticamente útil.
Cada evento de clique registra as coordenadas x/y e o elemento DOM sob o cursor (tag, classe, ID, conteúdo de texto quando disponível). O revisor pode pesquisar por cliques em um botão ou link específico no registro da sessão, sem ter de percorrer as capturas de tela em busca de um.
As mudanças de posição de rolagem são registradas com throttle para evitar spam de log. Resolução suficiente para reconstruir onde o usuário olhou em páginas longas, mas sem gerar milhares de eventos de rolagem desnecessários por minuto.
Cada navegação — carregamentos de página completa, mudanças pushState de aplicação de página única, mudanças programáticas de localização — é registrada com URL de origem, URL de destino, gatilho (clique em link, manual, programático) e tempo de conclusão. As navegações SPA que o registro tradicional perde são capturadas pela camada de polling de URL do ZeroLeak.
Quando o usuário envia um formulário, o registro de eventos captura a URL de action do formulário, seu método e os nomes dos campos. Os valores reais dos campos são capturados pelo registro de entrada de teclado (para que o histórico de digitação seja preservado), não repetidos no evento de formulário.
A sessão monitora a atividade do usuário na camada de entrada. As transições entre os estados ativo e ocioso são registradas com carimbos de data e hora, para que os revisores possam ver os períodos de atenção e a inatividade — útil para revisão de conformidade e perguntas de auditoria baseadas em tempo.
No fim da sessão é gravado um metadado de resumo: duração total, distribuição ocioso-ativo, total de eventos de cada tipo, capturas de tela geradas, referências de arquivo de vídeo e motivo de encerramento (timeout, encerramento manual, erro). Se um webhook de coordenador estiver configurado, esse resumo também é disparado para ele.
Reguladores que perguntam o que usuários específicos fizeram em sessões específicas — revisão HIPAA de acesso a registros de pacientes, conformidade de mesas de investimento financeiro, auditorias governamentais de processamento de dados. A captura disparada por evento gera por sessão uma trilha curta e informativa que os revisores podem percorrer rapidamente.
Quando se suspeita de um vazamento ou violação de política, o investigador precisa saber exatamente o que o usuário fez — não apenas quando. As capturas de tela sequenciais marcadas com o mouse, as entradas de teclado em buffer por palavra e o conteúdo completo da área de transferência tornam a sessão reproduzível em detalhe sem horas de visualização de vídeo.
Usuários externos que recebem permissão apenas de visualização ao seu ambiente. A gravação completa por sessão — junto com a marca d'água visível que identifica o usuário — fornece responsabilização por tudo o que veem e por cada ação que realizam durante a janela de acesso.
Após um evento inesperado em um console SCADA ou operacional, a gravação mostra exatamente o que o operador viu nos momentos anteriores e em quais controles clicou. O par de antes e depois na navegação acelera muito o diagnóstico de erros em cadeia.
Vamos abrir uma sessão, clicar em alguns links, preencher alguns formulários, copiar algum conteúdo e mostrar o índice de capturas de tela resultante, o registro de teclado e os segmentos de vídeo — e como um revisor reconstrói a sessão a partir deles.