Back to skill

Security audit

geoskill-thematic-map-automation

Security checks across malware telemetry and agentic risk

Overview

The main map generator is mostly local and coherent, but the package includes under-disclosed network, caching, and credential-handling helpers that do not fit the advertised offline map-export purpose.

Review this package before installing in an environment with real credentials or sensitive project locations. The main CLI appears intended for local map generation, but the bundled helper modules should be removed, narrowed, or clearly documented before use, especially the hardcoded Earthdata credentials, netrc/secrets access, external geocoding, home-directory cache, and unpinned dependencies.

SkillSpector

By NVIDIA
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
Findings (25)

Lp3

Medium
Category
MCP Least Privilege
Confidence
77% confidence
Finding
The skill metadata declares no permissions, yet the analyzed capability set includes file access, shell execution, environment access, network, and file writes. That mismatch weakens user consent and review because a consumer may treat the skill as offline/local-only while it can perform higher-risk operations, including reading secrets from the environment or invoking external commands.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding
The documented purpose is simple thematic map generation, but the detected behavior reportedly includes geocoding, HTTP downloading, credential handling for multiple remote services, AI-service integration, and remote-sensing registry utilities. This is a substantial scope expansion that can conceal data exfiltration, unexpected network access, secret exposure, or use of third-party services outside the user's expectation, making the skill materially more dangerous in context because the README repeatedly emphasizes offline/local processing.

Description-Behavior Mismatch

Medium
Confidence
93% confidence
Finding
The vendored metadata claims the embedded component belongs to a different skill, 'landsat-download', which is inconsistent with the advertised thematic map automation purpose. This kind of provenance mismatch is dangerous because it can conceal unrelated functionality, frustrate review, and indicate that code or metadata was copied from another package without proper validation.

Context-Inappropriate Capability

Medium
Confidence
89% confidence
Finding
The vendored file list includes modules such as safe_download.py and credentials.py that do not align with a skill whose stated purpose is rendering thematic maps to PNG or PDF. Unnecessary download and credential-handling code expands the attack surface, may introduce network or secret-access behavior reviewers do not expect, and makes it easier to hide risky capabilities inside an apparently offline rendering skill.

Description-Behavior Mismatch

Medium
Confidence
96% confidence
Finding
The AOI resolver makes outbound requests to Open-Meteo and Nominatim, which expands the skill's behavior beyond a narrowly understood offline/export-only mapping function and exposes user-supplied place queries to third parties. In this skill context, location names may contain sensitive project, customer, or research areas, so undisclosed network geocoding creates a real privacy and scope-expansion risk even though it is not direct code execution.

Description-Behavior Mismatch

Low
Confidence
93% confidence
Finding
The code persists cache files under the user's home directory by default, storing resolved place and bounding-box data without an obvious consent or retention policy. Persistent local storage can leak sensitive geographic interests across sessions or to other local users/processes, especially on shared systems.

Intent-Code Divergence

Medium
Confidence
88% confidence
Finding
The docstring says passwords are not cached, but load_user_secrets() copies secrets from the user secrets file into the process-wide _DEFAULTS dictionary and retains them. This increases secret lifetime in memory and can mislead reviewers or operators into underestimating exposure in long-lived processes.

Intent-Code Divergence

Low
Confidence
84% confidence
Finding
The get_earthdata_token() docstring claims the .netrc account field is part of resolution order, but _resolve() never reads .netrc at all and _read_netrc() does not return account unless login is present. This mismatch can cause operators to assume token-based auth is configured when it is not, leading to insecure fallback behavior or operational mistakes.

Description-Behavior Mismatch

Medium
Confidence
94% confidence
Finding
The skill advertises PNG/PDF thematic map export, but it also writes classified GeoJSON, GeoTIFF, metadata JSON, and an output manifest. In a local geospatial workflow, these extra artifacts can unintentionally persist sensitive derived data, spatial extents, field statistics, and input references beyond the user's expected output scope, increasing data exposure risk even without network exfiltration.

Missing User Warnings

