Skip to content
KitploitKITPLOIT
OutilsExploitsBlog
Log in
Soumettre
OutilsExploitsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

FluxContactConfidentialité© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
rocq-cve-poc-21683 — CVE-2026-72705 — Le vérificateur Rocq Guard accepte un point fixe passé comme argument d'ordre supérieur | Kitploit
Outils/GitHubGitHub/endrazine/rocq-cve-poc-21683
Analyse des VulnérabilitésExploitationCryptographieArticles et Recherche
GitHubendrazine/rocq-cve-poc-21683

rocq-cve-poc-21683

CVE-2026-72705 — Le vérificateur Rocq Guard accepte un point fixe passé comme argument d'ordre supérieur

Voir le dépôt
il y a 2 joursPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

CVE-2026-72705 — Le vérificateur de garde de Rocq accepte un Fixpoint passé comme argument d'ordre supérieur

Prouver 0 = 1 sans axiome via le paradoxe de Russell en contournant le vérificateur de garde sur les fixpoints.

Découvert de manière autonome par Claude Opus 4.6 (Anthropic).

ChampValeur
Rapport de bugrocq-prover/rocq#21683
CorrectifPR #21684
AffectéRocq ≤ 9.1.0 / toutes les versions de Coq avec vérificateur de garde
Corrigé dans9.2.0
CVSS 3.1AV:L/AC:L/PR:N/UI:R/S:C/C:N/I:H/A:N — 7.1
CWECWE-670 (Implémentation de flux de contrôle toujours incorrecte)
CVECVE-2026-72705

Résumé de la vulnérabilité

Le vérificateur de garde accepte des fixpoints qui se passent eux-mêmes comme arguments d'ordre supérieur à un autre fixpoint, lequel les appelle ensuite sur des non-sous-termes de l'argument structurel. Passer une fonction récursive à une Definition (constante non-fixpoint) est correctement rejeté — le vérificateur de garde la déplie et voit l'appel problématique. Mais le passer à un Fixpoint est incorrectement accepté.

Cela crée un paradoxe de style Russell en 4 lignes :

Definition delta (x : russell 1) : False := x x.
Definition omega : False := delta delta.

où russell 1 est par définition égal à russell 1 -> False — un type qui est sa propre négation. L'auto-application donne directement False.

L'exploit :

  • N'utilise aucun axiome, plugin ou fonctionnalité unsafe
  • Print Assumptions rapporte « Closed under the global context »
  • La preuve entière de False tient en 4 lignes de code fonctionnel
  • Aucune tactique, aucun Qed — purement définitionnel

Utilisation

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

Impact

Tout système qui fait confiance aux preuves vérifiées par le noyau de Rocq est affecté :

  • Logiciels formellement vérifiés : CompCert, CertiKOS, Iris, MathComp
  • Contrats intelligents : ConCert, DeFi vérifié
  • Preuves générées par IA : tout système utilisant Rocq comme backend de confiance

Détails techniques

La construction du paradoxe

iterate_to_neg f n seed :=
  match n with
  | 0   => f seed -> False      (* negate after n steps *)
  | S m => iterate_to_neg f m seed
  end

russell n :=
  match n with
  | 0   => True
  | S m => iterate_to_neg russell 1 (S m)   (* passes ITSELF *)
  end

Le vérificateur de garde devrait rejeter russell parce qu'il se passe lui-même comme argument d'ordre supérieur à iterate_to_neg, qui l'appelle ensuite sur S m (qui n'est pas un sous-terme de n). Mais le vérificateur ne suit que les appels récursifs directs, pas les appels via des arguments de point fixe d'ordre supérieur.

Réduction

russell 1 = iterate_to_neg russell 1 1
          = iterate_to_neg russell 0 1
          = russell 1 -> False

Donc russell 1 ≡ russell 1 -> False. C'est l'ensemble de Russell classique : l'ensemble de tous les ensembles qui ne se contiennent pas eux-mêmes. L'auto-application donne :

delta : russell 1 -> False    (* russell 1 = russell 1 -> False *)
delta x := x x                (* x : russell 1 = russell 1 -> False *)

omega : False
omega := delta delta           (* delta : russell 1 -> False = russell 1 *)

Découverte

Ce bug a été trouvé de manière autonome par Claude Opus 4.6 lors d'une campagne de fuzzing nocturne mise en place par Tristan Stérin (@tcosmo), à partir d'indices fournis par Yannick Forster (@yforster) sur le vérificateur de gardes. L'IA a identifié le schéma de contournement du point fixe d'ordre supérieur et a construit l'exploit minimal iterate_to_neg/russell.

Voir : fil Zulip

Crédits

  • Découverte du bug : Claude Opus 4.6 (Anthropic), configuration par Tristan Stérin (@tcosmo)
  • Correctif du noyau : PR #21684
  • Packaging du PoC : Jonathan Brossard (@endrazine)
Télécharger l’outil