Odkryto lukę w ogromnej liczbie kompilatorów, która pozwala ukryć złośliwy kod

Autor: Yuriy Stanislavskiy | 02.11.2021, 12:16
Odkryto lukę w ogromnej liczbie kompilatorów, która pozwala ukryć złośliwy kod

Eksperci z Uniwersytetu Cambridge opublikowali informacje o groźnej luce (CVE-2021-42574), która dotyczy niemal wszystkich współczesnych kompilatorów kodu źródłowego. Artykuł Trojan Source opisuje podstępny atak, który pozwala hakerom ukryć złośliwy kod w kodzie źródłowym różnych programów.

Atak opiera się na sposobie, w jaki kompilatory obsługują unikalne identyfikatory używane do określenia, czy tekst jest zorientowany od lewej do prawej, czy od prawej do lewej. Słaby punkt leży w algorytmie Unicode Bidi, który pozwala na łączenie słów pisanych od prawej do lewej i od lewej do prawej. Dzięki temu algorytmowi można łączyć słowa arabskie i angielskie. Pozwala na czytanie tekstu pisanego od prawej do lewej, od lewej do prawej i odwrotnie.

W niektórych przypadkach możliwości algorytmu Unicode Bidi nie są wystarczające do zmiany sposobu wyświetlania tych słów i w takich przypadkach stosuje się specjalne znaki kontrolne. Jeśli jednak słowa o różnym kierunku tekstu są połączone w jednym wierszu, możliwe jest użycie tych znaków sterujących do zmiany kierunku czytania tego tekstu przez kompilator i, na przykład, sprawienie, że wiersze wyglądające jak komentarze będą działać jak kod wykonywalny.

Używając tej metody, można dodać złośliwą instrukcję do normalnego kodu źródłowego i sprawić, że tekst tej instrukcji będzie niewidoczny podczas przeglądania kodu z późniejszym komentarzem. Doprowadzi to do wstawienia zupełnie innych znaków, które w rzeczywistości mogą być dowolnym kodem. Końcowy kod źródłowy pozostaje semantycznie poprawny, ale po kompilacji dzieje się odwrotnie.

Przeglądając i analizując taki kod źródłowy programista widzi kod z komentarzami, które nie wzbudzają żadnych podejrzeń, ale kompilator lub interpreter odwróci logiczną kolejność znaków i niewinny komentarz zamieni się w dodatkowy kod wstawiony do programu. Błąd jest obecny w niemal wszystkich kompilatorach - dla języków programowania C, C++ (gcc i clang), C#, JavaScript (Node.js), Java (OpenJDK 16), Rust, Go i Python; w różnych popularnych edytorach kodu, w tym VS Code, Emacs, Atom; oraz w interfejsach przeglądania kodu źródłowego w repozytoriach GitHub, Gitlab, BitBucket i wszystkich produktach Atlassian.

Źródło: trojansourcezdnet