Restringir o userfaultfd
Um programa comum não pode mais usar o lado do kernel desta interface, que atacantes usaram para cronar seus movimentos com precisão. Programas que tratam a própria memória em espaço de usuário continuam funcionando.
Por que importa
A chamada de sistema userfaultfd deixa um programa tratar faltas de página por conta própria. Atacantes a usaram para pausar o kernel num momento exato, alargando uma janela de tempo pequena o bastante para vencer uma corrida num erro como um use-after-free. Tirar a forma kernel dessa chamada de usuários comuns dificulta muitas dessas explorações.
Como funciona
Define vm.unprivileged_userfaultfd como 0. Segundo a documentação do kernel, usuários sem CAP_SYS_PTRACE passam a poder usar userfaultfd só para faltas que ocorrem em modo usuário, passando a flag UFFD_USER_MODE_ONLY. O acesso por /dev/userfaultfd pode ser concedido à parte.
Quem deve usar
Serve para quase todo desktop e servidor. Reveja se você usa migração a quente de máquinas virtuais, ferramentas de checkpoint e restore, ou outro software construído sobre userfaultfd.
O que você pode notar
Quase nunca aparece. Software que precisa do userfaultfd completo como usuário comum pode falhar com erro de permissão até receber /dev/userfaultfd ou rodar com mais direitos.
Verifique no seu computador
Leia o valor atual:
sysctl vm.unprivileged_userfaultfd Aplique à mão
Defina agora (até a próxima reinicialização):
sudo sysctl -w vm.unprivileged_userfaultfd=0 Mantenha após reinicializações, em um arquivo seu:
sudo tee /etc/sysctl.d/90-kernel-userfaultfd.conf <<'EOF'
vm.unprivileged_userfaultfd = 0
EOF
sudo sysctl --system Desfaça
Remova o arquivo e reinicie, ou volte ao valor antigo com sysctl -w.
Configurações relacionadas
Fontes
- Linux Hardening Guide (madaidans)
- 2.2.1