
Минимальная среда воспроизведения на основе Docker для уязвимости double-free до аутентификации в OpenSSH 9.1p1 (CVE-2023-25136), демонстрирующая повреждение памяти и отказ в обслуживании через PoC-клиент на Python.
Данный проект предоставляет минимальную локальную экспериментальную среду для воспроизведения уязвимости повреждения памяти double free до аутентификации в OpenSSH 9.1p1 (CVE-2023-25136) и наблюдения за эффектом аварийного завершения серверного процесса (DoS).
Примечание: официальные и основные анализы сходятся во мнении, что при конфигурации безопасности по умолчанию данную уязвимость «сложно реально эксплуатировать для удалённого выполнения кода»; данная среда в первую очередь предназначена для демонстрации ошибки памяти и эффекта отказа в обслуживании.
Целевая машина (Target):
sshd--with-sandbox=no, отключающий песочницу seccomp22, наружу проброшен на порт 2222 хостовой машины (WSL)Машина атакующего (Attacker):
paramiko для запуска PoC, формирует определённый идентификатор SSH-клиента и инициирует рукопожатие до аутентификацииСтруктура каталога:
Dockerfile: собирает образ среды с уязвимым OpenSSH 9.1p1poc.py: минимальный PoC-клиент для запуска double free на этапе до аутентификацииПеред выполнением указанных ниже действий в этом каталоге убедитесь, что:
pipВыполните в этом каталоге:
docker build -t sshd-9.1p1-vuln .
docker run --rm -d --name sshd-vuln -p 2222:22 sshd-9.1p1-vuln
Пояснение:
--rm: контейнер автоматически удаляется после остановки--name sshd-vuln: имя контейнера-p 2222:22: проброс порта 22 внутри контейнера на порт 2222 хостовой машиныdocker ps
Должен отображаться вывод, подобный:
CONTAINER ID IMAGE COMMAND STATUS PORTS
xxxxxx sshd-9.1p1-vuln "/usr/sbin/sshd -D…" Up ... 0.0.0.0:2222->22/tcp
Выполните в этом каталоге:
pip install paramiko
poc.py использует paramiko.Transport для активного установления соединения с целевым SSH-сервером и на этапе до аутентификации подделывает идентификатор клиента, пытаясь запустить double free.
Ключевые особенности:
127.0.0.1:2222 (то есть локальный Docker-контейнер)SSH-2.0-PuTTY_Release_0.64-t/--target: IP-адрес цели (по умолчанию 127.0.0.1)-p/--port: порт цели (по умолчанию 2222)-c/--client-id: поддельный идентификатор SSH-клиента--timeout: время ожидания (в секундах)-v/--verbose: вывод подробных сообщений об ошибкахУбедившись, что контейнер sshd-vuln запущен, выполните в этом каталоге:
python3 poc.py
Или с явным указанием параметров:
python3 poc.py -t 127.0.0.1 -p 2222 -v
Пример ожидаемого вывода клиента:
==============================================
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。
Пояснение:
Authentication failed или connection closed здесь являются ожидаемым поведением, поскольку дочерний процесс сервера до аутентификации может аварийно завершиться или активно закрыть соединение в процессе обработки.После запуска PoC просмотрите журналы контейнера на хостовой машине:
docker logs sshd-vuln
Ожидается вывод, подобный:
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
Здесь:
Invalid user: поскольку PoC использует пустое имя пользователя, OpenSSH зафиксировал попытку входа недопустимого пользователяfree(): double free detected in tcache 2: glibc обнаружил double free и завершил текущий дочерний процесс sshd; именно это и является наблюдаемым в данном эксперименте эффектом повреждения памяти/DoSПримечание: чтобы увидеть эту строку, мы отключили песочницу seccomp при сборке OpenSSH (
--with-sandbox=no); в противном случае песочница может перехватить аномальное поведение до double free и напрямую завершить дочерний процесс.
sshd продолжит порождать новые дочерние процессы для последующих соединений.