De bedreigingsactoren achter de supply chain-aanval gericht op de populaire Trivy-scanner worden ervan verdacht vervolgaanvallen uit te voeren die hebben geleid tot het compromitteren van een groot aantal npm-pakketten met een voorheen ongedocumenteerde, zichzelf voortplantende worm genaamd BusWorm.
De naam verwijst naar het feit dat de malware een ICP-canister gebruikt, die verwijst naar fraudebestendige slimme contracten op de blockchain van de internetcomputer, als dead drop-resolver. De ontwikkeling markeert het eerste publiekelijk gedocumenteerde misbruik van een ICP-bus met het expliciete doel om de command-and-control (C2)-server op te halen, zei Aikido Security-onderzoeker Charlie Eriksen.
De lijst met getroffen pakketten vindt u hieronder:
- 28 pakketten in het @EmilGroup-bereik
- 16 pakketten in het @opengov-bereik
- @teale.io/eslint-config
- @airtm/uuid-base32
- @pypestream/floating-ui-dom
De ontwikkeling komt binnen een dag nadat bedreigingsactoren een gecompromitteerde inloggegevens hebben gebruikt om kwaadaardige trivy-, trivy-action- en setup-trivy-releases te publiceren die een inloggegevenssteler bevatten. Er wordt vermoed dat een op de cloud gerichte cybercriminele operatie, bekend als TeamPCP, achter de aanvallen zit.
De infectieketen waarbij de npm-pakketten betrokken zijn, omvat het gebruik van een postinstall-hook om een lader uit te voeren, die vervolgens een Python-achterdeur laat vallen die verantwoordelijk is voor het contacteren van de ICP-canister dead drop om een URL op te halen die naar de payload van de volgende fase verwijst. Het feit dat de dead drop-infrastructuur gedecentraliseerd is, maakt deze veerkrachtig en bestand tegen verwijderingsinspanningen.
“De canistercontroller kan de URL op elk moment wisselen en nieuwe binaire bestanden naar alle geïnfecteerde hosts sturen zonder het implantaat aan te raken”, aldus Eriksen.
Persistentie wordt tot stand gebracht door middel van een systeemgebruikersservice, die is geconfigureerd om de Python-backdoor automatisch te starten na een vertraging van 5 seconden als deze om de een of andere reden wordt beëindigd met behulp van de instructie “Restart=always”. De systemd-service doet zich voor als PostgreSQL-tooling (“pgmon”) in een poging onder de radar te vliegen.
De achterdeur belt, zoals eerder vermeld, elke 50 minuten de ICP-bus met een vervalste browser User-Agent om de URL in leesbare tekst op te halen. De URL wordt vervolgens geparseerd om het uitvoerbare bestand op te halen en uit te voeren.
“Als de URL youtube(.)com bevat, slaat het script deze over”, legt Eriksen uit. “Dit is de slapende toestand van de bus. De aanvaller bewapent het implantaat door de bus op een echt binair bestand te richten, en ontwapent het door terug te schakelen naar een YouTube-link. Als de aanvaller de bus bijwerkt zodat deze naar een nieuwe URL verwijst, pikt elke geïnfecteerde machine het nieuwe binaire bestand op bij de volgende poll. Het oude binaire bestand blijft op de achtergrond draaien omdat het script nooit eerdere processen beëindigt.”
Het is de moeite waard om op te merken dat een vergelijkbare op YouTube(.)com gebaseerde kill-schakelaar ook door Wiz is gemarkeerd in verband met het getrojaniseerde binaire bestand Trivy (versie 0.69.4), dat contact maakt met dezelfde ICP-bus via een andere Python-dropper (“sysmon.py”). Op het moment van schrijven is de URL die door de C2 wordt geretourneerd een rickroll YouTube-video.
The Hacker News ontdekte dat de ICP-bus drie methoden ondersteunt – get_latest_link, http_request, update_link – waarvan de laatste de bedreigingsactor in staat stelt het gedrag op elk moment aan te passen om een daadwerkelijke payload te bedienen.
Tegelijkertijd worden de pakketten geleverd met een ‘deploy.js’-bestand dat de aanvaller handmatig uitvoert om de kwaadaardige lading te verspreiden naar elk pakket waartoe een gestolen npm-token op programmatische wijze toegang biedt. De worm, waarvan is vastgesteld dat hij vibratiegecodeerd is met behulp van een hulpmiddel voor kunstmatige intelligentie (AI), doet geen poging om zijn functionaliteit te verbergen.
“Dit wordt niet geactiveerd door npm-installatie”, zei Aikido. “Het is een op zichzelf staand hulpmiddel dat de aanvaller gebruikt met gestolen tokens om de explosieradius te maximaliseren.”
Tot overmaat van ramp is gebleken dat een volgende iteratie van CanisterWorm, gedetecteerd in “@teale.io/eslint-config” versies 1.8.11 en 1.8.12, zichzelf zelfstandig verspreidt zonder dat handmatige tussenkomst nodig is.
In tegenstelling tot ‘deploy.js’, een op zichzelf staand script dat de aanvaller moest uitvoeren met de gestolen npm-tokens om een kwaadaardige versie van de npm-pakketten naar het register te pushen, integreert de nieuwe variant deze functionaliteit in ‘index.js’ binnen een findNpmTokens()-functie die wordt uitgevoerd tijdens de post-installatiefase om npm-authenticatietokens van de machine van het slachtoffer te verzamelen.
Het belangrijkste verschil hier is dat het postinstall-script, na het installeren van de persistente achterdeur, probeert elk npm-token uit de ontwikkelaarsomgeving te lokaliseren en de worm meteen met die tokens voortbrengt door “deploy.js” te starten als een volledig losstaand achtergrondproces.
Interessant genoeg zou de bedreigingsacteur de ICP-backdoor-payload hebben vervangen door een dummy-testreeks (“hello123”), die er waarschijnlijk voor zal zorgen dat de hele aanvalsketen werkt zoals bedoeld voordat de malware wordt toegevoegd.
“Dit is het punt waarop de aanval gaat van ‘gecompromitteerd account publiceert malware’ naar ‘malware brengt meer accounts in gevaar en publiceert zichzelf'”, aldus Eriksen. “Elke ontwikkelaar of CI-pijplijn die dit pakket installeert en een npm-token toegankelijk heeft, wordt een onbewuste propagatievector. Hun pakketten raken geïnfecteerd, hun downstream-gebruikers installeren die, en als een van hen tokens heeft, herhaalt de cyclus zich.”
(Dit is een verhaal in ontwikkeling. Kom later terug voor meer details.)