
Encuentra puertas traseras en recursos de FiveM antes de iniciarlos: cargadores ocultos, load() remoto, payloads ofuscados, tokens filtrados. CLI, paso de CI, biblioteca.
Comprueba los recursos de FiveM en busca de backdoors antes de iniciarlos. Lee los archivos .lua y .js, analiza el Lua y busca los patrones que utilizan los backdoors conocidos de FiveM: un cargador oculto tras miles de espacios, código descargado por HTTP y pasado a load(), payloads ofuscados, lecturas de tu clave de licencia o contraseña RCON, y tokens dejados en los archivos. También marca ejecutables y rutas inseguras en un paquete.
No se ejecuta nada ni se sube nada. Las mismas reglas que la versión de navegador gratuita en RPScripts, que además acepta un ZIP o una carpeta de servidor completa mediante arrastrar y soltar.
Node.js 18 o superior. No requiere instalación:
npx github:rpScripts/fivem-backdoor-scanner ./resources
Escanea un único recurso, varias carpetas, un ZIP (hasta 300 MB), u obtén JSON para tus propias herramientas:
npx github:rpScripts/fivem-backdoor-scanner ./resources/[shops]/my_shop ./resources/[jobs]
npx github:rpScripts/fivem-backdoor-scanner ./downloaded-pack.zip
npx github:rpScripts/fivem-backdoor-scanner ./resources --json > report.json
Código de salida 0 = no se encontró nada, 1 = hallazgos, 2 = uso incorrecto, 3 = no se pudo ejecutar un escaneo (ruta faltante, ZIP que no es legible o que supera los 300 MB). Eso lo hace utilizable como un paso de CI:
# .github/workflows/backdoor-scan.yml
on: [push, pull_request]
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: 20 }
- run: npx --yes github:rpScripts/fivem-backdoor-scanner ./resources
| Código | Gravedad | Encuentra |
|---|---|---|
| LAB-SEC-107 | error | Código desplazado fuera de la vista tras más de 400 espacios o tabulaciones (el truco del cargador de una conocida familia de puertas traseras) |
| LAB-SEC-101 | advertencia | load() / loadstring() sobre el cuerpo de una respuesta HTTP |
| LAB-SEC-102 | advertencia | load() sobre texto decodificado en tiempo de ejecución (string.char, bytes escapados, decodificadores base64/hex) |
| LAB-SEC-103 | advertencia | Datos ofuscados: cadenas largas de bytes escapados, base64/hex de más de 400 caracteres, listas largas de string.char |
| LAB-SEC-104 | advertencia | Lee sv_licenseKey, rcon_password, sv_tebexSecret o la cadena de MySQL en un archivo que envía HTTP |
| LAB-SEC-105 | advertencia | Peticiones HTTP a una IP pública sin procesar o a una dirección decodificada en tiempo de ejecución |
| LAB-SEC-106 | advertencia | os.execute, io.popen, escrituras fuera del propio recurso, SaveResourceFile en otros recursos |
| LAB-SEC-108 | advertencia | Un token de bot de Discord con forma real, un webhook de Discord, una clave de licencia de Cfx o un token de GitHub en los archivos |
| LAB-PKG-004 | advertencia | .exe, .dll, .bat, .cmd, .ps1, .sh, .vbs, .jar, .scr en una carpeta o archivo comprimido (se espera .dll junto a un *.net.dll, un recurso de C#) |
| LAB-PKG-005 | advertencia | Entrada de archivo comprimido con .., una ruta absoluta o una letra de unidad: extraerla puede escribir fuera de la carpeta de destino |
Las advertencias son patrones, no pruebas: un logger de webhook puede llamar legítimamente a una IP sin procesar. Lee la línea reportada y decide.
Un error (LAB-SEC-107) significa tratar el paquete como comprometido. Cada hallazgo incluye severity, confidence,
method, un texto de corrección y referencias; los textos están en rules/catalog.json, las versiones en
rules/CHANGELOG.md. Los códigos de regla nunca cambian de significado.
.fxap cifradas con escrow, Lua
compilado, Lua que no se pudo analizar, JavaScript donde solo se ejecutan las comprobaciones de texto, archivos de más de 2 MB, archivos comprimidos dentro de la subida).Los hallazgos siempre prevalecen sobre la cobertura. Un resultado limpio cubre solo estos patrones. No demuestra que un recurso sea seguro.
+=, ?., <const>, hashes con comillas invertidas, /* */)..zip, .rar, .7z) se listan, no se descomprimen. Solo se lee .zip.node_modules y .git se omiten en un escaneo de carpeta. Las carpetas stream se escanean.import { scanFiles, scanPath, securityRules } from "fivem-backdoor-scanner";
const one = securityRules("server.lua", source); // { findings, parsed }
const report = await scanPath("./resources"); // folder, ZIP or file
const inMemory = scanFiles({ "server.lua": source });
console.log(report.verdict, report.findings);
¿Encontraste una puerta trasera que el escáner pasa por alto, o un falso positivo en un recurso conocido? Abre un issue con el patrón (nunca un payload activo ni un token); consulta CONTRIBUTING.md. Para reportar una familia sin publicarla, consulta SECURITY.md.
git clone https://github.com/rpScripts/fivem-backdoor-scanner.git
cd fivem-backdoor-scanner && npm ci && npm test
Mantenido por RPScripts. Licencia MIT. El software se proporciona "tal cual", sin garantía de ningún tipo.