Schwachstellen in Abhängigkeiten finden.

Fehlo liest, welche Pakete deine Projekte wirklich einsetzen, und zeigt bekannte Sicherheitslücken (CVE, GitHub Advisories) mit der Version, die sie behebt. Für npm, pnpm, Yarn, Bun, Python, Ruby, PHP und Go.

Der Scan ergänzt Dependabot, npm audit oder pip-audit in deiner CI, er ersetzt sie nicht. Sein Vorteil: Er sieht, welche Versionen auf deinen Servern laufen, und meldet neue Lücken auch dann, wenn seit Wochen niemand am Code gearbeitet hat.

Woher Fehlo deine Pakete kennt

Fehlo braucht eine Liste der Pakete mit Versionen. Die kommt aus einer von drei Quellen, die beste gewinnt:

  1. Lockfile aus GitHub. Ist das Projekt mit einem Repository verbunden (GitHub-Integration), liest Fehlo die Lockfiles im Hauptverzeichnis oder unter dem eingestellten Pfad: bei jedem Push auf den Standard-Branch, der eine Lockfile ändert, bei jedem Release, das einen Commit nennt, und einmal am Tag.
  2. Lockfile aus der CI. Ohne GitHub lädst du die Datei nach dem Build hoch, mit einem API-Token, das Schreibrechte für das Projekt hat. Release, Umgebung und Host gibst du optional mit.
  3. Pakete aus den Fehlerereignissen. Ohne Lockfile nimmt Fehlo die Modulliste, die das SDK mit jedem Fehler schickt. Python, Ruby und Go senden die installierten Versionen. Node.js sendet nur den Bereich aus package.json, etwa ^14.2.0; solche Funde heißen „möglicherweise betroffen“. Browser-, iOS-, Android- und .NET-Projekte bekommen ohne Lockfile keine Paketprüfung.
CI oder Cronjob
curl -fsS -X POST -H "Authorization: Bearer $FEHLO_TOKEN" \
  --data-binary @package-lock.json \
  "https://app.fehlo.de/api/0/projects/<organisation>/<projekt>/dependencies/?filename=package-lock.json&release=$GIT_SHA&environment=production"

# yarn.lock, poetry.lock, Gemfile.lock und composer.lock mit dem Manifest daneben
curl -fsS -X POST -H "Authorization: Bearer $FEHLO_TOKEN" \
  -F file=@yarn.lock -F manifest=@package.json \
  "https://app.fehlo.de/api/0/projects/<organisation>/<projekt>/dependencies/"

# auf dem Server: was dort wirklich installiert ist
pip freeze | curl -fsS -X POST -H "Authorization: Bearer $FEHLO_TOKEN" --data-binary @- \
  "https://app.fehlo.de/api/0/projects/<organisation>/<projekt>/dependencies/?filename=requirements.txt&host=$(hostname)"

Eine Lockfile deckt die SDK-Daten ihres Ökosystems für ihre Umgebung und ihren Host ab. Wechselst du von SDK-Daten auf eine Lockfile, bleiben ignorierte Funde ignoriert und gemeldete Funde gemeldet.

Welche Lockfiles Fehlo liest

ÖkosystemDateienHinweis
npmpackage-lock.json, npm-shrinkwrap.json (Version 1 bis 3)ganzer Baum, direkt und indirekt, Entwicklung und Laufzeit
pnpmpnpm-lock.yaml (Version 5 bis 9)ganzer Baum
Yarnyarn.lock (classic und Berry)für direkt und Entwicklung braucht Fehlo die package.json daneben
Bunbun.lock
Pythonpoetry.lock, uv.lock, Pipfile.lock, requirements.txt mit festen Versionen, Ausgabe von pip freezePipfile.lock und pip freeze haben keinen Baum; Poetry braucht die pyproject.toml für direkt und Entwicklung
RubyGemfile.lockmit Gemfile daneben für direkt und Entwicklung
PHPcomposer.lockEntwicklungspakete aus packages-dev, direkt mit composer.json
Gogo.mod, go.sumgo.sum hat keinen Baum; Go kennt keine Entwicklungsabhängigkeiten

Aus GitHub holt Fehlo das Manifest selbst. Beim Hochladen schickst du es als Feld manifest mit. Fehlt es, zählt Fehlo im Zweifel alles als Laufzeitpaket.

Was du siehst

