Back to skill

Security audit

geoskill-data-catalog-generator

Security checks across malware telemetry and agentic risk

Overview

The main catalog generator is local, but the package also ships under-disclosed network, downloader, and credential-handling code, including hardcoded Earthdata credentials.

Review this package before installing, especially on machines with sensitive environment variables, ~/.netrc, or ~/.geoskill/secrets.json. If you only need the catalog generator, use the main script in a network-restricted environment or remove/review the bundled credential, geocoding, and downloader modules first; the exposed Earthdata credentials should be rotated or revoked by their owner.

SkillSpector

By NVIDIA
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (43)

Lp3

Medium
Category
MCP Least Privilege
Confidence
90% confidence
Finding
The skill declares an offline local cataloging purpose, but static analysis detected capabilities including environment access, file read/write, shell, and network without any declared permissions. This creates a trust and transparency gap: users may run a seemingly harmless data-catalog skill that can access local data, invoke commands, and potentially exfiltrate information.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding
The documented behavior is limited to scanning local geospatial files and generating catalogs, but the code reportedly also performs online geocoding/weather lookups, includes a general HTTP downloader, reads credentials from environment/.netrc/secrets files, and even contains hardcoded Earthdata credentials. This is dangerous because it materially expands the attack surface beyond user expectations and could lead to credential exposure, unauthorized network access, or covert data movement under the guise of a local offline utility.

Description-Behavior Mismatch

Medium
Confidence
91% confidence
Finding
This module performs outbound geocoding requests to third-party services and persists query data under the user's home directory, which exceeds the stated offline/local catalog-generation purpose and creates an unexpected data-exposure channel. User-supplied place names may contain sensitive project, customer, or operational location information, and sending or storing them without explicit opt-in can leak metadata even if the code is otherwise non-malicious.

Intent-Code Divergence

Medium
Confidence
78% confidence
Finding
The docstring promises ambiguous place handling without silently choosing the first result, but the implementation scores candidates and auto-selects one. In a geospatial workflow, this can silently target the wrong area of interest, causing incorrect downstream data access, analysis scope, or report generation without the user's awareness.

Description-Behavior Mismatch

High
Confidence
96% confidence
Finding
This module materially expands the skill’s capability from local catalog generation into multi-service credential handling for NASA Earthdata, FIRMS, CMA, OpenAI, and EOG. That scope mismatch is dangerous because it enables unnecessary access to sensitive user secrets and remote-service accounts that are not justified by the stated functionality, increasing attack surface and the blast radius of any downstream misuse.

Context-Inappropriate Capability

High
Confidence
97% confidence
Finding
The code reads user credential stores from ~/.geoskill/secrets.json, environment variables, and ~/.netrc/_netrc for several services unrelated to local file scanning. Accessing broad user secret stores in a skill described as a local data catalog generator creates unjustified secret exposure and could enable credential harvesting or silent reuse by other code paths.

Intent-Code Divergence

Critical
Confidence
100% confidence
Finding
The module claims passwords are not hardcoded in skill source, but it embeds a literal default Earthdata username and password in _DEFAULTS. Hardcoded credentials are a severe secret-management failure: they can be extracted by anyone with source access, reused unintentionally in production, and may expose the associated external account to compromise or abuse.

Description-Behavior Mismatch

High
Confidence
92% confidence
Finding
The exported resolve_place API adds remote place-name geocoding and fallback behavior that is not necessary for a skill described as scanning local raster/vector files and generating an HTML/CSV catalog. This expands the skill’s capability surface to include outbound network access and user-supplied query handling, creating unnecessary privacy, compliance, and supply-chain risk if the function is invoked in catalog workflows.

Context-Inappropriate Capability

High
Confidence
96% confidence
Finding
The module performs HTTP requests to external geocoding services using user-provided place strings, which can leak sensitive project names, locations, or operator intent outside the local environment. In a skill whose stated purpose is local file cataloging, undisclosed outbound requests are especially risky because they violate least privilege and can create data-exfiltration and policy-bypass paths.

Intent-Code Divergence

Medium
Confidence
84% confidence
Finding
The docstring presents the file as a simple adapter shim, but the module still contains complete legacy network-based geocoding logic and runtime fallback. This mismatch can mislead reviewers and operators about the real behavior of the code, causing hidden network functionality to evade threat modeling, approval, or sandboxing decisions.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
The code transmits user-provided place queries to external geocoding services without any in-file disclosure or consent path. Because this skill is described as scanning local geospatial data and generating catalogs, users may reasonably expect local-only processing; leaking place names externally can expose confidential locations, customers, or project intent.

Missing User Warnings

Medium
Confidence
89% confidence
Finding
Resolved location queries are written to a persistent cache in the user's home directory without warning, which can leave sensitive location history on disk beyond the execution of the tool. On shared systems or managed environments, this persistence can expose operational or customer-related geographies to other users, support staff, backups, or forensic review.

Missing User Warnings

High
Confidence
99% confidence
Finding
The module includes hardcoded fallback credentials that may be used automatically when environment variables or other sources are absent, with no runtime warning or consent. Silent fallback to embedded credentials is dangerous because it can mask insecure deployment, cause accidental use of shared accounts, and normalize secret leakage in distributed code.

Credential Access

High
Category
Privilege Escalation
Content
/ `EARTHDATA_TOKEN` / `FIRMS_MAP_KEY` / `OPENAI_API_KEY` /
  `CMA_API_KEY` / `EOG_USERNAME` / `EOG_PASSWORD` 任何一项显式设置
  都优先于默认值。
