flawopen.com/Teardowns/cve-2026-31431-linux-algif-aead-copy-fail
CVE-2026-31431: уязвимость Copy Fail в ядре Linux
Copy Fail — локальное повышение привилегий в пути AEAD интерфейса Linux AF_ALG. Оптимизация in-place смешивала отображения источника и назначения; исправление upstream возвращает обработку out-of-place, а CISA внесла CVE в KEV.[1], [2], [5]
Библиотекарю нужно отметить копию, но короткий путь ведёт карандаш к оригиналу. Оптимизация in-place позволяла записи для результата попасть на другую отображённую страницу. Исправление обрабатывает источник и назначение раздельно.[3], [8]
Ключевые понятия и термины
AEAD- Аутентифицированное шифрование с сопутствующими данными: шифрует данные и проверяет дополнительные незашифрованные метаданные.[8]
algif_aead- Реализация AF_ALG для AEAD, включая уязвимый путь обработки источника и назначения.[3]
Page cache- Кэш содержимого файлов в памяти ядра; запись в страницу может повлиять на чтение до записи на диск.[8]
Связи со стандартами
- Ссылка CWE для слабого места, описанного в этом руководстве: CWE-669 CWE-1288
- CISA KEV — добавлено 2026-05-01 — CVE-2026-31431
Анализ первопричины
Изменение 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]
Пошаговый сценарий атаки
Запись выходит за границу результата
Во время authencesn временные данные могут попасть за пределы выхода и на страницу кэша файла, переданного через splice().[8]
Исходный код: Уязвимый 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);
Чек-лист по защите системы для инженеров
- ✓Обновите ядро через канал дистрибутива и подтвердите исправление
CVE-2026-31431в уведомлении пакета; общий номер upstream-версии недостаточен.[1], [5], [7] - ✓В первую очередь обновите хосты с общим ядром и недоверенными пользователями: многопользовательские системы, сборочные узлы и контейнерные узлы.[5], [7]
- ✓Если обновление невозможно, применяйте только документированную поставщиком ОС меру и проверьте её влияние; код может быть встроен в ядро.[5], [7]
- ✓Проверьте ядра и происхождение пакетов во всех образах, включая неизменяемые и LTS-ветки с backport-исправлениями.[5], [7]
- ✓Контейнеры используют ядро хоста; локальное повышение привилегий может ослабить изоляцию namespaces.[5], [8]
- ✓После исправления отслеживайте backport-обновления и ведите уязвимые хосты как задачи устранения; запись в KEV не заменяет патч.[1], [5]
Источники
- Linux kernel CVE notice for CVE-2026-31431
- Upstream stable patch: revert algif_aead to out-of-place operation
- Stable patch source with the algif_aead.c code diff
- CVE record and CVSS vector
- Canadian Centre for Cyber Security alert AL26-009
- CISA Known Exploited Vulnerabilities catalog entry
- Red Hat CVE analysis and affected product status
- Xint technical disclosure: Copy Fail — 732 Bytes to Root on Linux
- MITRE CWE-1288: Improper Validation of Consistency within Input
- MITRE CWE-669: Incorrect Resource Transfer Between Spheres
- NVD — CVE-2026-31431 weakness mapping (source: redhat-SADP)