
En octobre 2025, Unity a publié un avertissement de sécurité sérieux : une vulnérabilité critique (CVE-2025-59489) découverte dans le runtime Unity affecte les applications et jeux construits avec Unity 2017.1 et versions ultérieures sur Windows, Android, macOS et, dans certaines conditions, Linux.
Cette faille permet, sous certaines conditions, le chargement de bibliothèques non prévues par l’éditeur et l’exécution de code arbitraire dans le contexte de l’application ciblée. Bien que Unity indique qu’aucune exploitation confirmée « dans la nature » n’a été observée au moment de l’annonce, l’étendue historique des builds potentiellement vulnérables publiés depuis presque une décennie en fait un problème prioritaire pour les développeurs et les éditeurs.
Pourquoi c’est grave ? Unity n’est pas seulement un moteur : c’est une infrastructure. Des centaines de milliers d’applications des petits jeux indépendants aux titres AAA reposent sur ce runtime. Lorsqu’une faille se trouve à ce niveau « bas-niveaux », elle peut toucher massivement des applications dont les développeurs ne se doutent même pas qu’elles sont concernées.
Le risque n’est pas uniquement théorique : il s’agit d’une porte d’entrée qui, si elle est exploitée dans le bon contexte, permettrait à un attaquant d’agir avec les droits et accès de l’application compromise (accès aux fichiers, communications réseau, etc.).
Une vulnérabilité « dormante » depuis Unity 2017
La vulnérabilité a été mise en lumière par une recherche technique publiée récemment, qui explique comment un vecteur d’arguments/intentions permettait au runtime Unity de charger des bibliothèques natives (par exemple des .so
sur Android) depuis des emplacements non contrôlés par l’application.
Techniquement, il s’agit d’une injection d’argument qui peut conduire à l’appel de « dlopen"
sur une bibliothèque arbitraire, une mécanique simple mais dangereuse lorsque le lancement de l’application peut être influencé.
Ce qui rend l’affaire d’autant plus sensibles, c’est l’origine temporelle : le code vulnérable remonte aux versions 2017.1, ce qui signifie que des jeux publiés il y a des années peuvent rester exposés si leurs builds n’ont jamais été recompilés ou patchés.
Autrement dit, il ne s’agit pas seulement des nouveaux projets : le parc installé (les jeux déjà distribués) est concerné. Unity a publié des correctifs et un outil de patch permettant d’appliquer des corrections aux builds existants, en complément des mises à jour de l’éditeur.
Réactions et portée immédiate
La découverte a rapidement été relayée par la presse spécialisée et a déclenché des actions coordonnées : plateformes et éditeurs (Steam, Microsoft, Google…) ont déployé des mitigations temporaires pendant que Unity fournissait ses correctifs, et certains studios ont même retiré temporairement des titres pour appliquer les patchs.
Le message pour les développeurs est simple et urgent : vérifiez vos projets, appliquez les correctifs officiels et, si nécessaire, utilisez l’outil de patch de Unity pour les builds déjà publiés

