Back to skill

Security audit

geoskill-geodatabase-management

Security checks across malware telemetry and agentic risk

Overview

The main GeoPackage workflow appears local, but the package also ships under-disclosed credential and network helper code that does not fit the advertised local database purpose.

Review this skill before installing. The advertised main command is a local GeoPackage tool, but the package also includes unrelated credential-handling and network code, including hardcoded fallback credentials and logic that can inspect home-directory secret files if those helpers are invoked. Install only if you trust the publisher and can accept or remove the extra bundled modules.

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
82% confidence
Finding
The skill documentation declares no permissions, yet the analyzed capability set includes environment access, filesystem read/write, shell execution, and network access. That mismatch can cause users or orchestration systems to grant or execute broader powers than expected, reducing informed consent and increasing the blast radius if the underlying code is unsafe or compromised.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding
This is a significant description-behavior mismatch: the skill claims to do local GeoPackage management, but static analysis indicates additional behaviors including geocoding, HTTP downloads, credential handling, remote-service integration, and embedded fallback secrets handling. Hidden network and credential-related functionality in a supposedly local GIS skill is dangerous because it can enable covert data egress, unexpected secret use, supply-chain style abuse, or unauthorized external access outside the user's expectations.

Description-Behavior Mismatch

Medium
Confidence
96% confidence
Finding
The vendored metadata claims the embedded core belongs to a different skill ('landsat-download') than the surrounding skill ('geodatabase-management'). This supply-chain/integrity mismatch undermines provenance and reviewability: consumers may trust code or hashes under the wrong identity, making it easier for unintended or unreviewed components to be shipped without detection.

Context-Inappropriate Capability

Medium
Confidence
84% confidence
Finding
The code sends user-supplied place queries to external services (Open-Meteo and optionally Nominatim), which creates a real privacy and data-boundary risk. In the stated context of GeoPackage database management, unexpected outbound geocoding is more dangerous because users may not anticipate that operational or sensitive location names will leave the local environment.

Description-Behavior Mismatch

High
Confidence
98% confidence
Finding
This module’s scope materially exceeds the stated GeoPackage database-management purpose by adding broad credential management for multiple external services, including OpenAI, NASA Earthdata, FIRMS, CMA, and EOG. In a skill that should operate on local GeoPackage data, this expansion increases the attack surface and creates capability for credential discovery and later external use that is not justified by the manifest.

Context-Inappropriate Capability

High
Confidence
99% confidence
Finding
The code reads secrets from environment variables, ~/.geoskill/secrets.json, and ~/.netrc for several online services unrelated to GeoPackage table creation and spatial queries. Even without immediate exfiltration in this file, harvesting or normalizing access to user credentials inside an unrelated skill is dangerous because it creates a reusable secret-access primitive for other code paths.

Intent-Code Divergence

Critical
Confidence
100% confidence
Finding
The module claims passwords are not hardcoded, yet it embeds a default Earthdata username and password directly in source code. Hardcoded credentials are inherently high risk: anyone with source access can recover them, and they may enable unauthorized access or encourage credential reuse in deployed environments.

Description-Behavior Mismatch

Medium
Confidence
88% confidence
Finding
This module provides a reusable generic HTTP downloader with retry, resume, and arbitrary destination path support, which is broader than the declared GeoPackage-management scope. In an agent skill context, that creates an unexpected capability for fetching arbitrary remote content onto the local filesystem, increasing the attack surface for SSRF, untrusted file ingress, or capability creep if higher-level callers pass user-controlled URLs or paths.

Context-Inappropriate Capability

Medium
Confidence
84% confidence
Finding
The low-level _http_get function accepts arbitrary URLs and performs network retrieval without any host, scheme, or purpose restriction. By itself this is not exploit code, but in a skill whose stated purpose is GeoPackage table/index/query management, this unjustified network primitive can be abused by surrounding code to retrieve attacker-controlled content or access unintended network resources.

Description-Behavior Mismatch

High
Confidence
95% confidence
Finding
This file implements networked place-name geocoding and fallback resolution logic, which is materially outside the stated GeoPackage database-management scope. In an agent skill, undocumented off-scope capabilities increase attack surface, can exfiltrate user-supplied location queries to third parties, and make behavior harder for users and reviewers to predict.

Context-Inappropriate Capability

High
Confidence
96% confidence
Finding
The code makes outbound HTTP requests to Open-Meteo and Nominatim even though the skill is described as local GeoPackage table/import/index/query management. This unjustified external connectivity can leak sensitive user queries or operational context to third-party services and introduces dependency on remote infrastructure not implied by the skill's purpose.

Missing User Warnings

Medium
Confidence
88% confidence
Finding
User-provided place strings are transmitted to third-party geocoding services without any visible user-facing disclosure or consent mechanism. This is dangerous because place names can encode sensitive business, personal, or operational information, and the skill's advertised purpose does not clearly prepare users for external data sharing.

Natural-Language Policy Violations

Medium
Confidence
83% confidence
Finding
The Nominatim request hard-codes an Accept-Language preference of zh-CN without user choice or documented need. While not code-execution dangerous, it can bias responses, disclose assumptions about users or deployment context, and create unexpected or misleading query behavior that is especially concerning in a skill already performing undisclosed network lookups.

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
97% 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
97% 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
97% 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
96% 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
97% 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
97% 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
96% 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
99% 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
99% 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
94% 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
98% 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
97% 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