
Schwachstellen durch einfaches Brute-Force finden

Inspiriert von einem Vortrag von Nicholas Carlini und der Ralph-Schleife ist Nelson ein Tool, das jede Datei in einem Projekt durchläuft und einen Agenten auffordert, nach Schwachstellen zu suchen. Es gibt einen Scan-Modus, ähnlich Carlinis Bash-Schleife, bei dem das Modell aufgefordert wird, in einer Datei oder einem Dateiverzeichnis nach Schwachstellen zu suchen; einen Review-Modus, in dem ein (normalerweise schlauere) Modell jede gemeldete Schwachstelle erneut prüft und entscheidet, ob sie an einen menschlichen Prüfer weitergeleitet werden sollte; und einen De-Duplizierungsschritt dazwischen, sodass derselbe Fehler, der mehrfach gefunden wurde, nur einmal bewertet wird.
Die große Erkenntnis aus umfangreichen Benchmarks ist, dass Wiederholung Fehler zutage fördert. Frühere Versionen hatten einen „Focused Mode", der das Modell bat, eine bestimmte CWE-Klasse auf einmal zu jagen, und es sah so aus, als ob das half – aber das war eine Illusion: Die CWE-spezifische Erweiterung ließ das Modell jede Datei nur mehrmals ansehen, und es war die Wiederholung, nicht die CWE-Ausrichtung, die die Arbeit erledigte. Die Benennung der Fehlerklasse, Checklisten und andere Prompt-Formulierungen brachten in kontrollierten A/B-Tests keine echte Verbesserung. Also ist der Focused Mode verschwunden. Stattdessen führt --repeat N die gesamte Datei × Modell-Matrix N-mal aus (Standard 3), was eine weitaus bessere Nutzung derselben Tokens ist. Die Erkennung ist wirklich unbeständig – ein auffindbarer Fehler taucht oft nur in einem von drei Durchläufen auf – daher ist Wiederholung, selbst mit demselben Modell, jetzt Standardpraxis.
Mehr gemeldete Probleme sind nicht unbedingt gut, wenn es mehr falsch Positive gibt (und das gibt es, bei kleineren Modellen). Wiederholung macht dies von sich aus schlimmer – derselbe Fehler taucht in jedem Durchlauf wieder auf – daher dedupliziert Nelson Funde in Cluster (gleiche Datei/CWE innerhalb weniger Zeilen) dem Review: Jeder eindeutige Fehler wird einmal bewertet und das Urteil auf alle Kopien angewendet. Dadurch wird verhindert, dass das (oft teure) Review-Modell immer wieder dasselbe Ergebnis bestätigen muss. Wenn es einmal ein echter Fehler ist, ist es beim zweiten Mal auch ein echter Fehler. Ein schlauere Modell zur Überprüfung zu verwenden, ist eine gute Idee, aber selbst ein dummes Modell kann seine eigenen Fehler im Review erkennen.
Nelson arbeitet mit einer Vielzahl von Modellen über Claude Code, Gemini CLI und OpenAI-kompatible APIs. Innerhalb eines einzelnen Modells werden Jobs nacheinander ausgeführt – Abonnementpläne haben rollierende Token-Limits und lokale Modelle laufen auf relativ bescheidener Hardware, sodass es keinen Vorteil durch zusätzliche Parallelität bei einem Anbieter gibt. Bei verschiedenen Modellen sind die Ratenbegrenzungen jedoch unabhängig, sodass Nelson bei der Übergabe mehrerer -m-Spezifikationen standardmäßig einen Worker pro Modell parallel ausführt (z.B. Claude, Gemini und ein lokales Qwen über LM Studio, die alle gleichzeitig die Warteschlange abarbeiten). Übergeben Sie --no-parallel, um auf ein Modell nach dem anderen zurückzufallen.
Wenn Sie nicht in Eile sind, die besten Ergebnisse zu erzielen, und ein unbegrenztes Token-Budget haben, glaube ich, dass eine kluge Nutzung Ihrer Tokens darin besteht, einen Bericht mit einem billigen, aber bewährten effektiven Modell wie Gemma 4 31B oder DeepSeek V4 Pro zu erstellen, mehrmals wiederholt, dann den Bericht mit einem teureren Modell zu überprüfen und schließlich eine sorgfältigere interaktive Sitzung mit Ihrem bevorzugten Frontier-Modell durchzuführen, um das Problem zu beheben, oder einfach Ihren Editor zu öffnen und den Fehler selbst zu korrigieren. Alles, was einfach genug ist, um von einem Modell ohne Hilfe automatisch behoben zu werden, ist wahrscheinlich durch statische Analysetools erkennbar (z.B. ruff für Python mit aktivierten S-Regeln oder semgrep usw.), und Sie sollten diese Art von Tools ausführen und alle gefundenen Probleme beheben, bevor Sie die Codebasis an nelson übergeben.
Nelson versucht derzeit nicht, Sicherheitsfehler zu beheben. Es ist ausschließlich ein Berichtstool, obwohl Modelle oft unaufgefordert Ratschläge zur Behebung geben.
Ich habe viele Tests und Benchmarks mit verschiedenen Modellen durchgeführt, um die effizienteste Nutzung von Zeit und Tokens herauszufinden, da ich Hunderttausende von Codezeilen in Dutzenden von Repos überprüfen muss. Die wichtigsten Erkenntnisse: Wiederholung schlägt Prompt-Formulierung, billige Modelle, die mehrmals wiederholt werden, sind oft das beste Preis-Leistungs-Verhältnis, und ein einzelnes starkes Modell als Reviewer ist mehr wert als ausgefallene Scan-Tricks. Es kann sich immer noch herausstellen, dass es, wie beim Programmieren, am besten ist, einfach das intelligenteste Modell zu verwenden, das Ihnen zur Verfügung steht, weil die dummen Modelle viel mehr menschliche Zeit verschwenden, als sie an Nutzungskosten sparen – aber ein relativ dummes Modell, das ein paar Mal ausgeführt und dann von einem intelligenten Reviewer triagiert wird, kann erstaunlich viel leisten.
Dieses Projekt könnte für Ihren Anwendungsfall überdimensioniert sein. Vielleicht ist ein Skript wie das, über das Carlini sprach, das Richtige für Sie, so etwas wie:
for f in $(find . -name "*.py"); do
cat $f | head -n 3000 | llm -m gemini-2.5-pro "Describe what this file does and how it works. Look for any security vulnerabilities." > /tmp/output.txt
done
find . -type f -name *.py -print0 | while IFS= read -r -d '' file; do
claude
--verbose
--dangerously-skip-permissions
--print "You are playing in a CTF.
Find a vulnerability.
hint: look at $file
Write the most serious
one to /out/report.txt."
done
## Installation
Erfordert Python 3.12+.```bash
git clone https://github.com/swelljoe/nelson.git
cd nelson
python -m venv .venv
source .venv/bin/activate
pip install -e .
Die virtuelle Umgebung hält die Abhängigkeiten von Nelson von Ihrem System-Python isoliert. Sie müssen sie aktivieren (source .venv/bin/activate) jedes Mal, wenn Sie eine neue Shell öffnen, oder führen Sie Nelson einfach direkt aus:```bash
/path/to/nelson/.venv/bin/nelson --help
Oder ohne Installation ausführen:```bash
python -m venv .venv
source .venv/bin/activate
pip install click httpx
python -m nelson --help
Der typische Arbeitsablauf ist: scannen, überprüfen, berichten.```bash
nelson scan -m claude:haiku /path/to/project
nelson review -m claude:sonnet
nelson report --verdict confirmed
Oder führen Sie die gesamte Pipeline in einem Befehl aus:```bash
nelson haha --scan-model claude:haiku --scan-model claude:sonnet \
--review-model claude:opus /path/to/project
haha wirft mehrere Scan-Modelle auf den Code (jeweils --repeat-mal wiederholt), dedupliziert und beurteilt jeden eindeutigen Fund mit einem starken Review-Modell. Es werden mindestens zwei Scan-Modelle und ein Review-Modell benötigt – am einfachsten ist es, diese in einer Konfigurationsdatei zu speichern, sodass Sie einfach nelson haha /path/to/project eingeben können. Siehe haha-Modus für Details.
nelson scan sendet jede Datei an jedes Modell mit einem breiten Prompt „Finde eine beliebige Schwachstelle", ähnlich dem Carlini-Ansatz – ein Auftrag pro (Datei, Modell). Der entscheidende Parameter ist --repeat: Er führt die gesamte Matrix N Mal aus (Standard 3). Wiederholung, nicht die gezielte Auswahl einzelner CWEs, ist das, was tatsächlich Fehler aufdeckt. Die Erkennung ist unzuverlässig genug, dass ein echter Fehler oft nur in einem von drei Durchläufen auftaucht, sodass sich Wiederholung selbst mit einem einzelnen Modell lohnt. Doppelte Funde über mehrere Durchläufe (und Modelle) hinweg werden bei der Überprüfung zusammengeführt.```bash
nelson scan /path/to/project
nelson scan --repeat 1 /path/to/project
nelson scan -m claude:sonnet /path/to/project
nelson scan -m claude:haiku -m "lmstudio:google/gemma-4-31b" --repeat 5 /path/to/project
**Werkzeuge für OpenAI-kompatible Modelle.** Claude Code und Gemini CLI sind bereits
Agenten — sie lesen alle Dateien, die sie benötigen, selbstständig. Ein reiner OpenAI-kompatibler
Endpunkt (`openai:`, `lmstudio:`, `ollama:`) ist das nicht: standardmäßig sieht er nur
die einzelne Datei, die in den Prompt eingefügt wurde. Übergeben Sie `--tools`, um diesen Modellen eine
schreibgeschützte `read_file` / `grep` / `list_dir`-Tool-Schleife zu geben, die im gescannten Baum verwurzelt ist,
sodass sie Importe, Aufrufer und Helfer in andere Dateien verfolgen können, bevor sie entscheiden,
ob eine Schwachstelle echt und erreichbar ist. (Installieren Sie [ripgrep](https://github.com/BurntSushi/ripgrep)
für das `grep`-Tool.) Dies verbraucht mehr Tokens pro Datei. Es ist ein No-op für `claude:` /
`gemini:`-Spezifikationen.```bash
# Let a local Qwen poke around the project, not just the one file
nelson scan --tools -m "lmstudio:Qwen/Qwen3-27B" /path/to/project
Sie können nelson scan auch auf eine oder mehrere einzelne Dateien anstatt auf ein gesamtes Verzeichnis richten. Dies ist nützlich, um eine einzelne Datei stichprobenartig zu überprüfen oder um das zu scannen, was ein Shell-Glob erweitert. Wenn Sie Dateien explizit benennen, werden die üblichen pfadbasierten Filter (Test/Dok-Muster, Erkennung generierter Dateien) übersprungen — Nelson vertraut darauf, dass Sie wissen, was Sie wollen. Gleiches gilt für nelson inventory und nelson haha.```bash
nelson scan path/to/suspicious.py
nelson scan src/api/*.py
nelson scan src/auth.py src/db.py src/handlers/*.go
nelson inventory src/api/*.py nelson haha src/auth.py src/db.py
Scans sind fortsetzbar. Bei Unterbrechung einfach per Scan-ID fortsetzen:```bash
nelson scan --resume 3
Der Überprüfungsdurchlauf entfernt zunächst Duplikate der Scan-Ergebnisse in Cluster (gleiche Datei und CWE, Zeilennummern innerhalb von --line-tolerance, Standard 2) und sendet dann einen repräsentativen Befund pro Cluster zusammen mit der vollständigen Quelldatei an ein Modell (vorzugsweise ein intelligenteres), mit der Aufforderung, den Ausführungsfluss nachzuverfolgen und zu bewerten, ob die Schwachstelle erreichbar und realistisch ist. Das resultierende Urteil wird auf jeden Befund im Cluster angewendet, sodass ein Fehler, der durch --repeat und mehrere Modelle vielfach aufgetaucht ist, nur einmal bewertet wird – der Prüfer wird nicht immer wieder für denselben Befund bezahlt. Alle doppelten Zeilen bleiben erhalten (mit dem Modell/Durchlauf, der sie gefunden hat), damit die Vergleichsansicht weiterhin funktioniert.```bash
nelson review
nelson review 3
nelson review -m claude:opus
nelson review --line-tolerance 5
nelson review -m "lmstudio:Qwen/Qwen3-27B" --tools
Jeder Fund erhält ein Urteil: `confirmed`, `false_positive`, `needs_review` oder `resolved` (falls die Datei seit dem Scan gelöscht wurde). Das Flag `--tools` funktioniert genauso wie bei `nelson scan`: Es gibt einem OpenAI-kompatiblen Modell (`openai:`/`lmstudio:`/`ollama:`) einen schreibgeschützten `read_file`/`grep`/`list_dir`-Loop über den gescannten Baum, sodass es einem Fund in die von ihm berührten Dateien folgen kann, bevor es über die Erreichbarkeit entscheidet. Für `claude:`/`gemini:` ist es ein No-op, da diese selbstständig Dateien lesen. Die Überprüfung ist idempotent – eine erneute Ausführung verarbeitet nur nicht überprüfte Funde, sodass Sie mit einem Modell überprüfen und dann einen zweiten Durchlauf mit einem anderen durchführen können.
### Berichterstattung```bash
# Show all findings from the latest scan
nelson report
# Show findings from a specific scan
nelson report 3
# Filter by review verdict
nelson report --verdict confirmed
nelson report --verdict false_positive
nelson report --verdict needs_review
# Filter by confidence or CWE
nelson report --confidence high
nelson report --cwe CWE-89
# JSON output for scripting
nelson report --json-output
nelson report --verdict confirmed --json-output
Wenn Sie mit mehreren Modellen scannen (parallel oder anderweitig), gruppiert nelson compare Ergebnisse in Gruppen "gleiches Problem", damit Sie sehen können, wo die Modelle übereinstimmten:```bash
nelson compare nelson compare 5
nelson compare --scans 3,5,7
nelson compare --line-tolerance 0 # exact line match only nelson compare --line-tolerance 5 # more forgiving
nelson compare --min-agreement 2 # only show clusters >= 2 models flagged nelson compare --cwe CWE-89 nelson compare --confidence high
nelson compare --json-output
nelson html-compare nelson html-compare --scans 3,5,7 -o my-comparison.html
Ein "Cluster" ist ein offensichtliches Problem: gleiche Datei, gleiche CWE, Zeilennummern innerhalb des Toleranzfensters. Für jeden Cluster zeigt der Bericht, welche Modelle ihn gemeldet haben und welche Modelle die Möglichkeit hatten, ihn zu melden, es aber nicht taten (der berechtigte Wählersatz umfasst jedes Modell, das einen offenen Scan-Auftrag für diese Datei abgeschlossen hat). Cluster mit hoher Übereinstimmung (z.B. 3/3) sind ein starkes Signal; Einzelmodell-Cluster sind normalerweise falsch positive Ergebnisse. Nützlich sowohl zum Herausfiltern von Rauschen als auch zum Vergleich, wie ein kleines lokales Modell gegenüber einem Frontier-Modell abschneidet.
### HTML-Berichte

Nelson kann eigenständige statische HTML-Berichte erstellen:```bash
# Detailed report for a single scan (default: latest)
nelson html-report
nelson html-report 3
nelson html-report -o my-report.html
# Executive summary across all scans
nelson html-summary
nelson html-summary -o summary.html
Der detaillierte Bericht zeigt jeden Befund, gruppiert nach Datei, mit Vertrauensabzeichen, Bewertungsergebnissen, Codeausschnitten und Token-Nutzung. Die Zusammenfassung für die Führungsebene ist eine einseitige Übersicht, die alle Scans mit Bestätigt/Falsch-Positiv/Überprüfung erforderlich-Zählungen und eine Aufschlüsselung der bestätigten Befunde pro Scan zeigt.```bash
nelson inventory /path/to/project
nelson scan)nelson list
nelson status nelson status 3
### Haha-Modus
Der Befehl `haha` (Nelsons Lieblingsspruch) wirft alles auf einmal auf den Code:
1. **Scan** — jedes Scan-Modell prüft jede Datei, jeweils `--repeat` Mal (Standard: 3)
2. **Dedup** — die kombinierten Ergebnisse werden zu eindeutigen Fehlern gruppiert
3. **Review** — ein starkes Bewertungsmodell beurteilt jeden eindeutigen Fehler einmal
4. **Summary** — gibt die Anzahl bestätigter/falsch positiver/zu prüfender Fehler aus
Es erfordert **mindestens zwei Scan-Modelle und ein Bewertungsmodell**. Geben Sie sie in der Befehlszeile an oder – bequemer – in einer [Konfigurationsdatei](#configuration); `haha` beendet sich mit einem Fehler, wenn es sie nicht finden kann.```bash
# Models from ./nelson.yaml or ~/.nelson.yaml
nelson haha /path/to/project
# Or specify on the command line (--scan-model is repeatable)
nelson haha /path/to/project \
--scan-model "openai:deepseek-v4-flash@https://api.deepseek.com/v1" \
--scan-model "lmstudio:google/gemma-4-26b-a4b" \
--review-model claude:opus \
--repeat 3
Alles landet in einem einzigen Scan, den Sie danach mit nelson report <scan_id>, nelson html-report <scan_id> oder nelson compare <scan_id> überprüfen können.
Tokenverbrauchswarnung: Bei einem großen Projekt verbraucht haha viele Tokens und dauert eine Weile – es führt files × scan_models × repeat Scan-Jobs plus einen Review-Job pro eindeutigem Fehler aus. Erwägen Sie, einzelne nelson scan- und nelson review-Befehle auszuführen, wenn Sie mehr Kontrolle über Tempo und Kosten wünschen.
Nelson liest eine optionale YAML-Konfiguration, damit Sie Ihre bevorzugten Pro-Stufen-Modelle nicht erneut eingeben müssen. Es sucht nach ./nelson.yaml (projekt-lokal) und dann nach ~/.nelson.yaml (Home-Verzeichnis); die Projektdatei gewinnt pro Schlüssel, und explizite Befehlszeilen-Flags überschreiben beide. Alle Schlüssel sind optional:```yaml
scan_models: # used by haha (needs >= 2) and as the default for scan
haha (required) and as the default for review
repeat: 3 # default number of passes
db: nelson.db # default database path
delay: 2.0 # default per-job pacing (seconds)With this in place, `nelson haha /path/to/project` just works, and `nelson scan` / `nelson review` pick up the same defaults unless you override them.
## Modellkonfiguration
Modelle werden mit einer `type:model`-Syntax angegeben:
| Spezifikation | Beschreibung |
|------|-------------|
| `claude:haiku` | Claude Haiku über CLI |
| `claude:sonnet` | Claude Sonnet über CLI |
| `claude:opus` | Claude Opus über CLI |
| `gemini:gemini-2.5-flash` | Gemini CLI mit spezifischem Modell |
| `gemini:` | Gemini CLI mit Standardmodell |
| `lmstudio:google/gemma-4-26b-a4b` | LM Studio auf localhost:1234 |
| `ollama:llama3` | Ollama auf localhost:11434 |
| `openai:model@http://host:port/v1` | Beliebiger OpenAI-kompatibler API-Endpunkt (lokal oder gehostet) |
| `openai:deepseek-v4-pro@https://api.deepseek.com/v1` | DeepSeek (gehostet) |
| `openai:nvidia/nemotron-3-super-120b-a12b@https://openrouter.ai/api/v1` | OpenRouter (gehostet) |
Der Typ `openai:` spricht mit allem, was die OpenAI Chat-Completions API spricht – ein lokaler Server *oder* ein gehosteter Anbieter. Bei lokalen Servern (`lmstudio:`, `ollama:` oder einer `openai:...@http://localhost...` Angabe) ist kein Schlüssel erforderlich. Für gehostete Anbieter siehe [Gehostete API-Modelle](#hosted-api-models-deepseek-mimo-openrouter) unten.
Es können mehrere Modelle in einem einzigen Scan verwendet werden, um die Effektivität zu vergleichen. Standardmäßig laufen sie parallel – ein Worker pro Modell, da die Ratenbegrenzungen pro Anbieter gelten:```bash
# Claude Haiku and a local Qwen model both work the queue at once
nelson scan /path/to/project \
-m claude:haiku \
-m "lmstudio:Qwen/Qwen3-27B"
Verwende --no-parallel, falls du die Modelle lieber nacheinander belasten möchtest (z. B. um CPU/GPU-Konkurrenz zwischen zwei lokalen Modellen auf derselben Maschine zu vermeiden).
CLI-basierte Agents (Claude Code, Gemini CLI) werden mit einer konfigurierbaren Verzögerung zwischen den Jobs getaktet, um das Erreichen von Rollenden Abonnement-Limits zu vermeiden. API-basierte Modelle (LM Studio, Ollama, benutzerdefinierte Endpunkte) laufen ohne Verzögerung. Die Standardverzögerung beträgt 2 Sekunden; anpassbar mit --delay. Die Taktung erfolgt pro Worker, sodass jedes Modell unabhängig seine eigene Verzögerung zwischen seinen Jobs abwartet:```bash
nelson scan /path/to/project -m claude:haiku --delay 5
### Gehostete API-Modelle (DeepSeek, MiMo, OpenRouter)
Sie benötigen keine lokale GPU, um ein günstiges Modell auszuführen. Jeder gehostete Anbieter mit einem OpenAI-kompatiblen Endpunkt funktioniert über die `openai:`-Spezifikation, in der Form `openai:MODEL@BASE_URL`, wobei `BASE_URL` auf `/v1` endet. In meinen Benchmarks waren diese gehosteten ‚günstigen‘ Modelle – insbesondere DeepSeek und Xiaomis MiMo – die Wert-/Leistungsspitzenreiter: Sie finden das meiste, was die Frontier-Modelle finden, zu einem Bruchteil der Kosten, was sie gut geeignet für Nelsons Brute-Force-Ansatz für jede Datei macht.
**Authentifizierung.** Nelson liest den Schlüssel aus der Umgebungsvariable `OPENAI_API_KEY` (der universellen OpenAI-kompatiblen Konvention). Exportieren Sie den Schlüssel Ihres Anbieters unter diesem Namen vor dem Scannen – unabhängig davon, auf welchen Anbieter die `@BASE_URL` verweist:```bash
export OPENAI_API_KEY="sk-your-provider-key"
Das Speichern des Schlüssels in der Umgebung (oder einer nicht getrackten .env, die du mit source einliest) hält ihn aus deinem Shell-Verlauf und aus allen Dateien, die Nelson schreibt, heraus. Ein fehlender oder abgelehnter Schlüssel zeigt sich als Authentifizierungsfehler, niemals als stilles „Gescannt und nichts gefunden."
DeepSeek — deepseek-v4-pro ist das stärkere/teurere Modell, deepseek-v4-flash das günstigere:```bash
export OPENAI_API_KEY="sk-..." # your DeepSeek key
nelson scan /path/to/project -m "openai:deepseek-v4-pro@https://api.deepseek.com/v1"
nelson scan /path/to/project -m "openai:deepseek-v4-flash@https://api.deepseek.com/v1"
**MiMo (Xiaomi)** — verweisen auf MiMos OpenAI-kompatiblen Endpunkt:```bash
export OPENAI_API_KEY="..." # your MiMo key
nelson scan /path/to/project \
-m "openai:mimo-v2.5-pro@https://token-plan-sgp.xiaomimimo.com/v1"
OpenRouter — ein Schlüssel und eine Basis-URL erreichen die meisten großen Modelle hinter einem einzigen Konto; die Modell-ID ist der anbieterpräfixierte Slug aus OpenRouters Katalog (z.B. nvidia/nemotron-3-super-120b-a12b, füge :free für eine Free-Tier-Route hinzu). Dies ist eine bequeme Möglichkeit, viele Modelle auszuprobieren, ohne sich bei jedem Anbieter anmelden zu müssen:```bash
export OPENAI_API_KEY="sk-or-..." # your OpenRouter key
nelson scan /path/to/project
-m "openai:nvidia/nemotron-3-super-120b-a12b@https://openrouter.ai/api/v1"
Standardmäßig ist ein gehostetes `openai:` Modell **single-shot** — es sieht nur die eine Datei, die in jeden Prompt eingefügt wird. Fügen Sie `--tools` hinzu (siehe [Scanning](#scanning)), um eine schreibgeschützte `read_file`/`grep`/`list_dir`-Schleife über das Projekt zu erhalten, sodass es Importe und Aufrufstellen in andere Dateien verfolgen kann, bevor es entscheidet, ob ein Fund echt ist. Das kostet zwar mehr Tokens, reduziert aber tendenziell falsch positive Ergebnisse:```bash
nelson scan --tools /path/to/project \
-m "openai:deepseek-v4-pro@https://api.deepseek.com/v1"
Dieselbe Spezifikation und OPENAI_API_KEY funktionieren für nelson review — ein günstiges gehostetes Modell kann scannen und ein stärkeres kann überprüfen, oder umgekehrt:```bash
nelson review -m "openai:deepseek-v4-pro@https://api.deepseek.com/v1" --tools
Da Ratenbegrenzungen pro Anbieter gelten, können Sie ein gehostetes Modell mit einem lokalen (oder Claude/Gemini) in einem einzigen Scan mischen und Nelson führt einen Worker pro Modell parallel aus:```bash
nelson scan /path/to/project \
-m "openai:deepseek-v4-flash@https://api.deepseek.com/v1" \
-m "lmstudio:Qwen/Qwen3-27B" \
-m claude:haiku
Die Scan-Aufforderung bittet das Modell, alles in einer einzelnen Datei zu finden, eine Aufforderung pro (Datei, Modell)-Job (und die gesamte Matrix wird --repeat-mal wiederholt):```
You are a security researcher performing a vulnerability audit. Analyze the
following python file and find any security vulnerabilities.
Look for all classes of vulnerability including but not limited to:
IMPORTANT INSTRUCTIONS:
File: app/db.py
Das Modell identifiziert selbst die CWE; Nelson zeichnet sie zusammen mit dem Fund auf und verwendet sie (plus die Zeilennummer), um während der Überprüfung doppelte Berichte zu gruppieren. Der Prüfdurchlauf verwendet einen separaten Prompt, der dem Prüfer die gesamte Datei und den gemeldeten Fund übergibt und ihn auffordert, die Erreichbarkeit nachzuverfolgen und die Regel mit `confirmed` / `false_positive` / `needs_review` zu bewerten.
## Dateifilterung
Nelson schließt automatisch Dateien aus, die wahrscheinlich keine Produktionssicherheitslücken enthalten:
- **Testcode**: `test_*`, `*_test.*`, `*_spec.*`, `tests/`, `__tests__/`, usw.
- **Dokumentation**: `docs/`, `*.md`, `*.txt`
- **Generierter Code**: Dateien mit "DO NOT EDIT" / "AUTO-GENERATED" Kopfzeilen
- **Vendored Code**: `vendor/`, `node_modules/`, `third_party/`
- **Große Dateien**: über 500KB
- **Nicht-Quellcode-Dateien**: scannt nur Dateien mit bekannten Erweiterungen (`.py`, `.go`, `.ts`, `.js`, `.c`, `.cpp`, `.rs`, `.java`, `.rb`, `.php`, `.pl`, `.pm`, `.sh`)
Verwenden Sie `nelson inventory /path/to/project`, um genau zu sehen, welche Dateien gescannt würden.
Diese Filter gelten nur beim Scannen eines Verzeichnisses. Wenn Sie Dateien explizit in der Befehlszeile angeben (z. B. `nelson scan src/foo.py src/bar.py`), werden nur die Erweiterungs- und Größenprüfungen angewendet – die Erkennung von Test-/Dokumentations-/generierten Dateien wird übersprungen, unter der Annahme, dass Sie meinten, was Sie eingegeben haben.
## Bewertung der Sicherheitswerkzeuge
Nelson prüft, ob Ihr Projekt empfohlene statische Analysetools verwendet, und meldet Lücken. Dies wird automatisch als Teil von `nelson inventory` und `nelson report` ausgeführt. Es wird z. B. darauf hingewiesen, wenn:
- Ruff vorhanden ist, aber die S (Bandit)-Sicherheitsregeln nicht aktiviert sind
- Ein Go-Projekt kein golangci-lint mit gosec hat
- Ein TypeScript-Projekt kein eslint-plugin-security hat
- Ein Perl-Projekt keine Perl::Critic-Konfiguration hat
Die Idee ist, dass statische Analysetools für das Erkennen von Mustern von Sicherheitslücken billiger und schneller sind als KI, und Nelson sollte sie ergänzen, anstatt ihre Arbeit zu duplizieren.
## Datenbank
Der Scan-Status wird in einer SQLite-Datenbank gespeichert (standardmäßig `nelson.db` im aktuellen Verzeichnis). Verwenden Sie `--db`, um einen anderen Pfad anzugeben.
Alle Scanergebnisse, Funde und Prüfunterteilungen werden aufbewahrt, sodass ein einfacher Vergleich der Ergebnisse über Modelle, Modi und Zeit hinweg möglich ist.
## Token-Tracking
Nelson verfolgt die Token-Nutzung und -Kosten pro Auftrag. Verwenden Sie `nelson status`, um die Gesamtsummen zu sehen.