Sploitus

Exploit for CVE-2024-21626-runcPOC

kitploit · 2026-08-27

Exploit Code

MARKDOWN88 lines
## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-V0WKEEP3R-CVE-2024-21626-RUNCPOC
# [Воспроизведение уязвимости] CVE-2024-21626 уязвимость побега из контейнера docker runc

# 1\. Обзор уязвимости

Имя уязвимости| Уязвимость побега из контейнера docker runc  
---|---  
Номер уязвимости| CVE-2024-21626  
Дата раскрытия| 2024-01-31  
Характеристика| /  
Затронутые версии| runc @ [v1.0.0-rc93,1.1.11]  
  
# 2\. Эксплуатация уязвимости и POC/EXP

**Условия эксплуатации** довольно строгие, требуется взаимодействие жертвы. Лично считаю это немного бесполезным:

  1. Использование вредоносного образа атакующего (включая настройки рабочего каталога и т.д.) для создания контейнера
  2. Атакующий может управлять контейнером и выполнять команды.



**Проверка наличия уязвимости и получение дескриптора:**

root@kitploit:~
    
    
    git clone https://github.com/V0WKeep3r/CVE-2024-21626-runcPOC.git
    cd CVE-2024-21626-runcPOC
    bash verify.sh
    

Как показано ниже, уязвимость существует, и файловый дескриптор — `/proc/self/fd8`

![](https://assets.kitploit.com/production/public/readmes/21449/6ff39d450b1deb063bcb8c36119e9dd751a161c63db17e8aea6cb96e4ed70f73.jpg)

verify.sh может определить фактическое значение fd в текущей среде машины. Если fd не равен 8, необходимо изменить WORKDIR в Dockerfile на соответствующее значение или указать его с помощью `-w` в `docker run`.

**Проверка побега/повышения привилегий:**

Здесь я больше ориентируюсь на реальную практику: poc.sh использует запланированную задачу для обратного шелла. poc2.sh использует метод замены команд (обратите внимание, при использовании этого метода необходимо заранее сделать резервную копию файлов, чтобы избежать трудностей с восстановлением).

root@kitploit:~
    
    
    # 需要确认定时任务文件存在,不存在可以创建写,但是那样不能触发定时任务
    # 只有crontab -e创建的,在crontab组的文件才会被定时执行。
    docker build . -t poc1
    docker run -it --rm poc1 bash /poc.sh
    

![](https://assets.kitploit.com/production/public/readmes/21449/02e9a06f7aa00e266a0b82a4cb0bcbec572e97fae01be0d7951bdffbbda91bb7.jpg) ![](https://assets.kitploit.com/production/public/readmes/21449/99d4fb8c84c08a9dc2ad73de1a839c1de7dbeeaac9b26bd0290e33d89e33ce10.jpg)

POC2:

root@kitploit:~
    
    
    docker build . -t poc2
    docker run -it --rm poc2 bash /poc.sh
    
    # 另起一个terminal
    /bin/bash.copy
    

![](https://assets.kitploit.com/production/public/readmes/21449/93aa67e91bb5c9dd3ff0b9ab9dfe4145ee4fff46db23047aec4a53a752fb8ea5.jpg)

# 3\. Анализ принципа уязвимости

Полного понимания нет, но в сочетании с патчем можно уловить суть.

В процессе `docker exec` или `docker run` вызывается функция `execve` из runc, но в процессе `runc exec` файловые дескрипторы не закрываются, что приводит к утечке файловых дескрипторов хоста в среду контейнера. Пользователь может использовать эти дескрипторы для чтения и записи файлов хоста, тем самым осуществляя побег из контейнера.

# 4\. Способ исправления / Анализ патча

**Способ исправления** Обновите runc до версии 1.12 и выше. Официальная ссылка runc: https://github.com/opencontainers/runc/releases

**Анализ патча** diff commit: https://github.com/opencontainers/runc/commit/2a4ed3e75b9e80d93d1836a9c4c1ebfa2b78870e Закрытие внутренних файловых дескрипторов перед execve

![](https://assets.kitploit.com/production/public/readmes/21449/9f869f94e936b6ed25258c657b8ed16b8643a8e798c2258380223b65e1a7076e.jpg)

`init_linux.go`, после `chdir` проверяется, находится ли cwd (текущий рабочий каталог) внутри контейнера

![](https://assets.kitploit.com/production/public/readmes/21449/ba3f87a14a698447bd1a0ce0ddebcb0b71e0a8be9733c49f8e20ba051b6e5664.jpg)

# F. Ссылки

  1. Описание уязвимости: https://github.com/opencontainers/runc/security/advisories/GHSA-xr7r-f8xq-vfvv
  2. Патч: https://github.com/opencontainers/runc/commit/2a4ed3e75b9e80d93d1836a9c4c1ebfa2b78870e