2022-11-18 16:56:47 +03:00
|
|
|
---
|
|
|
|
title: Sicherheit
|
|
|
|
layout: default
|
|
|
|
root: ../..
|
|
|
|
idx: 8.3
|
|
|
|
---
|
|
|
|
|
|
|
|
## Einleitung <!-- omit in toc -->
|
|
|
|
|
2022-12-18 12:30:23 +03:00
|
|
|
Sicherheit ist sehr wichtig, um sicherzustellen, dass Serverbesitzer durch die Mod keine Daten oder die Kontrolle verlieren.
|
2022-11-18 16:56:47 +03:00
|
|
|
|
|
|
|
- [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**.
|
2022-12-18 12:30:23 +03:00
|
|
|
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).
|
2022-11-18 16:56:47 +03:00
|
|
|
|
|
|
|
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
|
2022-12-18 12:30:23 +03:00
|
|
|
private Nachrichten. Dies ist besonders schlimm, wenn der Server Informationen
|
|
|
|
wie E-Mails oder das Alter speichert, was manche zu Überprüfungszwecken tun.
|
2022-11-18 16:56:47 +03:00
|
|
|
|
|
|
|
## 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
|
|
|
|
```
|
|
|
|
|
2022-12-18 12:30:23 +03:00
|
|
|
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.
|
2022-11-18 16:56:47 +03:00
|
|
|
|
2022-12-18 12:30:23 +03:00
|
|
|
Die Lösung für diese Art von Problem ist die Verwendung eines
|
|
|
|
[Contexts](../players/formspecs.html#contexts), wie zuvor im Kapitel Formspecs gezeigt.
|
2022-11-18 16:56:47 +03:00
|
|
|
|
2022-11-27 17:34:35 +03:00
|
|
|
### Der Zeitpunkt der Prüfung ist nicht der Zeitpunkt der Nutzung <a name="check-use"></a>
|
2022-11-18 16:56:47 +03:00
|
|
|
|
2022-12-18 12:30:23 +03:00
|
|
|
Jeder Benutzer kann jederzeit einen beliebigen Formspec mit beliebigen Werten übermitteln,
|
|
|
|
außer wenn die Engine dies verbietet:
|
2022-11-18 16:56:47 +03:00
|
|
|
|
2022-12-18 12:30:23 +03:00
|
|
|
* Die Eingabe einer `Node Meta Formspec-Einsendungen` wird blockiert, wenn der Benutzer zu weit entfernt ist.
|
2022-11-18 16:56:47 +03:00
|
|
|
* Ab 5.0 werden benannte formspecs blockiert, wenn sie noch nicht angezeigt wurden.
|
|
|
|
|
2022-12-18 12:30:23 +03:00
|
|
|
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.
|
2022-11-18 16:56:47 +03:00
|
|
|
|
2022-12-18 12:30:23 +03:00
|
|
|
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.
|
2022-11-18 16:56:47 +03:00
|
|
|
|
|
|
|
|
|
|
|
## (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))
|
|
|
|
```
|
|
|
|
|
2022-12-18 12:30:23 +03:00
|
|
|
`string.format` ist eine Funktion in der globalen gemeinsamen Tabelle `string`. Eine
|
|
|
|
bösartige Mod könnte diese Funktion überschreiben und Material an os.execute übergeben:
|
2022-11-18 16:56:47 +03:00
|
|
|
|
|
|
|
```lua
|
|
|
|
string.format = function()
|
|
|
|
return "xdg-open 'http://example.com'"
|
|
|
|
end
|
|
|
|
```
|
|
|
|
|
2022-12-18 12:30:23 +03:00
|
|
|
Die 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.
|
2022-11-18 16:56:47 +03:00
|
|
|
|
|
|
|
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.
|
2022-12-18 12:30:23 +03:00
|
|
|
* 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.
|