
Seccomp-основанное смягчение для CVE-2026-31431, LPE-уязвимости ядра Linux. Блокирует AF_ALG-сокеты через PAM-модуль и автономную обёртку, с автоматическим определением пропатченных ядер.
Лёгкая обратимая защита на основе seccomp для CVE-2026-31431 — локальной уязвимости повышения привилегий в подсистеме криптографии algif_aead / authencesn ядра Linux.
Тип: Локальное повышение привилегий (LPE)
Поражённый компонент: Ядро Linux crypto/algif_aead.c — операция AEAD на месте (in-place)
Примитив атаки: Контролируемая запись 4 байт в page cache любого читаемого файла через путь записи-черновика (scratch-write) алгоритма AEAD authencesn. Нацелившись на /etc/passwd, атакующий может изменить свой UID на 0 (root) и получить root-оболочку через su.
Затронутые ядра: Подтверждено на ядрах 6.12+, 6.17+, 6.18+, также воспроизведено на ядрах RHEL/CentOS 4.18/5.14.
Проверенные окружения: Rocky Linux 8 (ядро 4.18) и Rocky Linux 9 (ядро 5.14) — эксплойт полностью заблокирован, безопасное удаление подтверждено.
Корневая причина: Коммит 72548b093ee3 ввёл операцию AEAD на месте. Когда сцепленные (spliced) страницы page cache используются как целевой scatterlist, поле AAD seqno_lo ошибочно записывается обратно в page cache во время расшифровки AEAD.
Исправление в апстриме: Откат к операции AEAD вне места (out-of-place).
Данное решение состоит из двух компонентов:
PAM-модуль (pam_block_afalg.so) — основная защита. Загружается PAM при открытии сеанса (pam_sm_open_session), применяет seccomp BPF-фильтр, блокирующий socket(AF_ALG, ...) до запуска любого пользовательского кода. Это покрывает ВСЕ сеансы, прошедшие аутентификацию PAM: su -c, su -, SSH, вход через TTY и т. д.
Автономный бинарник (block_afalg) — опционально. Может оборачивать конкретные программы для сценариев без PAM (например, cron-задачи, systemd-сервисы, ручной вызов).
Seccomp-фильтр:
socket(AF_ALG, ...) (возвращает EACCES)setuid, su, sudo)Открытие PAM-сеанса (su, ssh, login и т. д.)
|
v
pam_block_afalg.so (pam_sm_open_session)
|
+-- Проверка: уязвимо ли ядро? (попытка socket(AF_ALG))
| |
| +-- Нет --> возврат PAM_SUCCESS (no-op)
| |
| +-- Да --> prctl(PR_SET_SECCOMP, BPF-фильтр)
| |
| +-- seccomp-фильтр активен на дочернем процессе sshd
| +-- наследуется оболочкой пользователя и ВСЕМИ дочерними процессами
| +-- socket(AF_ALG, ...) возвращает EACCES
v
Оболочка / команда пользователя выполняется с защитой seccomp
|
+-- su, sudo и все остальные системные вызовы работают нормально
+-- Блокируется только сокет AF_ALG
| Файл | Назначение |
|---|---|
pam_block_afalg.c | Исходный код PAM-модуля. Применяет seccomp-фильтр при открытии сеанса. |
gcc (для компиляции)libpam (во время выполнения, обычно предустановлена)# 1. Компиляция PAM-модуля
gcc -Wall -O2 -fPIC -shared -o pam_block_afalg.so pam_block_afalg.c \
/usr/lib64/libpam.so.0
# 2. Установка (автоматически добавляет конфигурации PAM в su, sshd, login)
sudo ./deploy.sh install
# 3. Проверка (обязательно НОВЫЙ сеанс)
cat /proc/self/status | grep Seccomp
# Должно показывать: Seccomp: 2
python3 -c "
import socket
try:
s = socket.socket(38,2,0); s.close()
print('VULNERABLE')
except OSError:
print('BLOCKED')
"
# Должно показывать: BLOCKED
# 4. Удаление
sudo ./deploy.sh remove
| Команда | Описание |
|---|---|
deploy.sh install | Компиляция PAM-модуля, установка в /lib64/security/, автоматическое добавление конфигураций PAM |
deploy.sh remove | Полное удаление: удаление модуля, очистка конфигураций PAM, удаление файлов |
Для сценариев без PAM используйте block_afalg напрямую:
# Компиляция
gcc -Wall -O2 -o block_afalg block_afalg.c
# Запуск команды с заблокированным AF_ALG
./block_afalg python3 your_script.py
./block_afalg bash
python3 -c "
import socket
try:
s = socket.socket(38, socket.SOCK_SEQPACKET, 0)
s.close()
print('VULNERABLE: AF_ALG socket available')
except:
print('SAFE: AF_ALG socket blocked or unavailable')
"
# Проверка статуса seccomp
cat /proc/self/status | grep Seccomp
# Seccomp: 0 = не защищено
# Seccomp: 2 = защищено
# Тест сокета AF_ALG
python3 -c "
import socket
try:
s = socket.socket(38,2,0)
s.close()
print('AF_ALG available - NOT protected')
except OSError:
print('AF_ALG blocked - PROTECTED')
"
# Проверка журналов PAM
grep pam_block_afalg /var/log/secure
# Должно показывать: seccomp filter applied, AF_ALG blocked
__NR_socket на x86_64). Для других архитектур необходимо обновить номер системного вызова.exec() без PAM не покрываются (используйте block_afalg для таких случаев).remove.yum update kernel, затем удалите модуль.Этот инструмент предоставляется только для авторизованного тестирования безопасности и защитных целей. Используйте только на системах, которыми вы владеете или на оценку которых у вас есть явное разрешение.
pam_minimal.h | Минимальные определения типов PAM (компилируется без pam-devel). |
block_afalg.c | Автономный бинарник-обёртка seccomp. Для использования вне PAM. |
deploy.sh | Скрипт развёртывания. Компилирует, устанавливает и управляет PAM-модулем. |
deploy.sh status | Показ состояния установки, конфигураций PAM, статуса ядра |