Обычно capabilities ограничены по умолчанию: если их устанавливает непривилегированный пользователь, такие права связываются с пользовательским пространством имён (namespace) – и не могут применяться за пределами этого namespace.
Однако эксплоит Game Over(lay) использует две уязвимости в системе OverlayFS (CVE-2023-2640 и CVE-2023-32629), чтобы обойти это ограничение. Эксплоит заставляет систему скопировать файл с ограниченными правами в другое место – где права не ограничены. После этого пользователь без привилегий может выполнить такой файл с рутовыми правами.
Как устроена атака:
OverlayFS – это объединенная файловая система, которая даёт пользователю общее представление разных каталогов в виде «слоев». Это позволяет обмениваться данными и модифицировать их, не изменяя оригинальный контент.
Система устроена так:
– нижний слой (lowedir): монтируется только для чтения,
– верхний слой (upperdir): позволяет записывать модификации,
– рабочий слой (workdir): для управления рабочим каталогом контейнеризованных процессов,
– объединенный слой (merged): доступен пользователю как объединенное представление файловой системы.
Оригинальные файлы хранятся в нижнем слое, только на чтение. При модификации файла или его метаданных активируется механизм Copy-on-Write (CoW), который копирует файл на верхний слой, оставляя оригинал на нижнем.
В некоторых версиях Ubuntu система OverlayFS не проводит валидацию при копировании файлов между слоями. Это позволяет заменить ограниченные root-права на неограниченные одной строчкой команд:
unshare -rm sh -c "mkdir l u w m && cp /u*/b*/p*3 l/; setcap cap_setuid+eip l/python3;mount -t overlay overlay -o rw,lowerdir=l,upperdir=u,workdir=w m && touch m/*; u/python3 -c 'import os;os.setuid(0);os.system(\"bash\")'";rm -rf l u w m
Результат выполнения можно увидеть на скриншоте выше. Разберём атаку по шагам:
unshare -rm создаёт и монтирует новое пространство имён (namespace) пользователя, которому будут предоставлены рутовые права,mkdir создаёт четыре каталога (l, u, w, m) для «ловушки» OverlayFS.cp копирует бинарный файл python3 в каталог l, нижний уровень (только чтение). Путь /u*/b*/p*3 обфусцирует реальный путь /usr/bin/python3.setcap cap_setuid+eip назначает файлу ограниченные рутовые права (capabilities), позволяя ему вызов setuid(0). Эта возможность работает только внутри пользовательского namespace. mount создаёт OverlayFS с каталогами l (нижний слой), u (верхний слой), w (рабочий слой) и m (объединенный слой). В нижнем слое лежит python3 (с ограниченными правами).touch модифицирует метаданные файла через каталог m, активируя Copy-on-Write. В уязвимых версиях Ubuntu это приводит к копированию файла python3 в каталог u, где у бинарника будут неограниченные права (за пределами namespace). Теперь файл python3 можно запустить для повышения привилегий через os.setuid(0) и создать рутовый shell, используя os.system("bash").
Последняя команда
rm зачищает каталоги «ловушки».Как избежать атаки:
Уязвимостям подвержены версии ядра от v5.4 до v6.3. Информацию по обновлениям смотрите здесь: CVE-2023-2640 и CVE-2023-32629.
Также рекомендуется ограничить возможность создания namespace для непривилегированных пользователей:
echo kernel.unprivileged_userns_clone=0 | sudo tee /etc/sysctl.d/99-disable-unpriv-userns.conf
Как детектировать атаку:
– Отслеживайте нестандартное использование unshare, особенно с флагами namespace.
– Выявляйте shell-процессы с подозрительными аргументами, которые предполагают установку рутовых прав (capabilities) и монтирования с перекрывающимися слоями.
– Мониторьте подозрительные родительские shell-процессы, которые могут означать повышение привилегий.
