Jak číst fxmanifest.lua očima bezpečnostního revizora
Ve zkratce
fxmanifest.lua je pro bezpečnostního revizora nejužitečnější soubor ve FiveM resource, protože deklaruje, co runtime skutečně načítá a kde který soubor běží. server_scripts běží uvnitř procesu vašeho serveru s přístupem k databázi a konzoli; client_scripts běží na strojích hráčů, dají se zmanipulovat, ale k vašim datům nedosáhnou; shared_scripts běží na obou stranách, čímž zdvojnásobí plochu; a files jen zpřístupňují obsah klientům. Zastavit se vyplatí u wildcard globů, které schovají nové soubory před revizí, u cest opouštějících adresář resource, u deklarací závislostí a provide, které vtáhnou neprověřený kód, a u každého manifestu, jehož deklarované vstupní body neodpovídají obsahu archivu. Přečtení manifestu jako první změní archiv o dvou stech souborech na krátký seznam.
Hlavní body
- server_scripts je nejcennější sekce: tenhle kód běží s vašimi přístupovými údaji.
- Wildcard globy schovají budoucí soubory před revizí, která četla jen manifest.
- shared_scripts zdvojnásobuje plochu — stejný soubor získá dosah klienta i oprávnění serveru.
- Soubor přítomný v archivu, ale chybějící v manifestu, není automaticky neškodný; může se načítat jinak.
- Nesoulad mezi tím, co manifest deklaruje, a tím, co archiv obsahuje, je sám o sobě nález.
Každý FiveM resource se musí deklarovat. Tou deklarací je fxmanifest.lua a je to nejbližší věc, kterou ekosystém má k manifestu oprávnění: které soubory pro runtime existují, na které straně každý běží a na čem resource závisí. Pro revizora je to místo, kde práce začíná.
Direktivy, které rozhodují o dosahu škody
| Direktiva | Kde běží | Kam dosáhne |
|---|---|---|
| server_scripts | Proces vašeho serveru | Databáze, convary, konzole, souborový systém, odchozí síť, přidělování ACE |
| client_scripts | Hra každého připojeného hráče | Stav hry, vlastní session hráče, odchozí síť z klienta |
| shared_scripts | Obě strany | Všechno z obou řádků výše — revidovat dvakrát, ne jednou |
| files | Posílá se klientům na vyžádání | Samo o sobě nic, ale takhle se ke klientovi dostávají NUI assety a data |
| ui_page | NUI prohlížeč na klientovi | HTML/JS bundle, což je skutečný kód a zaslouží si vlastní revizi |
| dependencies / provide | Pořadí načítání a identita | Vtáhne do hry jiné resources, nebo se za jeden vydává |
Praktický důsledek: pokud stihnete přečíst jen jednu sekci, čtěte server_scripts. Backdoor v klientském skriptu je otrava a vektor pro cheatery. Backdoor v serverovém skriptu je vaše databáze.
Manifest, který vás nemusí znepokojovat
fx_version 'cerulean'
game 'gta5'
author 'Example Studios'
version '2.4.1'
shared_scripts { 'config.lua' }
client_scripts { 'client/main.lua', 'client/nui.lua' }
server_scripts {
'@oxmysql/lib/MySQL.lua',
'server/main.lua',
'server/commands.lua',
}
files { 'html/index.html', 'html/style.css', 'html/app.js' }
ui_page 'html/index.html'
dependencies { 'oxmysql' }Všechno je pojmenované jednotlivě. Seznam revizora je pět Lua souborů a jeden HTML bundle. Pokud se v archivu objeví šestý Lua soubor, nenačítá se — což je samo o sobě zajímavé, ale touhle cestou to nebezpečné není.
Červené vlajky podle toho, jak často na nich záleží
1. Wildcard globy v načítacích direktivách
server_scripts { 'server/**/*.lua' }Pohodlné pro vývojáře, nepřátelské k revizi. Jakýkoli soubor přidaný do toho stromu v budoucí aktualizaci se načte automaticky a revizor, který manifest četl minulý měsíc, nemá signál, že se sada souborů změnila. Není to škodlivé, ale manifest tím přestává být spolehlivou inventurou — vypište si adresář sami.
2. Cesty opouštějící resource
Položky obsahující ../ nebo absolutní cesty se snaží načíst kód mimo adresář resource. U distribuovaného resource pro to existuje jen málo legitimních důvodů a boří to každý předpoklad, se kterým revize po jednotlivých resourcech pracuje.
3. Nečekané shared_scripts
Soubor v shared_scripts běží na obou stranách. Konfigurace tam legitimně patří. Soubor jménem utils.lua nebo core.lua v shared_scripts obsahující síťovou logiku si zaslouží přečíst celý — má zároveň dosah klienta i oprávnění serveru.
4. Nároky na identitu a vkládání závislostí
provide 'somecore' říká runtime, že tenhle resource naplňuje jméno jiného resource. V ekosystému frameworků, kde se resources hledají podle jména, je to způsob, jak se vložit do volací cesty, které jiný kód věří. Zkontrolujte, že položky provide i dependencies odpovídají tomu, k čemu resource poctivě slouží.
5. Manifest a archiv si odporují
Porovnejte deklarovaný seznam souborů s obsahem archivu v obou směrech. Deklarované, ale chybějící soubory naznačují neúplný nebo pozměněný archiv. Přítomné, ale nedeklarované soubory mohou být mrtvá váha, mohou se načítat dynamicky z Lua, nebo tam mohou být proto, aby je provozovatel spustil ručně — což je vlastní kategorie rizika, pokud jde o .exe.
Pětiminutová rutina nad manifestem
- 1Otevřete fxmanifest.lua a vypište každou serverovou položku.
- 2Rozbalte každý glob výpisem adresáře, který pokrývá, a soubory přidejte na seznam.
- 3Označte cokoli s ../, s absolutní cestou nebo s názvem napodobujícím soubor frameworku.
- 4Poznamenejte si dependencies a provide a zvažte, jestli dávají pro účel resource smysl.
- 5Porovnejte deklarované soubory s obsahem archivu; prošetřete všechno, co je jen na jedné straně.
- 6Přečtěte serverový seznam. Pak sdílený. A pokud zbyde čas, i klientský.
Přesně tenhle krok dělá FXScan dřív, než začne hledat jakékoli vzory: naparsuje manifest, vyřeší globy, sestaví reálný graf souborů a označí u každého stranu, na které běží. Proto může být stejný podezřelý vzor v jednom souboru nahlášen jako kritický a v jiném jen informativně — kontext je to, co dělá z nálezu akceschopnou informaci místo šumu.
Nechte analýzu manifestu na nástrojiFXScan parsuje fxmanifest.lua deklarativně a řadí nálezy podle toho, jestli kód opravdu běží a na které straně.Časté dotazy
Co je fxmanifest.lua a proč je důležitý pro bezpečnost?
fxmanifest.lua je deklarační soubor, který musí obsahovat každý FiveM resource. Říká runtime, které soubory načíst a jestli každý z nich běží na serveru, na klientech, nebo na obou stranách. Pro bezpečnostního revizora je to mapa: promění archiv se stovkami souborů na krátký seznam kódu, který se skutečně spouští, a ukáže, která jeho část běží s vašimi přístupovými údaji k databázi.
Jsou wildcard globy ve fxmanifest.lua nebezpečné?
Samy o sobě škodlivé nejsou, ale podkopávají revizi. Položka jako server_scripts { 'server/**/*.lua' } načte jakýkoli soubor přidaný do adresáře v budoucí aktualizaci, takže revizor, který četl manifest, nepozná, že se sada souborů změnila. Když uvidíte glob, vypište si adresář sami a berte výsledný seznam jako skutečný manifest.
Mám se bát souborů v resource, které manifest nikdy nenačte?
Běžnou načítací cestou se spustit nemohou, takže mají nižší prioritu než deklarované serverové skripty. Pohled si přesto zaslouží: nedeklarovaný soubor se může načítat dynamicky z Lua, může jít o instalátor určený ke spuštění rukou provozovatele, nebo o spustitelný soubor, který v Lua resource nemá vůbec co dělat.