Operation auf einer Ressource nach Ablauf oder Freigabe
Beschreibung
Operation auf einer Ressource nach Ablauf oder Freigabe tritt auf, wenn Code eine Ressource weiterhin verwendet, nachdem diese freigegeben, abgelaufen oder anderweitig ungültig geworden ist. Dies umfasst die Verwendung von Speicher nach dessen Freigabe (Use-After-Free), den Zugriff auf Dateien nach dem Schließen, die Nutzung von Netzwerkverbindungen nach der Trennung, die Verwendung abgelaufener Anmeldedaten oder Token sowie die Referenzierung von Objekten nach Ende ihrer Lebensdauer. Solche Operationen führen zu undefiniertem Verhalten und Sicherheitslücken.
Risiko
Use-After-Free ermöglicht die Ausführung beliebigen Codes. Abgelaufene Token gewähren weiterhin Zugriff. Geschlossene Verbindungen können Daten lecken oder Abstürze verursachen. Veraltete Anmeldedaten umgehen Widerrufe. Freigegebene Ressourcen können neu zugewiesen und missbraucht werden. Speicherkorruption durch baumelnde Pointer ist möglich. Datenintegritätsprobleme durch abgelaufene Cache-Einträge können auftreten.
Lösung
Setzen Sie Pointer nach dem Freigeben von Speicher auf NULL. Verfolgen Sie den Ressourcenstatus explizit. Verwenden Sie Smart Pointer und RAII-Muster. Implementieren Sie ordnungsgemäße Token-Ablaufprüfungen. Validieren Sie die Verfügbarkeit von Ressourcen vor der Verwendung. Nutzen Sie Sprachfeatures, die Use-After-Free verhindern. Implementieren Sie ordnungsgemäße Bereinigungssequenzen.
Häufige Auswirkungen
| Auswirkung | Details |
|---|---|
| Integrität | Bereich: Speicherkorruption Use-After-Free korrumpiert den Speicherstatus. |
| Vertraulichkeit | Bereich: Informationsoffenlegung Freigegebener Speicher kann sensible Daten enthalten. |
| Autorisierung | Bereich: Zugriffskontrollumgehung Abgelaufene Anmeldedaten gewähren weiterhin Zugriff. |
Beispielcode und Lösung
Verwundbarer Code
// VERWUNDBAR: Use-After-Free und verwandte Probleme
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
// VERWUNDBAR: Klassisches Use-After-Free
void use_after_free_verwundbar() {
char* buffer = malloc(100);
strcpy(buffer, "sensible daten");
free(buffer);
// VERWUNDBAR: Verwendung von freigegebenem Speicher
printf("Daten: %s\n", buffer); // Use-After-Free
strcpy(buffer, "neue daten"); // Schreiben in freigegebenen Speicher
}
// VERWUNDBAR: Baumelnder Pointer in Struktur
typedef struct {
char* name;
int id;
} User;
void baumelnder_zeiger_verwundbar(User* user) {
free(user->name);
// VERWUNDBAR: user->name baumelt jetzt
// Anderer Code kann noch darauf zugreifen
}
# VERWUNDBAR: Python Ressourcenablaufprobleme
from datetime import datetime, timedelta
# VERWUNDBAR: Verwendung geschlossener Datei
def datei_nach_schließen_verwundbar():
f = open('daten.txt', 'r')
inhalt = f.read()
f.close()
# VERWUNDBAR: Datei ist geschlossen
f.seek(0) # ValueError: I/O-Operation auf geschlossener Datei
mehr_inhalt = f.read()
# VERWUNDBAR: Abgelaufenes Token wird noch verwendet
class VerwundbareTokenAuth:
def __init__(self):
self.token = None
self.expires_at = None
def authenticate(self, token):
self.token = token
self.expires_at = datetime.now() + timedelta(hours=1)
def make_request(self, endpoint):
# VERWUNDBAR: Prüft nicht auf Ablauf
headers = {'Authorization': f'Bearer {self.token}'}
return requests.get(endpoint, headers=headers)
Sichere Lösung
// SICHER: Korrekte Ressourcenlebenszyklusverwaltung
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
// SICHER: Nach free auf NULL setzen
void use_after_free_sicher() {
char* buffer = malloc(100);
if (!buffer) return;
strcpy(buffer, "sensible daten");
// Sensible Daten vor free löschen
memset(buffer, 0, 100);
free(buffer);
buffer = NULL; // SICHER: Verhindert Use-After-Free
// Sicher: NULL-Prüfung verhindert Probleme
if (buffer) {
printf("Daten: %s\n", buffer);
}
}
// SICHER: Strukturierte Bereinigung
typedef struct {
char* name;
int id;
int name_valid; // Verfolgt ob name gültig ist
} SafeUser;
void cleanup_user_sicher(SafeUser* user) {
if (user && user->name && user->name_valid) {
free(user->name);
user->name = NULL;
user->name_valid = 0;
}
}
# SICHER: Python korrekter Ressourcenlebenszyklus
from datetime import datetime, timedelta
from contextlib import contextmanager
# SICHER: Verwendung von Kontextmanagern
def datei_mit_kontext_sicher():
with open('daten.txt', 'r') as f:
inhalt = f.read()
# Datei automatisch nach Block geschlossen
# Kann geschlossene Datei nicht versehentlich verwenden
# SICHER: Token mit Ablaufprüfung
class SichereTokenAuth:
def __init__(self):
self.token = None
self.expires_at = None
def authenticate(self, token, expires_in=3600):
self.token = token
self.expires_at = datetime.now() + timedelta(seconds=expires_in)
def is_expired(self):
return not self.expires_at or datetime.now() >= self.expires_at
def get_token(self):
if self.is_expired():
raise TokenExpiredError("Token ist abgelaufen")
return self.token
def make_request(self, endpoint):
if self.is_expired():
self.refresh_token() # Vor Verwendung aktualisieren
headers = {'Authorization': f'Bearer {self.token}'}
return requests.get(endpoint, headers=headers)
Ausgenutzt in der Praxis
Chrome V8 Use-After-Free (Google Chrome, 2021)
Eine Use-After-Free-Schwachstelle in der V8 JavaScript-Engine von Google Chrome ermöglichte es Angreifern, beliebigen Code im Kontext des Browsers auszuführen. Die Schwachstelle wurde aktiv ausgenutzt, bevor Google einen Notfall-Patch veröffentlichte.
Firefox Use-After-Free Angriffe (Mozilla Firefox, 2020)
Mozilla patched mehrere kritische Use-After-Free-Schwachstellen in Firefox, die aktiv von Angreifern ausgenutzt wurden. Die Schwachstellen ermöglichten Remote-Code-Ausführung durch speziell präparierte Webseiten.
iOS Use-After-Free Exploit (Apple, 2021)
Forscher entdeckten eine Use-After-Free-Schwachstelle in iOS, die von der Pegasus-Spyware ausgenutzt wurde, um iPhones ohne Benutzerinteraktion zu kompromittieren.
Tools zum Testen und Ausnutzen
-
AddressSanitizer (ASan) — Compiler-Tool zur Erkennung von Speicherfehlern einschließlich Use-After-Free.
-
Valgrind — Speicherprüfungswerkzeug zur Erkennung von Speicherlecks und Use-After-Free.
-
Dr. Memory — Speicherüberwachungstool für Windows und Linux.
CVE-Beispiele
-
CVE-2021-21224 — Chrome V8 Use-After-Free mit aktiver Ausnutzung.
-
CVE-2020-6819 — Firefox Use-After-Free in nsDocShell.
-
CVE-2021-30858 — WebKit Use-After-Free in Safari/iOS.
Referenzen
-
MITRE Corporation. "CWE-672: Operation on a Resource after Expiration or Release." https://cwe.mitre.org/data/definitions/672.html
-
OWASP. "Memory Management Cheat Sheet." https://cheatsheetseries.owasp.org/cheatsheets/Memory_Management_Cheat_Sheet.html
-
CERT Secure Coding. "MEM30-C: Do not access freed memory." https://wiki.sei.cmu.edu/confluence/display/c/MEM30-C.+Do+not+access+freed+memory