← На главную

Уязвимость в Exим позволяет украсть данные пользователей через DKIM

12.05.2026 17:52 · hackernews

Текст, который вы предоставили, представляет собой подробный технический анализ (разбор полетов/взлома) критической уязвимости в почтовом сервере Exim. Текст обрывается в самом интересном месте — описании стратегии эксплуатации.

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

Это классическая проблема Use-After-Free (UAF) в сочетании с уязвимостью выделения памяти через пользовательские данные. 1. Сценарий: Сторонний отправитель (клиент) вызывает ошибку в TLS-сессии (EOF) или принудительное закрытие соединения. 2. Освобождение: Функция tls_close освобождает буфер передачи (state->xfer_buffer) в POOL_MAIN. 3. Использование после освобождения: Логика программы не понимает, что соединение закрыто, и продолжает использовать старый указатель, вызывая tls_ungetc. Эта функция записывает данные в уже освобожденный буфер. 4. Запуск DKIM: Параллельно запускается механизм верификации DKIM, который также потребляет память из POOL_MAIN (и других пулов), создавая условия для перезаписи метаданных свободного блока.

В вашем тексте оборвалась фраза:

"As far as I could tell, that was the only user-controlled"

Финиширование этой мысли: Это был единственный пользовательский ввод, который мог влиять на размер выделенного блока в пуле POOL_MAIN. Стратегия заключалась в том, чтобы манипулировать этим размером, чтобы переполнить или изменить метаданные следующего блока памяти.

  1. Целевая структура: В памяти существует блок storeblock, который содержит:

    • Указатель на следующий блок (next) — 8 байт.
    • Поле размера (length) — 8 байт.
    • Полезная нагрузка.

    Формат: [next_ptr (8B)] [length (8B)] [payload]

  2. Механизм переполнения (The Overflow):

    • Эксплойт отправляет команду MAIL FROM с очень длинным комментарием (например, AAAA...AAAA).
    • Парсер Exim вычисляет длину строки включая комментарий.
    • Выделение памяти происходит в POOL_TAINT_MAIN (специальный пул для атак через SMTP-команды), но при определенных условиях (например, если пул истощен или из-за особенностей реализации store_get после сброса), данные могут попасть в POOL_MAIN или соседний блок.
    • Когда срабатывает UAF и память освобождается, контроллер эксплойта инициирует DKIM-верификацию (или другой код, работающий в POOL_MAIN).
    • DKIM требует выделения памяти для хеширования данных. Выделение происходит "вперед" (bump allocator).
    • Если предыдущий (освободившийся) блок был "отложен" (retained) или если указатель сместился так, что новая выкладка начинается внутри старого освобожденного блока, новый код записи (от DKIM или логики исправления CRLF) может перезаписать поле length следующего блока.
  3. Результат изменения length:

    • Эксплойт записывает в поле length несуществующее огромное число (например, 0x3fe00xa3fe0).
    • При следующем выделении памяти (store_get) для реальной части сообщения, алгоритм bump-allocator берет блок, начинающийся после освобожденного.
    • Однако, из-за фальшивого length, память считывается до конца фальшивого диапазона.
    • Если этот диапазон накладывается на соседний блок (состоящий из полезных данных пользователя), данные следующего блока "смещаются" или "раздавливаются".
    • Флаг (Flag): Обычно в таких CTF или PoC разыскиваются конкретные байты в мета-данных или выполнение кода, если в освобожденный блок попадает стек или буфер выполнения. В данном контексте (Exim) цель — скорее всего, подмена данных в соседнем блоке, что позволяет читать данные других пользователей или перезаписать таблицы маршрутизации/ACL.
  4. Вторая сессия: Текст упоминает: "start a second TLS session". Это подразумевает переполнение через буфер обмена (heap spraying). Создавая много сессий или используя одну сессию с большими буферами, атакующий пытается найти позицию в хипе, где данные атакующего перекрываются с данными, которые нужно прочитать или изменить.

Этот текст описывает этап разработки эксплойта для CVE-2024-XXXX (вероятно, речь идет о реальных уязвимостях Exim, выпущенных недавно, возможно, связанных с DKIM или TLS обработкой).

Ключевой момент: Атакующий не получает прямого исполнения кода через этот механизм напрямую, а скорее читает содержимое памяти (Information Disclosure) или вызывает крах (DoS), либо в более сложных сценариях использует это для подмены данных конфигурации. Однако, если рядом лежит стек с кодом или если хип используется совместно (что редкость в однопроцессных системах, но возможно в пулах), это может привести к Remote Code Execution (RCE) через переполнение стека, который будет "подготовлен" через манипуляции с хипом.

В контексте вашей задачи: Текст останавливается на этапе планирования "гонки" (race condition) между освобождением памяти и перезаписью метаданных размером следующего блока. Эксплойт должен быть построен так, чтобы DKIM-код (или другой код) заполнил освобожденный блок и изменил length соседнего блока, используя комментарий в SMTP-запросе как точный инструмент контроля над размером выделенного диапазона.

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