93 lines
4.2 KiB
Markdown
93 lines
4.2 KiB
Markdown
---
|
|
title: Sicherheit
|
|
layout: default
|
|
root: ../..
|
|
idx: 8.3
|
|
---
|
|
|
|
## Einleitung <!-- omit in toc -->
|
|
|
|
Sicherheit ist sehr wichtig, um sicherzustellen, dass Serverbesitzer durch den Mod keine Daten oder die Kontrolle verlieren.
|
|
|
|
- [Zentrale Konzepte](#zentrale-konzepte)
|
|
- [Formspecs](#formspecs)
|
|
- [Trauen Sie niemals Einsendungen](#trauen-sie-niemals-einsendungen)
|
|
- [Der Zeitpunkt der Prüfung ist nicht der Zeitpunkt der Nutzung](#check-use)
|
|
- [(Unsichere) Umgebungen](#umgebungen)
|
|
|
|
## 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:
|
|
|
|
```lua
|
|
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](../players/formspecs.html#contexts), wie zuvor im Kapitel Formspecs gezeigt.
|
|
|
|
### Der Zeitpunkt der Prüfung ist nicht der Zeitpunkt der Nutzung <a name=check-use"></a>
|
|
|
|
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 <a name="umgebungen"></a>
|
|
|
|
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?
|
|
|
|
```lua
|
|
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:
|
|
|
|
```lua
|
|
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.
|