Sploitus

Exploit for CVE-2022-0847-Container-Escape

kitploit · 2026-08-27

Exploit Code

MARKDOWN58 lines
## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-GREENHANDATSJTU-CVE-2022-0847-CONTAINER-ESCAPE
# CVE-2022-0847

CVE-2022-0847 используется для побега из контейнера (перезапись любых файлов, доступных только для чтения, на хосте)

Слайды (на китайском) доступны здесь

Использование CVE-2022-0847 (Dirty Pipe) для осуществления побега из контейнера (эффект — перезапись любых файлов, доступных только для чтения, на хосте)

PPT доклада на китайском доступен здесь

## Введение

Если ядро уязвимо к CVE-2022-0847, атакующий может перезаписывать файлы, доступные только для чтения (Непостоянно! Посетите https://dirtypipe.cm4all.com/ для подробностей). Однако контейнер может получить доступ только к файлам внутри контейнера. К счастью, при наличии `CAP_DAC_READ_SEARCH` атакующий теперь может перезаписывать файлы на хосте!

## Объяснение

Как объясняется на https://dirtypipe.cm4all.com/, для перезаписи файла, доступного только для чтения, мы должны `splice()` его в pipe. Чтобы использовать `splice()`, мы должны сначала открыть целевой файл с флагом `O_RDONLY`, чтобы получить **файловый дескриптор**.

Именно тогда я вспомнил о `CAP_DAC_READ_SEARCH`. Согласно руководству Linux, при наличии `CAP_DAC_READ_SEARCH` атакующий внутри контейнера может:

  * Обходить проверки прав на чтение файлов и проверки прав на чтение и выполнение каталогов
  * вызывать open_by_handle_at(2)



Обладая возможностью `CAP_DAC_READ_SEARCH`, мы можем искать файловую систему хоста и использовать `open_by_handle_at(2)` для открытия в режиме только для чтения любого файла на хосте из контейнера и получения его **файлового дескриптора** (посетите http://stealth.openwall.net/xSports/shocker.c для подробностей).

Теперь, когда у нас есть **файловый дескриптор** целевого файла на хосте, мы, конечно, можем использовать `splice()`, чтобы отправить содержимое целевого файла в pipe, а затем перезаписать его!

## Использование

root@kitploit:~
    
    
    cp /etc/password . # back up /etc/password
    gcc dp.c -o dp
    docker run --rm -it -v $(pwd):/exp --cap-add=CAP_DAC_READ_SEARCH ubuntu
    /exp/dp /etc/passwd 1 ootz: # overwrite /etc/password on host from offset 1
    /etc/dp /etc/passwd # dump /etc/passwd on host
    

## Пример

Сначала создайте на хосте от имени пользователя root файл `/home/vagrant/flag.txt`, доступный только для чтения, содержимое которого — `hello world`: ![](https://assets.kitploit.com/production/public/readmes/26049/52aa1f90c738df8786f2ce8fac6ed0be7d9981a56db6ea21d2fad6ff3b244c07.png)

Затем запустите контейнер с возможностью `CAP_DAC_READ_SEARCH`, сначала попробуйте сделать дамп `/home/vagrant/flag.txt` на хосте — мы получим `hello world`: ![](https://assets.kitploit.com/production/public/readmes/26049/a93947ab482a0837c36de8556446b96edaad9f4e70e4f5794ce4ba4ecc32aa3d.png)

затем попробуйте перезаписать целевой файл, начиная со смещения 1, содержимым `abcdefghij`: ![](https://assets.kitploit.com/production/public/readmes/26049/17fb0c3e16b5466ea33f44eb8533b6a42514a6e4299c4be34321477e24fccfb0.png)

снова сделайте дамп целевого файла — теперь содержимое равно `habcdefghij`! Выйдите из контейнера и проверьте `/home/vagrant/flag.txt` на хосте: его содержимое — `habcdefghij`. ![](https://assets.kitploit.com/production/public/readmes/26049/22a70336246255654793b2913eadda01ac6141203d9d3b91a1e4140aa3b137e4.png)

Да, мы только что перезаписали файл на хосте из контейнера!

## Благодарности

  * https://dirtypipe.cm4all.com/
  * http://stealth.openwall.net/xSports/shocker.c