
CVE-2022-27499
Dies ist die originale Demo des von uns entdeckten Unanticipated Snapshot-Angriffs. Danke an Intel für die Sicherheitswarnung.
Zuallererst muss jeder, der die Demo ausführen möchte, Intel SGX SDK und Occlum installieren (Sie können wählen, unser modifiziertes SGX SDK zu verwenden). Wir stellen ein Dockerfile für eine schnelle Occlum/SDK-Installation bereit. Das modifizierte SGX SDK hilft dem Angreifer, den Zeitpunkt zu bestimmen.
Sie können Occlum auch auf dem Host-Rechner installieren. (Weitere Installationsdetails finden Sie unter https://github.com/occlum/occlum.) In beiden Fällen müssen Sie zuerst den Intel SGX-Treiber auf Ihrem Host installieren oder einen SGX-Treiber im Kernel verwenden.
(sudo) docker build -t $Your_Image_Name .
Nachdem das Image erstellt wurde, führen Sie Folgendes aus:
(sudo) docker run -it --privileged -p $Redis_Server_Port:6379 -v $Host_SGX_Driver_Path:/dev/sgx --name "snapshot-demo" $Your_Image_Name
Hier ist $Redis_Server_Port die Host-Portnummer, die Sie für den Redis-Server im Container freigeben möchten, während $Host_SGX_Driver_Path der oben genannte Gerätepfad Ihres installierten SGX-Treibers ist.
Das Zielprogramm befindet sich im Ordner bash_redis.
Das Opferprogramm führt ein Bash-Shell-Skript (occlum_bash.sh) aus. Es ruft zunächst ein bereitgestelltes Passwort ab, um eine benutzerdefinierte Redis-Konfigurationsdatei zu generieren, wobei der Eintrag "requirepass" ausgefüllt wird. Dann startet es einen Redis-Server gemäß der benutzerdefinierten Konfigurationsdatei.
Um das Konfigurationsgenerierungsprogramm zu erstellen, führen Sie make aus. Um den Redis-Server zu erstellen, führen Sie die folgenden Befehle aus.
cd bash_redis
./download_and_build_redis_glibc.sh
Öffnen Sie ein Terminal für das Opfer. Führen Sie run_redis.sh aus und prüfen Sie, ob der Redis-Server einwandfrei funktioniert.
Verwenden Sie den Befehl redis-cli -h $Redis_Server_IP -p $Redis_Server_Port -a admin123456, um zu überprüfen, ob das Passwort (admin123456) in der Konfigurationsdatei gesetzt wurde.
Drücken Sie Strg + C, um den Redis-Server zu beenden.
Bereiten Sie zwei Terminals vor, eines für das Opfer und eines für den Angreifer. Sie können nur ein weiteres Terminal (für den Angreifer) öffnen, wenn bereits ein Terminal für das Opfer geöffnet wurde.
Führen Sie run_redis.sh auf dem Opferterminal erneut aus. Dieses Skript startet das Zielprogramm.
Der Angreifer muss einen Snapshot (mit ./take_snapshot_step-1.sh) erstellen, wenn er feststellen kann, dass der Snapshot geschrieben wird. In der Demo erhält der Angreifer eine klare Benachrichtigung vom Opferterminal wie folgt.
...
Run ./take_snapshot_step-1.sh NOW!
line 4522: # passwords, then flags, or key patterns. However note that the additive
line 4523: # and subtractive rules will CHANGE MEANING depending on the ordering.
line 4524: # For instance see the following example:
...
Starten Sie das Skript ./take_snapshot_step-1.sh auf dem Terminal des Angreifers.
Wenn Sie Occlum mit unserem modifizierten SGX SDK erstellen, sehen Sie weitere Hinweise. Dies liegt daran, dass wir den nicht vertrauenswürdigen Teil des Intel SGX SDK modifiziert haben, um Hilfsnachrichten auszugeben, die dem Angreifer die Entscheidung über den Zeitpunkt erleichtern. Zur Bequemlichkeit des Angreifers haben wir Zeitfenster reserviert, damit der Angreifer ./take_snapshot_step-1.sh ausführen kann. Tatsächlich könnte ein Angreifer mit Host-Root-Rechten die Enclave-Ausführung abfangen und beliebige Snapshots erfassen, indem er den nicht vertrauenswürdigen Teil des SGX SDK modifiziert.
Sobald der Redis-Server läuft, führen Sie ./take_snapshot_step-2.sh aus, um die Snapshot-Erfassung abzuschließen.
Der Angreifer führt replay_redis.sh aus, um die Enclave mit dem gesammelten Snapshot wiederzugeben. Jeder Client kann sich ohne Authentifizierung beim Redis-Server anmelden.
Beispielbefehl für Redis-Client:
redis-cli -h $Redis_Server_IP -p $Redis_Server_Port
keys *
Wenn eine Meldung (error) NOAUTH Authentication required. erscheint, bedeutet dies, dass Sie ein Passwort benötigen, um auf den Redis-Server zuzugreifen. Geben Sie auth $Your_Password ein, um die Authentifizierung zu bestehen. Verwenden Sie in dieser Demo auth admin123456.
Wenn eine Meldung (empty array) erscheint, bedeutet dies, dass Sie kein Passwort benötigen, um auf den Redis-Server zuzugreifen.
Manchmal schlägt die Demo aufgrund der Integritätsprüfung von Occlum fehl. Sie sehen wahrscheinlich die folgende Meldung.
Replaying ...
~/snapshot-demo/bash_redis_replay/occlum_instance ~/snapshot-demo/bash_redis_replay
In: writing meta-data in write_all_changes_to_disk
In: writing meta-data in write_all_changes_to_disk
Error: Os { code: 22, kind: InvalidInput, message: "Invalid argument" }
[ERROR] occlum-pal: The init process exit with code: 1 (line 59, file src/pal_api.c)
[ERROR] occlum-pal: Failed to run the init process: EINVAL (line 129, file src/pal_api.c)
Führen Sie die Demo einfach erneut aus (ab der Aufzeichnungsphase), dann wird der Fehler endgültig verschwinden.
Viel Glück und viel Spaß!