Erzwingt, dass cURL ein Passwort von der Umgebung erhält

8

Diese Frage zur Verwendung von cURL mit einem Benutzernamen und einem Passwort hat suboptimale Antworten für mich:

  1. curl -u "user:pw" https://example.com setzt den PW in die Prozessliste
  2. curl "https://user:[email protected]" setzt den PW in die Prozessliste
  3. curl -u "user:$(cat ~/.passwd)" https://example.com setzt den PW in die Prozessliste
  4. curl -u user https://example.com fordert zur Eingabe von pw
  5. auf
  6. curl --netrc-file ~/.netrc https://example.com benötigt eine Datei

# 4 ist sicher, aber ich könnte diesen Befehl hunderte Male am Tag ausführen, also ist es langweilig. # 5 ist fast sicher, aber diese Datei könnte von jemandem mit Root-Zugriff gelesen werden.

Die cURL-Manpage lautet (beachten Sie den fettgedruckten Text):

  

-u/--user <user:password>

     

Geben Sie den Benutzernamen und das Kennwort für die Serverauthentifizierung an.   Überschreibt -n/--netrc und --netrc-optional .

     

Wenn Sie nur den Benutzernamen eingeben (ohne einen Doppelpunkt einzugeben), wird curl   Aufforderung für ein Passwort.

     

Wenn Sie eine SSPI-fähige curl-Binärdatei verwenden und NTLM-Authentifizierung durchführen, Sie   kann curl zwingen, den Benutzernamen und das Passwort von Ihrer Umgebung abzurufen   indem Sie einfach einen einzelnen Doppelpunkt mit dieser Option angeben: -u : .

Ich habe versucht, $USER und $PASSWORD (und $CURLOPT_PASSWORD und andere) in der Umgebung, aber cURL nimmt keine davon auf, wenn sie als curl -u : https://example.com aufgerufen wird (und auch nicht ohne -u : ).

Ich mache keine NTLM, also funktioniert das nicht. Es sei denn, ich verpasse etwas.

Gibt es eine Möglichkeit, Anmeldeinformationen nur über die Umgebung an curl zu übergeben?

(Der Workaround wurde in eine Antwort verschoben)

    
Adam Katz 19.11.2015, 03:37
quelle

2 Antworten

13

Diese bash Lösung scheint meinen Bedürfnissen am besten zu entsprechen. Es ist anständig sicher, tragbar und schnell.

%Vor%

Dies verwendet Prozesssubstitution ( <( command ) führt command in einer Subshell aus, um eine Dateideskriptor , der als "Datei" an den übergeordneten Befehl übergeben wird, in diesem Fall curl ). Die Prozesssubstitution enthält eine Hier-Zeichenfolge ( cat <<< text , eine Variante von echo text , die nicht eingefügt wird alles in Ihre Prozessliste), indem Sie einen Dateideskriptor für die netrc-Datei erstellen, um Anmeldeinformationen an diese Datei zu senden der entfernte Webserver.

Die durch die Prozesssubstitution gebotene Sicherheit ist eigentlich ziemlich gut: Der Dateideskriptor ist nicht eine temporäre Datei und ist nicht von anderen Aufrufen in derselben Shell-Instanz verfügbar, daher erscheint in diesem Kontext als sicher ; Ein Angreifer müsste durch die Erinnerung graben oder einen komplizierten Angriff starten, um seinen Inhalt zu finden. Da sich die Umgebungsvariable $PASSWORD ebenfalls im Speicher befindet, sollte dies die Angriffsfläche nicht vergrößern.

Solange Sie export PASSWORD nicht verwendet haben, sollte ein Trick wie ps ewwp $$ das Passwort nicht enthalten (wie in dieser kommentar ). Es wäre auch ratsam, einen weniger offensichtlichen Variablennamen zu verwenden.

Hier ist eine vereinfachte unsichere Version des obigen Codes, die erklären kann, wie es funktioniert:

%Vor%

Diese unsichere Version hat viele Fehler, die alle in der vorherigen Version gelöst wurden:

  • Es speichert das Passwort in einer Datei (obwohl diese Datei nur für Sie lesbar ist)
  • Es hat sehr kurz das Passwort in einer Befehlszeile
  • Die temporäre Datei bleibt bis nach curl exits
  • Strg + c wird beendet, ohne die temporäre Datei zu entfernen

Einige davon könnten gelöst werden durch:

%Vor%

Ich halte diese Version für chaotisch, suboptimal und möglicherweise weniger sicher (obwohl sie tragbarer ist). Es erfordert auch eine Version von sleep , die Dezimalzahlen versteht (und 0,1 Sekunden können zu schnell sein, wenn das System stark ausgelastet ist).

Ich hatte ursprünglich einen Workaround gepostet, der in meiner Frage einen perl one-liner enthielt (mit Hilfe von Etan Reisner ) Ich habe ein paar bessere Methoden durchgearbeitet, bevor ich mich auf diese hier-string-Methode festgelegt habe, die sowohl leichter (schneller) als auch portabler ist .

An diesem Punkt ist es elegant genug, dass ich es eher als "Antwort" ansehe als als "hässliche Problemumgehung", also habe ich es zu dieser offiziellen Antwort migriert. Ich habe @ghoti +1 für seine Antwort , die korrekt besagt, dass das Befehlszeilenprogramm von cURL nicht in der Lage ist, das zu tun, was ich will, aber ich akzeptiere diese Antwort nicht, weil sie das Problem nicht lösen kann.

    
Adam Katz 20.11.2015, 04:22
quelle
6
  

Gibt es eine Möglichkeit, Anmeldeinformationen nur über die Umgebung an curl zu übergeben?

Nein, das glaube ich nicht.

Die CURLOPT_USERPWD Dokumentation Ich denke, beschreibt, was Sie brauchen, aber dies ist eine Option, die mit der Curl-Bibliothek in einer anderen Sprache verfügbar wäre. PHP, Perl, C usw.

Die curl-Binärdatei, die Sie von Ihrer Shell ausführen, ist nur ein anderes Frontend in dieser Bibliothek, aber die Art, wie CURLOPT_USERPWD über die curl-Binärdatei an die Bibliothek übergeben wird, erfolgt über Befehlszeilenoptionen für die Binärdatei.

Sie könnten theoretisch Ihre eigene Binärdatei als Frontend in die curl-Bibliothek schreiben und Unterstützung für Umgebungsvariablen schreiben.

Sie könnten die Umgebungsunterstützung abwechselnd hacken, wenn Sie hoffen, sie in der vorhandenen curl-Binärdatei zu sehen, und Ihre eigenen mit lokalen Funktionen kompilieren.

Vorsicht , dass sogar Umgebungsvariablen von Ihrer Shell in die Prozesstabelle gelangen können. (Was sehen Sie, wenn Sie ps ewwp $$ ausführen?)

Vielleicht ist eine .netrc-Datei mit eingeschränkten Berechtigungen der sicherste Weg. Möglicherweise müssen Sie eine temporäre .netrc-Datei generieren, die von der Option --netrc-file curl verwendet wird.

Ich denke, Sie müssen entweder die am wenigsten riskante Lösung für Ihre Umgebung auswählen oder etwas in einer echten Sprache schreiben, die die Sicherheit richtig macht.

    
ghoti 19.11.2015 04:45
quelle