
Artefatos de pesquisa para ataques de canal lateral de notificação de arquivos no Linux, Windows e macOS, demonstrando vazamento de inotify/FSEvents, temporização de teclas e fingerprinting de sites.
Este repositório contém os artefatos (ainda em revisão!) para o artigo "File Notification Attacks: Templating and Exploiting Side-Channel Leakage from the File-Notification Systems on Linux, Windows, and macOS", aceito no CCS '26.
Visite o site com demonstrações em: https://inoti.fyi/
Leia o artigo em: https://snee.la/pdf/pubs/file-notification-attacks.pdf ou http://inoti.fyi/pubs/file-notification-attacks.pdf
Como parte da avaliação de artefatos no CCS'26 (ainda em andamento!), disponibilizamos uma VM Debian 13 + KDE Plasma 6 com um kernel pré-patchado. Esta VM não foi usada para produzir os resultados de avaliação do artigo e não se destina a reproduzir sua magnitude exata. Este repositório pode ser atualizado para incorporar revisões e feedback dos nossos avaliadores de artefatos. Tornaremos a VM publicamente acessível quando nossa avaliação de artefatos for concluída.
Empregamos o Claude (Opus 4.8) para empacotar nosso código em artefatos razoavelmente bem documentados e de alto desempenho (por exemplo, o do Windows estava um pouco lento). No entanto, o código, scripts e makefiles que ele gerou foram baseados em
As instruções para testar o código Linux abaixo são específicas para executar
comandos na VM. Por favor, consulte o código em Linux/.
A VM existe puramente por conveniência, para que a montagem de cada ataque não exija uma configuração de ambiente do zero ou um downgrade de kernel. O mecanismo subjacente demonstrado na VM é idêntico ao descrito no artigo, mas observe que não usamos a VM para produzir os números relatados no artigo. Os tempos absolutos podem diferir devido ao ambiente virtualizado e ao hardware subjacente.
Os achados são reproduzidos dentro de uma VM Debian 13 (linux-vm/), instalada
a partir da ISO live oficial do Debian com KDE Plasma 6 (Wayland) instalado com
um kernel anterior à correção do
fsnotify.
inotify-tools, cabeçalhos de desenvolvimento do Qt6 e pkexec estão
instalados. Nada mais é atualizado, e o kernel nunca é tocado após a instalação.
Por favor, NÃO execute apt upgrade nem tente atualizar o kernel. Esta
imagem de VM é deliberadamente antiga, não está atualizada e não possui os
últimos patches de segurança. Esta imagem de VM destina-se apenas a validação e
testes rápidos!
O código, os ataques e as demonstrações localizados dentro da VM estão
espelhados em Linux/.
Nota: Mencionamos como qual usuário executar os comandos no topo de cada
bloco de comando. Há o [host], que é a máquina hospedeira que executa a VM, o
[user], que é a vítima dos ataques na VM, e o [spyuser], que precisa ser
configurado e será o atacante na maioria dos ataques Linux.
A imagem de disco é fornecida como linux-vm-upload.qcow2, comprimida com zstd.
Renomeie-a para linux-vm.qcow2 antes de executar run.sh (que espera esse
nome de arquivo):
# Run As: [host]
cd linux-vm/
mv linux-vm-upload.qcow2 linux-vm.qcow2
./run.sh
Ler um qcow2 comprimido com zstd requer qemu-img/qemu-system-x86_64 versão
5.2 ou mais recente (2020+), verifique com qemu-img --version. Se você estiver
preso em um QEMU mais antigo e ele falhar ao abrir a imagem, descompacte-a em um
qcow2 plano primeiro:
qemu-img convert -O qcow2 linux-vm-upload.qcow2 linux-vm.qcow2
4 núcleos, 4GB de RAM, exibição GUI. Os logins são:
root, senha password,user, senha password,spyuser, senha password (não faça login como spyuser!)A VM fornecida já executa um kernel vulnerável e pré-patchado
(6.12.43+deb13-amd64), então nenhum downgrade é necessário para usá-la. Você
precisará do QEMU para executar esta imagem (que possui uma GUI). O artefato
está em /home/user/Linux-File-Notification-Attacks dentro da VM.
Um comando configura tudo do zero na VM: (i) uma conta spyuser sem
privilégios (não-sudo), (ii) sua própria cópia do diretório de artefatos (uma
conta sem privilégios separada não consegue, de outra forma, acessar o
diretório home do user), (iii) e todos os scripts tornados executáveis em
ambas as cópias.
# In the VM, Run As: [user]
sudo bash ~/Linux-File-Notification-Attacks/setup_attacks.sh
Cada ataque abaixo é executado como spyuser (su - spyuser, senha
password), exceto auth-ui-redress, que é executado como user (explicado
abaixo).
Prova que notificações de operações de arquivo são entregues para arquivos que não podem ser lidos diretamente, desde que seu diretório pai seja legível.
# Run As: [spyuser]
# To switch to spyuser, in a new terminal type `su - spyuser`. The password
# is `password`.
cd ~/Linux-File-Notification-Attacks/unreadable-file-bypass
./watch-syslog.sh
Deixe-o em execução, então gere uma linha de log de outro terminal como user:
# Run As: [user]
logger "hello"
Esta imagem Debian 13 não possui rsyslog, então não há arquivo /var/log/syslog
como mostrado no artigo. O script recorre a monitorar
/var/log/journal/<machine-id>/ em vez disso. É a mesma ideia, pois os arquivos
.journal sendo monitorados pertencem a root (usuário) e systemd-journal
(grupo), nenhum dos quais é spyuser.
Mede o atraso de notificação do inotify.
# Run As: [user], ensure numpy is installed (or pip3)
sudo apt install python3-numpy
# Run As: [spyuser]
cd ~/Linux-File-Notification-Attacks/temporal-resolution
./run.sh
watcher abre um watch do inotify em um arquivo de teste e marca o timestamp de
cada IN_ACCESS que recebe. accessor lê esse mesmo arquivo 1000 vezes com um
atraso aleatório de 5-10ms entre leituras, marcando o timestamp de cada leitura
ele mesmo. stats.py compara as duas gravações de timestamp e imprime o
atraso médio/desvio padrão/mínimo entre a leitura ocorrer e a notificação
chegar, ou seja, a resolução temporal do inotify.
Não é o ataque completo do artigo, mas apenas a primitiva de prova de conceito
de filtragem na qual o ataque é construído: para cada tecla pressionada em
qualquer lugar do sistema, imprime uma notificação com timestamp, sem nunca ler
/dev/input diretamente.
# Run As: [spyuser]
cd ~/Linux-File-Notification-Attacks/inter-keystroke-timing
make
./find-keyboard.sh
Digite em qualquer janela (talvez um novo terminal como user). Cada tecla
pressionada imprime uma linha KEYPRESS. A janela de supressão (que escolhemos
heurísticamente para esta demonstração é de 130ms) mescla vários eventos
IN_ACCESS gerados por um único pressionamento físico de tecla. Na prática,
notamos que esta janela é diferente para hardwares diferentes (por exemplo,
teclados mecânicos, estilos de digitação).