{"id":51119981,"url":"https://github.com/yandex-cloud-examples/yc-mk8s-copy-fail-mitigation","last_synced_at":"2026-06-25T01:01:26.120Z","repository":{"id":355806130,"uuid":"1225547505","full_name":"yandex-cloud-examples/yc-mk8s-copy-fail-mitigation","owner":"yandex-cloud-examples","description":"DaemonSet для митигации уязвимости CVE-2026-31431 (Copy Fail)","archived":false,"fork":false,"pushed_at":"2026-05-05T09:45:01.000Z","size":12,"stargazers_count":5,"open_issues_count":1,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-05T11:29:35.766Z","etag":null,"topics":["kubernetes","mk8s","security","yandex-cloud","yandexcloud"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/yandex-cloud-examples.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-30T11:47:33.000Z","updated_at":"2026-05-05T09:45:04.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/yandex-cloud-examples/yc-mk8s-copy-fail-mitigation","commit_stats":null,"previous_names":["yandex-cloud-examples/yc-mk8s-copy-fail-mitigation"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/yandex-cloud-examples/yc-mk8s-copy-fail-mitigation","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yandex-cloud-examples%2Fyc-mk8s-copy-fail-mitigation","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yandex-cloud-examples%2Fyc-mk8s-copy-fail-mitigation/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yandex-cloud-examples%2Fyc-mk8s-copy-fail-mitigation/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yandex-cloud-examples%2Fyc-mk8s-copy-fail-mitigation/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yandex-cloud-examples","download_url":"https://codeload.github.com/yandex-cloud-examples/yc-mk8s-copy-fail-mitigation/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yandex-cloud-examples%2Fyc-mk8s-copy-fail-mitigation/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34755063,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-24T02:00:07.484Z","response_time":106,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["kubernetes","mk8s","security","yandex-cloud","yandexcloud"],"created_at":"2026-06-25T01:01:26.038Z","updated_at":"2026-06-25T01:01:26.108Z","avatar_url":"https://github.com/yandex-cloud-examples.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# Copy Fail / Dirty Frag Mitigation for Yandex Managed Kubernetes\n\nАвтоматическое применение митигации для уязвимостей `CVE-2026-31431`, `CVE-2026-43284` и `CVE-2026-43500` в Linux kernel на всех worker-нодах Yandex Managed Kubernetes кластера.\n\n## Описание уязвимости\n\n**Идентификатор CVE (CVE ID):** `CVE-2026-43284`, `CVE-2026-43500`\n\n**Ссылка на CVE:** https://nvd.nist.gov/vuln/detail/CVE-2026-43284\n\n**Исходный отчет:**\n- Dirty Frag (PoC и write-up): https://github.com/V4bel/dirtyfrag\n- Copy Fail 2: Electric Boogaloo (PoC xfrm-ESP): https://github.com/0xdeadbeefnetwork/Copy_Fail2-Electric_Boogaloo\n- Рассылка oss-security: https://www.openwall.com/lists/oss-security/2026/05/07/8\n\n**Краткое описание:**\n\nDirty Frag - это класс логических уязвимостей в ядре Linux, позволяющий непривилегированному локальному пользователю получить права суперпользователя (`root`). Эксплуатация объединяет два независимых page-cache write-примитива в подсистемах `xfrm-ESP` и `RxRPC`, каждый из которых самодостаточен для повышения привилегий.\n\n`Copy Fail 2: Electric Boogaloo` - независимый PoC, эксплуатирующий `xfrm-ESP`-примитив (`CVE-2026-43284`). По классу уязвимости он аналогичен исходному `Copy Fail` (`CVE-2026-31431`), поэтому этот DaemonSet сохраняет митигацию и для исходного `AF_ALG`-сценария, и для новых вариантов `Dirty Frag`.\n\n**Атака:**\n- не требует удалённого доступа - только непривилегированный локальный аккаунт\n- является детерминистическим логическим багом без race condition - успешна с первой попытки\n- не приводит к `kernel panic` при неудачной эксплуатации\n- может быть использована как примитив побега из контейнера на хост, поскольку `page cache` общий для всего узла\n\nКорневая причина обоих вариантов одна: при использовании `splice()` / `MSG_SPLICE_PAGES` ядро помещает страницы `page cache` напрямую во фрагменты сокетных буферов (`skb`). Подсистемы `xfrm-ESP` и `RxRPC` выполняют дешифрование in-place над такими фрагментами, не проверяя, являются ли они приватными. В результате атакующий получает контролируемую запись в `page cache` любого читаемого файла.\n\n**Затронутые технологии:**\n- Ядро Linux, подсистема `net/ipv4/esp4.c` / `net/ipv6/esp6.c` (`xfrm-ESP`)\n- Ядро Linux, подсистема `net/rxrpc/rxkad.c` (`RxRPC` / `RxKAD`)\n- Системные вызовы `splice()` / `vmsplice()` в связке с UDP-сокетами (`ESP-in-UDP`) и `AF_RXRPC`\n- Отдельно сохраняется митигация исходного `Copy Fail` (`CVE-2026-31431`) через блокировку `AF_ALG` (`algif_aead`)\n\nУязвимость напрямую не затрагивает `AF_ALG` (`algif_aead`) как часть `Dirty Frag` - это отдельная уязвимость `Copy Fail` (`CVE-2026-31431`). Также напрямую не затрагиваются `dm-crypt` / `LUKS`, `kTLS`, `in-kernel TLS` и `IPsec` в режиме tunnel без UDP-инкапсуляции.\n\n**Вектор атаки и уровень опасности согласно CVSS v.3.1:**\n\nБазовая оценка: на момент публикации не присвоена.\n\nПо характеру уязвимость аналогична `Copy Fail` (`CVE-2026-31431`, `7.8 HIGH`, `CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H`) - это локальное повышение привилегий без race condition.\n\n## Что делает этот фикс\n\nDaemonSet автоматически на каждой worker ноде кластера:\n\n1. **Проверяет доступность `AF_ALG`** - выполняет быстрый тест для исходного сценария `Copy Fail`\n2. **Блокирует уязвимые модули** - создает `/etc/modprobe.d/blacklist-lpe.conf` с правилами для `algif_aead`, `esp4`, `esp6` и `rxrpc`\n3. **Выгружает модули** - выполняет `rmmod` для `algif_aead`, `esp4`, `esp6` и `rxrpc`, если они загружены\n4. **Сбрасывает `page cache` и верифицирует конфигурацию** - очищает кэши и проверяет наличие конфигурационного файла\n5. **Мониторит состояние** - каждый час проверяет наличие конфигурации и повторно выгружает модули при необходимости\n\n## Быстрый старт\n\n### 1. Скачать DaemonSet\n\n```bash\nwget https://raw.githubusercontent.com/yandex-cloud-examples/yc-mk8s-copy-fail-mitigation/main/copy-fail-mitigation-daemonset.yaml\n```\n\nИли клонировать репозиторий:\n\n```bash\ngit clone https://github.com/yandex-cloud-examples/yc-mk8s-copy-fail-mitigation.git\ncd yc-mk8s-copy-fail-mitigation\n```\n\n### 2. Применить фикс\n\n```bash\nkubectl apply -f copy-fail-mitigation-daemonset.yaml\n```\n\n### 3. Проверить статус применения\n\n```bash\n# Проверить статус DaemonSet\nkubectl get daemonset -n kube-system cve-2026-31431-fix\n\n# Посмотреть на скольких нодах применен фикс\nkubectl get pods -n kube-system -l app=cve-2026-31431-fix -o wide\n```\n\n### 4. Просмотреть логи применения фикса\n\n```bash\n# Логи initContainer (применение фикса)\nkubectl logs -n kube-system -l app=cve-2026-31431-fix -c apply-fix\n\n# Логи основного контейнера (мониторинг)\nkubectl logs -n kube-system -l app=cve-2026-31431-fix -c monitor\n```\n\n## Пример успешного применения\n\n```\n=========================================\nCopy Fail / Dirty Frag mitigation for Yandex Managed K8s\nNode: demo-ru-central1-a-1\nDate: Thu May 08 14:00:00 UTC 2026\n=========================================\n\nStep 1: Checking vulnerability before fix...\n❌ System is VULNERABLE - AF_ALG AEAD interface is accessible\n\nStep 2: Creating modprobe configuration...\n✓ Created /etc/modprobe.d/blacklist-lpe.conf\n\nStep 3: Unloading vulnerable modules...\n  ✓ algif_aead unloaded\n  ✓ esp4 not loaded\n  ✓ esp6 not loaded\n  ✓ rxrpc not loaded\n\nStep 3.5: Dropping system caches...\n✓ System caches cleared\n\nStep 4: Verifying the fix...\n✓ Configuration file exists:\ninstall algif_aead /bin/false\ninstall esp4 /bin/false\ninstall esp6 /bin/false\ninstall rxrpc /bin/false\n\nStep 5: Testing if vulnerability is fixed...\n✓ AF_ALG AEAD interface is properly blocked\n\n=========================================\n✓ Mitigation applied successfully\n=========================================\n```\n\n## Проверка уязвимости вручную\n\nВы можете проверить наличие уязвимости на ноде вручную. Подключитесь к ноде по SSH и выполните:\n\n```bash\n# Проверить доступность исходного сценария Copy Fail через AF_ALG\npython3 -c 'import socket; s = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0); s.bind((\"aead\",\"authencesn(hmac(sha256),cbc(aes))\")); print(\"AF_ALG AEAD available - VULNERABLE\")'\n\n# Если выводит \"AF_ALG AEAD available - VULNERABLE\" - система уязвима\n# Если выдает ошибку - система защищена\n```\n\nПроверить конфигурацию:\n\n```bash\n# Проверить наличие конфигурации блокировки\ncat /etc/modprobe.d/blacklist-lpe.conf\n\n# Ожидаемый вывод:\n# install algif_aead /bin/false\n# install esp4 /bin/false\n# install esp6 /bin/false\n# install rxrpc /bin/false\n```\n\nПроверить, что уязвимые модули не загружены:\n\n```bash\nlsmod | egrep 'algif_aead|esp4|esp6|rxrpc'\n```\n\n## Удаление фикса\n\nЕсли необходимо удалить DaemonSet:\n\n```bash\nkubectl delete -f copy-fail-mitigation-daemonset.yaml\n```\n\n**Важно:** Удаление DaemonSet **не удалит** конфигурационные файлы с нод. Файл `/etc/modprobe.d/blacklist-lpe.conf` останется на месте и будет продолжать защищать систему.\n\nДля полного удаления фикса с нод нужно подключиться к каждой ноде по SSH и вручную удалить файл:\n\n```bash\nrm /etc/modprobe.d/blacklist-lpe.conf\n```\n\n## Технические детали\n\n**Используемые разрешения:**\n- `hostPID: true` - для доступа к процессам хоста через nsenter\n- `privileged: true` - для записи в `/etc` и выгрузки модулей ядра\n- Volume mount `/` - для доступа к файловой системе хоста\n\n**Образ:** `ubuntu:22.04`\n\n**Ресурсы:**\n- Init container: 10m CPU / 64Mi RAM (requests), 200m CPU / 128Mi RAM (limits)\n- Monitor container: 5m CPU / 32Mi RAM (requests), 50m CPU / 64Mi RAM (limits)\n\n**Namespace:** `kube-system`\n\n## Совместимость\n\n- ✓ Yandex Managed Kubernetes\n- ✓ Ubuntu 20.04\n- ✓ Ubuntu 22.04\n- ✓ Kubernetes 1.20+\n\n## Лицензия\n\nApache License 2.0\n\nСм. [LICENSE](LICENSE) для подробностей.\n\n## Поддержка\n\nПри возникновении проблем создайте issue в репозитории.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyandex-cloud-examples%2Fyc-mk8s-copy-fail-mitigation","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyandex-cloud-examples%2Fyc-mk8s-copy-fail-mitigation","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyandex-cloud-examples%2Fyc-mk8s-copy-fail-mitigation/lists"}