
CVE-2026-0994のAny-unwrapping再帰バグクラスが、RubyおよびPHPのprotobufバインディングにおけるupbのCコアに影響を与えるかどうかを、ASan/UBSanペイロードを用いてテストする監査ハーネス。
protobufのPythonおよびJavaScriptバインディングで確認されたAnyアンラップ再帰CVE(直近では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ランタイムは関与しない — / / / ディスクリプタでをブートストラップし、実際のデコーダエントリポイント(、)を敵対的ペイロードで直接駆動する。ASan/UBSan下で。
google.protobuf.AnyStructValueListValueupb_DefPoolupb_JsonDecodeupb_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、およびワイヤ深さ制限定数は2つのファイル間でバイト単位で同一である(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が再現性のアンカーとなる。