FlawOpen

flawopen.com/Teardowns/cve-2026-31431-linux-algif-aead-copy-fail

● CVE-2026-31431 · CVSS 7.8 · Высокий
Исследования · FlawOpen

CVE-2026-31431: уязвимость Copy Fail в ядре Linux

Copy Fail — локальное повышение привилегий в пути AEAD интерфейса Linux AF_ALG. Оптимизация in-place смешивала отображения источника и назначения; исправление upstream возвращает обработку out-of-place, а CISA внесла CVE в KEV.[1], [2], [5]

💡 Простыми словами (ELI5)

Библиотекарю нужно отметить копию, но короткий путь ведёт карандаш к оригиналу. Оптимизация in-place позволяла записи для результата попасть на другую отображённую страницу. Исправление обрабатывает источник и назначение раздельно.[3], [8]

Ключевые понятия и термины

AF_ALG
Сокетный интерфейс Linux для криптографии из пользовательских процессов.[8], [3]
AEAD
Аутентифицированное шифрование с сопутствующими данными: шифрует данные и проверяет дополнительные незашифрованные метаданные.[8]
algif_aead
Реализация AF_ALG для AEAD, включая уязвимый путь обработки источника и назначения.[3]
Page cache
Кэш содержимого файлов в памяти ядра; запись в страницу может повлиять на чтение до записи на диск.[8]
CWE-1288 / CWE-669
В NVD указана CWE-1288 с источником классификации redhat-SADP; на странице Red Hat также указана эта CWE. Центр кибербезопасности Канады относит проблему к CWE-669. Это классификации, приписанные разным источникам, а не взаимозаменяемые метки.[11], [7], [5], [9], [10]

Связи со стандартами

Анализ первопричины

Изменение 72548b093ee3 2017 года добавило оптимизацию in-place в algif_aead. Источник и назначение могут находиться в разных отображениях. authencesn может записывать временные данные за пределами результата; in-place scatterlist могла направить запись на страницу page cache файла, переданного через splice(). Уведомление Linux CVE описывает исправление как возврат к обработке out-of-place с сохранением копирования связанных данных. Нужны локальный доступ и включённый уязвимый путь. CVSS 7,8 (AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H); это не удалённый неаутентифицированный вход.[1], [3], [8], [7], [9], [10]

Пошаговый сценарий атаки

Шаг 1

Локальный процесс достигает API

Процесс с локальным доступом запрашивает AEAD через AF_ALG, затем операцию обрабатывает algif_aead. Одна удалённая заявка не достигает интерфейса.[8], [7]

Шаг 2

Путь использует in-place

Реализация располагает источник и назначение так, будто они используют общие страницы, хотя отображения различаются.[8], [3]

Шаг 3

Запись выходит за границу результата

Во время authencesn временные данные могут попасть за пределы выхода и на страницу кэша файла, переданного через splice().[8]

Шаг 4

Ядро разделяет отображения

Исправление убирает ненужную сложность in-place, копирует связанные данные и возвращает обработку out-of-place.[1], [3]

Исходный код: Уязвимый vs Защищённый вариант

Концептуальное резюме, а не дословный код ядра или компилируемый патч. Исправление в основном отменяет 72548b093ee3, сохраняя копирование связанных данных, поскольку отображения различаются.[3], [2]

Фрагмент исходного кода: crypto/algif_aead.c (_aead_recvmsg)

УЯЗВИМАЯ РЕАЛИЗАЦИЯ
/* До исправления: выполнять криптографическую операцию на месте. */
rsgl_src = areq->first_rsgl.sgl.sg;

if (ctx->enc) {
    memcpy_sglist(areq->first_rsgl.sgl.sg, tsgl_src, processed);
    af_alg_pull_tsgl(sk, processed, NULL, 0);
} else {
    memcpy_sglist(areq->first_rsgl.sgl.sg, tsgl_src, outlen);
    /* Собрать и связать TX scatterlist для тега аутентификации. */
    areq->tsgl_entries = af_alg_count_tsgl(sk, processed, processed - as);
    /* ... */
}

aead_request_set_crypt(&areq->cra_u.aead_req, rsgl_src,
                       areq->first_rsgl.sgl.sg, used, ctx->iv);
БЕЗОПАСНЫЙ ИСПРАВЛЕННЫЙ ВАРИАНТ
/* После исправления: сохранять исходную scatterlist для каждого запроса. */
processed = used + ctx->aead_assoclen;
areq->tsgl_entries = af_alg_count_tsgl(sk, processed);
/* Выделить и инициализировать areq->tsgl, затем добавить в неё страницы TX. */
af_alg_pull_tsgl(sk, processed, areq->tsgl);
tsgl_src = areq->tsgl;

/* Копировать дополнительные данные, сохраняя источник и назначение раздельными. */
rsgl_src = areq->first_rsgl.sgl.sg;
memcpy_sglist(rsgl_src, tsgl_src, ctx->aead_assoclen);
aead_request_set_crypt(&areq->cra_u.aead_req, tsgl_src,
                       areq->first_rsgl.sgl.sg, used, ctx->iv);

Чек-лист по защите системы для инженеров

Источники