flawopen.com/Teardowns/cve-2023-2640-ubuntu-overlayfs-privilege-escalation
CVE-2023-2640: LPE in Ubuntu-OverlayFS
CVE-2023-2640 umgeht Berechtigungsprüfungen in bestimmten Ubuntu-OverlayFS-Kerneln. Prüfen Sie Kernelvariante und Anbieter-Patch.
Stellen Sie sich ein Gebäude vor, in dem ein Mitarbeiter prüft, ob jemand ein amtliches Siegel auf ein Dokument setzen darf. Ein lokaler Schnellweg sollte Prüfungen nur für interne Wartungsetiketten umgehen. Eine spätere Änderung leitete alle Siegelanfragen über diesen Weg, auch eingeschränkte Sicherheitssiegel. Der Fix stellt die normale Berechtigungsprüfung im User-Namespace des eingehängten Dateisystems wieder her.
Kernkonzepte & Begriffe
OverlayFS- OverlayFS ist ein Linux-Union-Dateisystem, das Dateien aus einer unteren Ebene präsentiert und Änderungen in eine obere Ebene schreibt.
Extended attribute (xattr)- Ein erweitertes Attribut (xattr) sind Metadaten an einem Dateisystemobjekt. Linux-Sicherheitsmodule und Dateifähigkeiten verwenden bestimmte xattr-Namespaces.
ovl_do_setxattr()- OverlayFS-Helper zum Schreiben eines xattr in ein Objekt der oberen Ebene. Der betroffene Wrapper nutzte zu breit eine VFS-Funktion ohne Berechtigungsprüfung.
Copy-up- OverlayFS-Vorgang, der eine Kopie in der oberen Ebene anlegt, wenn ein Schreibzugriff eine beschreibbare Kopie des unteren Objekts benötigt.
Framework-Zuordnungen
- CWE-Referenz für die in diesem Leitfaden beschriebene Schwachstelle: CWE-863
Ursachenanalyse
Laut Ubuntu-CVE-Eintrag erfordert die verwundbare Konfiguration sowohl den Upstream-Commit c914c0e27eb0 als auch den Ubuntu-SAUCE-Patch „Skip permission checking for trusted.overlayfs.* xattrs“. Dieser Patch änderte OverlayFS-xattr-Wrapper so, dass sie VFS-Funktionen mit _noperm nutzten; Prüfungen sollten nur für interne trusted.overlayfs.*-Metadaten entfallen. Nach der Upstream-Änderung am Wrapper wurde der Helper auch für andere xattrs verwendet. Dadurch konnte ein lokaler Benutzer ohne Privilegien privilegierte erweiterte Attribute auf eingehängten Dateien setzen und sie ohne passende Prüfungen in die obere Ebene übernehmen lassen. Canonicals Fix nimmt den breiten Pfad ohne Berechtigungsprüfung zurück und ruft vfs_setxattr() mit dem User-Namespace des oberen Mounts auf. Es handelt sich um eine lokale Rechteausweitung speziell im Ubuntu-Kernel; die Betroffenheit hängt von Release, Kernelvariante sowie Namespace- und Mount-Richtlinien ab.
Schritt-für-Schritt Angriffsablauf
Betroffene Ubuntu-Kernelkonfiguration
Der Kernel muss sowohl c914c0e27eb0 als auch den Ubuntu-SAUCE-Patch zum Überspringen der Prüfungen für trusted.overlayfs.*-xattrs enthalten. Die Upstream-Versionsnummer allein belegt keine Betroffenheit.
Lokaler Benutzer erreicht den xattr-Pfad
Ein lokaler Benutzer ohne Privilegien muss den betroffenen OverlayFS-Pfad gemäß den Namespace- und Mount-Richtlinien des Hosts nutzen können. Ubuntu beschreibt einen lokalen Angriff.
Berechtigungsumgehung betrifft weitere xattrs
Der geänderte Wrapper leitete xattr-Änderungen an _noperm-Helper weiter, die für interne OverlayFS-Metadaten gedacht waren. Durch die Upstream-Änderung konnten auch andere xattrs die passenden Prüfungen umgehen.
Privilegiertes Attribut erreicht die obere Ebene
Ubuntu zufolge konnten privilegierte erweiterte Attribute ohne erforderliche Prüfung auf gemounteten Dateien gesetzt und in obere Dateien kopiert werden; dies kann lokale Rechteausweitung ermöglichen. Nicht jede Kernel- oder Containerkonfiguration ist gleich betroffen.
Quellcode: Verwundbar vs. Sicher
Der betroffene SAUCE-Pfad rief nach einer Upstream-Änderung für alle xattrs __vfs_setxattr_noperm() auf. Der Fix verwendet vfs_setxattr() mit dem User-Namespace des oberen Mounts und stellt die normalen VFS-Prüfungen wieder her. Dies ist ein fokussierter Auszug aus Canonicals Patch; umgebende Debug-Ausgaben sind weggelassen.
Quelltextauszug: fs/overlayfs/overlayfs.h
/* Kontext des maßgeblichen Ubuntu-Patches vor dem Zurücknehmen der SAUCE-Änderung. */
static inline int ovl_do_setxattr(struct ovl_fs *ofs, struct dentry *dentry,
const char *name, const void *value,
size_t size, int flags)
{
struct inode *inode = dentry->d_inode;
int err;
inode_lock(inode);
err = __vfs_setxattr_noperm(&init_user_ns, dentry, name,
value, size, flags);
inode_unlock(inode);
return err;
}
/* Maßgebliche Ubuntu-Korrektur: den VFS-Wrapper zur Berechtigungsprüfung wiederherstellen. */
static inline int ovl_do_setxattr(struct ovl_fs *ofs, struct dentry *dentry,
const char *name, const void *value,
size_t size, int flags)
{
int err = vfs_setxattr(ovl_upper_mnt_userns(ofs), dentry, name,
value, size, flags);
return err;
}
Checkliste für Engineering & Systemsicherheit
- ✓Prüfen Sie Ubuntus CVE-Tracker für Release, Kernelvariante und installiertes Paket; betroffen ist eine bestimmte Kombination von Ubuntu- und Upstream-Änderungen.
- ✓Installieren Sie das korrigierte Kernelpaket für das betroffene Ubuntu-Release und die Variante, starten Sie neu und prüfen Sie den laufenden Kernel.
- ✓Falls ein Update warten muss und die Arbeitslast es erlaubt, bewerten Sie Ubuntus temporäre Maßnahme zur Einschränkung nicht privilegierter User-Namespaces; testen Sie Auswirkungen auf Anwendungen und Container.
- ✓Verwenden Sie in OverlayFS-xattr-Wrappern für benutzergesteuerte Attribute berechtigungsprüfende VFS-APIs mit dem korrekten Mount-User-Namespace; reservieren Sie ungeprüfte Helper für eng begründete interne Metadaten.