
Prova de Conceito para CVE-2025-40778: envenenamento de cache DNS no BIND 9 via registros não solicitados da Seção Additional.
Esta vulnerabilidade permite que um atacante corrompa o cache DNS de um resolvedor BIND, forçando usuários legítimos a serem redirecionados para endereços IP maliciosos sem que eles saibam.
O ataque depende da exploração da confiança. A Vítima confia no Resolvedor, e o Resolvedor (BIND) confia nas respostas que recebe dos Servidores Autoritativos. A falha existe porque o BIND processa e armazena em cache dados não solicitados fornecidos na seção ADDITIONAL de uma resposta DNS, mesmo que esses dados pertençam a um domínio completamente diferente e não solicitado.
A preparação: O Atacante controla um servidor DNS Autoritativo malicioso para um domínio específico (por exemplo, poc.lab). O Atacante espera que o Resolvedor alvo (BIND) consulte esse domínio.
A injeção: Quando o Resolvedor consulta o servidor do Atacante por poc.lab, o Atacante responde com uma resposta legítima para poc.lab, mas inclui uma resposta não solicitada na seção ADDITIONAL para um domínio diferente (no nosso exemplo é www.hacker.com, mas poderia ser qualquer domínio legítimo, como facebook.com) apontando para um endereço IP malicioso.
O envenenamento: Devido à vulnerabilidade, o Resolvedor aceita o registro "Additional" não solicitado e o armazena em seu cache. Ele não verifica se o Atacante não tem autoridade sobre o domínio não solicitado.
A consulta da Vítima: Quando a Vítima consulta posteriormente o Resolvedor pelo domínio não solicitado (www.hacker.com), o Resolvedor retorna o registro envenenado de seu cache, redirecionando a Vítima para o endereço IP malicioso controlado pelo Atacante.
[!IMPORTANT]
Principais Conclusões deste PoC
Ataque Indireto: A Vítima nunca se comunica diretamente com o Atacante.
Comprometimento da Âncora de Confiança: A máquina da Vítima está funcionando corretamente; é a infraestrutura (DNS) que está mentindo.
O Mecanismo: O exploit aproveita o processamento da seção Additional para injetar registros que nunca foram solicitados.
[!CAUTION]
Este PoC é apenas para fins educacionais. O uso não autorizado destas informações para comprometer sistemas é ilegal e antiético. Sempre obtenha permissão antes de testar ou explorar vulnerabilidades em qualquer rede ou sistema.
As seguintes máquinas virtuais (VMs) são usadas nesta demonstração:
Os seguintes comandos são para a configuração do BIND 9.21.12 em um sistema baseado em Debian para demonstrar a vulnerabilidade CVE-2025-40778.
[!NOTE] Esta demonstração usa o BIND 9.21.12, que é uma das versões afetadas por esta vulnerabilidade.
Outras faixas conhecidas de versões afetadas incluem:
- 9.11.0 – 9.16.50
- 9.18.0 – 9.18.39
- 9.20.0 – 9.20.13
- 9.21.0 – 9.21.12
Os seguintes comandos instalarão as dependências necessárias, baixarão o código-fonte do BIND 9.21.12, o compilarão e o instalarão em nosso sistema.
sudo apt install -y build-essential pkg-config perl meson ninja-build libssl-dev libuv1-dev liburcu-dev libcap-dev liblmdb-dev libnghttp2-dev
cd /usr/local/src
sudo wget -O bind-9.21.12.tar.xz https://isc.mirrorservice.org/bind/9.21.12/bind-9.21.12.tar.xz
sudo tar -xf bind-9.21.12.tar.xz
cd bind-9.21.12
sudo meson setup build --prefix=/usr/local --sysconfdir=/etc --localstatedir=/var
sudo ninja -C build
sudo ninja -C build install
echo /usr/local/lib/x86_64-linux-gnu | sudo tee /etc/ld.so.conf.d/bind9-local.conf
sudo ldconfig
ldconfig -p | grep 'libdns-9.21.12' || true
/usr/local/sbin/named -v
Aqui está a saída esperada do último comando:
> student@student:/usr/local/src/bind-9.21.12$ /usr/local/sbin/named -v
BIND 9.21.12 (Development Release) <id:9bafc35>
Antes de iniciar o servidor BIND, precisamos criar um usuário e um grupo dedicados para executar o serviço named:
sudo groupadd --system named 2>/dev/null || true
sudo useradd --system --no-create-home --home /nonexistent --shell /usr/sbin/nologin --gid named named 2>/dev/null || true
Como esta instalação do BIND não vem com arquivos de configuração padrão, precisamos criar os diretórios necessários manualmente:
sudo mkdir -p /etc/bind
sudo mkdir -p /var/cache/bind
sudo mkdir -p /var/log/named
sudo mkdir -p /var/run/named
sudo chown -R named:named /var/cache/bind /var/log/named /var/run/named
sudo chmod 750 /var/cache/bind /var/log/named /var/run/named
O próximo passo é criar o arquivo de configuração principal /etc/bind/named.conf com o conteúdo abaixo:
include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.logging";
include "/etc/rndc.key";
Para a configuração de opções, crie o arquivo /etc/bind/named.conf.options com o seguinte conteúdo:
options {
directory "/var/cache/bind";
recursion yes;
allow-recursion { 192.168.174.0/24; };
allow-query { 192.168.174.0/24; };
listen-on { 192.168.174.131; 127.0.0.1; };
listen-on-v6 { none; };
dnssec-validation no;
forwarders {
1.1.1.1;
8.8.8.8;
};
minimal-responses no;
// for manual start
pid-file "/var/run/named/named.pid";
};
Para configurar uma zona de encaminhamento (forward zone) para o domínio poc.lab encaminhar consultas para o servidor DNS do atacante em 192.168.174.130 na porta padrão 53, precisamos editar o arquivo /etc/bind/named.conf.local da seguinte forma:
zone "poc.lab" {
type forward;
forward only;
forwarders { 192.168.174.130; };
};
Para a configuração de logging, crie o arquivo /etc/bind/named.conf.logging contendo:
logging {
channel queries_file {
file "/var/log/named/queries.log" versions 3 size 20m;
severity info;
print-time yes;
print-category yes;
};
channel default_stderr {
stderr;
severity info;
print-time yes;
print-category yes;
};
category queries { queries_file; };
category default { default_stderr; };
};
Por fim, precisamos configurar o RNDC:
sudo /usr/local/sbin/rndc-confgen -a -c /etc/bind/rndc.key
sudo chown root:named /etc/bind/rndc.key
sudo chmod 640 /etc/bind/rndc.key
Primeiramente, precisamos garantir que a porta 53 não esteja sendo usada por nenhum outro serviço (no nosso caso, tivemos que desativar o systemd-resolved):
sudo systemctl disable --now systemd-resolved || true
sudo ss -lunp | grep ':53' || true # To verify that port 53 is free
Finalmente, podemos iniciar o servidor BIND usando o seguinte comando:
sudo /usr/local/sbin/named -g -u named -c /etc/bind/named.conf
[!TIP]
Para verificar se o BIND está funcionando corretamente, podemos usar o seguinte comando:
ss -lunpt | grep :53
Para a máquina da vítima, precisamos configurá-la para usar o servidor BIND como resolvedor DNS. Além disso, temos que desativar o systemd-resolved para evitar conflitos:
sudo systemctl disable --now systemd-resolved
Depois, podemos definir um servidor DNS estático usando os comandos:
sudo rm -f /etc/resolv.conf
sudo nano /etc/resolv.conf
> nameserver 192.168.174.129
> options timeout:1 attempts:1
sudo chattr +i /etc/resolv.conf #block overwrites
Na máquina do atacante, precisamos executar o script fornecido no repositório (attacker.py).
No nosso cenário, o atacante controla o domínio poc.lab. Quando consultado por ele ou qualquer subdomínio, ele adiciona um registro de resposta não solicitado (www.hacker.com) apontando para o seu endereço IP.
Quando a vítima consulta o domínio poc.lab, o servidor BIND encaminha a solicitação para o servidor DNS do atacante. O atacante responde com um registro de resposta não solicitado que envenena o cache do servidor BIND. Quando a vítima acessar www.hacker.com, ela será redirecionada para o endereço IP do atacante em vez do legítimo.
Aqui está uma demonstração da vítima consultando ambos os domínios:
student@student:~/Desktop$ dig www.poc.lab +noall +answer
www.poc.lab. 60 IN A 192.168.174.99
student@student:~/Desktop$ dig www.hacker.com +noall +answer
www.hacker.com. 60 IN A 192.168.174.130
Como mostrado acima, a consulta DNS da vítima por www.hacker.com retorna o endereço IP do atacante (192.168.174.130).
[!NOTE]
Este vídeo é uma demonstração da vulnerabilidade explicada: https://drive.google.com/file/d/1PATD0tUqw8-BipfSf6TkQQfnJBvV110Z/view?usp=sharing