← На главную

Неизвестный через CVE-2023-38198 в acme.sh подделал TLS-сертификаты

30.05.2026 19:47 · hackernews

TLS — это протокол, который отвечает за значок замка в браузере. В основе лежат шифровальные числа: одни секретные, другие публичные. Их можно комбинировать, чтобы выстроить цепочку доверия. На вершине этой цепочки — корневой удостоверяющий центр (CA). Именно его «доверяют» по умолчанию, а остальные наследуют этот статус.

Проблема в том, что TLS-перехват с использованием сертификатов, подписанных корневым CA, — это не теория заговора, а реальность. И однажды кто-то забыл продлить сертификат для такого законного перехвата. Пользователи увидели огромное предупреждение безопасности, и началось расследование.

Суть в том, что 18 апреля 2023 года неизвестный начал выпускать SSL/TLS-сертификаты. Ключевая улика — acme.sh. Это shell-скрипт для автоматизации работы с протоколом ACME. Он работал на сервере jabber.ru, продлевая сертификаты по таймеру. Примерно в то же время в acme.sh нашли уязвимость удалённого выполнения кода — CVE-2023-38198. Исправление вышло 9 июня 2023 года, но 18 апреля сервер jabber.ru использовал уязвимую версию.

Уязвимость обнаружили в ACME challenge http-01. Поле Token содержало команду с инъекцией. Там была хитрость с переопределением разделителя полей ввода (IFS=^), чтобы упаковать shell-команду без пробелов. Автор статьи не смог воспроизвести этот трюк — возможно, HiCA (CA, который этим злоупотреблял) менял полезные нагрузки по ходу дела.

Тогда автор пошёл своим путём. Он использовал echo|nl — хитрый способ получить пробел без пробела. Получился такой payload: base64-строка с питоновским кодом декодируется и передаётся в python3. Это stager — он подключается к серверу, читает 4096 байт и выполняет код в памяти. Проблема только в размере: максимальная длина имени файла в Linux — 255 байт, а эксплойт пишется прямо в имя файла. Поэтому пришлось всё гольфить.

В итоге на машине жертвы запускается python3 без ошибок, а acme.sh висит и ждёт. Процесс выглядит безобидно: sh ./acme.shpython3. Никаких артефактов — /tmp чистится при перезагрузке.

Вывод: кто-то проводил законный перехват трафика, выпускал фальшивые сертификаты, но попался из-за просрочки. И одновременно была уязвимость, которой злоупотребляли. Самое слабое звено — не протокол ACME, а софт, который его реализует. И пока оператор не ошибётся, такие штуки остаются легендами. После инцидента Hugo Landau написал блог о том, как защититься от более компетентного противника, который может всё, кроме взлома самой машины жертвы.

Читать оригинал →