minetest_modding_book/_de/quality/security.md
debiankaios 8fb0813f5f All by gamer777:
- Translation of unit_testing.md
- 2 Corrections by him
2022-11-27 15:34:35 +01:00

4.2 KiB

title layout root idx
Sicherheit default ../.. 8.3

Einleitung

Sicherheit ist sehr wichtig, um sicherzustellen, dass Serverbesitzer durch den Mod keine Daten oder die Kontrolle verlieren.

Zentrale Konzepte

Das wichtigste Sicherheitskonzept lautet: Niemals dem Benutzer vertrauen. Alles, was der Benutzer eingibt, sollte als bösartig betrachtet werden. Das bedeutet, dass Sie immer prüfen sollten, ob die eingegebenen Informationen gültig sind, dass der Benutzer über die richtigen Berechtigungen verfügt und dass er ansonsten berechtigt ist, diese Aktion durchzuführen (d.h. im Bereich oder als Eigentümer).

Eine böswillige Aktion ist nicht unbedingt die Änderung oder Zerstörung von Daten, sondern kann der Zugriff auf sensible Daten sein, z. B. Passwort-Hashes oder private Nachrichten. Dies ist besonders schlimm, wenn der Server Informationen wie E-Mails oder das Alter speichert, was manche zu Überprüfungszwecken tun.

Formspecs

Trauen Sie niemals Einsendungen

Jeder Benutzer kann jederzeit fast jeden Formspec mit beliebigen Werten eingeben.

Hier ist ein echter Code, der in einer Mod gefunden wurde:

minetest.register_on_player_receive_fields(function(player,
        formname, fields)
    for key, field in pairs(fields) do
        local x,y,z = string.match(key,
                "goto_([%d-]+)_([%d-]+)_([%d-]+)")
        if x and y and z then
            player:set_pos({ x=tonumber(x), y=tonumber(y),
                    z=tonumber(z) })
            return true
        end
    end
end

Können Sie das Problem erkennen? Ein böswilliger Benutzer könnte eine Formularvorgabe mit selbst bestimmten Positionswerten übermitteln, die es ihm ermöglichen, sich an jeden beliebigen Ort zu teleportieren. Dies könnte sogar automatisiert werden, indem man Änderungen am Client vornimmt, um im Wesentlichen den Befehl den Befehl /teleport zu replizieren, ohne dass ein Privileg erforderlich ist.

Die Lösung für diese Art von Problem ist die Verwendung einer Context, wie zuvor im Kapitel Formspecs gezeigt.

Der Zeitpunkt der Prüfung ist nicht der Zeitpunkt der Nutzung

Jeder Benutzer kann jederzeit einen beliebigen Formspec mit beliebigen Werten übermitteln, außer wenn die Engine dies verbietet:

  • Die Eingabe eines Knoten-formspec-Einsendungen wird blockiert, wenn der Benutzer zu weit entfernt ist.
  • Ab 5.0 werden benannte formspecs blockiert, wenn sie noch nicht angezeigt wurden.

Das bedeutet, dass Sie im Handler prüfen sollten, ob der Benutzer die Bedingungen erfüllt, um die Formspec überhaupt anzuzeigen, sowie alle entsprechenden Aktionen.

Die Schwachstelle, die dadurch entsteht, dass die Berechtigungen in der show formspec geprüft werden, aber nicht in der handle formspec verursacht wird, wird Time Of Check is not Time Of Use (TOCTOU) genannt.

(Unsichere) Umgebungen

Minetest erlaubt es Mods, eine unsandboxed Umgebung anzufordern, die ihnen Zugang auf die gesamte Lua-API gibt.

Können Sie die Schwachstelle im Folgenden erkennen?

local ie = minetest.request_insecure_environment()
ie.os.execute(("path/to/prog %d"):format(3))

string.format ist eine Funktion in der globalen gemeinsamen Tabelle string. Ein bösartiger Mod könnte diese Funktion überschreiben und Material an os.execute übergeben:

string.format = function()
    return "xdg-open 'http://example.com'"
end

Der Mod könnte etwas viel Bösartigeres als das Öffnen einer Website weitergeben, wie z. B. einem entfernten Benutzer die Kontrolle über den Rechner zu geben.

Einige Regeln für die Verwendung einer unsicheren Umgebung:

  • Speichern Sie sie immer in einem lokalen Verzeichnis und geben Sie sie nie in eine Funktion ein.
  • Stellen Sie sicher, dass Sie jeder Eingabe in eine unsichere Funktion vertrauen können, um das oben genannte Problem zu vermeiden. Dies bedeutet, dass global umdefinierbare Funktionen vermieden werden sollten.