W procesie badania krytycznej luki w OpenSSH, która została ujawniona w zeszłym tygodniu, odkryto jeszcze jedną podobną lukę (CVE-2024-6409), która umożliwia zdalne wykonanie kodu bez konieczności autoryzacji. Nowa luka nie jest tak niebezpieczna jak poprzednia, ponieważ występuje po obniżeniu uprawnień w działającym procesie potomnym SSH. Luka ta jest obecna w pakietach openssh z dystrybucji Red Hat Enterprise Linux 9, opartych na wydaniu OpenSSH 8.7 z 2021 roku. Problem ten dotyczy również pakietów dla Fedora Linux 36 i 37, opartych na wersjach OpenSSH 8.7 i 8.8.
Zasadniczo luka ta jest podobna do poprzedniego problemu i również jest spowodowana wyścigiem stanów w obsłudze przerwania SIGALRM, które pojawia się w wyniku wykonywania funkcji, które nie są przystosowane do wywołania w trybie asynchronicznym z obsług przerwań. Obsługa włącza się, gdy następuje przekroczenie czasu określonego za pomocą parametru LoginGraceTime, przerywając aktualne wykonywanie kodu. Użycie w obsłudze przerwań funkcji, które nie są przystosowane do asynchronicznego wykonywania, a które wykorzystują dynamiczne przydzielanie pamięci, takich jak syslog(), może prowadzić do uszkodzenia wewnętrznych struktur malloc w momencie wystąpienia SIGALRM podczas wykonywania określonego kodu.
Nowa luka różni się tym, że wyścig stanów występuje z powodu wywołania w obsłudze sygnału funkcji cleanup_exit() w grace_alarm_handler(). W głównym kodzie OpenSSH ta funkcja może być wykorzystywana w kodzie wykonywanym asynchronicznie, ale w pakietach dla RHEL 9 i Fedora zastosowano dodatkową łatkę, która dodaje w cleanup_exit() wywołanie funkcji do generowania zdarzeń audytu, przeznaczonej do użycia w obsługach sygnałów.
Ta łatka była stosowana w RHEL 9 i pochodnych dystrybucjach w pakietach opartych na OpenSSH 8.7p1. W aktualnych wydaniach Fedora problem ten nie występuje, ponieważ od Fedora 38 dystrybucja przeszła na nowszą wersję OpenSSH bez modyfikacji cleanup_exit(). W przeciwieństwie do poprzedniej luki, nie ma sposobu obejścia nowego problemu poprzez użycie opcji „-e” w sshd, która wyłącza logowanie poprzez syslog. Jednak aby zablokować lukę, można ustawić parametr „LoginGraceTime=0” w sshd_config.
Źródło: opennet.ru
