Back to skill

Security audit

geoskill-image-quality-assessment

Security checks across malware telemetry and agentic risk

Overview

The advertised image-quality tool bundles undocumented network, geocoding, download, and credential-handling code, including hardcoded fallback credentials.

Review this package carefully before installing. The main CLI appears to run local image-quality scoring, but the bundled helper code has sensitive capabilities that are not explained in the skill documentation. Do not install it in an environment with valuable ~/.netrc, ~/.geoskill/secrets.json, or API keys unless the unused credential, geocoding, and downloader modules are removed or clearly gated and disclosed.

SkillSpector

By NVIDIA
Vulnerability Patterns
  • 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
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (26)

Lp3

Medium
Category
MCP Least Privilege
Confidence
82% confidence
Finding
The skill documentation declares no permissions, yet the analyzed capability set includes environment access, file read/write, shell, and network use. This creates an unsafe trust boundary because operators may run the skill believing it is offline/local-only while it can access credentials, write artifacts, and potentially reach external services.

Tp4

High
Category
MCP Tool Poisoning
Confidence
93% confidence
Finding
The documented purpose is narrow image-quality assessment, but the detected behavior includes geocoding, external network access, a generic downloader, credential discovery from env/secrets/.netrc, fallback Earthdata credentials, and broader raster utilities. This mismatch is dangerous because hidden secondary functions materially expand the attack surface and can lead to unexpected data exfiltration, credential exposure, or unauthorized remote access during execution.

Description-Behavior Mismatch

Medium
Confidence
76% confidence
Finding
The outputs table lists `result.tif` and `output-manifest.json`, which conflicts with the stated purpose of producing JSON and HTML quality reports. Output mismatches can mislead users about what data is generated and retained, increasing the risk of unnoticed file creation, overwrite of geospatial artifacts, or omission of expected reporting artifacts needed for review.

Description-Behavior Mismatch

Medium
Confidence
93% confidence
Finding
The vendored metadata shows this skill bundles code for a different capability ('landsat-download') than its declared purpose of image quality assessment. That mismatch is dangerous because it can hide unexpected functionality such as network retrieval, AOI handling, or other side effects that users and reviewers would not reasonably expect from an assessment-only skill, expanding the attack surface and undermining trust boundaries.

Context-Inappropriate Capability

Medium
Confidence
95% confidence
Finding
The metadata references modules such as 'safe_download.py' and 'credentials.py', which imply download and credential-handling behavior not justified by the skill's stated assessment-only function. In this context, undeclared credential and network-related code is especially risky because it may enable secret access, outbound data transfer, or unauthorized fetching of remote content under the guise of local image analysis.

Context-Inappropriate Capability

Medium
Confidence
85% confidence
Finding
The code sends user-supplied place names to external geocoding services, which creates an outbound data-exfiltration/privacy surface unrelated to the advertised image-quality-assessment function. Even if intended for AOI support, undisclosed network transmission of potentially sensitive locations can leak user interests, project areas, or operational regions to third parties.

Intent-Code Divergence

Medium
Confidence
83% confidence
Finding
The docstring claims network failures raise NetworkError, but the HTTP helper suppresses exceptions and returns None, causing failures to look like ordinary no-match conditions. This can hide connectivity issues, monitoring gaps, or policy-enforcement failures and may lead callers to make unsafe assumptions about why resolution failed.

Description-Behavior Mismatch

High
Confidence
94% confidence
Finding
This credential module is materially over-scoped for an image-quality assessment skill: it centralizes access to multiple unrelated external services and broad credential types. In a skill context, broad credential handling increases the blast radius if other code imports this helper, because the skill can access secrets unrelated to its declared purpose without strong need-to-know boundaries.

Context-Inappropriate Capability

Medium
Confidence
88% confidence
Finding
Retrieving an OpenAI API key is not justified by the stated functionality of assessing multispectral image quality and generating reports. In this context, adding LLM-provider credential access expands the set of secrets the skill can touch and creates an unnecessary path for external transmission if later code uses the key.

Context-Inappropriate Capability

Medium
Confidence
84% confidence
Finding
The module advertises support for many remote providers beyond the declared assessment task, indicating a broader capability set than users would reasonably expect from this skill. In an agent setting, this mismatch is dangerous because it normalizes access to unrelated credentials and data sources under a narrowly described package.

Context-Inappropriate Capability

Medium
Confidence
85% confidence
Finding
The module accepts arbitrary URLs and performs remote fetches without host allowlisting, scheme restriction, or private-network blocking. In an agent context, this can enable SSRF-like behavior, access to internal services or metadata endpoints, and retrieval of untrusted content from attacker-controlled locations under the guise of normal image processing.

Description-Behavior Mismatch

High
Confidence
96% confidence
Finding
This module exposes place-resolution behavior and outbound geocoding even though the skill is declared as an image-quality assessment tool. That mismatch is dangerous because it expands the skill's effective capability surface, enables external data transmission of user-supplied locations, and can be used as hidden network functionality that callers would not reasonably expect from this skill.

Context-Inappropriate Capability

High
Confidence
98% confidence
Finding
The code performs live requests to Open-Meteo and Nominatim, sending user-provided place names and headers to third-party services unrelated to the stated image-quality function. In a mismatched skill context, this is a material security concern because it creates covert exfiltration and dependency on external services, and it can violate least-privilege and user expectations.

Intent-Code Divergence

Medium
Confidence
88% confidence
Finding
The docstring states this file is an adapter for AOI/place-resolution logic, which directly conflicts with the declared purpose of assessing multispectral image quality. This inconsistency is dangerous because it suggests code reuse or hidden functionality outside the approved scope, making review, governance, and user trust significantly weaker.

Missing User Warnings

Low
Confidence
71% confidence
Finding
The skill documents output files but does not clearly warn that execution writes artifacts to disk. While common, this can still surprise users in sensitive environments where local writes are restricted, audited, or may overwrite existing data.

Missing User Warnings

Medium
Confidence
90% confidence
Finding
Place queries are transmitted to external services without any user-facing disclosure or consent mechanism in this code. Because place names may encode sensitive locations, this creates a privacy risk through silent third-party sharing and is more concerning given the skill's stated purpose does not suggest geocoding/network disclosure behavior.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
The module persistently stores resolved place queries and AOI manifests under the user's home directory without user-facing disclosure. Cached location queries can reveal sensitive operational geography, and silent persistence increases exposure to local users, backups, and forensic recovery beyond the original session.

Missing User Warnings

High
Confidence
100% confidence
Finding
The file contains hardcoded fallback credentials, including a non-empty username and password, directly in source code. Hardcoded secrets are highly dangerous because they may grant unauthorized access, are easily leaked through source distribution, and silently cause the skill to authenticate as a shared account without user knowledge.

Natural-Language Policy Violations

Medium
Confidence
86% confidence
Finding
Forcing the Accept-Language header to zh-CN/zh without user choice is a privacy and policy issue because it imposes locale inference/behavior on all requests and may bias returned results. While not severe on its own, it becomes more concerning here because the network behavior itself is already out of scope for the skill.

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

Credential Access

High
Category
Privilege Escalation
Content
# 用户级 secrets 文件位置(在用户 home,**不** vendor 到 skill 内部)。
# Phase 7 (2026-07-27): 包含 NASA Earthdata bearer token 等真实凭证。
USER_SECRETS_PATH = Path.home() / ".geoskill" / "secrets.json"

# 是否已加载过用户级 secrets(避免每次调用都重读)
_user_secrets_loaded = False
Confidence
78% confidence
Finding
secrets.json

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
Confidence
98% confidence
Finding
numpy

Unpinned Dependencies

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

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