
Google Chrome CVE-2026-6307 PoC
Nebula द्वारा वर्णित V8 JS-to-Wasm deoptimization प्रकार भ्रम का स्थानीय पुनरुत्पादन और शस्त्रीकरण, Chrome for Testing 146.0.7680.165 के रेंडरर से xcalc पॉप करने तक ले जाया गया
(बग 147.0.7727.101 में ठीक किया गया है)।
सभी पेलोड हानिरहित हैं (एक कैलकुलेटर / exit(0x42) / jmp $)।
सब कुछ एक स्थानीय प्रयोगशाला में जानबूझकर पुराने ब्राउज़र के विरुद्ध चलता है
इसे किसी और पर न लगाएं।
https://github.com/user-attachments/assets/d450f064-ba52-4f39-a88b-367f31217143
JSToWasmFrameStateFunctionInfo का समानता ऑपरेटर Wasm हस्ताक्षर तुलना को छोड़ देता है, इसलिए CSE/GVN केवल हस्ताक्षर में भिन्न फ्रेम स्थितियों को मर्ज करता है। एक आलसी deopt तब एक Wasm i64 को एक टैग किए गए externref के रूप में मटेरियलाइज़ करता है (और इसके विपरीत), एक पूर्ण 64-बिट addrof/fakeobj देता है जिसके पॉइंटर्स नहीं cage-compressed हैं
(Wasm refs टैग किए गए रजिस्टर प्रतिनिधित्व का उपयोग करते हैं, kReturnRegister0 के माध्यम से लौटाए गए)।
नीचे सब कुछ 146.0.7680.165 के विरुद्ध लाइव सत्यापित किया गया था। प्रति-लोड संख्याएं बार-बार चलाने पर मापी गई हिट-दरें हैं (भ्रम GC-संवेदनशील है; प्रत्येक पृष्ठ गंदे बिल्ड पर पुनः लॉन्च होता है)। किसी भी रन ने कभी गलत सकारात्मक उत्पन्न नहीं किया।
--allow-natives-syntaxअधिकांश V8 बग PoCs %OptimizeFunctionOnNextCall के साथ ऑप्टिमाइज़ेशन को मजबूर करते हैं, एक केवल-परीक्षण इंट्रिन्सिक जो --allow-natives-syntax के पीछे गेटेड है जिसे कोई वास्तविक पीड़ित सक्षम नहीं करता। ये बग को बिना किसी ध्वज के चलाते हैं, वार्मअप फीडबैक को आकार देकर ताकि deopt भ्रम स्वाभाविक रूप से सक्रिय हो। प्रत्येक पता रनटाइम पर लीक होता है — कुछ भी हार्डकोडेड नहीं है।
उन्हें बिना किसी ध्वज के हेडलेस चलाएं।
rce-no-aslr/ इसे कोड निष्पादन तक ले जाता है: एक अनुकूलित JS फ़ंक्शन g JIT डबल-लिटरल के रूप में execve शेलकोड को स्टेज करता है (movabs स्थिरांक, प्रत्येक अगले को चेन करने के लिए eb rel8 में समाप्त होता है), भ्रमित स्टोर g के कोड में एक nop; jmp पैच करता है, और g() को कॉल करना RIP को शेलकोड में स्लाइड करता है।
यह बिल्ड --allow-natives-syntax का उपयोग करता है (%Optimize g के JIT पेलोड को पिन करता है ताकि deopt-GC इसे फ्लश न कर सके) और --no-memory-protection-keys (ताकि भ्रमित स्टोर JIT पृष्ठ को पैच कर सके — वरना V8 का PKU इसे केवल-पढ़ने योग्य चिह्नित करता है)। ASLR बंद है (randomize_va_space=0) इसलिए पते नियतात्मक हैं (A_MAP = 0x5555bbc0128a)। रेंडरर को --disable-seccomp-filter-sandbox --no-zygote की भी आवश्यकता है, क्योंकि seccomp अन्यथा शेलकोड के execve को ब्लॉक करता है।
नेटिव x86_64 Linux, ASLR बंद, PATH पर Chrome 146, :0 पर एक X डिस्प्ले (Xvfb या वास्तविक X)। rce-no-aslr/run.sh सभी फ्लैग सेट करता है और http पर सर्व करता है।
cd rce-no-aslr
./run.sh calc # pop a real xcalc over http://127.0.0.1:8080, on :0
./run.sh exit # strace-confirms the renderer's exit(66)
./run.sh jmp # gdb-confirms RIP inside the injected shellcode
./demo.sh calc # clean-slate + auto-retry, full-size headful browser (for recording)
./demo.sh msgbox # same, but the pop is a branded "0xSha :: pwned" box
pocmode.sh calc|msgbox स्विच करता है कि RCE का execve("/usr/bin/xcalc") क्या लॉन्च करता है (एक वास्तविक कैलकुलेटर बनाम ब्रांडेड बॉक्स)। ध्वज-मुक्त प्रिमिटिव को केवल एक ब्राउज़र की आवश्यकता है:
chrome --headless=new --no-sandbox http://127.0.0.1:8080/flag-free/01-primitives-flagfree.html
flag-free/ ध्वज-मुक्त योगदान (NO --allow-natives-syntax)
00-reachability ट्रिगर + पैच अंतर (vuln 146 बनाम पैच किया गया 147)
01-primitives addrof / fakeobj
02-store केज-बाहर स्टोर
03-arw केज-अंदर read64 / write64
rce-no-aslr/ दृश्य RCE (नियतात्मक, no-ASLR प्रयोगशाला बिल्ड)
exploit-calc.html / exploit-exit.html
run.sh, demo.sh, pocmode.sh, xcalc-msgbox.sh
बग और मूल-कारण लेख: Nebula Security (ऊपर लिंक किया गया)। इस रिपॉजिटरी में ध्वज-मुक्त ट्रिगर, प्रिमिटिव और दृश्य कार्य स्थानीय प्रयोगशाला में सत्यापित पुनरुत्पादन/विस्तार हैं।
| फ़ाइल | सिद्ध करता है | सत्यापित |
|---|
flag-free/00-reachability-flagfree.html | भ्रमित स्थिति को ट्रिगर करता है; कमजोर 146 पर फायर करता है, पैच किए गए 147 पर नहीं | 6/15 प्रति लोड |
flag-free/01-primitives-flagfree.html | addrof / fakeobj (fakeobj(addrof(o))===o) | 8/12 |
flag-free/02-store-flagfree.html | केज-बाहर स्टोर एक चुने हुए मान को एक चुनी हुई वस्तु में रखता है | 12/12 |
flag-free/03-arw-flagfree.html | केज-अंदर read64 / write64 (नकली PACKED_DOUBLE सरणी) | 2/12 (अस्थिर, पुनः प्रयास करें) |
| फ़ाइल | सिद्ध करता है | सत्यापित |
|---|
rce-no-aslr/exploit-calc.html | रेंडरर से execve के माध्यम से एक वास्तविक xcalc विंडो पॉप करता है | एक साफ स्लेट पर ~1s में पॉप करता है |
rce-no-aslr/exploit-exit.html | रेंडरर इंजेक्टेड शेलकोड को exit(66) चलाने के लिए चलाता है; #jmp RIP को इसके अंदर घुमाता है | exit(66) 8/8 (strace) |