Skip to content
KitploitKITPLOIT
ツールエクスプロイトブログ
Log in
提出
ツールエクスプロイトブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

フィードお問い合わせプライバシー© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
rocq-cve-poc-22024 — CVE-2026-72704 — Rocq Guard Checkerがトランスポート後に破損した再帰ツリーを信頼する | Kitploit
ツール/GitHubGitHub/endrazine/rocq-cve-poc-22024
脆弱性分析エクスプロイト暗号化論文と研究
GitHubendrazine/rocq-cve-poc-22024

rocq-cve-poc-22024

CVE-2026-72704 — Rocq Guard Checkerがトランスポート後に破損した再帰ツリーを信頼する

リポジトリを見る
2日前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

CVE-2026-72704 — Rocq ガードチェッカーがトランスポート後に破損した再帰ツリーを信頼する

一貫した公理から 0 = 1 をガードチェッカーの不動点再帰ツリー破損を経由して証明する。

フィールド値
バグ報告rocq-prover/rocq#22024
修正PR #22027 (オープン)
影響範囲Rocq ≤ 9.2.0 / Coq 8.x (ガードチェッカーを備えるすべてのバージョン)
CVSS 3.1AV:L/AC:L/PR:N/UI:R/S:C/C:N/I:H/A:N — 7.1
CWECWE-670 (常に誤った制御フロー実装)
CVECVE-2026-72704

脆弱性の概要

Rocq Prover のガードチェッカー(不動点の停止性チェッカー)は、帰納型の引数の 再帰ツリー表現がトランスポート(rew)によって変更された場合に、その再帰ツリーを 再検査しない。不動点は帰納型の型パラメータの再帰ツリーを暗黙のうちに破損させ得る。 そして最初の不動点を呼び出す2番目の不動点は、検証なしに破損した再帰ツリーを信頼し、 停止しない定義を構造的に減少するものとして受け入れてしまう。

このエクスプロイトは、CIC と一貫性のある2つの公理を使用する。これらは 一貫性公理(ユニバレンス公理)の直接の帰結である(0↔1 を入れ替える全単射は Type 内にパス nat = nat を与え、それに沿ったトランスポートは 0 を 1 に送る)。 健全なガードチェッカーは、一貫性のある公理から False を導出してはならない。

このエクスプロイトの特徴:

  • 一貫性のある2つの公理のみを使用する(ユニバレンスの帰結)
  • Print Assumptions はそれら2つの公理のみを報告する — False も sorry もない
  • プラグイン、安全でない機能、宇宙の操作は一切なし
  • ガードチェッカーが唯一の非健全性の原因である

使用方法

docker build -t rocq-cve-poc-22024 .
docker run --rm rocq-cve-poc-22024

脆弱な Rocq バージョンで期待される出力:

[*] Compiling ZeroEqOne.v with rocq compile ...

zero_eq_one is defined
Axioms:
e : nat = nat
e1 : rew [fun T : Type => T] e in 0 = 1

[!] VULNERABILITY CONFIRMED

    zero_eq_one : 0 = 1
    Axioms used: e (nat = nat), e1 (transport sends 0 to 1)
    These axioms are consistent (consequences of univalence).
    A sound guard checker must not derive False from them.

    Bug class:  Guard checker rectree corruption (CWE-670)
    Root cause: fixpoints can alter rectrees via transport; nested
                fixpoints trust the corrupted rectree without recheck
    Bug report: https://github.com/rocq-prover/rocq/issues/22024

影響

Rocq のカーネルで検査された証明を信頼し、かつ univalence と整合する公理を使用しているあらゆるシステムが影響を受けます:

  • HoTT 開発: univalence 公理(または同じクラスのバグを引き起こす可能性がある命題的外延性)を使用するあらゆる Rocq プロジェクトは、非終了であるにもかかわらず、ガードチェックされた fixpoint が黙って受理される可能性があります。
  • 形式検証済みソフトウェア: CompCert、CertiKOS、Iris、および CIC と整合するカスタム公理を追加するあらゆるプロジェクトは、ガードチェッカーが唯一の終了保証である場合にリスクにさらされます。
  • 証明付きコード: 悪意のある依存関係が 2 つの公理と破損した fixpoint を持ち込み、下流で False を使用することができます。

技術的詳細

ガードチェッカーのバグ

Rocq のガードチェッカーは、rectree を構築することによって fixpoint が構造的に減少していることを検証します。rectree とは、再帰呼び出しの各時点で再帰引数のどの部分項が利用可能かを追跡するツリーです。このバグは 2 段階の失敗です:

  1. Rectree の破損: weird は Box A 上の fixpoint であり、wrap ケースで再帰引数に rew [Box] e(e : A = A に沿った transport)を適用します。ガードチェッカーは、transport が帰納型 Box を保持するためこれを受理しますが、パラメータ A の rectree は黙って変更されます — transport の後、ガードチェッカーの内部モデルは A を通じてどの値が流れるかを正確に追跡しなくなります。

  2. 未検査の信頼: loop は weird loop e (wrap _ (box _ n)) を呼び出します。ガードチェッカーは loop 自身の再帰呼び出しを検証しますが、ネストされた呼び出しについては weird の rectree を信頼します。weird の rectree が transport によって破損しているため、ガードチェッカーは loop が構造的に減少していると誤って結論付けます。

矛盾

ガードチェッカーが欺かれた結果、loop は非終了であるにもかかわらず受理されます。そして証明は次を示します:

loop 1 = S (loop 1)

loop と weird を展開し、e1 を使って transport が box nat 0 を box nat 1 に送り、それが loop にフィードバックされることを示すことで得られる。∀ n, n ≠ S n は帰納法により証明可能であるため、loop 1 = S (loop 1) から False が導かれ、そこから 0 = 1 が得られる。

公理が無矛盾である理由

2つの公理:

e  : nat = nat :> Type
e1 : rew [fun T => T] e in 0 = 1

は単一性公理の帰結である。単一性の下では、任意の全単射 f : nat → nat が Type 内に経路 nat = nat を与え、その経路に沿った 輸送は f として作用する。0↦1、1↦0、および n≥2 に対して n↦n を送る全単射 swap01 はそのような全単射であり、swap01 0 = 1 が e1 を 証人立てする。

単一性は CIC と整合的であることが知られている(キュービカル型 理論モデルによって検証済み)。したがって、これらの公理が矛盾の 原因ではあり得ない — ガードチェッカーが原因である。

他の PoC との比較

観点Rocq #22024(本バグ)Rocq #22287Lean #14484
バグ分類ガードチェッカーの rectree 破損宇宙検査の状態デシンク推論キャッシュのポイズニング
必要な公理2(単一性と整合的)なしなし
エクスプロイトの複雑さ約30行6行約20行
コンポーネントガードチェッカー(fixpoint)モジュールシステム(ugraph フラグ)型チェッカー(opaque 宣言)
修正状況PR #22027(オープン)オープン修正済み(PR #14498)

クレジット

  • バグ発見: Yann Leray (@yannl35133)
  • PoC パッケージング: Jonathan Brossard (@endrazine)
ツールをダウンロード