Fehlo gleicht die Pakete alle sechs Stunden mit der Datenbank OSV.dev ab, die CVE-Einträge, GitHub Security Advisories und die Datenbanken der Paketregister zusammenführt. Ein Fund zeigt:

  • das Paket mit der installierten Version und den Hosts, auf denen sie läuft,
  • die Quelle, etwa „aus package-lock.json, Commit abc1234“,
  • bei indirekten Paketen den Weg dorthin, etwa @auth/drizzle-adapter > @auth/core,
  • die Version, die die Lücke behebt, und den Hinweis, wenn dafür eine neue Hauptversion nötig ist,
  • eine Checkliste „Bin ich betroffen?“, wenn die Meldung einen solchen Abschnitt hat; viele haben keinen,
  • Laufzeiten, deren Support ausgelaufen ist, etwa eine alte Node.js- oder Python-Version (Daten von endoflife.date).

Meldungen, die dieselbe Lücke unter mehreren Kennungen führen (CVE, GHSA, PYSEC, GO), zählen einmal. Zurückgezogene Meldungen fallen weg. Bestrittene Meldungen bekommen ein Etikett, stehen am Ende der Liste und kommen nicht in die Mail.

Ignorieren, mit Begründung

Nicht jede Lücke betrifft dich. Beim Ignorieren wählst du einen Grund: Code nicht erreichbar, nur Build oder Entwicklung, Voraussetzungen nicht erfüllt, bereits behoben und noch nicht gemeldet, Risiko akzeptiert oder Paket wird nicht verwendet. Dazu schreibst du eine Notiz. Du kannst ein ganzes Paket ignorieren, auf Wunsch auch für künftige Funde, und jede Entscheidung später zurücknehmen. So sieht dein Team in drei Monaten noch, warum etwas offen geblieben ist.

Eine Mail am Tag

Einmal täglich bekommen Inhaber, Manager, Admins und die Mitglieder der Projektteams eine Mail mit den neuen Funden, nach Paket gruppiert. Dieselbe Zusammenfassung geht an die Chat- und Webhook-Kanäle deiner Alarme. Pro Projekt stellst du die Schwelle ein: kritisch, hoch oder mittel. Pakete, die nur die Entwicklung braucht, bleiben draußen, außer du schaltest sie dazu. Jeder Fund wird höchstens einmal gemeldet.

Was der Scan nicht kann

  • Er prüft keinen Code. Ob deine App die betroffene Funktion aufruft, entscheidest du.
  • Er öffnet keine Pull Requests mit Updates. Das macht Dependabot oder Renovate.
  • Ohne Lockfile hängt er an deinen Fehlern: Ein Projekt ohne aktuelle Fehler wird nur über eine Lockfile aufgefrischt.
  • .NET meldet Assembly-Versionen statt NuGet-Paketen; ohne Lockfile gibt es dort keine Prüfung.
  • Widersprechen sich Text und Versionsbereich einer Meldung, folgt Fehlo dem Versionsbereich.

Was es kostet

Der Scan gehört zu jedem Projekt, auch im Plan Free. Hochgeladene Lockfiles zählen nicht zum Ereignis-Kontingent. Pro Projekt nimmt Fehlo eine begrenzte Zahl von Uploads pro Stunde an; für einen Upload pro Build reicht das. Die Pläne stehen unter Preise.

KI-Agenten lesen die Funde über den MCP-Server, ignorieren sie mit Begründung und stoßen eine neue Prüfung an, wenn deine Rolle es erlaubt.

Häufige Fragen

Ersetzt Fehlo Dependabot oder npm audit?

Nein. Lass sie in der CI laufen. Fehlo prüft zusätzlich, was tatsächlich ausgerollt ist, und meldet neue Lücken in Paketen, die du nicht mehr anfasst.

Welche Datenbank nutzt Fehlo?

OSV.dev, die offene Datenbank, die CVE-Einträge, GitHub Security Advisories, PyPI-, Go-, RubyGems-, Packagist- und npm-Meldungen zusammenführt. Fehlo fragt sie alle sechs Stunden ab.

Schickt Fehlo meinen Code an OSV.dev?

Nein. An OSV.dev gehen nur Paketname, Ökosystem und Version. Lockfiles und Code bleiben bei Fehlo in Deutschland.

Muss ich GitHub verbinden?

Nein. Du kannst die Lockfile aus der CI hochladen. Für Python, Ruby und Go reichen oft schon die Daten, die das SDK mit jedem Fehler schickt.

Warum steht bei Node.js „möglicherweise betroffen“?

Ohne Lockfile kennt Fehlo nur den Versionsbereich aus der package.json, etwa ^14.2.0, und prüft dessen niedrigste Version. Mit package-lock.json, pnpm-lock.yaml, yarn.lock oder bun.lock sind die Versionen exakt.