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:
- CVE-2017-5753
- CVE-2017-5715
- Exploit-DB:43427
- CVE-2017-5754
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.
Weitere Beiträge
von Kevin Wennemuth
Dein Job bei codecentric?
Jobs
Agile Developer und Consultant (w/d/m)
Alle Standorte
Weitere Artikel in diesem Themenbereich
Entdecke spannende weiterführende Themen und lass dich von der codecentric Welt inspirieren.
Gemeinsam bessere Projekte umsetzen.
Wir helfen deinem Unternehmen.
Du stehst vor einer großen IT-Herausforderung? Wir sorgen für eine maßgeschneiderte Unterstützung. Informiere dich jetzt.
Hilf uns, noch besser zu werden.
Wir sind immer auf der Suche nach neuen Talenten. Auch für dich ist die passende Stelle dabei.
Blog-Autor*in
Kevin Wennemuth
Head of IT Security
Du hast noch Fragen zu diesem Thema? Dann sprich mich einfach an.
Du hast noch Fragen zu diesem Thema? Dann sprich mich einfach an.