Sposób na wywołanie naruszenia zasad SELinux?


12

Badam podstawowe zasady działania SELinuksa i przydałoby się wywołać odmowę. Na mojej maszynie testowej działa CentOS 7, jest to podstawowa instalacja serwera bez żadnych dodatkowych usług, a getenforce stwierdza „Egzekwowanie”. Byłem więc pewien, że uczynienie / root czytelnym dla świata i próba odczytania plików stamtąd jako nieuprzywilejowanego użytkownika załatwi sprawę. Ale bez powodzenia! Czy ktoś może zasugerować szybkie testy? Próba uzyskania dostępu do ścieżek lub otwarcia portów itp.

Idealnie szukam prostych poleceń powłoki, których DAC nie ograniczyłby, ale MAC zauważy i zaprzeczy. W związku z tym nie zamierzam kompilować programów na zamówienie ani instalować określonych usług (takich jak serwer WWW), aby to osiągnąć. Jest to cenne, ponieważ zapewnia ogólny i jasny sposób na sprawdzenie SELinuksa w działaniu.

Nie mam problemu ze zmodyfikowaniem DAC (tj. Uprawnień systemu plików), aby były mniej restrykcyjne niż byłyby domyślnie w ramach testu.


1
+1, wiedząc, jak uruchomić systemy ochronne, abyś mógł sprawdzić, czy działają, jest ważnym i często pomijanym krokiem.
gowenfawr

Głosuję za zamknięciem tego pytania jako nie na temat, ponieważ należy ono do Unix i Linux SE.
Mark

Odpowiedzi:


3

Aby zademonstrować użyteczność SELinuksa w wykrywaniu błędów w kodzie firm trzecich / twojego własnego dewelopera, oto test ochrony pamięci (modyfikacji pierwszego przykładu kod tutaj ):

#include <fcntl.h>
#include <stdio.h>
#include <sys/mman.h>

int main (void) {
  // open file read-write, get a memory-mapped pointer with private access, write permission
  int fd = open ("file_to_test", O_RDWR);
  char *p = mmap (NULL, 42, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);

  p[0] = 'a';   // put something

  // Update protection mode; SELinux response depends on sebool: allow_execmod
  int r = mprotect (p, 42, PROT_READ | PROT_EXEC);

  // Display mprotect result
  printf ("mprotect = %d\n", r);

  close(fd);
  return 0;
}
Skompiluj i pokaż domyślnie (nie złapany)
$ echo "test data" > file_to_test
$ gcc execmod.c 

$ ./a.out 
mprotect = 0

$ sudo aureport -a

AVC Report
========================================================
# date time comm subj syscall class permission obj event
========================================================
<no events of interest were found>

Zmień wartość logiczną, aby złapać problem:

$ sudo getsebool allow_execmod
allow_execmod --> on

$ sudo setsebool allow_execmod 0
$ ./a.out 
mprotect = -1

$ sudo aureport -a

AVC Report
========================================================
# date time comm subj syscall class permission obj event
========================================================
1. 04/30/2015 12:26:41 a.out unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 10 file execmod unconfined_u:object_r:user_home_t:s0 denied 3612

Jest to zdecydowanie przydatne i dobrze udokumentowane (+1), chociaż nie jestem programistą i tak naprawdę nie rozumiem kodu. Idealnie chciałbym zobaczyć oczywisty przykład SELinuksa odmawiającego próby otwarcia portu lub dostępu do ścieżki, za pomocą prostych narzędzi wiersza poleceń, takich jak shell, netcat, telnet itp. Zedytuję pytanie, aby to wyjaśnić.
Przemyślane

Sam musiałem poszukać części kodu. Cieszę się, że dodałeś poniżej test bashowy. Pominąłem błędy Snorta i postfiksa (być może dovecot) na CentOS7, ponieważ są to pakiety, są więcej pracy do zainstalowania, można to naprawić później i to po prostu większa konfiguracja. Jeśli już idziesz tą drogą, jest to przydatne w praktyce generowania polis.
ɯͽbρɯͽ

3

