Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
block-copyfail — BPF LSM блокировщик для CVE-2026-31431 (Copy Fail) — устранение без перезагрузки для OpenShift 4 | Kitploit
Инструменты/GitHubGitHub/mrunalp/block-copyfail
Оборонительные ИнструментыБезопасность контейнеровАнализ уязвимостейВиртуализация для безопасностиБезопасность облачных сред
GitHubmrunalp/block-copyfail

block-copyfail

BPF LSM блокировщик для CVE-2026-31431 (Copy Fail) — устранение без перезагрузки для OpenShift 4

Репозиторий
12104 месяцев назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

Краткое описание

CVE-2026-31431 («Copy Fail») — это уязвимость повышения привилегий в ядре Linux в криптографическом интерфейсе algif_aead. Злоумышленник использует сокеты AF_ALG с алгоритмом authencesn и splice() для повреждения произвольных файлов в кэше страниц ядра — включая setuid-бинарники, такие как /usr/bin/su.

В этом документе представлено исправление без перезагрузки с использованием DaemonSet на основе BPF LSM, который блокирует все привязки AF_ALG AEAD — подсистему, эксплуатируемую Copy Fail. Это предотвращает обходы через вложенность криптошаблонов (например, pcrypt(authencesn(...))). Другое использование AF_ALG (hash, skcipher) не затрагивается. Протестировано комплексно на трёх отдельных кластерах OCP 4.22.

Быстрый старт

root@kitploit:~
# 1. Проверьте, что BPF LSM включён (в RHEL CoreOS 9.8 он включён по умолчанию)
oc debug node/<любой-узел> -- chroot /host cat /sys/kernel/security/lsm
# Должен содержать "bpf"

# 2. Разверните namespace и предоставьте привилегированный SCC
oc apply -f daemonset.yaml

# 3. Pod'ы DaemonSet запустятся автоматически на всех узлах

# 4. Проверка
oc get pods -n block-copyfail     # На всех узлах должен быть статус Running
oc logs -n block-copyfail -l app=block-copyfail
# Ожидается: "block-copyfail: blocker active — all AF_ALG AEAD binds blocked"

Без перезагрузок. Без drain узлов. Без перезапусков pod'ов. Защита действует немедленно и охватывает все процессы на всех узлах (100% покрытие).

Содержание

  1. Как работает эксплойт
  2. Подтверждение уязвимости в вашем кластере
  3. Развёртывание DaemonSet на основе BPF LSM
  4. Проверка после развёртывания
  5. Сборка образа из исходного кода
  6. Удаление

Как работает эксплойт

Эксплойт объединяет три функции ядра:

  1. Сокет AF_ALG — создаёт пользовательский дескриптор для криптографии ядра через socket(AF_ALG, SOCK_SEQPACKET, 0)
  2. Привязка AEAD — привязывается к authencesn(hmac(sha256),cbc(aes)), конкретному алгоритму аутентифицированного шифрования
  3. splice() + sendmsg() — ядро некорректно выполняет операцию «на месте», где отображения страниц источника и назначения различаются, повреждая кэш страниц файла, доступного только для чтения

Злоумышленник повреждает /usr/bin/su в кэше страниц (без права записи в файл), а затем выполняет его для получения root.


Подтверждение уязвимости в вашем кластере

Создайте новый namespace cve-2026-31431-test в вашем кластере и запустите тестовый скрипт, применив манифесты из каталога test:

root@kitploit:~
oc apply -f test

Проверьте результаты:

root@kitploit:~
oc wait pod/cve-test -n cve-2026-31431-test \
  --for=jsonpath='{.status.phase}'=Succeeded --timeout=120s
oc -n cve-2026-31431-test logs -l app=cve-2026-31431-test

В уязвимом кластере вы увидите:

root@kitploit:~
=== CVE-2026-31431 Vulnerability Test ===
Target: /usr/bin/su

Original SHA256: 8969560ae8e6e21c6184c1451f59418822ee69dd5d946d71987b55236bbc0feb
Attempting splice + AF_ALG page-cache corruption (160 bytes in 40 chunks)...
After SHA256:    30b0f5b5a054c4df65b48ca792863bf7054b4d793f15f57163792ba6c2b151ae

PAGE CACHE CORRUPTION: YES - /usr/bin/su was modified in the page cache

Attempting to execute corrupted /usr/bin/su ...
  exit code: 0

RESULT: PARTIALLY MITIGATED
  Page-cache corruption succeeded (kernel is vulnerable)
  Privilege escalation blocked (allowPrivilegeEscalation=false)

Шаг 4: Очистка

root@kitploit:~
oc delete namespace cve-2026-31431-test

Развёртывание DaemonSet на основе BPF LSM

Подход BPF LSM перехватывает socket_bind на уровне ядра и блокирует все привязки AF_ALG AEAD независимо от вложенности шаблонов. Он основан на block-copyfail, переписан на C с использованием libbpf для развёртывания в OCP.

Предварительные требования

BPF LSM должен быть включён. В RHEL CoreOS 9.8 (OCP 4.22) он включён по умолчанию. Проверьте с помощью:

root@kitploit:~
oc debug node/<любой-узел> -- chroot /host cat /sys/kernel/security/lsm

Ожидаемый вывод включает bpf:

root@kitploit:~
lockdown,capability,landlock,yama,selinux,bpf

Если bpf отсутствует, потребуется одноразовый MachineConfig (это единственный сценарий, требующий перезагрузки):

