Średni Odebrany

CVE-2026-95834

opublikowano:
modyfikacja:
Ocena CVSS
4.6
Średni · v4.0
wektor: CVSS:4.0/AV:L/AC:L/AT:N/PR:N/UI:A/VC:N/VI:L/VA:L/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X

>_ Opis

Tłumaczenie automatyczne – może zawierać nieścisłości.

Użycie After Free w ścieżce źródłowej przeciągania protokołu przeciągnij i upuść w kitty od wersji 0.47.0 przed wersją 0.49.0 pozwala programowi piszącemu do terminala spowodować, że terminal będzie odczytywał i zapisywał w zwolnionej pamięci sterty, ponieważ funkcja drag_remote_file_data() w kitty/dnd.c przechowuje wskaźnik DragRemoteItem do tablicy, której nie jest właścicielem, wywołuje funkcję toplevel_data_for_drag() lub subdir_data_for_drag(), a następnie kontynuuje używanie tego wskaźnika. Te pomocniki oraz wywoływane przez nie metody add_payload() i populate_dir_entries() zgłaszają błędy za pomocą makra abrt(), które rozwija się do funkcji cancel_drag(), po której następuje zwykły zwrot, a cancel_drag() wywołuje funkcję drag_free_offer(), która zwalnia tablicę, do której odnosi się wskaźnik. Pomocnicy zwracają void, więc osoba wywołująca nie otrzymuje żadnej wskazówki, że doszło do porzucenia, i kontynuuje wywoływanie all_children_complete() na zwolnionym wskaźniku, co powoduje jego wyłuskanie, a następnie zapisuje przez niego. To wyłuskanie jest chronione przez lokalną flagę, która jest ustawiana, gdy żądanie nie przenosi ładunku i nie ogłasza dalszych danych. Jest to ten sam warunek, który wybiera blok finalizacji add_payload(), więc ścieżki błędów w tym bloku do niego docierają: tworzenie, które kończy się niepowodzeniem, ponieważ wpis o tej samej nazwie już istnieje, ponieważ klient może zadeklarować dwa wpisy o jednej nazwie, a operacje tworzenia używają O_CREAT z O_EXCL i symlinkat(), błąd mkdirat() inny niż EEXIST, oraz ścieżki alokacji wpisów katalogu. Dochodzą do niego obie gałęzie. W gałęzi najwyższego poziomu wskaźnik osoby wywołującej nigdy nie jest czyszczony, więc czyszczenie własnych wskaźników struktury będącej właścicielem podczas usuwania nie pomaga. W gałęzi podkatalogu subdir_data_for_drag() ustawia wskaźnik wywołującego na NULL przy wpisie i przypisuje go dopiero po własnej ścieżce ostatniego błędu, więc jego własne przerwania pozostawiają wywołujący z NULL i są zatrzymywane przez sprawdzenie zerowej, ale następnie wywołuje add_payload() z tym ustawionym wskaźnikiem, a przerwanie pozostawia wywołującego trzymającego zwolniony węzeł podrzędny w drzewie elementów, który drag_free_offer() zwalnia przez rekurencja. Powoduje to niezdefiniowane zachowanie w procesie terminala, dostępne ze strumienia bajtów dowolnego programu działającego w oknie.

>_ Słabości (CWE)

>_ Referencje

Dane podatności pochodzą z oficjalnych źródeł (CVE® List / NVD). Opisy po polsku są tłumaczone automatycznie i mogą zawierać nieścisłości – na stronie rekordu można wyświetlić wersję angielską.

This product uses the NVD API but is not endorsed or certified by the NVD.

Copyright © 1999–2026, The MITRE Corporation. CVE is a registered trademark and the CVE logo is a registered trademark of The MITRE Corporation.

CVE Usage: MITRE hereby grants you a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute Common Vulnerabilities and Exposures (CVE®). Any copy you make for such purposes is authorized provided that you reproduce MITRE's copyright designation and this license in any such copy. ALL DOCUMENTS AND THE INFORMATION CONTAINED THEREIN PROVIDED BY MITRE ARE PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND.

NVD Terms of Use / CVE® Terms of Use / nvd.nist.gov / cve.org