
llama.cpp Android JNI में CVE-2026-70638 पूर्णांक अतिप्रवाह को एक सुरक्षित अंकगणित डेमो, दुर्भावनापूर्ण GGUF जनरेटर, और अधिकृत सुरक्षा अनुसंधान के लिए Frida हुक के साथ पुनरुत्पादित करता है।
हंट-बेनिटो लेख के लिए साथी PoC "एक गुणा बहुत अधिक: CVE-2026-70638 — llama.cpp के Android JNI हीप आवंटन में पूर्णांक अतिप्रवाह" → https://www.hunt-benito.com/blog/one-multiply-too-many-cve-2026-70638-llama-cpp-android-jni-integer-overflow/
examples/llama.android/llama/src/main/cpp/llama-android.cpp में Java_android_llama_cpp_LLamaAndroid_new_1batch() (llama.cpp बिल्ड b1886–b7445) llama_batch_init() की एक हस्त-प्रति है जो कई अनियंत्रित malloc(sizeof(T) * count) गणनाएँ करती है। हमलावर-नियंत्रित गुणक (n_seq_max, n_tokens, या embd) के साथ, आकार रैप हो जाता है, हीप ब्लॉक आकार में छोटा हो जाता है, और कॉलर के बाद के लेखन इसे ओवरफ्लो कर देते हैं (CWE-190 → CWE-122)। NVD CVSS 3.1 7.8 उच्च (AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H)।
फ़ंक्शन का कमज़ोर मूल भाग:
batch->seq_id[i] = (llama_seq_id *) malloc(sizeof(llama_seq_id) * n_seq_max);
# 1. Arithmetic demonstrator (the core of the article's PoC)
cc -O2 -o overflow_demo overflow_demo.c
./overflow_demo
# 2. Malicious model file
python3 craft_gguf.py 0x40000001 malicious.gguf # -> 416-byte GGUF
xxd malicious.gguf | head # verify magic 'GGUF' + key
# 3. Live hook (rooted/emulator device with frida-server, authorized target only)
frida -U -l hook_new_batch.js -f <package> --no-pause
[2] Malicious: n_seq_max = 0x40000000 (2^30). 4 * 2^30 = 2^32 -> wraps:
n_seq_max (attacker) = 1073741824 (0x40000000)
malloc size, arm64 = 4294967296 bytes (4.00 GiB)
malloc size, armeabi-v7a = 0 bytes
caller believes it got = 4294967296 bytes
>>> 32-bit WRAP: 4294967296-byte write into 0-byte heap block (CWE-122)
armeabi-v7a, अभी भी शिप किया जाता है) पर सीधे पहुँच योग्य है। 64-बिट (arm64-v8a) पर वही अनियंत्रित एक्सप्रेशन इसके बजाय एक मल्टी-GiB ब्लॉक का अनुरोध करता है जिसे malloc विफल कर देता है (NULL → बाद में क्रैश / DoS); हीप भ्रष्टाचार के लिए 32-बिट पथ आवश्यक है।overflow_demo.c कोई सीमा-से-बाहर लेखन नहीं करता — यह केवल सिद्ध करता है कि अंकगणित रैप होता है। craft_gguf.py एक गैर-चलाने योग्य मॉडल (कोई टेंसर नहीं) बनाता है, इसलिए इसे जैसे-का-तैसा हथियार नहीं बनाया जा सकता; यह प्रदर्शित करता है कि हमलावर-नियंत्रित गुणक अविश्वसनीय मेटाडेटा से प्राप्त होता है।llama.cpp को b7446 या उसके बाद के संस्करण में अपग्रेड करें (Android-बाइंडिंग पुनर्लेखन द्वारा new_1batch JNI पथ हटा दिया गया था)। यदि आपको किसी प्रभावित बिल्ड या डाउनस्ट्रीम फोर्क पर बने रहना है, तो https://github.com/Vladimir-tokarev-cyera/llama-cpp-security-patches से Cyera का सत्यापन पैच लागू करें (CVE-2026-43627 batch-init गार्ड इस बग वर्ग के लिए विहित सुधार है)।
केवल अधिकृत सुरक्षा अनुसंधान और शैक्षिक उपयोग के लिए।
| फ़ाइल | उद्देश्य |
|---|
overflow_demo.c | 32-बिट (armeabi-v7a) बनाम 64-बिट (arm64-v8a) size_t के अंतर्गत रैपिंग आकार अंकगणित का स्टैंडअलोन पुनरुत्पादक। कोई दूषित लेखन नहीं — कहीं भी चलाना सुरक्षित। |
craft_gguf.py | llama.embedding_length को हमलावर मान पर सेट करके एक न्यूनतम, संरचनात्मक रूप से मान्य GGUF बनाता है, जो मॉडल-फ़ाइल डिलीवरी वेक्टर दिखाता है (embd सीधे अविश्वसनीय मेटाडेटा से पढ़ा जाता है)। |
hook_new_batch.js | Frida हुक जो किसी शोध डिवाइस पर लाइव JNI सीमा पर तीनों गुणकों को लॉग/ओवरराइड करता है। |