
Kubernetes DaemonSet для обнаружения и устранения CVE-2026-31431 (GHSA-2274-3hgr-wxv6) — LPE в algif_aead через чёрный список modprobe
Серьёзность: Высокая (CVSS 7.8 — CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H)
CVE-2026-31431 — это локальная уязвимость повышения привилегий в модуле algif_aead ядра Linux (интерфейс криптографических сокетов AF_ALG AEAD). Непривилегированный локальный пользователь может использовать некорректные операции с буфером на месте для получения полного доступа root. Все пулы узлов AKS, работающие на ядрах Linux до применения соответствующего исправления, потенциально уязвимы.
Модуль algif_aead не требуется для обычных рабочих нагрузок Kubernetes или AKS. Внесение его в чёрный список полностью устраняет поверхность атаки.
Один под запускается на каждом узле Linux. При запуске, а затем каждые 60 секунд каждый под:
Записывает /etc/modprobe.d/modprobe-CIS.conf на хосте со следующим содержимым:
install algif_aead /bin/false
blacklist algif_aead
Это предотвращает загрузку модуля при перезагрузке или через modprobe.
Проверяет /proc/modules (живой список модулей ядра хоста — общий для всех контейнеров) на наличие algif_aead.
Помечает узел Kubernetes меткой с результатом, чтобы вы могли выполнять запросы по всему кластеру:
| Значение метки | Значение |
|---|---|
mitigated | Модуль не загружен; применена конфигурация чёрного списка |
module-loaded | Модуль в настоящее время загружен — немедленно проведите расследование |
| Файл | Назначение |
|---|---|
rbac.yaml | Namespace, ServiceAccount, ClusterRole (get/patch узлов), ClusterRoleBinding |
configmap.yaml | Shell-скрипт устранения уязвимости, монтируемый в каждый под |
daemonset.yaml | Определение DaemonSet — один под на узел Linux |
kubectl, настроенный для целевого кластера AKSПримените манифесты по порядку:
kubectl apply -f rbac.yaml
kubectl apply -f configmap.yaml
kubectl apply -f daemonset.yaml
Дождитесь завершения развёртывания на всех узлах:
kubectl -n security-remediation rollout status daemonset/cve-2026-31431-remediator
kubectl get nodes -L vulnerability.aks.io/CVE-2026-31431
Ожидаемый вывод на чистом кластере:
NAME STATUS ROLES AGE VERSION CVE-2026-31431
aks-nodepool1-xxxxx-vmss000000 Ready <none> 4d v1.33.7 mitigated
aks-nodepool1-xxxxx-vmss000001 Ready <none> 4d v1.33.7 mitigated
# Список подов и назначенных им узлов
kubectl -n security-remediation get pods -o wide
# Просмотр журналов конкретного пода в реальном времени
kubectl -n security-remediation logs <pod-name> -f
Ожидаемый вывод журнала:
2026-05-01T01:33:36Z [INFO ] CVE-2026-31431 remediator starting on node: aks-nodepool1-...
2026-05-01T01:33:36Z [INFO ] Blacklist config written → /host/etc/modprobe.d/modprobe-CIS.conf
2026-05-01T01:33:36Z [INFO ] Node aks-nodepool1-...: 'algif_aead' is NOT loaded — blacklist config applied, node is mitigated.
2026-05-01T01:33:36Z [INFO ] Labeled node aks-nodepool1-...: vulnerability.aks.io/CVE-2026-31431=mitigated
2026-05-01T01:33:36Z [INFO ] Entering monitoring loop (interval: 60s)
kubectl -n security-remediation exec <pod-name> -- cat /host/etc/modprobe.d/modprobe-CIS.conf
Ожидаемое содержимое:
# CIS hardening – mitigate CVE-2026-31431 (GHSA-2274-3hgr-wxv6)
# Prevents algif_aead (AF_ALG AEAD) LPE from being loaded or exploited.
install algif_aead /bin/false
blacklist algif_aead
Если узел показывает module-loaded, модуль ядра в настоящее время активен, и узел может быть уже скомпрометирован. Немедленно изолируйте (cordon) и осушите (drain) узел для криминалистического анализа:
# Поиск затронутых узлов
kubectl get nodes -l vulnerability.aks.io/CVE-2026-31431=module-loaded
# Изоляция и осушение для расследования
kubectl cordon <node-name>
kubectl drain <node-name> --ignore-daemonsets --delete-emptydir-data
Примечание: Удаление DaemonSet не удаляет файл
/etc/modprobe.d/modprobe-CIS.confс узлов хоста. Этот файл намеренно оставляется на месте как постоянная мера укрепления ядра.
kubectl delete -f daemonset.yaml
kubectl delete -f configmap.yaml
kubectl delete -f rbac.yaml
Это удаляет DaemonSet, все его поды, ConfigMap, ServiceAccount, ClusterRole, ClusterRoleBinding и namespace.
kubectl label nodes --all vulnerability.aks.io/CVE-2026-31431-
Делайте это только в том случае, если у вас есть альтернативная мера устранения (исправленное ядро). Выполните на каждом узле или через привилегированный под:
rm -f /etc/modprobe.d/modprobe-CIS.conf
runAsUser: 0) — это требуется для записи в /etc/modprobe.d/ на хосте.capabilities.drop: ["ALL"]). Возможности ядра не требуются.readOnlyRootFilesystem: true. Записываемыми являются только смонтированные тома hostPath и emptyDir./etc/modprobe.d/ — не /etc, /proc или любой другой более широкий путь.curl и его общие библиотеки размещаются init-контейнером в emptyDir (/tools), чтобы основной контейнер мог обращаться к API Kubernetes без необходимости записи в rootfs.get и patch на nodes.