
BPF LSM blocker para CVE-2026-31431 (Copy Fail) — bloqueia binds AF_ALG authencesn em tempo de execução sem reinicializar
Prova de conceito de mitigação em tempo de execução para CVE-2026-31431 ("Copy Fail") — uma escalada de privilégios no kernel Linux via o template criptográfico authencesn em algif_aead.
Ao contrário do bloqueio de módulos, isto não requer reinicialização. Um programa BPF LSM intercepta socket_bind e bloqueia todos os binds AF_ALG AEAD — o subsistema explorado pelo Copy Fail. Isso impede bypasses via aninhamento de templates criptográficos (ex.: pcrypt(authencesn(...))). Outros usos de AF_ALG (hash, skcipher) não são afetados.
Tentativas bloqueadas são registradas em tempo real com PID, nome do processo e timestamp.
make doctor # verifica todos os pré-requisitos
git clone https://github.com/atgreen/block-copyfail.git
cd block-copyfail
make ubi8-build
sudo ./block-copyfail
O bloqueador permanece ativo até você pressionar Ctrl-C, então se desanexa de forma limpa.
Para compilar na sua própria máquina, você precisa de SBCL e Whistler (o compilador eBPF em Common Lisp):
git clone https://github.com/atgreen/whistler.git ~/git/whistler
make build
sudo ./block-copyfail
Compile dentro de um contêiner UBI8 para produzir um binário que roda em RHEL/CentOS/Alma/Rocky 8+, Fedora, Ubuntu 20.04+ e qualquer Linux com glibc 2.28 ou mais recente. Não é necessário SBCL ou Whistler no sistema de destino — basta copiar o binário e executá-lo.
make ubi8-build
scp block-copyfail root@server:
ssh root@server ./block-copyfail
Produz um arquivo .bpf.o padrão carregável por bpftool, libbpf ou qualquer carregador BPF:
make elf
sudo mkdir -p /sys/fs/bpf/copyfail
sudo bpftool prog loadall block-copyfail.bpf.o /sys/fs/bpf/copyfail autoattach
Para desanexar e remover:
sudo rm -rf /sys/fs/bpf/copyfail
Com o bloqueador em execução em um terminal, dispare um teste em outro:
python3 trigger-test.py
O script de teste tenta um bind AF_ALG AEAD (nenhum exploit é executado).
Saída esperada no terminal de teste:
BLOCKED: aead/authencesn(hmac(sha256),cbc(aes)) — [Errno 1] Operation not permitted
BLOCKED: aead/gcm(aes) — [Errno 1] Operation not permitted
ALLOWED: hash/sha256
ALLOWED: skcipher/cbc(aes)
Saída esperada no terminal do bloqueador:
Copy Fail blocker active — all AF_ALG AEAD binds blocked.
Other AF_ALG usage (hash, skcipher) unaffected.
Watching for blocked attempts. Press Ctrl-C to exit.
TIME PID COMMAND
---- --- -------
06:38:12 31337 python3
Sem o bloqueador em execução, o script de teste imprime ALLOWED para todos os quatro algoritmos.
O programa BPF lê 7 bytes de struct sockaddr_alg dos argumentos de socket_bind via bpf_probe_read_kernel, verifica se salg_family == AF_ALG e salg_type == "aead", e retorna -EPERM em caso de correspondência. Isso bloqueia todos os binds de algoritmos AEAD independentemente do aninhamento de templates. Eventos são enviados ao espaço do usuário via um ring buffer.
Escrito em Whistler, um dialeto de Common Lisp que compila diretamente para bytecode eBPF — sem necessidade de C, clang ou LLVM.
MIT