Jak číst fxmanifest.lua očima bezpečnostního revizora

Publikováno 5 min čteníTitan Software z.s.

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

DirektivaKde běžíKam dosáhne
server_scriptsProces vašeho serveruDatabáze, convary, konzole, souborový systém, odchozí síť, přidělování ACE
client_scriptsHra každého připojeného hráčeStav hry, vlastní session hráče, odchozí síť z klienta
shared_scriptsObě stranyVšechno z obou řádků výše — revidovat dvakrát, ne jednou
filesPosílá se klientům na vyžádáníSamo o sobě nic, ale takhle se ke klientovi dostávají NUI assety a data
ui_pageNUI prohlížeč na klientoviHTML/JS bundle, což je skutečný kód a zaslouží si vlastní revizi
dependencies / providePořadí načítání a identitaVtáhne do hry jiné resources, nebo se za jeden vydává
Co která načítací direktiva ve skutečnosti uděluje

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

lua
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' }
Explicitní, minimální, všechno pojmenované

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

lua
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

  1. 1Otevřete fxmanifest.lua a vypište každou serverovou položku.
  2. 2Rozbalte každý glob výpisem adresáře, který pokrývá, a soubory přidejte na seznam.
  3. 3Označte cokoli s ../, s absolutní cestou nebo s názvem napodobujícím soubor frameworku.
  4. 4Poznamenejte si dependencies a provide a zvažte, jestli dávají pro účel resource smysl.
  5. 5Porovnejte deklarované soubory s obsahem archivu; prošetřete všechno, co je jen na jedné straně.
  6. 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.

Související projekty

Čtěte dál