Détails techniques, scénarios d’attaque et remédiations
A. Mécanique de la vulnérabilité (explication technique sûre)
La vulnérabilité (CVE-2025-59489) est liée à la manière dont le runtime Unity traite certains arguments de lancement / entrées externes et comment il en déduit des chemins ou des bibliothèques à charger.
Concrètement, une chaîne d’entrée (argument en ligne de commande ou paramètre transmis via un mécanisme d’OS comme un Intent Android) peut influencer l’appel à une fonction de chargement dynamique (dlopen
sur Linux/Android ou MacOs, LoadLibrary
sur Windows), poussant le runtime à charger une bibliothèque native depuis un emplacement non prévu par le développeur.
Si une bibliothèque malicieuse est chargée, elle s’exécute avec les droits et permissions de l’application cible, entraînant potentiellement exécution de code arbitraire ou exfiltration de données.
Points clefs à retenir :
- Le vecteur n’est pas un bug de script C# mais un chemin bas-niveau du runtime (gestion d’arguments/entrées + appel de chargement natif).
- L’exploitation exige généralement un vecteur local (capacité à influencer la façon dont l’application est lancée, installer une application co-localisée, ou manipuler raccourcis/URI/arguments). Cela n’élimine pas le risque : dans des environnements multi-applications (Android) ou des plateformes qui acceptent URI externes, le scénario est réaliste.
Remarque sécurité : fournir un exemple de PoC exécutable serait irresponsable — les éditeurs ont choisi de publier des correctifs officiels et un outil de patch (Unity Application Patcher). Je détaille comment valider et corriger en toute sécurité plus bas.
B. Scénarios d’exploitation (conceptuels sans instructions exploitables)
- Android application locale malveillante + Intent manipulé
- Contexte : Un appareil contient l’application cible (jeu Unity) et une autre application malveillante installée localement.
- Mécanique conceptuelle : l’appli malveillante envoie un
Intent
qui lance l’activité Unity (ou l’invoque avec des paramètres) en ajoutant un argument contrôlé qui force le runtime à charger une.so
depuis un chemin accessible par l’attaquant. - Impact possible : exécution de code sous le contexte de l’app cible (vol de fichiers, envoi de données réseau).
- Conditions d’atténuation : si l’activité Unity n’est pas exportée, si les intents sont filtrés/validés ou si le runtime a été patché, l’attaque échoue.
- Windows / macOS manipulation d’arguments sur lancement
- Contexte : l’appli est lancée via un raccourci/URI/launcher qui peut incorporer arguments externes.
- Mécanique conceptuelle : lancement avec un argument malformé qui indique un chemin vers une bibliothèque malveillante sur le système ou un partage réseau.
- Impact : chargement d’icônes/bibliothèques non signées, exécution de code avec les droits de l’utilisateur courant.
- Conditions d’atténuation : signature du binaire, validation des arguments au démarrage, politiques de plateforme (antivirus/launcher) limitant ce type d’arguments.
- Scénario “chaîne d’attaque”
- L’attaquant obtient d’abord un accès basique (ex. installer une application sur Android ou persuader un utilisateur d’ouvrir un raccourci malicieux). Ensuite il tente d’invoquer l’app vulnérable via l’argument permettant le chargement natif. Si le runtime est vulnérable et l’application a des permissions sensibles, l’impact peut être élevé (exfiltration, persistance).
C. Mesures techniques recommandées (par plateforme)
Rappel pratique : Unity a publié des mises à jour et un Unity Application Patcher pour corriger les builds existants priorité numéro 1 : appliquer les correctifs officiels.
1) Actions immédiates (tous environnements)
- Télécharger et appliquer les correctifs Unity officiels (mettre à jour l’éditeur, recompiler les projets lorsque possible).
- Utiliser le Unity Application Patcher pour patcher des builds déjà distribués lorsque recompilation est compliquée (outil fourni par Unity). Testez les builds patchés avant republication.
- Informer les utilisateurs et indiquer qu’une mise à jour est disponible (transparence recommandée).
2) Android
- Ne pas exporter UnityPlayerActivity si ce n’est pas nécessaire. Dans
AndroidManifest.xml
:
<activity android:name="com.unity3d.player.UnityPlayerActivity"
android:exported="false">
...
</activity>
Cela empêche d’autres applications d’appeler directement l’activité via des Intent
. (Si l’activité doit être exportée, restreindre les intent-filter
et valider strictement les extras entrants.)
- Valider et filtrer les Intents entrants côté Java/Kotlin : vérifier que seuls les intents attendus sont traités et rejeter tout paramètre inattendu.
- Limiter les permissions : éviter d’accorder à l’application des permissions inutiles qui augmenteraient l’impact d’une compromission.
- Utiliser la signature/packing : vérifier signatures et intégrité native des bibliothèques.
3) Windows / macOS / Linux
- Ignorer ou valider rigoureusement les arguments de la ligne de commande : n’acceptez explicitement que les flags documentés et ignorez/considérez comme invalides les autres. Exemple (C# pseudo-sécurisé) :
string[] allowedFlags = { "--mode", "--config" }; // exemple
foreach (var arg in Environment.GetCommandLineArgs()) {
if (!IsAllowed(arg)) { continue; }
// traiter seulement si validé
}
- Code signing & intégrité : distribuer des builds signés et vérifier signatures avant chargement dynamique.
- Ne pas charger dynamiquement des bibliothèques depuis des chemins non fiables (partages réseau, dossiers temporaires). Restreindre
LoadLibrary
/dlopen
aux chemins approuvés. - Configurer protections OS : Application Control (AppLocker/SMB hardening), antivirus/EDR, et politiques de lancement qui limitent arguments externes (Steam/launchers ont déjà ajouté mitigations).
D. Tests, validation et processus CI/CD
- Testez les builds patchés sur un parc restreint : s’assurer qu’aucune régression fonctionnelle n’est introduite par le patcher ou la recompilation.
- Ajoutez des checks automatiques en CI : validation des arguments, scanning de dépendances natives, et signatures de binaires.
- Intégrer la revue de sécurité dans le cycle de release : pour tous les builds destinés à la production, prévoir un checklist sécurité (versions Editor, patcher appliqué, manifest Android vérifié, tests d’intégrité).
- Surveiller les indicateurs en production : alertes basées sur comportement inhabituel (app qui tente de charger bibliothèques non-signées, appels système suspects).
E. Que faire si tu découvres qu’un de tes builds est affecté
- Priorité 0 : Consulter la page officielle Unity Security Advisory et télécharger le tool / updates.
- Patch rapide : appliquer le Unity Application Patcher pour les builds distribués (si recompilation immédiate impossible).
- Recompiler & republish : ouvrir le projet dans la version d’Unity corrigée et recompiler pour une correction définitive.
- Coordination plateforme : communiquer avec les stores (Google Play, Steam, etc.) et suivre leurs recommandations (certains ont déployé mitigations côté client/launcher).
Techniquement la vulnérabilité est « simple » dans son principe (injection d’argument → chargement natif non-contrôlé) mais dangeureuse par son emplacement bas-niveau dans le runtime et par la vaste base installée de builds Unity 2017+.
Les développeurs doivent traiter cette alerte comme prioritaire : appliquer les correctifs officiels, patcher ou recompiler les builds existants, et durcir la manière dont leurs applications acceptent des entrées externes (intents, arguments, URI).

3 — Mesures concrètes, snippets et checklist (Android / Windows / macOS / CI)
A — Android : manifest, activités et contrôle des Intents
- Désexporter UnityPlayerActivity si possible
DansAndroidManifest.xml
du projet Unity (ou dans le manifest final), assure-toi que l’activité principale n’est pas exportée :
<activity android:name="com.unity3d.player.UnityPlayerActivity"
android:exported="false"
android:allowBackup="false"
android:label="@string/app_name">
<!-- Si tu dois exporter, alors limiter les intent-filter strictement -->
</activity>
- Si l’activité doit rester exportée : validation stricte des extras
Dans un plugin Android (Java/Kotlin) qui reçoit lesIntent
, valide les extras avant de les transférer au runtime Unity :
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
Bundle extras = intent.getExtras();
if (extras != null) {
String param = extras.getString("my_expected_param");
if (param != null && isValidParam(param)) {
// transmettre à Unity de façon contrôlée
} else {
// ignorer / logger
}
}
}
private boolean isValidParam(String p) {
// Ex: regex, longueur max, whitelist de valeurs
return p.matches("[a-zA-Z0-9_\\-]{1,128}");
}
- Restreindre les permissions et minimiser la surface
Retire les permissions inutiles du manifest (READ_EXTERNAL_STORAGE
, etc.) si non nécessaires réduit l’impact d’une éventuelle compromission.
B — Windows / macOS : validation d’arguments et chargement natif sécurisé
- Filtrer les arguments de la ligne de commande (C# dans
Main
ou premier script) :
string[] allowedFlags = new[] { "--mode", "--config" };
var args = Environment.GetCommandLineArgs();
foreach (var arg in args.Skip(1)) {
if (!IsAllowedArg(arg)) {
Debug.LogWarning($"Argument non autorisé ignoré : {arg}");
continue;
}
ProcessArg(arg);
}
bool IsAllowedArg(string arg) {
// Ex: vérifier clé=valeur, whitelist, longueur, pas de chemins
return arg.Contains("=") && arg.Split('=')[0].TrimStart('-').All(char.IsLetter);
}
- Interdire le chargement dynamique depuis chemins non approuvés
Avant d’appelerLoadLibrary
/dlopen
, vérifier que le chemin est dans une whitelist (ex :Application.dataPath + "/PlugIns"
). Refuser tout chemin absolu pointant vers des dossiers temporaires ou réseaux. - Signer les binaires & vérifier l’intégrité au démarrage
- Distribuer builds signés (Authenticode Windows, codesign macOS).
- Si possible, vérifier au runtime un hachage/empreinte des bibliothèques natives avant chargement (ex : SHA256 stocké et comparé).
C — Utilisation du Unity Application Patcher (procédure opérationnelle)
- Télécharger l’outil officiel depuis le Security Advisory Unity.
- Sauvegarder le build original (APK, EXE, .app).
- Exécuter le patcher en environnement contrôlé (CI ou poste de dev).
- Tester le build patché sur un ensemble réduit d’appareils / OS.
- Remonter en production après validation (release note + version bump).
Remarque : teste toutes les plateformes ciblées : Android (arm/v8/armeabi), Windows x86/x64, macOS intel/arm.
D — Exemple de pipeline CI (GitHub Actions) — checks automatisés
Fichier minimal .github/workflows/security-checks.yml
:
name: Security checks & build
on: [push, pull_request]
jobs:
build-and-scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Unity
uses: game-ci/unity-builder@v2
with:
unityVersion: 2021.3.XX
- name: Run static analysis (example)
run: ./tools/run-static-analysis.sh
- name: Validate Android manifest
run: python tools/validate_manifest.py Android/AndroidManifest.xml
- name: Build
run: ./build.sh
- name: Run integration smoke tests
run: ./tests/run_smoke_tests.sh
- name: Create artifact
uses: actions/upload-artifact@v4
with:
name: build
path: build/output/
Automatise : validation du manifest (exported=false), scanning des dépendances natives, hachage des binaires produits et stockage des artefacts signés.
E — Checklist opérationnelle avant release / hotfix
- Vérifier la version Unity de l’éditeur (installer la version patchée).
- Recompiler le projet avec la version patchée si possible.
- Si recompilation impossible : exécuter Unity Application Patcher sur les builds distribués.
- Valider
AndroidManifest.xml
(activities non exportées, permission minimales). - Scanner les plugins natifs (.so/.dll/.dylib) : vérifier provenance, signature, hachage.
- Mettre en place tests d’acceptation (smoke tests) sur device farm (Android/iOS) et plate-forme desktop.
- Mettre à jour la CI pour inclure checks de sécurité (manifest + args).
- Préparer communication aux utilisateurs / stores.
- Surveiller logs / EDR pour chargements de bibliothèques non signées en production après patch.

