
CVE-2026-0994 Any-unwrapping रिकर्शन बग क्लास Ruby और PHP protobuf बाइंडिंग्स में upb के C कोर को प्रभावित करता है या नहीं, इसका परीक्षण करने वाला ऑडिट हार्नेस, ASan/UBSan पेलोड्स के साथ।
स्थिति: पूर्ण। तीन स्वतंत्र कार्यान्वयनों (Ruby/PHP साझा upb कोर, C# का अलग प्रबंधित कार्यान्वयन) में छह रिकर्शन-गार्ड जाँचें, सभी को गलत सिद्ध किया गया, सिवाय उस एक के जो पहले से ही सार्वजनिक और पहले से ही पैच किया गया Python CVE था जिसके विरुद्ध यह ऑडिट किया जा रहा था। कोई नई भेद्यता नहीं मिली।
protobuf की Python और JavaScript बाइंडिंग्स में पुष्ट Any-अनरैपिंग रिकर्शन CVEs के अनुवर्ती (सबसे हाल ही में CVE-2026-0994, json_format.py के _ConvertAnyMessage में एक शुद्ध-Python बग, जो ConvertMessage() के बजाय methodcaller() के माध्यम से रिकर्शन करता था और चुपचाप गहराई काउंटर को छोड़ देता था)।
प्रश्न: क्या यही बग वर्ग Ruby और PHP नेटिव एक्सटेंशन्स में बंडल किए गए C upb कोर में मौजूद है?
संक्षिप्त उत्तर: नहीं। JSON-डिकोड पथ, बाइनरी वायर-डिकोड पथ, और स्वतंत्र प्रबंधित C# कार्यान्वयन सभी यहाँ परीक्षण किए गए प्रत्येक मामले में अपनी रिकर्शन सीमाओं को सही ढंग से लागू करते हैं, जिसमें 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 बूटस्ट्रैप करता है, और वास्तविक डिकोडर एंट्री पॉइंट्स (upb_JsonDecode, upb_Decode) को सीधे विरोधी पेलोड के साथ, ASan/UBSan के अंतर्गत संचालित करता है।
| पथ | गार्ड | डिफ़ॉल्ट सीमा | परिणाम |
|---|---|---|---|
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 बाइंडिंग | समान गार्ड फ़ंक्शन | समान | तत्समकता के प्रमाण द्वारा गलत सिद्ध, अलग रन द्वारा नहीं — नीचे देखें |
JSON डिकोड, JsonParser.MergeAny (C#, Google.Protobuf 3.36.1) | tokenizer.RecursionDepth, Merge() में जाँचा गया | 100 | गलत सिद्ध — 200-स्तरीय पेलोड पर पुष्ट; MergeAny प्रत्येक Any-अनरैप के लिए FromReplayedTokens के माध्यम से एक नया JsonTokenizer बनाता है, लेकिन गहराई लेखांकन सही ढंग से उसके माध्यम से प्रसारित होता है |
बाइनरी वायर डिकोड, CodedInputStream/Value.Parser (C#, Google.Protobuf 3.36.1) | स्ट्रीम पर recursionDepth/recursionLimit | 64 | गलत सिद्ध — 60-स्तरीय सीमा पेलोड पर स्वच्छ InvalidProtocolBufferException (Ruby वायर परीक्षण के समान पेलोड बाइट्स, सीधे पुनः उपयोग किए गए) |
किसी भी रन में कोई ASan या UBSan उल्लंघन नहीं देखा गया। कोई क्रैश नहीं, कोई हैंग नहीं, कोई स्टैक थकावट नहीं।
php-upb.c और ruby-upb.c समग्र रूप से ~1,964 पंक्तियों में भिन्न हैं, लेकिन jsondec_any, jsondec_push, और वायर गहराई-सीमा स्थिरांक दोनों फ़ाइलों के बीच बाइट-समान हैं (verify_php_identical.sh इसे सिद्ध करता है, इसे विश्वास पर मत लें — इसे चलाएँ)। चूँकि गार्ड कोड स्वयं प्रमाणित रूप से समान है, Ruby परिणाम बिना किसी अनावश्यक PHP-विशिष्ट हार्नेस की आवश्यकता के स्थानांतरित होता है।
चार बाइंडिंग्स का परीक्षण किया गया (Ruby, PHP, C#, साथ ही Python का पहले से सार्वजनिक CVE), सभी गलत सिद्ध, सिवाय उस एक के जो पहले से ही अपस्ट्रीम में पैच किया गया था। शेष खुली शाखाएँ, इनमें से कोई भी इस विशिष्ट बग वर्ग की नहीं:
utf8_range.c सत्यापन।dotnet run -- wire <payload>) अभी तक CI में जोड़ा नहीं गया है — केवल JSON-मोड 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 ही पुनरुत्पादनशीलता का आधार है।