SkillSpector - NVIDIA's security scanner voor AI agent skills
Je installeert een agent skill. Eén bestand, één repo, één zip. De agent voert hem uit met impliciet vertrouwen. Wat je niet weet: uit onderzoek van 42.447 skills blijkt dat 26,1% kwetsbaarheden bevat en 5,2% waarschijnlijk kwaadaardig is.
NVIDIA's SkillSpector is het eerste serieuze antwoord op die vraag. Geen generieke SAST-tool, maar een scanner die expliciet kijkt naar agent-skill misbruik: prompt injection, verborgen instructies, exfiltratie, tool misuse, permissieafwijkingen, supply-chain risico's en MCP-specifieke patronen. Precies de laag die traditionele security scanners missen.
Wat SkillSpector doet
SkillSpector scant "skills" voor AI-agentomgevingen, Claude Code, Codex CLI, Gemini CLI en vergelijkbare tooling. Input via Git-repo's, file-URL's, zipbestanden, losse markdownbestanden en lokale directories. Output naar terminal, JSON, Markdown of SARIF 2.1.0. Een --no-llm modus draait puur statische analyse zonder model-calls.
De dekking is breed: 64 vulnerability patterns in 16 categorieën. Prompt injection (5 patterns), data exfiltration (4), privilege escalation (3), supply chain (6, inclusief live OSV.dev CVE-lookups), excessive agency (4), output handling (3), system prompt leakage (3), memory poisoning (3), tool misuse (3), rogue agent (2), trigger abuse (3), behavioral AST (8, exec(), eval(), subprocess, os.system, dynamic import), taint tracking (5), YARA signatures (4), MCP least privilege (4) en MCP tool poisoning (4).
De risicoscore loopt van 0 tot 100. CRITICAL issues tellen voor 50 punten, HIGH voor 25, MEDIUM voor 10, LOW voor 5. Executable scripts krijgen een 1.3x multiplier. De severity bands: 0-20 = SAFE, 21-50 = CAUTION, 51-80 = HIGH (DO NOT INSTALL), 81-100 = CRITICAL (DO NOT INSTALL).
Architectuur
De pipeline is een LangGraph-workflow met vijf fasen:
resolve_input normaliseert elke input (Git URL, zip, file, directory) naar een lokale directory. build_context verzamelt componenten, manifest en file-cache. Daarna draaien 20 analyzer nodes parallel: 11 statische pattern analyzers, een AST-analyzer, taint tracking, YARA, MCP least privilege, MCP tool poisoning, MCP rug pull en drie semantische LLM-analyzers. De meta_analyzer filtert en verrijkt findings met optionele LLM-analyse, één call per file, met token budgets. report bouwt SARIF 2.1.0, berekent de risicoscore en produceert de gevraagde output.
De statische Python-analyse executeert geen code. De AST-analyzer parset Python en zoekt naar exec(), eval(), dynamic import, subprocess, os.system en gevaarlijke execution chains. De taint-tracking analyzer volgt flow van bronnen (environment variables, file reads, network input) naar sinks (network output, exec, file writes). Een secure-by-design keuze voor onbetrouwbare skills.
De supply-chain analyzer (SC4) doet live OSV.dev lookups voor PyPI en npm, batch queries, geen API key nodig, met automatische fallback als OSV onbereikbaar is.
Sterke punten
Domeinspecifieke dekking. Dit is geen generieke SAST. De 16 categorieën zijn precies afgestemd op het agent-skill threat model. Prompt injection, excessive agency, MCP tool poisoning, memory poisoning, dit zijn risico's die traditionele scanners niet zien.
CI-vriendelijke rapportage. SARIF 2.1.0 output, exit code 1 bij risicoscore > 50, SAFE/CAUTION/DO_NOT_INSTALL bands. Integratie in GitHub Advanced Security, Azure DevOps of GitLab is praktisch haalbaar.
LLM-laag met het juiste threat model. De meta-analyzer bevat expliciete instructies om skill-content als adversarial te behandelen, instructies in de skill te negeren, geen code uit te voeren en statische findings contextueel te beoordelen. Geen volledige prompt-injection verdediging, maar het ontwerp erkent het juiste dreigingsmodel.
Community-momentum. 3.2K stars, 243 forks, Apache 2.0. Release 21 maart 2026, pas drie maanden oud maar al een volwassen architectuur. Actieve development: 16 commits, laatste PR twee dagen geleden.
Kritieke aandachtspunten
Het grootste technische risico zit in de ingest-laag. input_handler.py downloadt URL-content volledig in memory via response.content, pakt zipbestanden uit met extractall, clonet Git-repo's zonder post-clone size cap en kopieert single files zonder voorafgaande size check. De scanner is zelf kwetsbaar voor memory- of disk-exhaustion bij onbetrouwbare input.
Dat probleem wordt versterkt in build_context.py. De code loopt door de skilldirectory met rglob, leest files volledig met read_text, telt regels via een volledige read_text().splitlines() en leest SKILL.md volledig in voor manifest parsing. De statische runner heeft wel een MAX_FILE_BYTES van 1 MB, maar die grens komt pas nadat build_context de file al in memory heeft geladen. Een open issue beschrijft exact deze risico's: URL-body buffering, zip bombs, grote clones, unbounded local-file copy en symlink-escape naar bestanden buiten de scan-root.
De LLM-pad is fragiel. De async runner gebruikt standaard max_concurrency=10, doet geen retry of backoff, en asyncio.gather draait zonder return_exceptions=True. Eén 429, timeout of providerfout kan de hele semantische pass laten falen. De meta-analyzer vangt daarna breed Exception af en valt terug op statische findings. Conservatief qua false negatives, maar slecht qua assurance, de gebruiker kan denken dat LLM-filtering is uitgevoerd terwijl de scan feitelijk statisch is.
False positives door parser-imperfecties. De supply-chain analyzer behandelt pyproject.toml als requirements-achtige input en haalt packages op met een requirements-regex. Metadata zoals requires-python kan als package worden geïnterpreteerd, een open issue meldt een false HIGH finding op OSV advisory MAL-2025-41747 hierdoor. Daarnaast parseert build_context manifestvelden zoals permissions en parameters, maar niet het standaardveld allowed-tools. De MCP least-privilege analyzer leest alleen manifest.get("permissions") en adviseert zelfs een permissions veld toe te voegen, wat botst met standaardconforme skills die capabilities via allowed-tools declareren.
Supply-chain governance van het project zelf is licht. Ruff, pytest, mypy-config en Makefile-targets zijn aanwezig, maar geen CodeQL, SBOM-generatie, dependency-review, secret scanning policy, signed releases of release artifacts. De GitHub-pagina toont geen gepubliceerde releases. Verdedigbaar voor een alpha-tool, maar onvoldoende voor directe regulated-sector adoptie zonder interne hardening.
Privacy- en observability-risico. Bij LLM-analyse wordt file-content onderdeel van prompts naar de gekozen provider (OpenAI, Anthropic, NVIDIA). De CLI voegt LangChain run metadata toe, inclusief input path, use-LLM vlag, output format en versie. Gevoelige repo- of padinformatie, en bij LLM-mode ook skill-content, heeft governance nodig voordat dit in een enterprise-omgeving mag draaien.
Risicoregister
| Risico | Impact | Kans | Mitigatie |
|---|---|---|---|
| Scanner DoS via grote URL, zip bomb, grote Git clone of grote file | Hoog | Hoog | Streamed downloads, byte counters, zip entry limit, decompressed-size cap, clone size cap, disk quota |
| Symlink escape uit scan-root | Hoog | Middel | lstat, symlinks weigeren, scan in container zonder host secrets |
| LLM fallback onzichtbaar of onvoldoende machine-readable | Middel | Hoog | LLM execution status in report, fail-closed optie, per-batch isolation, retry/backoff |
| False positives door dependency parser en manifest mismatch | Middel | Hoog | PEP 621 parser, PEP 508 parser, allowed-tools support, exception workflow |
| Data leakage naar externe LLM of tracing backend | Hoog | Middel | Private endpoint, --no-llm default voor sensitive repos, DLP, tracing hardening |
| Onvoldoende release en supply-chain maturity | Middel | Middel | Signed releases, SBOM, SCA, CodeQL, dependency review, container hardening |
Enterprise inzetadvies
Gebruik SkillSpector eerst als advisory control, niet als harde gate. Laat het draaien op een representatieve set interne skills, verzamel false positives en false negatives, en bouw een organisatie-eigen policyprofiel. Zet HIGH en CRITICAL pas blokkerend nadat de baseline stabiel is. Voor LOW en MEDIUM is review-routing meestal beter dan build-failure.
Draai scans in een geïsoleerde worker: read-only input mount, geen host secrets, beperkte CPU, memory en disk, korte timeout, ephemeral filesystem, geen toegang tot /etc, home directories of CI-secret stores. Voor remote inputs: clone en extract in een sandbox met quota. Beperk egress tot OSV.dev en eventueel een goedgekeurde private LLM-endpoint. Voor gevoelige codebases is --no-llm de veilige default totdat er een interne of contractueel goedgekeurde inference endpoint is.
Fork of vendor de tool voorlopig intern. Prioriteer patches voor ingest bounding, symlink rejection, PEP 621 dependency parsing, allowed-tools support, LLM retry/backoff, per-batch isolation en expliciete LLM-status in JSON/SARIF metadata. De open issues en PR's tonen dat de community deze problemen al scherp heeft geïdentificeerd, maar ze moeten gecontroleerd in je eigen baseline worden gevalideerd voordat je beleid erop baseert.
Roadmap voor adoptie
Dag 0-30: Gecontroleerde pilot op interne testskills, zonder externe LLM voor gevoelige inhoud. False-positive register opbouwen, runtime/memory/disk meten, SARIF-export aanzetten. Wrapper-controles voor timeout, file-size caps, disk quota en netwerk-egress toevoegen.
Dag 31-60: Fork hardenen. Veilige ingest implementeren, symlinks rejecten, dependencies parsen met echte parsers in plaats van requirements-regex voor pyproject.toml, allowed-tools als first-class manifestveld toevoegen, LLM fallback expliciet zichtbaar maken in machine-readable output.
Dag 61-90: Integreren in de secure SDLC. Interne policyregels publiceren, exception handling definiëren, findings mappen naar risk owners, output koppelen aan bestaande AppSec workflows. Pas daarna is een blokkerende gate op DO_NOT_INSTALL verdedigbaar.
Eindoordeel
SkillSpector is inhoudelijk sterk en zeer relevant voor AI-agent security. De dekking is modern, de architectuur is begrijpelijk, SARIF maakt enterprise-integratie realistisch, en de focus op MCP, prompt injection, excessive agency en supply chain is precies waar de markt risico loopt.
De tool is echter nog alpha in maturity. De belangrijkste blocker is niet detectielogica, maar self-protection: onbegrensde ingest, volledige file reads, zip-extractie zonder quota en symlinkgedrag zijn onacceptabel voor scanning van onbetrouwbare externe input.
Score: functionele relevantie 8/10, enterprise maturity 5/10, scanner self-protection 3/10, LLM-resilience 4/10. Overall inzetbaarheid: 5,5/10.
Advies: gebruiken als pilot en interne guardrail, maar pas als production-grade control na sandboxing, parser-fixes, LLM-resilience en release-governance hardening.
Dit artikel is onderdeel van DjimIT's doorlopende analyse van agent skill security. Lees ook: SkillOpt, de paper die agent skills trainbaar maakt, Microsoft Security Skills, agent-skill repository assessment, exceptd, de AI security intelligence layer voor skills, Memory is een attack surface, ASI06 en de MemoryTrap-aanvalsketen, en MCP security control plane, vier-lagen architectuur.
SkillSpector - NVIDIA's security scanner voor AI agent skills
Dit artikel is exclusief beschikbaar voor nieuwsbrief-abonnees. Schrijf je in voor toegang tot 880+ artikelen.
Geen spam. Uitschrijven op elk moment.
AI & Security Intelligence
Wekelijkse nieuwsbrief met AI updates, security alerts en compliance inzichten, direct in uw inbox.
Security & AI Operating Model
Advisory met executiekracht
Van BIO2 en NIS2 tot EU AI Act, embedded in uw operating model, niet als extern project. Maandelijks opzegbaar, met assessments als bewijsvoering.