Michael Litwin
Michael LitwinIT Content Writer

4-letnia luka w Rust

W dwóch ostatnich wersjach Rusta odkryto poważną lukę, która może skutkować odczytem i zapisem poza wyznaczoną pamięcią. Jednak funkcja sprawiająca problemem była obecna we wszystkich wersjach Nightly od 1.0.0 (wydanego w maju 2015).
15.05.20192 min
4-letnia luka w Rust

Rust, młody język programowania od Mozilli, który cieszy się rosnącą popularnością, został stworzony z myślą o stabilności i bezpieczeństwie pamięci. Okazuje się jednak, że sprytny programista może obecnie podważyć to bezpieczeństwo.

W zeszłym tygodniu użytkownik Rusta i kontrybutor Sean McArthur, znalazł i zgłosił trudną do zauważenia, ale poważną w implikacjach lukę w wersjach 1.34.0 i 1.34.1 tego języka. Zespół Rust przez następne dni opracował plan przeciwdziałania i opisu błędu. Problem jest nieco poważniejszy, gdyż luka jest elementem stabilnych wersji. Całość została opisana w poradniku bezpieczeństwa na blogu Rust wczoraj oraz została zgłoszona do CVE pod nazwą CVE-2019-12083.

Na czym polega luka?

Jak wcześniej pisałem, luka dotyczy wersji 1.34.0 i 1.34.1, które zostały wydane w ubiegłym miesiącu, jednak funkcja objęta problemem była obecna przy wszystkich wersjach Nightly od 1.0.0. Zważając, że używanie Rusta w tej postaci jest dość popularne (ze względu na funkcje, które są tam dostępne) niewykluczone jest, że może mieć to wpływ na kod pisany dużo wcześniej.

Biblioteka standardowa Rusta zawiera metodę Error :: type_id, która pozwala na odczytanie globalnie unikalnego identyfikatora typu błędu TypeId. Podatność występuje, jeżeli ta metoda zostanie nadpisana i zwróci nieprawidłowe TypeId, co prowadzi do niebezpiecznego rzutowania typu przez rodzinę funkcji Error :: downcast.

Chociaż standardowa biblioteka posiada domyślną implementację Error :: type_id, można ją również zaimplementować ręcznie albo nadpisać kodem z crate'ów. Może to skutkować poważnymi problemami z bezpieczeństwem, takimi jak odczyt i zapis poza granicami. Raczej niewielka ilość użytkowników Rusta korzysta z ręcznej implementacji Error :: type_id. Nie zmienia to jednak faktu, że taka luka kłóci się z fundamentalnymi założeniami języka Rust jako języka skupionego na bezpieczeństwie, stabilności i braku wycieków pamięci.

W oficjalnym poradniku zespół Rust zaleca innowacyjne, tymczasowe rozwiązanie problemu, czyli... natychmiastowe usunięcie ręcznych implementacji Error :: type_id i używanie domyślnej implementacji, która nie doprowadza do błędów. Zapowiedzieli również, że w ciągu dwóch dni, będą mieli lepsze rozwiązanie.

Lepsze rozwiązanie: Rust 1.34.2

Jeszcze przy zgłoszeniu luki, zespół Rust w swoim poradniku bezpieczeństwa zapowiedział naprawę problemu za pomocą update’u i nowej wersji. Niestety, okazuje się, że problem wcale nie został naprawiony, a jedynie funkcja Error :: type_id została spowrotem oznaczona jako niestabilna, uniemożliwiając jej implementację lub użycie w dowolnym kodzie na stabilnych kanałach i kanałach beta. Na ten moment nie ma żadnej informacji o tym, czy ręczna implementacja funkcji trafi w bezpieczny sposób do stabilnej wersji w najbliższym czasie. Miło jednak wiedzieć, że zespół trzyma rękę na pulsie i informuje community o swoich krokach.

<p>Loading...</p>