Diese Frage ist ganz allgemein und gilt nicht nur für meine Situation, sondern ... Ich habe eine kleine Busybox-Appliance, mit der ein Benutzer ohne Rootberechtigung ein bestimmtes Skript mit Rootberechtigungen ausführen kann. So etwas wie dieses kleine Skript zum Aktivieren von DHCP, bei dem die einzige Variable ( $1
), die in der Befehlszeile (!!) gesendet werden kann, der Hostname ist, der gesendet werden soll:
#!/bin/bash
udhcpc -b -i eth0 -h $1
Zum Ausführen von udhcpc ist Root-Zugriff erforderlich. Dazu möchte ich /etc/sudoers
die folgende Zeile ändern :
joe ALL = NOPASSWD: /path/to/enable_dhcp.sh
was "joe" ermöglichen sollte, das Skript mit root-Rechten einfach auszuführen, indem man einfach Folgendes ausführt:
sudo /path/to/enable_dhcp.sh
und nicht nach einem Passwort gefragt zu werden (was ich will, da ich möchte, dass Joe dieses Skript ausführen kann).
Nun, ich weiß (oder glaube zumindest), dass die Verwendung $1
eines Skripts, das leicht mit Root-Rechten ausgeführt werden kann, eine SCHRECKLICHE Idee ist, da Sie in dieses Skript injizieren können, was Sie wollen.
Also ... wie geht man am besten damit um? Wie lasse ich Joe mit Root-Rechten tun, was ich will, erlaube ihm, eine Variable einzugeben (oder effektiv wie mit einer Umgebungsvariablen), während er nicht für Injektionsangriffe offen ist?
Sie sollten die übergebene Eingabe mit einem bekannten guten Muster abgleichen.
Es sieht beispielsweise so aus, als wäre eine IP-Adresse eine gültige Eingabe für Sie. Sie könnten also so etwas verwenden:
Beachten Sie, dass reguläre Ausdrücke nicht getestet wurden. Sie sind dafür verantwortlich, dass Ihre reguläre Ausdrücke keine gefährlichen Elemente zulassen.
quelle