
Детектор на основе eBPF для обнаружения уязвимостей выхода из контейнера в runc и Docker в реальном времени, отслеживающий системные вызовы и обращения к демону Docker для выявления эксплуатации CVE-2024-21626, CVE-2024-23651, CVE-2024-23652 и CVE-2024-23653 во время сборки и выполнения.
Этот репозиторий заархивирован.
В код больше не будут вноситься обновления, и к моменту прочтения этого уведомления он может быть небезопасным или даже неработоспособным. Рассматривайте его только в исторических целях и обращайтесь с ним осторожно.

В этом репозитории вы найдёте эталонную реализацию динамического обнаружения на основе eBPF для уязвимостей runc и Docker CVE-2024-21626, CVE-2024-23651, CVE-2024-23652 и CVE-2024-23653. Она перехватывает системные вызовы Linux (например, chdir, mount) и вызовы функций демона Docker, связывая их со сборками Docker и процессами контейнеров для выявления эксплуатации этих уязвимостей.
Для подхода, основанного на статическом анализе, см. этот репозиторий.
CVE-2024-21626 — это уязвимость в среде выполнения контейнеров runc, позволяющая атакующему выйти за пределы изоляции контейнера и получить полный root RCE с помощью специально созданного образа, эксплуатирующего проблему в обработке инструкции WORKDIR. Поскольку существует состояние «гонки» между моментом открытия и закрытия некоторых файловых дескрипторов хоста, атакующий может создать Dockerfile со следующей инструкцией WORKDIR /proc/self/fd/[ID] (где ID — системно-зависимый файловый дескриптор), которая будет указывать на файловую систему базового хоста. Это можно эксплуатировать при выполнении:
docker build — в 2 случаях:
FROM, содержащую команду ONBUILD, запускающую эксплойт, например ONBUILD WORKDIR /proc/self/fd/[ID]. Инструкция ONBUILD внедряет команду не в образ, который её содержит, а в образ, который использует его как базовый. Это означает, что если базовый образ скомпрометирован или намеренно вредоносен (например, размещён на Dockerhub или в других публичных реестрах контейнеров), эксплуатация возможна, даже если в образе, который фактически собирает команда docker build, ничего не меняется.docker runТаким образом, эта уязвимость может подвергать риску как системы сборки, так и производственные среды.
CVE-2024-23651 — это уязвимость в Docker, когда команда RUN использует флаг --mount=cache. Существует уязвимость типа «проверка во времени / использование во времени» (TOCTOU) между проверкой существования каталога source на хосте демона Docker и фактическим вызовом системного вызова mount. Атакующий может создать Dockerfile, который разместит символическую ссылку между этими двумя вызовами, чтобы вызвать произвольное bind-монтирование, приводящее к полному root RCE на хосте.
Эта уязвимость затрагивает только команду docker build.
CVE-2024-23653 — это уязвимость в Docker, возникающая при использовании пользовательского генератора LLB Buildkit с директивой # syntax. Генератор может использовать GRPC-вызовы Client.NewContainer и Container.Start для выполнения нового контейнера во время сборки. Аргумент StartRequest.SecurityMode не проверяется должным образом на соответствие ожиданиям привилегий демона Docker или вызова docker build, что позволяет вызывающему GRPC создать привилегированный контейнер во время сборки. Из этого нового привилегированного контейнера затем можно совершить побег для получения полного root RCE на хосте сборки.
Эта уязвимость затрагивает только команду docker build.
CVE-2024-23652 — это уязвимость произвольного удаления в Docker. Когда в Dockerfile используется RUN --mount, если цель монтирования не существует, она будет создана для этого окружения. После завершения выполнения созданный каталог будет очищен. Если выполняемая команда изменяет путь, используемый для монтирования, на символическую ссылку, процедура очистки пройдёт по этой символической ссылке и потенциально очистит произвольные каталоги в корневой файловой системе хоста.
Эта уязвимость затрагивает только команду docker build.
Обнаружение во время сборки применимо ко всем 4 уязвимостям.
GOOS=linux GOARCH={{amd64/arm64}} go build.sudo (требуется для eBPF) в вашей среде сборки (например, sudo ebpf-detector &).Leaky vessels vulnerability detected, выведенное в STDOUT, вместе с соответствующим CVE, названием уязвимости и дополнительными данными криминалистического анализа.Обнаружение во время выполнения применимо только к уязвимости WORKDIR (CVE-2024-21626).
Dockerfile и отправьте его в реестр образов.image в файле detector.yaml (помечено как TODO).kubectl apply -f detector.yml.Leaky Vessels vulnerability detected в журналах подов DaemonSet.Модульные тесты необходимо запускать с правами sudo, так как они зависят от eBPF: sudo go test ebpf-detector/....
WORKDIR во время выполнения (CVE-2024-21626) происходит во время инициализации контейнера, поэтому она не будет обнаружена на уже запущенных контейнерах. Обнаружение также предполагает, что средой выполнения контейнеров является containerd.CVE-2024-23651) и Buildkit Build-time Container Teardown Arbitrary Delete (CVE-2024-23652) основано на времени и может давать ложные отрицательные результаты из-за состояний гонки.Актуальный список ошибок и проблем см. в разделе issues проекта.
Вклад приветствуется. Подробности см. в CONTRIBUTING.md.
Leaky Vessels Dynamic Detector распространяется под лицензией Apache-2.0. Дополнительную информацию см. в LICENSE.