aeon-vuln-scanner
Un scanner qui déverse des zero-days dans des PRs publiques n'est pas un helper — c'est un publisher. Cette skill trie chaque finding en lisant le code et l'achemine vers le bon canal de disclosure.
Inputs
| Param | Description |
|---|---|
var |
Optional owner/repo. Si vide, sélectionne automatiquement à partir de la sortie chaînée github-trending ou de l'API trending récente. |
Sélection des cibles
- Langage : JS/TS, Python, Go, Rust, ou Solidity.
- ≥ 50 stars, pas un fork, actif dans les 6 derniers mois.
- Traite les inputs non fiables (auth, crypto, network, file I/O, templating).
- Ignorer : les repos d'apprentissage intentionnellement vulnérables (juice-shop, webgoat, *-ctf).
- Ignorer si aucun PVR activé ET aucun
SECURITY.md— pas de canal sûr. - Ignorer si scanné dans les 30 derniers jours (dédup via
vuln-scanned.json).
Scanners
# Static analysis
semgrep --config=p/security-audit --config=p/owasp-top-ten --config=p/secrets \
--severity=ERROR --severity=WARNING --json --timeout=300 \
--exclude=test --exclude=examples --exclude=node_modules .
# Verified secrets (filesystem + git history)
trufflehog filesystem . --only-verified --json
trufflehog git file://. --only-verified --json
# Dependency CVEs across npm/pip/go/cargo/etc
osv-scanner --format=json --recursive .
# Solidity (if .sol files present)
slither . --json out.json --exclude-informational --exclude-low
L'échec de tous les scanners rapporte une error, jamais clean.
Triage (par candidate)
- Ouvrir le fichier à la ligne rapportée. Lire 30-50 lignes de contexte.
- Écrire une phrase : ce que l'attaquant contrôle, ce qu'il réalise. Impossible ? Rejeter.
- Vérifier le call path — atteignable depuis une input externe dans le code de production ?
- Rejeter si en tests, fixtures, examples, derrière un feature flag, ou nécessite des privs attaquant ≥ ce qui est gagné.
Disclosure routing
| Finding | Channel |
|---|---|
| Dependency CVE | Public PR mettant à jour la dépendance — CVE déjà public. |
| Code vulnerability | PVR — publier crée un zero-day. |
| Verified leaked secret | PVR + rotation request. |
| Smart-contract bug | PVR — l'exploitation on-chain est souvent immédiate. |
| No PVR + no SECURITY.md | Skip and log. Do no harm. |
# PVR (private advisory)
gh api -X POST "/repos/$REPO/security-advisories" \
-f summary="..." -f severity="..." -F cwe_ids='["CWE-89"]' -f description="..."
Les patches proposés pour les flaws de code vont uniquement dans votre fork (branche private/fix-<slug>). Ne jamais ouvrir une PR publique pour une flaw de code non patchée — lier le SHA dans le corps de l'advisory pour que le mainteneur puisse cherry-pick.
Required scopes
GH_TOKEN avec repo + repository_advisories:write (pour PVR).
Rules
- Do no harm. Pas de canal sûr → pas de publication.
- Lire le code. Un hit de scanner seul n'est pas une vulnerability.
- Un report par repo par run ; bundler les findings liés.
- Ignorer les repos intentionnellement vulnérables et les CTFs.
- Être déférent — tu offres de l'aide, tu ne fais pas de notation.