Docker vs. Spectre und Meltdown

Keine Kommentare

Die Architekturprobleme Spectre und Meltdown von Intel(-derivativen) Prozessoren sind derzeit in aller Munde – soweit so gut. Die Fehler werden nach und nach von den jeweiligen Herstellern wie Intel oder ARM durch Microcode- oder OS-Patches behoben, doch wie kann man jenseits des eigenen Laptops oder der Workstation Infrastrukturen wie Cluster oder Data-Center testen?

Die CVEs stehen schon bereit, und Proof-of-Concept (POC) Code ist auch verfügbar für:

Dieser Artikel zeigt auf, wie die entsprechenden Tests auf Spectre und Meltdown in Docker-Container verpackt werden können. Dies ermöglicht ein flächendeckendes Deployment zum Testen von Cluster-Infrastrukturen wie Kubernetes oder Docker-Swarm.

Logo Spectre und Logo Meltdown in Docker 2018

Spectre POC

Als Ausgangsbasis benötigen wir ein Linux-basiertes System (z.B. eine virtuelle Maschine) mit einem Ubuntu 16.04 LTS. Hier benötigen wir vor allem einen aktuellen GCC Compiler. Der bereits veröffentlichte POC Code wird kompiliert und danach in ein Docker scratch Abbild transferiert. Alle notwendigen Quellcodes für Spectre sind in einem eigenen GitHub Repository zusammengefasst:

git clone https://github.com/feffi/docker-spectre.git
cd docker-spectre
git submodule init
git submodule update

Als nächstes präparieren wir das Docker scratch Abbild für das einfache Deployment unseres POC:

tar cv --files-from /dev/null | docker import - scratch

Danach kann der POC Code kompiliert und im Container untergebracht werden:

gcc -static -std=c99 -O0 spectre.c -o spectre
echo "FROM scratch\nADD spectre /spectre\nCMD ["/spectre"]\n" > Dockerfile
docker build -t docker-sprectre:latest .

Nun haben wir eine einfache Möglichkeit, den POC Code auf unserem Laptop oder aber auch in einem Kubernetes Cluster auszuführen:

docker run -ti --privileged docker-spectre:latest

Sollte ein System betroffen sein, kann man folgende Meldung sehen:

