Back to skill

Security audit

geoskill-hyperspectral-mineral-mapping

Security checks across malware telemetry and agentic risk

Overview

The main tool appears to do local mineral mapping, but the package also bundles undisclosed credential and network helpers that do not fit the documented offline workflow.

Review this skill carefully before installing. Its normal command-line workflow appears local, but the package contains extra helper code for credentials, external geocoding, downloads, and home-directory caches that the user-facing skill description does not explain. Avoid using it in environments with sensitive .netrc, geospatial project names, or shared Earthdata/OpenAI-style credentials unless the publisher removes or clearly scopes those helpers.

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 (38)

Lp3

Medium
Category
MCP Least Privilege
Confidence
84% confidence
Finding
The skill declares no permissions, yet the associated capability profile indicates access to environment variables, filesystem, shell, and network. This is dangerous because users and orchestrators may trust the skill as a local, offline mineral-mapping utility while it can access sensitive local data and perform outbound actions without explicit disclosure or consent.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding
This is a strong description-behavior mismatch: a mineral-mapping skill should not silently include credential fallback logic, broad secret harvesting from ~/.netrc and ~/.geoskill/secrets.json, general HTTP download utilities, and unrelated network geocoding/weather calls unless clearly disclosed and narrowly justified. Such hidden breadth expands attack surface, can expose credentials, and enables data exfiltration or misuse under the cover of a benign geospatial workflow.

Description-Behavior Mismatch

Medium
Confidence
95% confidence
Finding
The vendored core metadata declares the embedded component as 'landsat-download', which conflicts with this skill’s stated purpose of hyperspectral mineral mapping. This kind of provenance mismatch is a supply-chain integrity issue: reviewers and tooling may trust code under a false identity, and the skill may bundle unexpected functionality or the wrong dependency set.

Description-Behavior Mismatch

Medium
Confidence
93% confidence
Finding
The AOI helper sends user-supplied place names to third-party geocoding services and also persists results locally, which expands the skill’s data exposure beyond pure mineral-mapping functionality. In a geospatial workflow, place names may reveal sensitive project locations, and transmitting them off-device without clear consent or strict scoping creates a real privacy and data-governance risk.

Intent-Code Divergence

Medium
Confidence
84% confidence
Finding
The module documentation claims ambiguous place handling will return candidate lists without silently choosing the first result, but the implementation ranks candidates and auto-selects one. This mismatch can cause silent resolution to the wrong area of interest, which is dangerous in a mineral-mapping context because downstream analysis may be performed on the wrong geographic target without user awareness.

Context-Inappropriate Capability

Medium
Confidence
92% confidence
Finding
This credential module exposes access paths for multiple unrelated external services (OpenAI, CMA, FIRMS, EOG, Earthdata) that exceed the stated mineral-mapping purpose. Broad credential capability increases attack surface and enables the skill or dependent code to access services the user would not reasonably expect from this narrowly described analytical tool.

Context-Inappropriate Capability

Medium
Confidence
88% confidence
Finding
The code reads secrets from the user's home directory and environment, including a custom secrets store, despite the manifest describing a narrow analytical function. In this context, silent credential discovery is dangerous because it normalizes harvesting locally available secrets that are not clearly necessary for hyperspectral mineral classification.

Intent-Code Divergence

High
Confidence
99% confidence
Finding
The module documentation states that passwords are not hardcoded, but the implementation includes a hardcoded fallback Earthdata username and password. This contradiction can mislead reviewers and operators into trusting the module while it embeds live-looking credentials directly in source control.

Description-Behavior Mismatch

High
Confidence
84% confidence
Finding
The file exposes place-resolution logic and delegates to network-backed AOI geocoding despite the skill being described as hyperspectral mineral mapping. This creates undeclared capability and data flow: user-supplied place names can be sent to external resolvers, expanding the skill’s behavior beyond its stated purpose and increasing privacy, compliance, and review risk.

Context-Inappropriate Capability

High
Confidence
93% confidence
Finding
The code issues outbound HTTP requests to Open-Meteo and Nominatim using user-provided place queries. In a skill whose stated function is mineral mapping, these external calls are an unexpected exfiltration path for user input and create supply-chain/privacy exposure, especially because fallback behavior preserves network access even when the unified core fails.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
User-provided place queries are transmitted to external geocoding providers with no user-facing disclosure in this code path. Even if the data seems low sensitivity, AOIs for exploration or survey work can be commercially sensitive, and undisclosed outbound transfer is a legitimate privacy and confidentiality issue.

Missing User Warnings

Low
Confidence
90% confidence
Finding
The code writes resolved location data into a persistent cache under the user’s home directory without user notice. Persistent storage of AOI queries can leak project history to other local users, backups, or endpoint monitoring tools, especially on shared or managed systems.

Missing User Warnings

High
Confidence
100% confidence
Finding
The source contains real-looking fallback credentials for Earthdata in plaintext. Hardcoded credentials are dangerous because anyone with repository access can reuse them, and downstream deployments may silently authenticate with an embedded shared account, undermining accountability and secret hygiene.

Natural-Language Policy Violations

Medium
Confidence
81% confidence
Finding
The Nominatim request hardcodes an Accept-Language header of zh-CN/zh without user choice. While not a code-execution issue, it can disclose or imply locale preferences, alter returned data in ways users did not request, and is inconsistent with privacy-minimizing behavior for a mapping-related workflow.

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
77% 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
77% 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
80% 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
75% 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
78% 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
78% 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
80% 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
93% 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
92% 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
74% 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
86% 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