
CVE-2026-0994 Any-unwrapping रिकर्शन बग क्लास Ruby और PHP protobuf बाइंडिंग्स में upb के C कोर को प्रभावित करता है या नहीं, इसका परीक्षण करने वाला ऑडिट हार्नेस, ASan/UBSan पेलोड्स के साथ।
protobuf की Python और JavaScript बाइंडिंग्स में पुष्ट Any-अनरैपिंग रिकर्शन CVEs का फॉलो-अप (सबसे हाल ही में CVE-2026-0994, json_format.py के _ConvertAnyMessage में एक शुद्ध-Python बग, जो ConvertMessage() के बजाय methodcaller() के माध्यम से रिकर्स करता था और चुपचाप डेप्थ काउंटर को छोड़ देता था)।
प्रश्न: क्या Ruby और PHP नेटिव एक्सटेंशन्स में बंडल किए गए C upb कोर में वही बग क्लास मौजूद है?
संक्षिप्त उत्तर: नहीं। JSON-डिकोड पाथ और बाइनरी वायर-डिकोड पाथ दोनों यहाँ परीक्षण किए गए हर केस में अपनी रिकर्शन सीमाओं को सही ढंग से लागू करते हैं, जिसमें 1MB स्टैक के तहत चलाया गया 200,000-स्तरीय स्ट्रेस पेलोड भी शामिल है। यह साक्ष्य के साथ एक असत्यापित परिकल्पना है, कोई भेद्यता नहीं — इसे यहाँ एक स्वच्छ नकारात्मक परिणाम के रूप में दर्ज किया गया है, उसी तरह जैसे आप किसी अन्य शोध थ्रेड में असत्यापित परिकल्पना को लॉग करते हैं।
protobuf के Ruby और PHP नेटिव एक्सटेंशन्स प्रत्येक एक शेयर्ड लाइब्रेरी को लिंक करने के बजाय upb के C कोर का सिंगल-फाइल अमलगमेशन (ruby-upb.c, php-upb.c) वेंडर करते हैं। यह ऑडिट उस सटीक फाइल को एक स्टैंडअलोन C टारगेट के रूप में बनाता है — इसमें कोई Ruby या PHP रनटाइम शामिल नहीं है — google.protobuf.Any / Struct / Value / ListValue डिस्क्रिप्टर्स के साथ एक upb_DefPool बूटस्ट्रैप करता है, और ASan/UBSan के तहत वास्तविक डिकोडर एंट्री पॉइंट्स (upb_JsonDecode, upb_Decode) को सीधे एडवर्सेरियल पेलोड्स के साथ चलाता है।
| पाथ | गार्ड | डिफ़ॉल्ट सीमा | परिणाम |
|---|---|---|---|
JSON डिकोड, jsondec_any (Ruby) | d->depth, jsondec_push में जाँचा गया | 64 | असत्यापित — 5000-स्तरीय पेलोड पर स्वच्छ त्रुटि, बाइट ऑफसेट ~64 स्तरों से बिल्कुल मेल खाता है |
बाइनरी वायर डिकोड, upb_Decode (Ruby) | Decode_LimitDepth | 100 | असत्यापित — 60-स्तरीय बाउंड्री पेलोड पर और 200,000-स्तरीय स्ट्रेस पेलोड पर स्वच्छ kUpb_DecodeStatus_MaxDepthExceeded, दोनों 8MB स्टैक और 1MB स्टैक (एक गैर-मुख्य Ruby थ्रेड का अनुमान) के तहत |
| PHP बाइंडिंग | समान गार्ड फंक्शन्स | समान | पहचान के प्रमाण द्वारा असत्यापित, अलग रन से नहीं — नीचे देखें |
किसी भी रन में कोई ASan या UBSan उल्लंघन नहीं देखा गया। कोई क्रैश नहीं, कोई हैंग नहीं, कोई स्टैक एक्सहॉशन नहीं।
php-upb.c और ruby-upb.c कुल मिलाकर ~1,964 लाइनों में भिन्न हैं, लेकिन jsondec_any, jsondec_push, और वायर डेप्थ-लिमिट कॉन्स्टेंट्स दोनों फाइलों के बीच बाइट-समान हैं (verify_php_identical.sh यह साबित करता है, इसे विश्वास पर न लें — इसे चलाएँ)। चूँकि गार्ड कोड स्वयं प्रमाणित रूप से समान है, Ruby परिणाम बिना किसी अनावश्यक PHP-विशिष्ट हार्नेस की आवश्यकता के स्थानांतरित हो जाता है।
JsonParser / CodedInputStream अपने स्वयं के RecursionLimit हैंडलिंग के साथ)। वास्तव में अप्रयुक्त; यह रेपो अभी इसे कवर नहीं करता।utf8_range.c वैलिडेशन।./fetch_source.sh # pins & clones protobuf @ ead3f0029facc43da13588132e9091bf9bd7a26f
./build.sh # compiles both harnesses w/ ASan+UBSan against the fetched source
./run_tests.sh # generates payloads, runs the full matrix, prints results
./verify_php_identical.sh # confirms the PHP claim above instead of asserting it
आवश्यक: gcc, protoc (apt-get install protobuf-compiler), python3, git। gcc (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0 और libprotoc 3.21.12 के विरुद्ध बनाया और सत्यापित — भिन्न संस्करण भिन्न व्यवहार कर सकते हैं; यदि आपके परिणाम ऊपर दी गई तालिका से मेल नहीं खाते, तो वह डेटा है, आपके सेटअप में बग नहीं। यह मानने से पहले कि यह टूलिंग मिसमैच है, पता लगाएँ कि ऐसा क्यों है।
third_party/ (fetch_source.sh द्वारा फेच किया गया) में Google का Apache-2.0-लाइसेंस्ड protobuf सोर्स है, जो ऊपर दिए गए कमिट पर पिन किया गया है। इसे कभी इस रेपो में कमिट नहीं किया जाता — किसी और के सोर्स ट्री को इस में वेंडर करने के बजाय fetch_source.sh पुनरुत्पादकता एंकर है।