- **支持 .netrc**:若 ~/.netrc 中存在 `machine urs.earthdata.nasa.gov`
  行,优先取 .netrc 凭证。
- **支持用户级 secrets 文件** ``~/.geoskill/secrets.json``:Phase 7
  (2026-07-27) 新增。本文件在用户 home,**不** vendor 到任何 skill,
Confidence
83% confidence
Finding
.netrc

Credential Access

High
Category
Privilege Escalation
Content
/ `EARTHDATA_TOKEN` / `FIRMS_MAP_KEY` / `OPENAI_API_KEY` /
  `CMA_API_KEY` / `EOG_USERNAME` / `EOG_PASSWORD` 任何一项显式设置
  都优先于默认值。
- **支持 .netrc**:若 ~/.netrc 中存在 `machine urs.earthdata.nasa.gov`
  行,优先取 .netrc 凭证。
- **支持用户级 secrets 文件** ``~/.geoskill/secrets.json``:Phase 7
  (2026-07-27) 新增。本文件在用户 home,**不** vendor 到任何 skill,
Confidence
83% confidence
Finding
~/.netrc

Credential Access

High
Category
Privilege Escalation
Content
`CMA_API_KEY` / `EOG_USERNAME` / `EOG_PASSWORD` 任何一项显式设置
  都优先于默认值。
- **支持 .netrc**:若 ~/.netrc 中存在 `machine urs.earthdata.nasa.gov`
  行,优先取 .netrc 凭证。
- **支持用户级 secrets 文件** ``~/.geoskill/secrets.json``:Phase 7
  (2026-07-27) 新增。本文件在用户 home,**不** vendor 到任何 skill,
  **不** push 到 GitHub;用于把个人真实凭证(NASA Earthdata bearer
Confidence
83% confidence
Finding
.netrc

Credential Access

High
Category
Privilege Escalation
Content
(2026-07-27) 新增。本文件在用户 home,**不** vendor 到任何 skill,
  **不** push 到 GitHub;用于把个人真实凭证(NASA Earthdata bearer
  token 等)放在 skill 之外。
- **不缓存密码**:每次调用读环境或 .netrc(避免长寿命进程泄露)。
- **统一接口**:`get_earthdata_creds()` / `get_earthdata_token()` /
  `get_firms_key()` / `get_cma_key()` / `get_openai_key()` /
  `get_eog_creds()` 六个 helper。
Confidence
80% confidence
Finding
.netrc

Credential Access

High
Category
Privilege Escalation
Content
"EOG_PASSWORD": "",
}

# .netrc 解析(仅在 UNIX-like / WSL 下 ~/.netrc 可用;Windows 下
# 通常用 %USERPROFILE%\_netrc,但 .netrc 本身仍是约定俗成的名称)。
_NETRC_HOSTS = {
    "urs.earthdata.nasa.gov": ("EARTHDATA_USERNAME", "EARTHDATA_PASSWORD"),
Confidence
90% confidence
Finding
.netrc

Credential Access

High
Category
Privilege Escalation
Content
"EOG_PASSWORD": "",
}

# .netrc 解析(仅在 UNIX-like / WSL 下 ~/.netrc 可用;Windows 下
# 通常用 %USERPROFILE%\_netrc,但 .netrc 本身仍是约定俗成的名称)。
_NETRC_HOSTS = {
    "urs.earthdata.nasa.gov": ("EARTHDATA_USERNAME", "EARTHDATA_PASSWORD"),
Confidence
90% confidence
Finding
~/.netrc

Credential Access

High
Category
Privilege Escalation
Content
}

# .netrc 解析(仅在 UNIX-like / WSL 下 ~/.netrc 可用;Windows 下
# 通常用 %USERPROFILE%\_netrc,但 .netrc 本身仍是约定俗成的名称)。
_NETRC_HOSTS = {
    "urs.earthdata.nasa.gov": ("EARTHDATA_USERNAME", "EARTHDATA_PASSWORD"),
    "firms.modaps.eosdis.nasa.gov": ("FIRMS_MAP_KEY",),
Confidence
89% 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
Confidence
95% 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
95% confidence
Finding
.netrc

Credential Access

High
Category
Privilege Escalation
Content
def _resolve(name: str) -> str:
    """env > 用户 secrets > .netrc > 默认. 空字符串视为未设."""
    env_val = os.environ.get(name, "").strip()
    if env_val:
        return env_val
Confidence
88% confidence
Finding
.netrc

Credential Access

High
Category
Privilege Escalation
Content
def _resolve_with_netrc(env_name: str, netrc_host: str, field_index: int) -> str:
    """env > 用户 secrets > .netrc > 默认."""
    env_val = os.environ.get(env_name, "").strip()
    if env_val:
        return env_val
Confidence
90% confidence
Finding
.netrc

Credential Access

High
Category
Privilege Escalation
Content
解析顺序:
    1. env: EARTHDATA_USERNAME / EARTHDATA_PASSWORD
    2. ~/.geoskill/secrets.json
    3. .netrc: machine urs.earthdata.nasa.gov
    4. _DEFAULTS 兜底
    """
    u = _resolve_with_netrc("EARTHDATA_USERNAME", "urs.earthdata.nasa.gov", 0)
Confidence
87% confidence
Finding
.netrc

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