Verwendung von process_string eingeschraenkt.
Um das moegliche Ausmass von privilege escalations durch
process_string zu reduzieren, wird process_string() wird
nur noch ausgewertet, wenn der Aufrufer einen Level von
maximal 25 hat. Das schliesst alle Objekten in /d/, /p/
und den Gilden ein, aber verhindert es fuer alle hochstufigen
Magier und ihre Objekte.
Ausserdem erlauben wir keine Auswertung mehr fuer
Spielerobjekte, wenn sie mehr als Seher sind.
Change-Id: I787bf06c00d62ca17a61c97bb6cef08aa2a34d5e
diff --git a/secure/simul_efun/simul_efun.c b/secure/simul_efun/simul_efun.c
index d9c2a54..c6582c5 100644
--- a/secure/simul_efun/simul_efun.c
+++ b/secure/simul_efun/simul_efun.c
@@ -780,11 +780,27 @@
return(efun::process_string(str));
}
-nomask string process_string( mixed str )
+nomask string process_string( string|closure str )
{
string tmp, err;
int flag;
+ // process_string() wird nur noch ausgewertet, wenn der Aufrufer einen
+ // Level von maximal 25 hat. Das schliesst alle Objekten in /d/, /p/ und den
+ // Gilden ein, aber verhindert es fuer alle hochstufigen Magier und ihre
+ // Objekte. Ausserdem erlauben wir keine Auswertung mehr fuer
+ // Spielerobjekte, wenn sie mehr als Seher sind.
+ // TODO: aus Spielershells ausbauen
+ // TODO 2: ganz ausbauen.
+ if ( (query_once_interactive(previous_object())
+ && query_wiz_level(previous_object()) > SEER_LVL
+ )
+ || query_wiz_level(getuid(previous_object())) > DOMAINMEMBER_LVL)
+ {
+ raise_error("Illegale Benutzung von process_string(). Aufrufer "
+ "ist Magiershell oder Objekt mit Level > 25.\n");
+ }
+
if ( closurep(str) ) {
set_this_object( previous_object() );
return funcall(str);