🔍 Contexte

PubliĂ© le 26 octobre 2026 par Tomasz Kaye (Axe Ghost) sur axeghost.offprint.app, cet article prĂ©sente une divulgation publique anticipĂ©e d’une vulnĂ©rabilitĂ© dĂ©couverte dans le moteur de jeu Godot, affectant les versions 4.1 et ultĂ©rieures (confirmĂ©e sur 4.7-stable). La divulgation intervient aprĂšs l’absence de rĂ©ponse du vendor suite Ă  un signalement privĂ© effectuĂ© le 23 septembre 2026.

🐛 VulnĂ©rabilitĂ©

Le chargeur de traductions .po de Godot stocke l’en-tĂȘte Plural-Forms sans validation grammaticale. Lors du premier appel Ă  une traduction plurielle (tr_n()), cet en-tĂȘte est Ă©valuĂ© par l’Ă©valuateur d’expressions gĂ©nĂ©raliste de Godot (Expression), qui peut appeler toutes les fonctions utilitaires enregistrĂ©es du moteur, y compris bytes_to_var_with_objects() — explicitement documentĂ©e comme dangereuse sur des entrĂ©es non fiables.

⛓ ChaĂźne d’exploitation (6 Ă©tapes)

  • core/io/translation_loader_po.cpp:232 : stockage sans validation
  • core/string/translation.cpp:222 : transmission Ă  PluralRules::parse()
  • core/string/plural_rules.cpp:40-46 : Ă©valuation comme Expression gĂ©nĂ©raliste
  • core/math/expression.cpp : dispatch vers bytes_to_var_with_objects()
  • core/io/marshalls.cpp:699-785 : dĂ©codage d’un objet avec classe et propriĂ©tĂ©s choisies par l’attaquant
  • modules/gdscript/gdscript.cpp:1013-1017 : compilation et exĂ©cution de l’initialiseur statique du script fourni

💣 Impact dĂ©montrĂ©

  • Preuve 1 : plural=seed(123456789) — manipulation de l’Ă©tat RNG global du jeu (10/10 runs)
  • Preuve 2 : dĂ©codage d’un enregistrement Variant de 180 octets contenant un objet GDScript avec code source arbitraire — exĂ©cution de l’initialiseur statique (10/10 runs)
  • Le script de l’attaquant s’exĂ©cute avec les mĂȘmes privilĂšges systĂšme que le jeu
  • Le payload tient en 180 octets dans l’en-tĂȘte Plural-Forms, sans fichier script, sans code natif, sans rĂ©fĂ©rence externe

📊 Score CVSS

CVSS 3.1 : 7.8 (High) — CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H

🔧 État des correctifs

Au 24 octobre 2026, aucun correctif n’est mergĂ©. Deux PR sont ouvertes :

  • PR #123130 (03/09/2026) : restreint partiellement les fonctions autorisĂ©es — la preuve seed() reste exploitable
  • PR #123857 (26/09/2026) : restreint aux fonctions mathĂ©matiques pures — ferme la chaĂźne dĂ©montrĂ©e, mais sans parser gettext dĂ©diĂ©

📅 Timeline

  • 23/09/2026 : signalement privĂ© Ă  [email protected]
  • 24/09/2026 : deux suivis envoyĂ©s (caveat grammatical + vidĂ©o de dĂ©monstration)
  • 26/10/2026 : Godot modifie sa page de contact pour interdire les rapports assistĂ©s par IA — divulgation publique anticipĂ©e

📄 Type d’article

Divulgation publique de vulnérabilité (full disclosure anticipée) avec preuve de concept, analyse de code source, scoring CVSS et timeline de coordination. But principal : alerter les développeurs de jeux Godot chargeant des traductions communautaires.

🧠 TTPs et IOCs dĂ©tectĂ©s

TTP

  • T1195.002 — Supply Chain Compromise: Compromise Software Supply Chain (Initial Access)
  • T1059.007 — Command and Scripting Interpreter: JavaScript (Execution)
  • T1027 — Obfuscated Files or Information (Defense Evasion)

IOC

  • Chemins : core/io/translation_loader_po.cpp
  • Chemins : core/string/translation.cpp
  • Chemins : core/string/plural_rules.cpp
  • Chemins : core/math/expression.cpp
  • Chemins : core/io/marshalls.cpp
  • Chemins : modules/gdscript/gdscript.cpp

⚠ À propos de ces IOC — ils sont extraits automatiquement de l’article original le 27 octobre 2026 et n’ont pas fait l’objet d’une vĂ©rification externe. Un indicateur peut avoir Ă©tĂ© rĂ©attribuĂ© depuis : une IP de C2 peut redevenir un service lĂ©gitime, un domaine sinkholĂ© peut changer de propriĂ©taire. Aucune garantie d’exactitude ni d’actualitĂ© — contrĂŽlez leur validitĂ© avant tout usage opĂ©rationnel, en particulier avant de les injecter dans une blocklist ou un SIEM.


🟡 Indice de vĂ©rification factuelle : 40/100 (moyenne)

  • ⬜ axeghost.offprint.app — source non rĂ©fĂ©rencĂ©e (0pts)
  • ✅ 9300 chars — texte complet (fulltext extrait) (15pts)
  • ✅ 6 IOCs (IPs/domaines/CVEs) (10pts)
  • ⬜ pas d’IOC vĂ©rifiĂ© (0pts)
  • ✅ 3 TTPs MITRE identifiĂ©es (15pts)
  • ⬜ date RSS ou approximĂ©e (0pts)
  • ⬜ aucun acteur de menace nommĂ© (0pts)
  • ⬜ pas de CVE Ă  vĂ©rifier (0pts)

🔗 Source originale : https://axeghost.offprint.app/a/3mysixmpap723-a-community-translation-can-run-attacker-chosen-code-in-an-exported-godot-game