Back to skill

Security audit

geoskill-image-mosaicking

Security checks across malware telemetry and agentic risk

Overview

The main image-mosaicking tool is local, but the package also ships undisclosed network geocoding and credential-handling code, including a hardcoded password.

Install only after reviewing or removing the bundled helper modules that are unrelated to mosaicking. The core CLI appears to process local rasters, but the package contains extra code that can contact geocoding services, persist location lookups, and access local/API credentials, plus a hardcoded Earthdata password that should be rotated and removed.

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 advertises local image mosaicking behavior, but the static analysis detected capabilities including environment access, file read/write, shell, and network without any declared permissions. This is dangerous because users and host systems cannot make an informed trust decision, and hidden capabilities can enable credential exposure, unauthorized file access, or unexpected external communication.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding
There is a strong description-behavior mismatch: a mosaicking skill appears to include geocoding, remote downloads, credential loading from environment/.netrc/secrets files, and even hardcoded default credentials. This is dangerous because it conceals materially broader behavior than the stated purpose, increasing the risk of data exfiltration, secret misuse, and supply-chain style abuse under the cover of an innocuous imaging task.

Description-Behavior Mismatch

Medium
Confidence
91% confidence
Finding
The vendored metadata claims the embedded core belongs to a different skill ('landsat-download') than the current mosaicking skill, which indicates a supply-chain integrity or packaging mismatch. Even though this file does not execute code itself, such mislabeling can cause the wrong vendored component to be trusted, audited, or updated, increasing the chance of shipping incorrect functionality or hidden dependencies without detection.

Context-Inappropriate Capability

High
Confidence
91% confidence
Finding
The code sends user-supplied place queries to third-party geocoding services over the network, despite the skill being described only as image mosaicking. This creates an undisclosed data egress path and expands the trust boundary to external services, which can leak sensitive user locations or operational interests.

Context-Inappropriate Capability

Medium
Confidence
87% confidence
Finding
The code defines a persistent cache directory under the user's home folder for resolved location data, which is unrelated to the stated mosaicking purpose. Persisting AOI queries and results can expose sensitive location history to other local users, backups, or later processes without the user's awareness.

Description-Behavior Mismatch

Medium
Confidence
93% confidence
Finding
This credential-management module is materially broader than the stated image mosaicking purpose and exposes accessors for multiple unrelated third-party services. In a skill environment, expanding credential reach increases the blast radius if downstream code is compromised or repurposed, because the skill can retrieve secrets unnecessary for its declared function.

Context-Inappropriate Capability

Medium
Confidence
94% confidence
Finding
Providing an OpenAI API key accessor in a mosaicking-focused skill is suspicious because it creates a pathway for unrelated network-capable functionality to obtain a sensitive API secret. Even if not used here, this violates least privilege and could enable misuse, billing abuse, or secret exfiltration by adjacent code.

Context-Inappropriate Capability

Medium
Confidence
90% confidence
Finding
Accessors for CMA, FIRMS, and EOG credentials are unrelated to the declared image mosaicking capability and unnecessarily broaden what secrets this skill can access. In plugin-like environments, unrelated secret access meaningfully increases risk because any code path using this shared module can harvest credentials for external services beyond user expectations.

Description-Behavior Mismatch

High
Confidence
97% confidence
Finding
The file exposes geocoding functionality and accepts arbitrary place input despite the skill being described as image mosaicking/blending. This creates a material capability mismatch: a seemingly offline image-processing skill can trigger external lookups and data flows to third-party services, which is risky in agent environments because users and reviewers may not expect networked location resolution.

Context-Inappropriate Capability

High
Confidence
98% confidence
Finding
The code performs outbound HTTP requests to Open-Meteo and Nominatim, sending user-supplied place names and request metadata to third parties. In the context of an image mosaicking skill, this unjustified network capability increases the attack surface, can leak sensitive user intent or locations, and can be abused as an unexpected external communication channel.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
User-entered place names are transmitted to Open-Meteo and Nominatim without any user-facing warning, consent flow, or disclosure in this code path. In the context of a mosaicking skill, location queries may be sensitive, so silent transmission to third parties creates a meaningful privacy and data-handling risk.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
The file cache stores resolved location manifests in the user's home directory without disclosure, which can retain sensitive geographic interests or work areas beyond the current session. Silent persistence increases privacy risk and may violate user expectations for a skill advertised only as image mosaicking.

Missing User Warnings

High
Confidence
99% confidence
Finding
The module contains hardcoded fallback credentials, including a plaintext username and password, which is a direct secret exposure. Even if intended as fallback only, shipping real credentials in source control enables unauthorized use, credential stuffing risk, accidental reuse, and immediate compromise of the associated external account.

Natural-Language Policy Violations

Medium
Confidence
79% confidence
Finding
Forcing the Accept-Language header to Chinese without user choice is a privacy and behavior-integrity issue: it silently influences third-party responses and reveals a locale preference that the user may not have intended to share. While not a critical exploit on its own, it is especially questionable here because the network request itself is already outside the stated purpose of the skill.

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
81% 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
81% 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
81% 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
79% 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
79% 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
79% 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
88% 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
88% 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
76% 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
83% 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