Skip to main content
Version: 1.0.0

Security Scanning Reference

Every Agent package is scanned before it can be created, and again before an update is applied. The scanner is NVIDIA SkillSpector, and the platform runs it server-side when the import is submitted—a preview that passed is never taken as a pass.

What the scanner is really doing is comparing what a Skill says it will do with what its code actually does.

Risk levels​

Scan resultPlatform behaviourWhat you do
LOWContinueCheck the basic permissions and dependencies.
MEDIUMWarn, and require an Administrator to acknowledge this specific scan resultRead the finding, its reason, and the file it points at. Confirm the behaviour is necessary.
HIGHBlock the importFix the high-risk behaviour and scan again.
CRITICALBlock the importStop, and review the code by hand before going further.

A MEDIUM acknowledgement covers one scan result. Change the package and the acknowledgement no longer applies.

Scan scope​

AreaWhat it looks atWhat it is looking for
Skill instructions and metadataSKILL.md, description, triggers, parametersPrompt injection, trigger abuse, a gap between stated and actual behaviour
Text and promptsMarkdown, written instructions, commentsInstructions to ignore safety rules, hidden instructions, requests to reveal the system prompt
CodePython, shell scripts, configuration filesCredential access, outbound network connections, system command execution, file modification
Python structureThe program's ASTexec, eval, subprocess, os.system, dynamic imports
Data flowWhere data comes from and where it goesPasswords → network, files → network, external input → command execution
DependenciesRequirements and package versionsUnpinned versions, known CVEs, typosquatting
Bundled artifacts.pyc files, hidden executables, executables embedded in documentsExecutable content hidden inside ordinary-looking files
YARA signaturesFile contentMalware, web shells, cryptominers, exploits
MCP and agent configurationMCP metadata, permissions, agent settingsExcessive permissions, tool poisoning, reaching into other Agents or Skills

How levels are assigned​

Each finding gets its own severity and contributes a base score. The scores add up into one number for the package, and that number picks the level. Executable scripts can carry an additional multiplier.

Finding severityBase score
LOW+5
MEDIUM+10
HIGH+25
CRITICAL+50
Total scoreLevelMeaning
0–20LOWLow risk. Basic security settings are still worth checking.
21–50MEDIUMContains behaviour that needs attention. Review it by hand.
51–80HIGHHigh-risk behaviour is present.
81–100CRITICALMay contain outright malicious behaviour, or behaviour that can cause severe harm directly.

One CRITICAL finding is enough to block on its own. Several MEDIUM findings can add up past the HIGH threshold even when no single one is serious—which is usually a sign the Skill is doing more than it needs to.

LOW findings​

RuleConditionExample
SC1A dependency version is not pinnedrequirements.txt lists requests with no version
PE1Requested permissions exceed what the feature needsA file-reading feature asks for broad system permissions
LP4Permissions are declared but never usedUsually leftover configuration rather than a real need

MEDIUM findings​

RuleCondition
PE2Uses sudo or root privileges
E1Sends data to an external URL
E3Scans the file system for sensitive files
EA3Actual capabilities exceed the Skill's stated purpose
EA4API, compute, or storage use has no explicit limit
TM3Insecure defaults, such as disabling TLS verification
TR1 / TR3Triggers are too broad, or use overly generic keywords
LP2 / LP3Wildcard permissions, or capabilities not declared in its permissions
TP3 / TP4MCP parameter descriptions carry injection content, or do not match actual behaviour
AS3Enumerates or reads other installed Skills

HIGH findings​

CategoryRulesTypical case
Prompt or agent manipulationP1, P2, P3, AR1–AR3Ignoring existing instructions, hiding prompts, prohibiting refusal, removing safety restrictions
Credential or data accessE2, E4, PE3Reading environment variables, SSH keys, tokens, or passwords; exfiltrating conversation content
Supply chainSC2, SC3, SC4, SC6, SC8, SC9curl URL | bash, obfuscated code, known CVEs, typosquatting, hidden executable content
Agent permissions and behaviourEA1, EA2, OH1, MP1, MP3Unrestricted tool permissions, high-risk operations with no human confirmation, unvalidated model output
System commands and PythonTM1, TM2, AST2–AST5, AST9shell=True, eval, subprocess, os.system, dynamic imports
Data flowTT1, TT4Sending sensitive data or file contents straight to the network
MCP or agent snoopingLP1, TP1, TP2, AS1, AS2Reading agent or MCP configuration, hiding tool instructions, deceptive Unicode
YARAYR3, YR4Cryptominer, hacking-tool, or exploit signatures

CRITICAL findings​

RuleCondition
P5High-risk instructions that could cause physical harm
RA1The Skill modifies its own code or configuration while running
AST1Uses exec() to run arbitrary code directly
AST8Fetches content from the network or another dynamic source and passes it to exec or eval
TT3Credentials or secrets flow directly to an external network destination
TT5External or user input flows directly into code execution
YR1Matches a known malware signature
YR2Matches a web-shell signature

Reading a finding​

LevelExampleWhy it scores that way
LOWrequirements.txt specifies no package versionsWeak supply-chain practice, not a behaviour
MEDIUMThe Skill needs sudo to runNot necessarily wrong, but the need for elevated privileges has to be justified
HIGHThe Skill reads ~/.ssh/id_rsa or every environment variableIt can obtain credentials or API keys
HIGHThe code uses curl URL | bashIt downloads and immediately executes remote code, so its real behaviour cannot be reviewed
CRITICALContent from requests.get(url) is passed to exec()External content executes as code—textbook remote code execution

A finding always names the rule ID, a short explanation, and the file it came from. Start from the file, not the score.

Blocked packages​

  1. Read the file the finding names. The rule ID tells you which table above to look in.
  2. Ask whether the Skill needs that behaviour at all. Most HIGH findings on a genuine industrial Skill come from convenience—shelling out where a library call would do, or reading a whole environment instead of one variable.
  3. If it does need it, narrow it: one specific file instead of a directory scan, a pinned dependency instead of a floating one, a declared permission instead of a wildcard.
  4. Rebuild the ZIP and import again. The scan runs from scratch.