Python Command Line Arguments validieren / säubern? [sonarqube]

Blackbenji

Lieutenant
Registriert
Nov. 2009
Beiträge
557
Hallo zusammen,

ich habe ein Python-Script, welches mit Argumenten aufgerufen wird.
Das ganze wird von einem Jenkins-Job angesprochen, je nachdem was der User im Job einstellt, sollen andere Funktionen mit Parameter gestartet werden.

Beispiel:
Python:
import argparse

parser = argparse.ArgumentParser('Test')
parser.add_argument('--db', dest='database', default=None, required=True, help='Database to restore')
parsed_args = parser.parse_args()
print(parsed_args)

Das Script lasse ich durch SonarQube laufen, und hier wird mir ein "Critical Security Hotspot" angezeigt:
"Using command line arguments is security-sensitive"

Schön und gut - aber wie "validated and sanitized" ich nun die Eingabe?
Oder anders gefragt: welche alternative gäbe es?

Gruß, Blackbenji
 
Zwei unterschiedliche Formen von Problemen:
  • Parameter können von jedem angemeldeten Benutzer gelesen werden, z.B. bei sowas "./myapp --host example.com --user foo --passwort admin123", sprich, wenn dein Argument an "--db" geheim sein soll.
  • Parameter werden ungeprüft an andere Programme/Funktionen/... weitergegeben, die sie interpretieren, im einfachsten Fall deines Python-Skripts z.B. "open()" oder "system()", "exec()", etc.
Sagen wir, du gibst das Argument an "--db" einfach aus, dann könnte ich z.B. "--db /etc/passwd" übergeben und rausfinden, was es alles für Benutzer auf deinem Rechner gibt, etc. Allerdings nimmt das meist ausgefeiltere Formen an, wie z.B. SQL injection, etc.

Solange du selbst alle Aufrufe tätigst, ist das alles völlig egal. Sobald dein Jenkins aber irgendeine User-Eingabe an dein Skript übergibt, wird das in höchstem Maße relevant.
 
Hallo,

danke für die Antwort - aber sie beantwortet leider die Frage nicht. Die validierung im Code erfolgt bereits, auch ein prüfen ob der Typ stimmt, gegebenenfalls eine Exception werfen etc. alles bereits eingebaut.

Interessiert SonarQube aber nicht, da "validated and sanitized" vor dem ArgumentParser erfolgen soll - mir ist nur nicht klar wie das gehen soll?

Das Problem ist nur, dass SonarQube den Fall als "Critical Security Hotspot" sieht und damit der check "Failed" ... das blockiert die Pipeline :freak:
 
This rule raises an issue on every reference to sys.argv, call to optparse.OptionParser() or a call to argparse.ArgumentParser(). The goal is to guide security code reviews.

Ich würde das so interpretieren, dass hier nicht auf eine etwaige Validierung geprüft wird, sondern alleine auf das Vorhandensein, damit man sich solche Stellen wegen der Sicherheitsproblematik anschauen kann.

Geht wohl nur Ausschalten oder ignorieren mittels #NOSONAR ans Ende der Zeile.
 
Blackbenji schrieb:
aber sie beantwortet leider die Frage nicht.

Ups, da hast du wohl recht.

Zu deiner Frage: Die Fehlermeldung ist dämlich. Das Problem entsteht erst, wenn du die Parameter interpretierst. Argparse selbst sollte das nicht tun.
 
Zurück
Oben