Back to skill

Security audit

geoskill-raster-resampling

Security checks across malware telemetry and agentic risk

Overview

The documented raster-resampling tool looks mostly local, but the package also ships undisclosed credential and online geocoding helpers that do not fit the stated purpose.

Review this before installing. The main entrypoint appears to perform local raster resampling, but the package should remove or clearly isolate the credential, AOI/geocoding, and download helpers. Do not use it in an environment with sensitive ~/.netrc or ~/.geoskill/secrets.json files unless you are sure only the main resampling script will be invoked. The embedded Earthdata credential should be treated as exposed and rotated by its 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 Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (37)

Description-Behavior Mismatch

High
Confidence
95% confidence
Finding
This file adds unrelated geocoding behavior to a raster-resampling skill and sends user-provided place names to external services. In the context of a skill that is supposed to resample local raster data, this expands the trust boundary, creates unexpected data egress, and introduces third-party dependency risk without clear necessity.

Context-Inappropriate Capability

High
Confidence
96% confidence
Finding
The code contacts Open-Meteo and Nominatim using user input, which is outside the declared purpose of raster resampling. That makes the skill capable of exfiltrating sensitive location queries and increases operational risk through hidden network access and reliance on external services.

Context-Inappropriate Capability

Medium
Confidence
90% confidence
Finding
The module persistently stores AOI query results under the user's home directory, which is unnecessary for the stated function and creates residual local data exposure. Cached place queries and resolved locations may reveal sensitive interests, projects, or operational locations to other local users, backups, or later processes.

Context-Inappropriate Capability

High
Confidence
94% confidence
Finding
This raster-resampling skill ships a general credential-harvesting module that reads environment variables, user secrets files, and ~/.netrc for multiple external services unrelated to the advertised functionality. In a least-privilege skill model, this unnecessary secret access broadens attack surface and enables credential collection far beyond what users would reasonably expect from a local raster-processing tool.

Description-Behavior Mismatch

High
Confidence
96% confidence
Finding
The manifest describes a GeoTIFF resampling utility, but the implementation includes retrieval of Earthdata, FIRMS, CMA, OpenAI, and EOG credentials from local secret stores. That mismatch is security-relevant because users and reviewers may grant trust based on benign geospatial functionality while the code can inspect sensitive local credentials unrelated to the stated purpose.

Intent-Code Divergence

Critical
Confidence
99% confidence
Finding
The docstring claims passwords are not hardcoded, yet the module embeds fallback Earthdata username and password directly in source. Hardcoded credentials are highly sensitive: anyone with source access can recover them, reuse them against the upstream service, and they are difficult to rotate once distributed or committed.

Intent-Code Divergence

Medium
Confidence
81% confidence
Finding
The module claims not to cache passwords, but load_user_secrets() copies secrets into the module-level _DEFAULTS dictionary and marks them as loaded for future reuse. Retaining credentials in process-global state increases exposure to accidental reuse, introspection, debugging leakage, or later code paths that were not intended to access those values.

Description-Behavior Mismatch

High
Confidence
97% confidence
Finding
This file implements place-name resolution and geocoding logic, including network lookups, even though the declared skill is for raster resampling. That capability mismatch is dangerous because it expands the skill’s attack surface, enables unexpected outbound data flows, and makes it harder for operators to reason about what the skill actually does.

Context-Inappropriate Capability

High
Confidence
98% confidence
Finding
The code performs outbound HTTP requests to external geocoding services (Open-Meteo and Nominatim) that are not justified by a raster-resampling skill. Unexpected network access can leak user-supplied place names and metadata to third parties, create privacy/compliance issues, and provide a covert exfiltration path under the guise of unrelated functionality.

Intent-Code Divergence

Medium
Confidence
90% confidence
Finding
The module docstring openly states that this file is an adapter for AOI/place resolution, which contradicts the manifest’s stated raster-resampling purpose. Such hidden or mismatched functionality is a security concern because users and reviewers may authorize the skill for benign image processing while it contains unrelated location-processing behavior with different data and network risks.

Missing User Warnings

Medium
Confidence
94% confidence
Finding
User-supplied place names are transmitted to third-party geocoding services without any visible warning in this file. Even if the content seems harmless, location queries can be sensitive and the undisclosed transfer violates the principle of least surprise and may create privacy/compliance issues.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
The code writes resolved location data to a persistent cache in the home directory without user-facing disclosure. This creates silent retention of potentially sensitive geographic queries and outputs beyond the current run, increasing privacy and forensic exposure.

Missing User Warnings

High
Confidence
99% confidence
Finding
The source contains hardcoded fallback credentials without any prominent user disclosure, making the secret both exposed to anyone reading the code and silently usable at runtime. This can lead to unauthorized service access, account takeover of the embedded account, and accidental propagation of the same credentials into downstream deployments.

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
88% 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
88% 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
88% 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
85% 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
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
93% 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
84% 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
87% 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
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