Beliebte Suchanfragen
//

Docker vs. Spectre und Meltdown

16.1.2018 | 4 Minuten Lesezeit

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 .

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.

Beitrag teilen

//

Weitere Artikel in diesem Themenbereich

Entdecke spannende weiterführende Themen und lass dich von der codecentric Welt inspirieren.

//
Jetzt für unseren Newsletter anmelden

Alles Wissenswerte auf einen Klick:
Unser Newsletter bietet dir die Möglichkeit, dich ohne großen Aufwand über die aktuellen Themen bei codecentric zu informieren.