2013-05-23 12 views
9

W celu ochrony przed niewłaściwym użyciem aplikacji staram się sprawdzić, czy jej pliki konfiguracyjne mają poprawne uprawnienia, aby aplikacja mogła zaufać zawartości plików, które nie zostały zmodyfikowane przez kogoś jeszcze.Jak zapewnić poprawne uprawnienia do plików

wierzę następujące zasady są koryguje:

  • plik nie musi być zapisywalny przez innych
  • plik musi być w posiadaniu przez zaufanego użytkownika/grupy: root lub
  • plik musi być w posiadaniu skutecznego użytkownika/grupy uruchomioną aplikacją (myśleć setuid programu)

Oto przykład:

#include <stdio.h> 
#include <unistd.h> 
#include <sys/stat.h> 

#include <string.h> 
#include <errno.h> 

static 
int is_secure(const char *name) 
{ 
    struct stat st; 

    uid_t euid = geteuid(); 
    gid_t egid = getegid(); 

    if (stat(name, &st) != 0) { 
     int err = errno; 
     fprintf(stderr, "can't stat() '%s': %d (%s)\n", name, err, strerror(err)); 
     return 0; 
    } 

    /* writable by other: unsecure */ 
    if ((st.st_mode & S_IWOTH) != 0) { 
     return 0; 
    } 

    /* not owned by group root and not owned by effective group: unsecure */ 
    if (st.st_gid != 0 && st.st_gid != egid) { 
     return 0; 
    } 

    /* not owned by user root and not owned by effective user: unsecure */ 
    if (st.st_uid != 0 && st.st_uid != euid) { 
     return 0; 
    } 

    return 1; 
} 

int 
main(int argc, char *argv[]) 
{ 
    int i; 

    for(i = 1; i < argc; i++) { 
     printf("'%s' : %s\n", argv[i], is_secure(argv[i]) ? "sure" : "unsure"); 
    } 

    return 0; 
} 

Ponieważ nie jestem pewien co do moich założeń, czy ktoś może sprawdzić, czy zostawię lukę w kontroli uprawnień do plików.

Aktualizacja

sudo posiada funkcję, która: sudo_secure_path, to tylko sprawdzić na jedną uid/gid, ale dbać o sprawdzenie zapisu grupa bitów.

Pozdrawiam.

+1

Rozważmy informacje w [bezpieczny dostęp do plików w katalogu określonym przez zmienną środowiskową] (http: // stackoverflow.com/questions/196244/secure-access-to-files-in-a-directory-defined-by-an-environment-variable). Scenariusz jest bardziej złożony. Jednak niektóre z pomysłów, w szczególności, że ścieżka prowadząca do pliku również musi być bezpieczna, jest ważna. –

+1

Jonathan ma rację. Każdy element ścieżki prowadzącej do pliku musi być zapisywalny tylko przez zaufanych użytkowników dla pełnego bezpieczeństwa. W przeciwnym razie mogą wystąpić dziwne scenariusze, takie jak przeniesienie komponentu ścieżki i zastąpienie go wskaźnikiem do innej, ale podobnej struktury katalogów, z pominięciem pliku, ale o takim samym skutku, jak przepisanie całego pliku konfiguracyjnego. W zależności od tego, co znajduje się w pliku konfiguracyjnym, może pomóc włamywaczom włamać się lub przynajmniej bardziej świadomie zaatakować DOS, więc może być nawet dobrze, aby plik był czytelny tylko dla jego właściciela/zaufanych użytkowników. –

+0

@JosephMyers Dzięki. Powinienem przedstawić bardziej kompletny przykład: ten kod służy do sprawdzania katalogu i wszystkich znajdujących się w nim plików. – ydroneaud

Odpowiedz

7

Uważam, że chcesz również sprawdzić uprawnienia do katalogu.

Użytkownik będzie mógł pobrać inny plik należący do poprawnego użytkownika, jeśli może zapisywać do katalogu.

Coś jak:

sudo touch foo.conf 
sudo touch foo.conf-insecure-sample 
mv -f foo.conf-insecure-sample foo.conf 
+0

Dobry połów. Nie zostało to pokazane w przedstawionym tutaj kodzie, ale katalog jest również sprawdzany przed poszczególnymi plikami w rzeczywistym kodzie. BTW nie zapewnia, że ​​katalog nadrzędny lub poprzednie poziomy są poprawne: inny poziom nie wchodzi w zakres aplikacji, jej system jest powiązany. – ydroneaud

8

Twoje zasady i twój kod wyglądają na poprawne, mimo że powinieneś zdawać sobie sprawę z następujących zagrożeń bezpieczeństwa, które nadal mogą wpłynąć na implementację.

  1. Osoba atakująca z fizycznym dostępem do komputera lub dostępem NFS/SMB może zamontować system plików przy użyciu skrzynki z uprawnieniami roota, a następnie zmodyfikować plik.
  2. Luka w innym uruchomionym programie jako zaufany użytkownik lub root może pozwolić na wykorzystanie tego programu do modyfikacji pliku.
  3. Wszystko, czego potrzeba, aby złamać twoją kontrolę bezpieczeństwa, byłoby nieostrożnym użytkownikiem lub sys-adminem, który przesłania ustawienia przywilejów pliku. Widziałem, jak to się stało podczas tworzenia kopii zapasowych i kopii na dyski twarde itp.
  4. Upewnij się również, że plik nie jest wykonywalny. Nie mogę wymyślić przykładu, w którym można to wykorzystać w pliku konfiguracyjnym, ale ogólna zasada z zabezpieczeniami nie daje żadnych uprawnień, które nie są wymagane dla zadania.

Jak widać, nie są to problemy pod kontrolą Twojego kodu. Dlatego powinieneś upewnić się, że klient zdaje sobie sprawę z tego ryzyka przed upewnieniem się, że plik konfiguracyjny nie podlega żadnym manipulacjom.

+1

Dzięki za odpowiedź. Twoje komentarze są bardzo interesujące. Odświeża dużo o bezpieczeństwie całego systemu. Mój model zagrożenia/potrzeby bezpieczeństwa są/są bardzo wąskie. Po prostu chcę mieć pewność, że konfiguracja nie jest pod kontrolą użytkownika, który nie jest zaufany (inny użytkownik). Upewnienie się, że zawartość pliku jest poprawna, wykracza poza zakres pytania, jest to kolejny, cały system, problem. – ydroneaud

Powiązane problemy