Une faille symptomatique d’un problème plus profond
Cette vulnérabilité ne se résume pas à un simple bug de code hérité. Elle illustre un problème systémique dans l’industrie du jeu vidéo : la dépendance massive à des moteurs et runtimes complexes, souvent considérés comme des boîtes noires par les studios.
Quand un moteur comme Unity, Unreal ou Godot devient la fondation de milliers de projets, une seule faille non corrigée se transforme en risque collectif.
Ce qui est marquant ici, c’est la durée : près de huit ans d’exposition potentielle avant la découverte publique. Cela rappelle qu’en matière de sécurité logicielle, l’héritage technique (legacy) n’est jamais neutre.
L’illusion du moteur “clé en main”
Beaucoup de studios utilisent Unity en se concentrant sur le gameplay, le rendu ou la physique, en supposant que la couche “système” est intrinsèquement sûre.
Mais un moteur n’est pas un antivirus : il ne protège pas de tout.
Chaque export, chaque build, chaque plugin ajouté (notamment sur Android ou Windows) représente une surface d’attaque supplémentaire.
Dans le cas présent, la faille vient d’une interaction très bas-niveau entre le runtime Unity et le chargement dynamique des bibliothèques. Un mécanisme que la plupart des développeurs n’ont jamais besoin de manipuler directement, mais dont les conséquences peuvent être dévastatrices s’il est compromis.
Les leçons à tirer pour les développeurs
- Tenir à jour son environnement de build.
Utiliser des versions anciennes de Unity peut sembler pratique pour éviter les régressions, mais c’est une dette technique et sécuritaire.
Chaque année sans mise à jour multiplie les risques de compatibilité… et d’exploitation. - Inclure la sécurité dans le cycle de développement.
Les pratiques comme le DevSecOps (tests de sécurité intégrés à la CI/CD), l’analyse de dépendances, et les audits de code externes doivent devenir la norme, même dans le jeu vidéo. - Ne pas sous-estimer le runtime.
Ce n’est pas parce qu’un projet “tourne” qu’il est sûr. Le moteur est une infrastructure critique : si elle est compromise, tout l’écosystème l’est. - Partager et documenter les incidents.
L’annonce de Unity, bien qu’un peu tardive, a été transparente et accompagnée d’outils. C’est une bonne pratique à suivre dans la communauté : documenter, expliquer, responsabiliser.
Pour les joueurs : la confiance, invisible mais essentielle
Pour le grand public, ce genre d’incident passe souvent inaperçu. Pourtant, la sécurité logicielle influence directement la confiance dans les jeux.
Un jeu qui charge des bibliothèques non sûres pourrait, dans le pire des cas, servir de vecteur à des malwares ou exposer des données personnelles (accès fichiers, réseau local…).
C’est pourquoi les correctifs ne concernent pas que les développeurs : les joueurs doivent aussi penser à mettre à jour leurs titres régulièrement.
Vers une maturité de la sécurité dans le jeu vidéo
Le cas Unity 2017+ pourrait marquer un tournant.
Les studios comprennent peu à peu qu’un moteur de jeu n’est plus seulement un outil créatif, mais un socle technologique aussi sensible qu’un framework web.
Les moteurs doivent donc intégrer des processus de sécurité continue, des audits de code tiers et une meilleure communication avec leurs utilisateurs.
Unity a ouvert la voie avec son “Application Patcher” et une documentation claire un geste salutaire après des mois de critiques sur sa gouvernance technique.
Une faille, un signal d’alarme
Cette vulnérabilité, si elle est bien gérée, restera une anecdote technique.
Mais si elle est ignorée, elle deviendra un précédent : celui d’un écosystème où la sécurité arrive toujours trop tard.
Les jeux vidéo, comme tout autre logiciel, doivent aujourd’hui être pensés, construits et maintenus avec la même rigueur qu’un système d’information critique.
Unity, par son envergure, a l’occasion de montrer la voie : celle d’un moteur plus sûr, plus transparent et plus résilient.
“Quand on construit un monde virtuel, on hérite aussi de la responsabilité de le protéger.”
— Nox Prime, CtrlAltPlay (2025)

