
Encontre backdoors em recursos FiveM antes de iniciá-los: loaders ocultos, load() remoto, payloads ofuscados, tokens vazados. CLI, etapa de CI, biblioteca.
Verifica recursos do FiveM em busca de backdoors antes de você iniciá-los. Ele lê arquivos .lua e .js, analisa o Lua e procura
os padrões que os backdoors conhecidos do FiveM utilizam: um loader escondido atrás de milhares de espaços, código baixado via HTTP e
passado para load(), payloads ofuscados, leituras da sua chave de licença ou senha do RCON, e tokens deixados nos arquivos.
Ele também sinaliza executáveis e caminhos inseguros em um pacote.
Nada é executado e nada é enviado. As mesmas regras da versão gratuita no navegador em RPScripts, que também aceita um ZIP ou uma pasta de servidor inteira por arrastar e soltar.
Node.js 18 ou mais recente. Não é necessária instalação:
npx github:rpScripts/fivem-backdoor-scanner ./resources
Escaneie um único recurso, várias pastas, um ZIP (até 300 MB) ou obtenha JSON para suas próprias ferramentas:
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 saída 0 = nada encontrado, 1 = achados, 2 = uso incorreto, 3 = não foi possível executar uma verificação (caminho ausente, ZIP que não é
legível ou com mais de 300 MB). Isso o torna utilizável como uma etapa 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 | Severidade | Encontra |
|---|---|---|
| LAB-SEC-107 | error | Código empurrado para fora da visualização após 400+ espaços ou tabulações (o truque de loader de uma família de backdoors conhecida) |
| LAB-SEC-101 | warning | load() / loadstring() sobre o corpo de uma resposta HTTP |
| LAB-SEC-102 | warning | load() sobre texto decodificado em tempo de execução (string.char, bytes escapados, decodificadores base64/hex) |
| LAB-SEC-103 | warning | Dados ofuscados: strings longas de bytes escapados, base64/hex com 400+ caracteres, listas longas de string.char |
| LAB-SEC-104 | warning | Lê sv_licenseKey, rcon_password, sv_tebexSecret ou a string do MySQL em um arquivo que envia HTTP |
| LAB-SEC-105 | warning | Requisições HTTP para um IP público bruto ou para um endereço decodificado em tempo de execução |
| LAB-SEC-106 | warning | os.execute, io.popen, gravações fora do próprio resource, SaveResourceFile em outros resources |
| LAB-SEC-108 | warning | Um token de bot do Discord com formato real, webhook do Discord, chave de licença Cfx ou token do GitHub nos arquivos |
| LAB-PKG-004 | warning | .exe, .dll, .bat, .cmd, .ps1, .sh, .vbs, .jar, .scr em uma pasta ou arquivo compactado (.dll é esperado ao lado de um *.net.dll, um resource C#) |
| LAB-PKG-005 | warning | Entrada de arquivo compactado com .., um caminho absoluto ou uma letra de unidade: extraí-la pode gravar fora da pasta de destino |
Avisos são padrões, não provas: um logger de webhook pode legitimamente chamar um IP bruto. Leia a linha reportada e decida.
Um erro (LAB-SEC-107) significa tratar o pacote como comprometido. Cada achado carrega severity, confidence,
method, um texto de correção e referências; os textos estão em rules/catalog.json, as versões em
rules/CHANGELOG.md. Os códigos de regra nunca mudam de significado.
.fxap criptografadas por escrow, Lua
compilado, Lua que não foi possível analisar, JavaScript onde apenas as verificações de texto são executadas, arquivos acima de 2 MB, arquivos compactados dentro do upload).Achados sempre prevalecem sobre a cobertura. Um resultado limpo cobre apenas esses padrões. Ele não prova que um resource é seguro.
+=, ?., <const>, hashes com backtick, /* */) é suportada..zip, .rar, .7z) são listados, não descompactados. Apenas .zip é lido.node_modules e .git são ignorados em uma verificação de pasta. Pastas stream são verificadas.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);
Encontrou um backdoor que o scanner não detecta, ou um falso positivo em um recurso bem conhecido? Abra uma issue com o padrão (nunca um payload ativo ou um token); consulte CONTRIBUTING.md. Para relatar uma família sem publicá-la, consulte SECURITY.md.
git clone https://github.com/rpScripts/fivem-backdoor-scanner.git
cd fivem-backdoor-scanner && npm ci && npm test
Mantido por RPScripts. Licenciado sob MIT. O software é fornecido "como está", sem garantia de qualquer tipo.