Przegląd kodu GO nr 1: poświadczenia zakodowane na stałe są wrażliwe na bezpieczeństwo

Przegląd
Recenzenci ocenili jakość kodu, łatwość konserwacji i zgodność z najlepszymi praktykami. Szczególnie zależało mi na zlokalizowaniu ewentualnych luk w zabezpieczeniach i miejsc wymagających naprawy. Jeśli chodzi o zakodowane na stałe dane uwierzytelniające, w tym raporcie zwrócono uwagę na jeden kluczowy problem bezpieczeństwa.
Przykład wrażliwego kodu
func connect() {
user := "root"
password:= "supersecret" // Sensitive
url := "login=" + user + "&passwd=" + password
}
Podany fragment kodu wydaje się być funkcją o nazwie connect() , która jest odpowiedzialna za ustanowienie połączenia, prawdopodobnie z usługą lub systemem. Oto szczegółowa analiza kodu:
func connect() {
user := "root"
password := "supersecret" // Sensitive
url := "login=" + user + "&passwd=" + password
}
- Wrażliwe hasło: Ponieważ jest bezpośrednio widoczne w kodzie źródłowym, zakodowana na stałe wartość hasła „supersecret” jest uważana za poufną. Ze względów bezpieczeństwa nie zaleca się twardego kodowania poświadczeń, takich jak hasła, w kodzie źródłowym. Każdy, kto ma dostęp do bazy kodów, może łatwo sprawdzić hasło.
- Generowanie adresu URL: zmienne użytkownika i hasła są łączone z dodatkowymi danymi wejściowymi w celu utworzenia ciągu adresu URL. Wygląda na to, że tworzy adres URL żądania logowania z parametrami zapytania dla wartości użytkownika i hasła.
- Zagrożenie bezpieczeństwa : poważne zagrożenie bezpieczeństwa istnieje, gdy poufne dane, takie jak hasła, są przechowywane w kodzie źródłowym w postaci zwykłego tekstu. Wrażliwe dane mogą zostać łatwo przejęte i wykorzystane w przypadku przeglądania bazy kodu przez osoby nieupoważnione lub włamania do repozytorium.
2. Zarządzanie poświadczeniami: trudno jest zmieniać lub obracać hasła w razie potrzeby, gdy są one przechowywane bezpośrednio w kodzie. Potencjalne luki w zabezpieczeniach mogą wynikać z zakodowanych na stałe poświadczeń, które mogą pozostać w bazie kodu nawet po zmianie hasła.
Zalecenie: użyj narzędzia do zarządzania kluczami tajnymi lub bezpiecznego rozwiązania do zarządzania poświadczeniami, aby bezpiecznie przechowywać poufne poświadczenia i zarządzać nimi. Rozwiązania te obejmują takie funkcje, jak automatyczna rotacja kluczy tajnych, a także bezpieczne przechowywanie, zarządzanie dostępem i inne funkcje.
3. Walidacja danych wejściowych: Wszelkie dane wprowadzane przez użytkownika muszą zostać zweryfikowane i oczyszczone, zwłaszcza podczas tworzenia adresów URL lub uruchamiania zapytań do bazy danych. Brak sprawdzania poprawności danych wejściowych i oczyszczania w dostarczonym kodzie sprawia, że system jest narażony na luki w zabezpieczeniach, takie jak wstrzykiwanie kodu SQL i ataki polegające na manipulacji adresami URL.
Zalecenie: Aby udaremnić takie ataki, użyj odpowiednich strategii sprawdzania poprawności danych wejściowych i oczyszczania. Używaj na przykład sparametryzowanych zapytań lub przygotowanych instrukcji i upewnij się, że wszelkie wartości podane przez użytkowników w adresach URL są prawidłowo zakodowane.
4. Bezpieczne przechowywanie haseł: Należy pamiętać, że przechowywanie haseł w postaci zwykłego tekstu jest niebezpieczne, jeśli ta funkcja jest elementem większego schematu uwierzytelniania. Przed zapisaniem hasła powinny być w idealnym przypadku bezpiecznie zaszyfrowane i zasolone, aby zapobiec nieautoryzowanemu dostępowi w przypadku naruszenia danych.
Zalecenie: Używaj zaawansowanych metod mieszania haseł, aby bezpiecznie przechowywać i weryfikować hasła, takich jak bcrypt lub Argon2.
Zgodne rozwiązanie:
func connect() {
user := getEncryptedUser()
password:= getEncryptedPass() // Compliant
url := "login=" + user + "&passwd=" + password
}
- Przechowuj poświadczenia w pliku konfiguracyjnym, który nie jest przekazywany do repozytorium kodu.
- Przechowuj poświadczenia w bazie danych.
- Skorzystaj z usługi dostawcy usług w chmurze do zarządzania tajemnicami.
- Jeśli hasło zostało ujawnione poprzez kod źródłowy: zmień je.
Przechowywanie poufnych informacji, takich jak hasła, bezpośrednio w kodzie źródłowym naraża system na nieautoryzowany dostęp i potencjalne exploity.
Świergot