Back to skill

Security audit

Geoskill: VIIRS Nightlights Download

Security checks across malware telemetry and agentic risk

Overview

The downloader is mostly aligned with downloading VIIRS data, but it ships a credential helper with hardcoded Earthdata credentials and broad local credential-loading behavior that needs review before install.

Review or patch the package before installing in a sensitive environment. Remove and rotate the hardcoded Earthdata credentials, avoid relying on default credentials, prefer explicit environment variables for any account use, and be aware that --place can send location text to external geocoding services. Pin reviewed dependency versions if deploying this beyond local experimentation.

SkillSpector

By NVIDIA
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (15)

Intent-Code Divergence

High
Confidence
99% confidence
Finding
The module documentation explicitly claims passwords are not hardcoded, yet `_DEFAULTS` contains a real Earthdata username and password. This is dangerous because it embeds reusable credentials in source code, makes accidental disclosure via repository access or package distribution likely, and misleads reviewers/operators into believing the module follows safer secret-handling practices.

Intent-Code Divergence

Medium
Confidence
92% confidence
Finding
The docstring says passwords are not cached and are read on each call, but `load_user_secrets()` loads secrets into the process-global `_DEFAULTS` and tracks `_user_secrets_loaded`. That discrepancy matters because long-lived processes retain secrets in memory longer than documented, increasing exposure to memory inspection, debugging leakage, or misuse by other code paths.

Missing User Warnings

Medium
Confidence
85% confidence
Finding
The function sends user-supplied place queries to third-party geocoding services and stores results in a persistent cache under the user's home directory without any built-in disclosure or consent mechanism. In a skill context, location queries can be sensitive, and silent network transmission plus durable local storage can leak private user interests, destinations, or operational geographies.

Missing User Warnings

High
Confidence
99% confidence
Finding
The code embeds hardcoded fallback credentials directly in `_DEFAULTS`, including a non-empty username and password. Any user of the package may unknowingly authenticate with the developer-provided account, causing account compromise, unauthorized access, shared-account abuse, and secret exposure through source distribution or downstream mirrors.

Missing User Warnings

Medium
Confidence
92% confidence
Finding
The resolver enables online fallback by default and may send user-supplied place names to an external geocoding service (via Nominatim) without any disclosure or explicit consent at this layer. This can leak sensitive or proprietary location queries to a third party, especially if the input contains internal site names, private addresses, or user-derived data.

Credential Access

High
Category
Privilege Escalation
Content
def _read_netrc(host: str) -> Optional[Tuple[str, ...]]:
    """从 ~/.netrc 读指定 host 的凭证(无 token 格式)。"""
    for path in (Path.home() / ".netrc", Path.home() / "_netrc"):
        if not path.is_file():
            continue
Confidence
74% confidence
Finding
~/.netrc

Credential Access

High
Category
Privilege Escalation
Content
def _read_netrc(host: str) -> Optional[Tuple[str, ...]]:
    """从 ~/.netrc 读指定 host 的凭证(无 token 格式)。"""
    for path in (Path.home() / ".netrc", Path.home() / "_netrc"):
        if not path.is_file():
            continue
        try:
Confidence
74% confidence
Finding
.netrc

Credential Access

High
Category
Privilege Escalation
Content
def load_user_secrets(path: Optional[Path] = None, *, force: bool = False) -> bool:
    """从 ``~/.geoskill/secrets.json`` 加载用户级凭证到 _DEFAULTS.

    Phase 7 (2026-07-27): 第一次调用自动加载(lazy)。之后每个 helper
    调用也会 lazy 加载,除非显式 ``force=True`` 强制重读。返回 True
Confidence
72% confidence
Finding
secrets.json

Unpinned Dependencies

Low
Category
Supply Chain
Content
requests>=2.28.0
tqdm>=4.64.0
pytest>=7.0.0
pytest-cov>=4.0.0
Confidence
95% confidence
Finding
requests>=2.28.0

Unpinned Dependencies

Low
Category
Supply Chain
Content
requests>=2.28.0
tqdm>=4.64.0
pytest>=7.0.0
pytest-cov>=4.0.0
Confidence
89% confidence
Finding
tqdm>=4.64.0

Unpinned Dependencies

Low
Category
Supply Chain
Content
requests>=2.28.0
tqdm>=4.64.0
pytest>=7.0.0
pytest-cov>=4.0.0
Confidence
88% confidence
Finding
pytest>=7.0.0

Unpinned Dependencies

Low
Category
Supply Chain
Content
requests>=2.28.0
tqdm>=4.64.0
pytest>=7.0.0
pytest-cov>=4.0.0
Confidence
87% confidence
Finding
pytest-cov>=4.0.0

Known Vulnerable Dependency: requests==2.28.0 — 8 advisory(ies): CVE-2024-47081 (Requests vulnerable to .netrc credentials leak via malicious URLs); CVE-2024-35195 (Requests `Session` object does not verify requests after making first request wi); CVE-2026-25645 (Requests has Insecure Temp File Reuse in its extract_zipped_paths() utility func) +5 more

High
Category
Supply Chain
Confidence
98% confidence
Finding
requests==2.28.0

Known Vulnerable Dependency: tqdm==4.64.0 — 2 advisory(ies): CVE-2024-34062 (tqdm CLI arguments injection attack); CVE-2024-34062 (tqdm CLI arguments injection attack)

Low
Category
Supply Chain
Confidence
91% confidence
Finding
tqdm==4.64.0

Known Vulnerable Dependency: pytest==7.0.0 — 2 advisory(ies): CVE-2025-71176 (pytest has vulnerable tmpdir handling); CVE-2025-71176 (pytest has vulnerable tmpdir handling)

High
Category
Supply Chain
Confidence
92% confidence
Finding
pytest==7.0.0

VirusTotal

VirusTotal findings are pending for this skill version.

View on VirusTotal

Static analysis

Detected: suspicious.dynamic_code_execution

Dynamic code execution detected.

Critical
Code
suspicious.dynamic_code_execution
Location
tests/conftest.py:15