root@kitploit:~
apiVersion: machineconfiguration.openshift.io/v1
kind: MachineConfig
metadata:
  labels:
    machineconfiguration.openshift.io/role: worker
  name: 99-enable-bpf-lsm
spec:
  kernelArguments:
    - lsm=lockdown,capability,selinux,bpf

Шаг 1: Создайте namespace, предоставьте SCC и разверните

Создайте новый namespace block-copyfail, предоставьте SCC и разверните DaemonSet, применив манифест daemonset.yaml. Привилегированный SCC должен быть предоставлен до создания pod'ов DaemonSet, иначе создание pod'ов завершится ошибками проверки SCC.

root@kitploit:~
oc apply -f daemonset.yaml

Шаг 2: Дождитесь запуска pod'ов на всех узлах

root@kitploit:~
oc get pods -n block-copyfail -o wide

Ожидается: по одному pod'у на узел, все Running:

root@kitploit:~
NAME                   READY   STATUS    AGE   NODE
block-copyfail-2jhzf   1/1     Running   34s   ci-...-master-2
block-copyfail-4dfq7   1/1     Running   34s   ci-...-master-1
block-copyfail-c2ts8   1/1     Running   34s   ci-...-worker-c
block-copyfail-ctblk   1/1     Running   34s   ci-...-worker-a
block-copyfail-m26sx   1/1     Running   34s   ci-...-worker-b
block-copyfail-xsh6d   1/1     Running   34s   ci-...-master-0

Шаг 3: Проверьте, что блокировщик активен

root@kitploit:~
oc logs -n block-copyfail -l app=block-copyfail

Ожидается:

root@kitploit:~
block-copyfail: blocker active — all AF_ALG AEAD binds blocked

Проверка после развёртывания

Повторно запустите тот же тест эксплойта из раздела Подтверждение уязвимости.

После развёртывания DaemonSet на основе BPF LSM вывод будет следующим:

root@kitploit:~
=== CVE-2026-31431 Vulnerability Test ===
Target: /usr/bin/su

Original SHA256: 30b0f5b5a054c4df65b48ca792863bf7054b4d793f15f57163792ba6c2b151ae
Attempting splice + AF_ALG page-cache corruption (160 bytes in 40 chunks)...
  AF_ALG bind failed: [Errno 1] Operation not permitted

RESULT: CANNOT TEST - AF_ALG or splice not available/permitted

Журналы DaemonSet покажут заблокированную попытку:

root@kitploit:~
oc logs -n block-copyfail -l app=block-copyfail
root@kitploit:~
block-copyfail: blocker active — all AF_ALG AEAD binds blocked
block-copyfail: BLOCKED pid=16777    comm=python3 time=2026-05-01 16:37:23

Проверка, что другие алгоритмы не затронуты

Запустите verify-algos.py на узле, чтобы подтвердить, что все алгоритмы AEAD заблокированы, а другие типы AF_ALG (hash, skcipher) продолжают работать:

root@kitploit:~
oc debug node/<любой-узел> -- chroot /host python3 -c "
import socket
tests = [
    ('aead',     'gcm(aes)'),
    ('aead',     'ccm(aes)'),
    ('aead',     'rfc4106(gcm(aes))'),
    ('hash',     'sha256'),
    ('skcipher', 'cbc(aes)'),
    ('aead',     'authencesn(hmac(sha256),cbc(aes))'),
]
for t, n in tests:
    s = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
    try:
        s.bind((t, n))
        print(f'  ALLOWED  {t}/{n}')
    except OSError as e:
        print(f'  BLOCKED  {t}/{n} -- {e}')
    finally:
        s.close()
"

Ожидаемый вывод:

root@kitploit:~
  BLOCKED  aead/gcm(aes) -- [Errno 1] Operation not permitted
  BLOCKED  aead/ccm(aes) -- [Errno 1] Operation not permitted
  BLOCKED  aead/rfc4106(gcm(aes)) -- [Errno 1] Operation not permitted
  ALLOWED  hash/sha256
  ALLOWED  skcipher/cbc(aes)
  BLOCKED  aead/authencesn(hmac(sha256),cbc(aes)) -- [Errno 1] Operation not permitted

Это подтверждает, что BPF LSM блокирует все привязки AEAD, оставляя другие типы AF_ALG функциональными.


Сборка образа из исходного кода

Исходный код блокировщика BPF LSM находится в block-copyfail/:

root@kitploit:~
block-copyfail/
  block_copyfail.bpf.c     # Программа ядра BPF (хук LSM)
  block_copyfail.c          # Загрузчик пользовательского пространства (скелет libbpf)
  block_copyfail.h          # Общая структура событий
  Makefile                  # Конвейер сборки
  Dockerfile                # Многоэтапная сборка
  daemonset.yaml            # Манифест Namespace + DaemonSet
  trigger-test.py           # Быстрый скрипт проверки

Сборка и публикация:

root@kitploit:~
cd block-copyfail/
podman build -t quay.io/<org>/block-copyfail:latest .
podman push quay.io/<org>/block-copyfail:latest

Dockerfile использует многоэтапную сборку: Fedora с clang/bpftool/libbpf-devel для компиляции, UBI 9 minimal для образа выполнения (~122 МБ).


Удаление

Удаление DaemonSet немедленно снимает смягчение на всех узлах:

root@kitploit:~
oc delete -f daemonset.yaml
# или
oc delete namespace block-copyfail

Программа BPF автоматически отсоединяется при завершении процесса загрузчика. Перезагрузка или перезапуск pod'а не требуются.

Скачать инструмент