
Inhaltsverzeichnis
Moderne Computersysteme verfügen oft über eng integrierte CPU- und GPU-Komponenten mit gemeinsamem Speicher und mikroarchitektonischen Ressourcen. Während diese Integration enorme Leistungsgewinne bringt, birgt sie auch erhebliche Risiken in Form von Seitenkanälen und verborgenen Kanälen. Diese ermöglichen es Angreifern, Informationen über Komponenten hinweg abzuziehen und dabei die traditionelle Prozessisolierung zu umgehen.
Dieser Beitrag bietet eine tiefgehende technische Überprüfung von versteckten Kanälen über Komponenten hinweg auf integrierten CPUs, insbesondere solche, die gemeinsam genutzte mikroarchitektonische Komponenten ausnutzen—Caches, Verzweigungsvorhersager und andere. Wir werden theoretische Hintergründe, reale Machbarkeit, Code-Demonstrationen und aktuelle Gegenmaßnahmen erkunden. Ob Sie ein Sicherheitsanfänger oder ein fortgeschrittener Forscher sind, dieser Leitfaden wird Bedrohungsmodelle, praktische PoCs und Verteidigungs-Best-Practices abdecken.
Ein verborgener Kanal ist ein Kommunikationspfad, der nicht für die Informationsübertragung vorgesehen war. In der Informatik bezieht sich der Begriff oft auf Situationen, in denen ein Prozess (der Sender oder "high"-Prozess) absichtlich Informationen an einen anderen Prozess (den Empfänger oder "low"-Prozess) auf eine Weise überträgt, die durch die Sicherheitspolitik verboten ist.
Verborgene Kanäle sind nicht auf Netzwerkverkehr beschränkt. Viele existieren auf niedrigeren Systemebenen, einschließlich Speicherkanälen (unter Verwendung von Dateien, Speicherzeiten usw.) und Zeitkanälen (Unterschiede in der Ressourcenverfügbarkeit).
Moderne CPUs und GPUs nutzen gemeinsame Ressourcen der Bequemlichkeit halber:
Wenn zwei Prozesse diese teilen, können sie Informationen über Änderungen im Zustand oder Timing der gemeinsamen Hardware signalisieren, selbst wenn keine direkte Kommunikation erlaubt ist.
Die bekanntesten verborgenen Kanäle sind cache-basiert:
Beide Angriffe nutzen die gemeinsame Natur von mehrstufigen CPU-Caches, insbesondere den Last-Level-Cache (LLC) aus.
Moderne CPUs verwenden Verzweigungsvorhersager, um die Ausführung zu beschleunigen. Diese Vorhersager sind gemeinsam zwischen Prozessen und manchmal sogar zwischen Kernen. Wenn ein Sender den Vorhersager trainiert, kann der Empfänger Reaktionen anprobieren und Veränderungen in der Vorhersage beobachten, um damit Daten zu übertragen.
Siehe: "Verborgene Kanäle durch Verzweigungsvorhersager: eine Machbarkeitsstudie"
Integrierte CPU-GPU-Systeme teilen sich DRAM und manchmal sogar noch feiner abgestimmte Komponenten (z.B. LLC, Systembusse). Diese komponentenübergreifende Ressourcenteilung eröffnet neue, weitgehend unerforschte Angriffsflächen:
Akademische Forschung untersucht Angriffe, bei denen die CPU und GPU oder verschiedene Prozesse, die auf beiden laufen, über gemeinsame Cache-Linien oder Speicherbandbreite einen verborgenen Kanal bilden ("Leaky Buddies").
clflush).Schlüsselpunkt: Zeitunterschiede zeigen die Aktionen des Senders an.
Wird vor allem in Cloud-Umgebungen verwendet, wo geteilter Speicher möglicherweise nicht existiert.
Siehe "Verborgene Kanäle durch Verzweigungsvorhersager: eine Machbarkeitsstudie" für eine Angriffsdarstellung.
Beginnen Sie mit dem Sammeln von Informationen zu CPU-Caches und Verzweigungsvorhersagern.
# Liste der Details zum CPU-Cache
lscpu | grep -i cache
# Erweiterte Option: CPU-Cachegrößen direkt analysieren
cat /proc/cpuinfo | grep -E 'cache size|model name'
# Liste der durch einen Prozess mmap'isierten gemeinsamen Bibliotheken
pidof firefox # Zum Beispiel
cat /proc/<pid>/maps | grep r-xp | grep 'lib'
# Python: Analyse, um Regionen von gemeinsamen Objekten zu suchen
import os
pid = <your_pid>
with open(f"/proc/{pid}/maps") as f:
for line in f:
if 'lib' in line and 'r-xp' in line:
print(line.strip())
// gcc -O2 -o flush_reload flush_reload.c
#include <stdio.h>
#include <stdint.h>
#include <x86intrin.h>
uint64_t measure_access_time(volatile char *addr) {
uint64_t start = __rdtscp(&start);
*(volatile char *)addr;
uint64_t end = __rdtscp(&end);
return end - start;
}
int main() {
char *ptr = ...; // Zuordnung zu gemeinsamem Objekt
while (1) {
_mm_clflush(ptr); // Sender: oder überspringen für Empfänger
uint64_t t = measure_access_time(ptr);
printf("Zugriffszeit: %lu\n", t);
}
}
import ctypes
import time
# Zuordnung einer freigegebenen Bibliothek/Datei, z.B. über mmap
libc = ctypes.CDLL("libc.so.6")
address = ctypes.c_void_p(...)
def measure_access_time(addr):
t1 = time.perf_counter_ns()
dummy = ctypes.c_char.from_address(addr.value)
val = dummy.value
t2 = time.perf_counter_ns()
return t2 - t1
while True:
t = measure_access_time(address)
print(f"Zugriffszeit: {t}ns")
// Pseudocode für Sender und Empfänger in Verzweigungsvorhersageangriff
// Zu übermittelndes Datenbit: 0 oder 1
// Sender: "trainieren" des Verzweigungsvorhersagers
if (bit_to_send == 1) {
for (int i = 0; i < 1000; i++) { if (cond) foo(); }
} else {
for (int i = 0; i < 1000; i++) { if (!cond) foo(); }
}
// Empfänger: Messen der Zeit für Verzweigungsmissvorhersage
uint64_t t1 = rdtscp();
if (cond) foo();
uint64_t t2 = rdtscp();
uint64_t elapsed = t2 - t1;
if (elapsed > THRESHOLD) dekodiere als Bit 1, sonst 0;
Hinweis: Keine Gegenstrategie ist perfekt—Abwägungen betreffen Leistung/Sicherheit.
Diese repräsentieren eine Obermenge von Seiten-/versteckten Kanälen, die spekulative Ausführung (Spectre, Meltdown) und andere transient ausgeführte Instruktionen ausnutzen, um Zustand über mikroarchitektonische Kanäle zu lecken:
Siehe die Vortragsreihe "Seitenkanäle und transiente Ausführung" für visuelle/Zeit-Aufschlüsselungen.
perf stat ...)# Überwachung von Cache-Fehlzugriffen und Verzweigungsmissvorhersagen
sudo perf stat -e cache-misses,branch-misses ./your_app
import psutil
# Überwachung der Cache- und CPU-Nutzung jedes Prozesses im Laufe der Zeit
for proc in psutil.process_iter(['pid', 'name', 'cpu_percent']):
print(proc.info)
Verborgene Kanäle über Komponenten hinweg verdeutlichen ein kritisches und anhaltendes Risiko in der Mikroarchitektursicherheit. Da CPUs und GPUs immer enger integriert werden, weitet sich die Grenze, über die geheime Daten durchsickern können, aus, von gemeinsam genutzten CPU-Caches über ausgeklügelte Verzweigungsvorhersager bis hin zu übergreifenden CPU-GPU-Ressourcen.
Abwehrmaßnahmen erfordern koordinierte Hardware-, OS- und Softwareanstrengungen—und kommen immer mit Leistungskosten. Je tiefer der Angriff, desto schwieriger die Wahl.
Für Forscher besteht der anhaltende Prozess darin, neue Techniken für verborgene Kanäle über Komponenten hinweg weiterhin zu katalogisieren, zu modellieren und abzumildern. Für Organisationen sind Bedrohungsmodellierung und Situationsbewusstsein von entscheidender Bedeutung.
Für die neuesten Forschungsergebnisse und Verwundbarkeitsanmeldungen, überwachen Sie regelmäßig vertrauenswürdige akademische/konferenzorientierte Sites und CVE-Berichte.
Wenn Sie diesen Inhalt wertvoll fanden, stellen Sie sich vor, was Sie mit unserem umfassenden 47-wöchigen Elite-Trainingsprogramm erreichen könnten. Schließen Sie sich über 1.200 Studenten an, die ihre Karrieren mit den Techniken der Unit 8200 transformiert haben.