Wyraźnie pokazuje to zasady MAC, w których równoważny przetwornik cyfrowo-analogowy mógłby zostać ominięty w podstawowej instalacji CentOS 7.

  1. Domyślnie (w CentOS w momencie pisania) użytkownicy nieuprzywilejowani są zalogowani jako rola „unconfined_u”. Możemy jednak zmienić nasz system, aby nasz nieuprzywilejowany użytkownik „alicja” został zamiast tego umieszczony w roli „użytkownik_u”. Można wprowadzić domyślne zasady, aby wyraźnie ograniczyć tę rolę przy niewielkiej ilości dodatkowej konfiguracji.

    [root]# echo "alice:user_u:s0-s0:c0.c1023" >> /etc/selinux/targeted/seusers
    
  2. Teraz wyłącz możliwość wykonywania przez tych użytkowników plików znajdujących się w ich katalogach domowych i / tmp. Po raz kolejny domyślnym jest zezwolenie na takie zachowanie. Wykonanie tego polecenia może chwilę potrwać .

    [root]# setsebool -P user_exec_content off
    
  3. Teraz (z naszym nieuprzywilejowanym użytkownikiem) możemy się zalogować i podjąć próbę wykonania czegoś na jednym z tych zakazanych obszarów. Jak widać, odmawia się nam.

    [alice]$ cp /bin/ls /tmp/
    [alice]$ /tmp/ls
    -bash: /tmp/ls: Permission denied
    
  4. Wreszcie możemy przeglądać dziennik AVC, aby zobaczyć naszą odmowę SELinux.

    [root]# aureport -a
    
    AVC Report
    ========================================================
    # date time comm subj syscall class permission obj event
    ========================================================
    1. 02/05/15 21:08:33 bash user_u:user_r:user_t:s0 59 file execute user_u:object_r:user_tmp_t:s0 denied 693
    

Hej tak, to działa! Szczególnie podoba mi się to, że wybrałeś to podejście „bez zawartości exec”, ponieważ zdecydowanie należy to złapać. Przede wszystkim wolałem audytowane, aby zapobiec tworzeniu plików wykonywalnych, ale to też mi się podoba. Przypadek użycia: korzystam ze wspólnej usługi w chmurze, która utrudnia instalację nowego oprogramowania (musisz użyć menedżera pakietów i nie ma sudo), ale nie ma to większego sensu; nie blokują tworzenia ani wykonywania i są środowiskami programistycznymi ... więc po prostu wget / scp potrzebnych mi pakietów i kompiluję je. +1
ɯͽbρɯͽ

1

O ile nie zmieniłeś swoich polityk w zakładce Boolean systemu-config-selinux (lub w / etc / selinux / policy), wówczas domyślna powinna odpowiadać na poniższe (możesz też chcieć zainstalować setroubleshoot dla głębszego nurkowania) :

mkdir -m 755 -p / install / ks

cp /root/anaconda-ks.cfg / install / ks

chmod 644 /install/ks/anaconda-ks.cfg

Następnie zrestartuj serwer WWW i spróbuj uzyskać dostęp do http: // localhost / ks za pomocą przeglądarki internetowej. Powinieneś zobaczyć komunikat „Zabronione”. Jeśli śledzisz /var/log/audit/audit.loglub biegniesz ausearch -m avc -ts recent, powinieneś zobaczyć komunikat:type=AVC msg=audit(1391277951.222:266): avc: denied { read } for pid=1731 comm="httpd" name="ks" dev=sda1 ino=22351 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined u:object r:default t:s0 tclass=dir

Następnie możesz zmienić kontekst SELinux, chcon -Rv --reference /var/www/html /install/ksjeśli nie chcesz wyłączać SELinux, ale możesz uzyskać dostęp do zasobu.

EDYCJA: przepraszam, nie widziałem, że powiedziałeś „nie serwer sieciowy”. Spróbuj chcon -u fake_u <filename>użyć nieuprzywilejowanego konta w pliku systemowym.


Nie mogłem uzyskać drugiej sugestii do pracy (przy użyciu nowo utworzonego użytkownika). Wolałbym też bardziej ogólny test, przykład zwiększenia MAC-a tam, gdzie DAC na to pozwolił: podczas gdy testuje to, jak dobrze SELinux może chronić przed zmianami administracyjnymi w etykietowaniu SELinux.
Przemyślane

0

zainstaluj dwa małe pakiety - bez zależności

  yum install -y vsftpd lftp

uruchom serwer FTP

  systemctl start vsftpd

utwórz plik w domu roota

  touch ~/tux.tch

przenieś z katalogu głównego root do katalogu FTP.
Uwaga: przenieś, nie kopiuj, inaczej zmieni się kontekst pliku

  mv ~/tux.tch /var/ftp/pub

zaloguj się na serwerze FTP jako użytkownik klienta FTP i spróbuj uzyskać dostęp do nowego pliku.
Uwaga: automatyczne uzupełnianie kart nie działa tutaj

  lftp localhost
    ls pub/tux.tch
    exit

zobacz odmowę w surowych logach

  grep AVC /var/log/audit/audit.log

lub jeśli masz setroubleshoot*zainstalowany

  grep sealert /var/log/messages
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.