Medium
Confidence
97% confidence
Finding
User geocoding queries are transmitted to third-party services without any disclosure in this file, which creates a privacy issue because place names can reveal sensitive operations, customers, or areas of interest. The risk is heightened here because the skill's stated purpose is thematic map automation, not obvious cloud geocoding, so users may reasonably expect local-only processing.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
Resolved place data is written to a persistent cache file without user disclosure, creating a privacy and data-retention issue. Even if the cached content is not highly sensitive by itself, it can reveal historical user queries and locations of interest over time.

Missing User Warnings

High
Confidence
99% confidence
Finding
This file contains hardcoded fallback credentials, including a plaintext Earthdata username and password. Embedding real credentials in source code is a direct secret-exposure vulnerability: anyone with repository or package access can recover and abuse them, and the skill may silently authenticate as a shared account without user awareness.

Natural-Language Policy Violations

Medium
Confidence
87% confidence
Finding
The Nominatim request hard-codes an Accept-Language header of zh-CN/zh without user choice, causing user queries and returned place metadata to be biased toward a Chinese locale. This can leak locale assumptions, produce incorrect or misleading geographic results, and create privacy/UX issues when used for users outside that context.

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
78% 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
78% confidence
Finding
.netrc

Credential Access

High
Category
Privilege Escalation
Content
def load_user_secrets(path: Optional[Path] = None, *, force: bool = False) -> bool:
    """从 ``~/.geoskill/secrets.json`` 加载用户级凭证到 _DEFAULTS.

    Phase 7 (2026-07-27): 第一次调用自动加载(lazy)。之后每个 helper
    调用也会 lazy 加载,除非显式 ``force=True`` 强制重读。返回 True
Confidence
82% confidence
Finding
secrets.json

Unpinned Dependencies

Low
Category
Supply Chain
Content
numpy
rasterio
scipy
matplotlib
Confidence
98% confidence
Finding
numpy

Unpinned Dependencies

Low
Category
Supply Chain
Content
numpy
rasterio
scipy
matplotlib
geopandas
Confidence
97% confidence
Finding
rasterio

Unpinned Dependencies

Low
Category
Supply Chain
Content
numpy
rasterio
scipy
matplotlib
geopandas
shapely
Confidence
98% confidence
Finding
scipy

Unpinned Dependencies

Low
Category
Supply Chain
Content
numpy
rasterio
scipy
matplotlib
geopandas
shapely
Confidence
97% confidence
Finding
matplotlib

Unpinned Dependencies

Low
Category
Supply Chain
Content
rasterio
scipy
matplotlib
geopandas
shapely
Confidence
99% confidence
Finding
geopandas

Unpinned Dependencies

Low
Category
Supply Chain
Content
scipy
matplotlib
geopandas
shapely
Confidence
97% confidence
Finding
shapely

Known Vulnerable Dependency: numpy — 10 advisory(ies): CVE-2014-1859 (Numpy arbitrary file write via symlink attack); CVE-2021-41495 (NumPy NULL Pointer Dereference); CVE-2021-33430 (NumPy Buffer Overflow (Disputed)) +7 more

Critical
Category
Supply Chain
Confidence
80% confidence
Finding
numpy

Known Vulnerable Dependency: scipy — 4 advisory(ies): CVE-2013-4251 (SciPy creates insecure temporary directories); CVE-2013-4251 (The scipy.weave component in SciPy before 0.12.1 creates insecure temporary dire); CVE-2023-25399 (A refcounting issue which leads to potential memory leak was discovered in scipy) +1 more

High
Category
Supply Chain
Confidence
84% confidence
Finding
scipy

Known Vulnerable Dependency: geopandas — 2 advisory(ies): CVE-2025-69662 (geopandas SQL Injection Vulnerability in to_postgis() Allows Information Disclos); CVE-2025-69662 (SQL injection vulnerability in geopandas before v.1.1.2 allows an attacker to ob)

Critical
Category
Supply Chain
Confidence
72% confidence
Finding
geopandas

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