Sources
- Unity – Security Update Advisory (détails de la vulnérabilité, versions affectées, gravité, correctifs) – Unity
- Unity – Developer Remediation Guide (instructions de patch / recompile / tool patcher) – Unity
- Flatt.Tech – “CVE-2025-59489: Arbitrary Code Execution in Unity Runtime”, par RyotaK (analyse technique) – GMO Flatt Security
- NVD (National Vulnerability Database) – fiche CVE-2025-59489 – NVD
- Tenable – description & résumé de CVE-2025-59489 (overview, vecteur, liens) – Tenable®
- The Verge – article grand public sur la faille Unity et l’appel à la mise à jour des jeux/apps – The Verge
- Steam / Valve – annonce pour les développeurs Unity (mesures mitigations via Steam) – Steam Boutique
- Unity Discussions – “Unity Platform Protection: Take Immediate Action” (forum officiel de Unity) – Unity Discussions
- Unity Discussions – “Requirements to exploit CVE-2025-59489” (forum technique) – Unity Discussions
- Article “Unity CVE-2025-59489” dans un forum Windows / patch & mitigation multiplateforme – Windows Forum
- SteamDB – mise à jour de version Unity liée à la correction de la faille – SteamDB
- Wikipedia – page Unity (section sur la vulnérabilité) – Wikipédia