-API%20.png)
Wir haben einen alten C-Code, der es weniger privilegierten Benutzern ermöglicht, benutzerdefinierte Skripte mit erweiterten Berechtigungen auszuführen. Dabei ist das SUID-Bit gesetzt. Dieser Code beschränkt die PATH-Umgebung auf einen bestimmten Ordner und verwendet dann system()
die API, um das Skript mit eingeschränkter Shell auszuführen:
/bin/bash -r -c "script <arg>"
Da der Pfad eingeschränkt ist, können nur Skripte aus diesem bestimmten Ordner ausgeführt werden.
Da wir nun alle Fallstricke der Befehlsinjektion mit system()
API kennen, welche Maßnahmen können ergriffen werden, um eine Befehlsinjektion zu vermeiden? Dies wird an vielen Stellen in verschiedenen Skripten usw. verwendet, daher möchten wir keine völlig neue Implementierung durchführen, um jegliche Regression zu vermeiden.
Antwort1
Da es schwierig ist, es richtig zu machen, würde ich vorschlagen, die SUID aus Ihrem Code zu entfernen. Ändern Sie Ihren C-Code, um zu verwenden sudo
. Durch die Verwendung von sudo werden die schwierigeren Aspekte der sicheren Systemprogrammierung erledigt.
Anschließend können Sie mithilfe von visudo sorgfältig eine Sudo-Konfiguration erstellen, die das absolute Minimum zur Ausführung der Aufgabe ausführt und dies auf die erforderlichen Benutzer/Gruppen beschränkt. Lassen Sie Sudo nach der Konfiguration von jemand anderem testen und versuchen Sie, die beabsichtigten Beschränkungen aufzuheben.
Antwort2
Code-Injection erfordert die Fähigkeit des Benutzers, beliebige Zeichenfolgen als Parameter an den system()
Aufruf zu übergeben. Dies ist SQL-Injections sehr ähnlich und sollte auf ähnliche Weise vermieden werden: Übergeben Sie keine benutzerdefinierten Zeichenfolgen direkt an den Aufruf:
numerische Parameter sollten in Ganzzahlen umgewandelt werden und dann zum Zeitpunkt des Aufrufs wieder in Zeichenfolgen zurückverwandelt werden
Parameter, die zu einem festen Wörterbuch gehören, sollten in "enum"-Werte oder ähnliches umgewandelt werden und dann zum Zeitpunkt des Aufrufs wieder in Zeichenfolgen zurückverwandelt werden.
Die Eingabe von freiem Text sollte möglichst auf einen harmlosen Zeichensatz beschränkt werden (z. B.
[a-zA-Z0-9]*
). Wo problematische Zeichen (einschließlich Leerzeichen) erforderlich sind, sollte eine entsprechende Maskierung angewendet werden (d. h.a b
sollte durch ersetzt werdena\ b
usw.).