Reading 40 bytes:
Reading at malicious_x = 0xffffffffffdd75a8... Success: 0x54=’T’ score=7 (second best: 0x0B score=1)
Reading at malicious_x = 0xffffffffffdd75a9... Success: 0x68=’h’ score=2
Reading at malicious_x = 0xffffffffffdd75aa... Success: 0x65=’e’ score=2
Reading at malicious_x = 0xffffffffffdd75ab... Success: 0x20=’ ’ score=2
Reading at malicious_x = 0xffffffffffdd75ac... Success: 0x4D=’M’ score=2
Reading at malicious_x = 0xffffffffffdd75ad... Success: 0x61=’a’ score=2
Reading at malicious_x = 0xffffffffffdd75ae... Success: 0x67=’g’ score=2
Reading at malicious_x = 0xffffffffffdd75af... Success: 0x69=’i’ score=2
Reading at malicious_x = 0xffffffffffdd75b0... Success: 0x63=’c’ score=2
Reading at malicious_x = 0xffffffffffdd75b1... Success: 0x20=’ ’ score=2
Reading at malicious_x = 0xffffffffffdd75b2... Success: 0x57=’W’ score=2
Reading at malicious_x = 0xffffffffffdd75b3... Success: 0x6F=’o’ score=2
Reading at malicious_x = 0xffffffffffdd75b4... Success: 0x72=’r’ score=2
Reading at malicious_x = 0xffffffffffdd75b5... Success: 0x64=’d’ score=2
Reading at malicious_x = 0xffffffffffdd75b6... Success: 0x73=’s’ score=2
Reading at malicious_x = 0xffffffffffdd75b7... Success: 0x20=’ ’ score=2
Reading at malicious_x = 0xffffffffffdd75b8... Success: 0x61=’a’ score=2
Reading at malicious_x = 0xffffffffffdd75b9... Success: 0x72=’r’ score=2
Reading at malicious_x = 0xffffffffffdd75ba... Success: 0x65=’e’ score=7 (second best: 0x0B score=1)
Reading at malicious_x = 0xffffffffffdd75bb... Success: 0x20=’ ’ score=2
Reading at malicious_x = 0xffffffffffdd75bc... Success: 0x53=’S’ score=2
Reading at malicious_x = 0xffffffffffdd75bd... Success: 0x71=’q’ score=2
Reading at malicious_x = 0xffffffffffdd75be... Success: 0x75=’u’ score=2
Reading at malicious_x = 0xffffffffffdd75bf... Success: 0x65=’e’ score=2
Reading at malicious_x = 0xffffffffffdd75c0... Success: 0x61=’a’ score=2
Reading at malicious_x = 0xffffffffffdd75c1... Success: 0x6D=’m’ score=2
Reading at malicious_x = 0xffffffffffdd75c2... Success: 0x69=’i’ score=2
Reading at malicious_x = 0xffffffffffdd75c3... Success: 0x73=’s’ score=2
Reading at malicious_x = 0xffffffffffdd75c4... Success: 0x68=’h’ score=2
Reading at malicious_x = 0xffffffffffdd75c5... Success: 0x20=’ ’ score=2
Reading at malicious_x = 0xffffffffffdd75c6... Success: 0x4F=’O’ score=2
Reading at malicious_x = 0xffffffffffdd75c7... Success: 0x73=’s’ score=2
Reading at malicious_x = 0xffffffffffdd75c8... Success: 0x73=’s’ score=2
Reading at malicious_x = 0xffffffffffdd75c9... Success: 0x69=’i’ score=2
Reading at malicious_x = 0xffffffffffdd75ca... Success: 0x66=’f’ score=2
Reading at malicious_x = 0xffffffffffdd75cb... Success: 0x72=’r’ score=2
Reading at malicious_x = 0xffffffffffdd75cc... Success: 0x61=’a’ score=2
Reading at malicious_x = 0xffffffffffdd75cd... Success: 0x67=’g’ score=2
Reading at malicious_x = 0xffffffffffdd75ce... Success: 0x65=’e’ score=2
Reading at malicious_x = 0xffffffffffdd75cf... Success: 0x2E=’.’ score=2

Meltdown POC

Im Grunde wenden wir hier die gleiche Verfahrensweise an, wie schon zuvor beim Spectre POC. Hierzu benötigen wir jedoch ein anderes Repository für den POC:

cd ./Am-I-affected-by-Meltdown

Hier wird auch der POC Code kompiliert und in einem Docker Container (diesmal mit phusion/baseimage) untergebracht:

make
echo "FROM phusion/baseimage\nADD meltdown-checker /meltdown-checker\nCMD ["/meltdown-checker"]\n" > Dockerfile
docker build -t docker-meltdown:latest .

Auch dieser Test kann wiederum in einem Cluster deployed oder auf einem lokalen Laptop/Workstation ausgeführt werden.

docker run -ti --privileged docker-meltdown:latest

Sollte das System anfällig für Meltdown sein, kann man folgende Ausgabe sehen:

Checking whether system is affected by Variant 3: rogue data cache load (CVE-2017-5754), a.k.a MELTDOWN ...
Checking syscall table (sys_call_table) found at address 0xffffffffaea001c0 ...
0xc4c4c4c4c4c4c4c4 -> That's unknown
0xffffffffae251e10 -> That's SyS_write

System affected! Please consider upgrading your kernel to one that is patched with KAISER
Check https://security.googleblog.com/2018/01/todays-cpu-vulnerability-what-you-need.html for more details

Noch ein Wort der Warnung

Aufgrund der statistischen Natur der Angriffe/Schwachstellen ist es möglich oder gar wahrscheinlich, dass beide o.g. POC Tests false positives und/oder false negatives liefern. Diesem Verhalten kann durch mehrmaliges Ausführen und Vergleichen der Ausgabe entgegen gewirkt werden.

TL;DR

Die folgenden Artikel und Webseiten bildeten die Grundlage für diesen Artikel.

Kevin Wennemuth

Immer auf der Suche nach disruptiven Technologien. Architekt, Security Spezialist, DevSecOps, Think Tank, hochmoderne IT Konzepte. Reicht.

Kommentieren

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.