Czy „curl -u nazwa użytkownika: hasło http://example.com” jest bezpieczne?

30

Jest curl -u username:password http://example.combezpieczny?

Jeśli nie, czy możesz krótko wyjaśnić, w jaki sposób ktoś może uzyskać twoje hasło?

JDiMatteo
źródło
6
jeśli używasz tego w terminalu, czy masz na myśli, że oba poświadczenia są przechowywane w historii bash?
Francisco Tapia
15
Takie polecenie nie jest bezpieczne, ponieważ inny użytkownik może ps -efsprawdzić, które procesy są uruchomione. Gdy curl -u username:password http://example.compojawi się na liście, miejsce docelowe, nazwa użytkownika i hasło są zagrożone.
Lambert
Chociaż pytanie jest tutaj na temat, możesz być także zainteresowany Bezpieczeństwo informacji StackExchange
IQAndreas

Odpowiedzi:

54

Jest to niebezpieczne, ponieważ domyślnym cURL jest podstawowe uwierzytelnianie, w którym protokół HTTP wysyła hasło w postaci zwykłego tekstu. Po określeniu username:passwordciągu zostanie on przekonwertowany na ciąg BASE64 w nagłówku HTTP:

GET / HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0
Accept: text/html
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=

Każdy, kto jest w stanie przechwycić ruch HTTP (twój dostawca, każdy, kto ma dostęp do tego samego bezprzewodowego punktu dostępowego co ty itp.), Będzie mógł odzyskać hasło za pomocą konwertera BASE64 online .

Protokół HTTPS poprawi sytuację, ustanawiając szyfrowane połączenie przed wysłaniem tego nagłówka, zapobiegając ujawnieniu hasła. Ma to jednak zastosowanie tylko wtedy, gdy użytkownik zwraca uwagę na prośbę o potwierdzenie nieznanych certyfikatów, autoryzację wyjątków bezpieczeństwa i tak dalej.

Zauważ, że argumenty poleceń mogą być dostępne dla innych użytkowników na tym samym komputerze, aby zobaczyć np. ps -efSystem plików / proc, twoją historię bashu i twój dziennik terminali (dziękuję za uwagę komentarza @ Lambert). cURL na niektórych platformach próbuje ukryć hasło, więc na przykład ps -efmożesz zobaczyć puste miejsce zamiast hasła. Jednak zamiast przekazywać hasło jako argument wiersza poleceń, lepiej jest poprosić cURL o podanie hasła, jak omówiono w FAQ cURL .

Dmitrij Grigoriew
źródło
4
Nawet jeśli jesteś na platformie, na której curl z powodzeniem zastępuje własny argument argv, aby ukryć dane ps, jest pewien okres, w którym zaczyna się, zanim zostanie zastąpione, gdy ta zawartość jest podatna na ataki.
Charles Duffy
Co z uwierzytelnianiem streszczenia? Czy curl domyślnie tego nie używa?
rr
2
@rr Uwierzytelnianie szyfrowane jest tylko nieznacznie lepsze, ponieważ nie zapobiega atakom typu man-in-the-middle, więc nadal lepiej jest używać HTTPS.
Dmitrij Grigoriew
1
@rr Jak twierdzisz, że StartSSL nie jest zaufany przez większość przeglądarek ? Czy spodziewasz się wielu użytkowników Windows 95 lub Firefox 1.5?
Hagen von Eitzen
1
@rr IMHO dostajesz niezaufane tylko wtedy, gdy występuje problem z brakującymi (lub błędnymi) certyfikatami pośrednimi na serwerze
Hagen von Eitzen
24

To nie jest bezpieczne. Parametry wiersza poleceń są widoczne dla wszystkich użytkowników.

Tronic
źródło
4
Połączenie z odpowiedzią @Dmitry Grigoryev może być najdokładniejsze.
Francisco Tapia
1
Tak, całkowicie przeoczyłem dużą część problemu, który muszę przyznać.
Dmitrij Grigoriew
polecenie może być częścią skryptu, który może odczytać tylko użytkownik ...
Pete
2
@Pete Wiersze poleceń programów wykonawczych (uruchamiane ze skryptu lub z terminala) są zwykle widoczne dla wszystkich użytkowników za pośrednictwem pspolecenia i /procsystemu plików. Jeśli polecenie zakończy się szybko, ryzyko jest zmniejszone, ale nadal istnieje.
RBerteig
2
@Pete Odpowiedzi nie powinny być wyłączne, wzajemnie się uzupełniają. Tak więc w drugiej odpowiedzi można pominąć zagrożenie wyjaśnione w pierwszej, raczej byłoby niepotrzebne powtórzyć ją. I nie nazwałbym tego stwierdzenia fałszywym, ponieważ nie jest to prawda w każdym możliwym przypadku.
Dmitrij Grigoriew
1

Można to zrobić w bezpieczniejszy sposób, używając parametru --netrc-file.

  1. Utwórz plik z uprawnieniem 600

Na przykład: vi / root / my-file

machine example.com

Login nazwa użytkownika

hasło HASŁO

Zapisz i zamknij plik

  1. Użyj poniższego, aby uzyskać dostęp do adresu URL za pomocą nazwy użytkownika i hasła.

curl --netrc-file / root / my-file http://example.com

  1. Gotowy
Wstydnik
źródło
0

Nie jest bezpieczne podczas korzystania ze schematu HTTP. Aby zabezpieczyć go, powinieneś użyć HTTPS.

Aby ukryć hasło przed pojawieniem się w historii poleceń, podaj tylko nazwę użytkownika. Curl poprosi o podanie hasła, jeśli nie zostanie podane w poleceniu.

Mohnish
źródło
Nie jest to przydatna odpowiedź, jeśli HTTPS nie jest dostępny. cURL jest „klientem”.
mckenzm
0

Krótka odpowiedź to nie ... ale ...

Jeśli nie ma opcji po stronie serwera, możesz wzmocnić bezpieczeństwo.

  1. Jeśli jest to lokalny intranet, odizoluj domenę rozgłoszeniową i nie używaj Wi-Fi ani żadnego radia.
  2. Jak mówi Shameer, użyj pliku .netrc, trzymaj wartości poza kodem.
  3. Jeśli ufasz, że pamięć jest bezpieczna, użyj zmiennych środowiskowych. $ PSWD.
  4. Jeśli jest to automatyzacja, uruchom z crontab roota.
  5. ... w pojemniku.
  6. ... z maszyny wirtualnej z zaszyfrowanym dyskiem.

Żadne z nich nie jest mniej bezpieczne niż przeglądarka wykorzystująca HTTP.

mckenzm
źródło