Back to skill

Security audit

geoskill-sar-crop-classification

Security checks across malware telemetry and agentic risk

Overview

The main classifier is local, but the package includes undisclosed credential and network helper code, including hardcoded Earthdata credentials, so it should be reviewed before install.

Install only after the publisher removes the hardcoded Earthdata credentials, narrows or removes the unrelated credential/geocoding/downloader modules, documents any network lookups and cache locations, and pins supported dependency versions. The core classifier appears local, but the bundled helper code has broader authority than the skill description explains.

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

Lp3

Medium
Category
MCP Least Privilege
Confidence
88% confidence
Finding
The skill declares no permissions, yet the described capabilities include network, shell, environment access, and file read/write. This creates a transparency and least-privilege problem: users and platforms cannot accurately assess what the skill may do before execution, increasing the risk of unintended data access or outbound communication.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding
The documented purpose is narrow SAR crop classification, but the analyzed behavior includes unrelated geocoding, generic downloading, broad credential management, and even hardcoded fallback Earthdata credentials. That mismatch is dangerous because it can hide unnecessary privileged behavior, expand attack surface, and expose secrets or trigger unauthorized network access under the guise of a benign geospatial workflow.

Description-Behavior Mismatch

Medium
Confidence
89% confidence
Finding
The AOI helper sends user-supplied place names to external geocoding services and also persists results locally under the user's home directory, which expands the skill's behavior beyond the crop-classification functionality described in the manifest. This creates a privacy and data-governance risk because location queries may reveal sensitive project context, and the persistent cache leaves recoverable traces on disk without clear disclosure or explicit opt-in.

Description-Behavior Mismatch

High
Confidence
94% confidence
Finding
This module reaches well beyond the stated SAR crop-classification purpose by centralizing access to multiple third-party service credentials, including Earthdata, FIRMS, CMA, EOG, and OpenAI. In a skill that is supposed to perform local SAR-based classification, this broad credential surface materially increases the chance of unnecessary secret exposure, privilege misuse, or later exfiltration by other code paths.

Context-Inappropriate Capability

Medium
Confidence
89% confidence
Finding
Support for FIRMS, CMA, and EOG credentials is not justified by the manifest's local crop-classification scope. Unneeded credential plumbing increases the number of sensitive values accessible at runtime and creates opportunities for cross-skill secret harvesting or accidental use of unrelated accounts.

Context-Inappropriate Capability

Medium
Confidence
89% confidence
Finding
Support for FIRMS, CMA, and EOG credentials is not justified by the manifest's local crop-classification scope. Unneeded credential plumbing increases the number of sensitive values accessible at runtime and creates opportunities for cross-skill secret harvesting or accidental use of unrelated accounts.

Intent-Code Divergence

Medium
Confidence
86% confidence
Finding
The documentation states that passwords are not cached, but `load_user_secrets()` copies secret values into the process-global `_DEFAULTS` dictionary and retains them for future calls. This discrepancy can mislead reviewers and operators, while increasing the lifetime of secrets in memory and the chance they are accessed by unrelated code in the same process.

Description-Behavior Mismatch

High
Confidence
92% confidence
Finding
This file adds broad place-name geocoding and AOI resolution capability, including network-backed fallback behavior, that is not clearly required by the stated SAR crop-classification purpose. Unrelated network/location-resolution logic expands the skill’s attack surface, enables unexpected data flows to third-party services, and can be abused to exfiltrate user-supplied locations or trigger unintended outbound requests.

Context-Inappropriate Capability

High
Confidence
95% confidence
Finding
The code performs external HTTP requests to Open-Meteo and Nominatim using user-provided place names, sending potentially sensitive operational inputs to third parties without clear justification from the skill description. In a crop-classification skill, such undeclared outbound requests create privacy, compliance, and supply-chain risk, especially because fallback behavior may make the network access non-obvious to operators.

Missing User Warnings

Medium
Confidence
92% confidence
Finding
User place queries are transmitted to Open-Meteo and potentially Nominatim with no in-function warning, consent flow, or prominent disclosure. Even if the values are 'just place names,' they can disclose sensitive operational interests, user whereabouts, or target areas, especially in a geospatial workflow where locations are the core data.

Missing User Warnings

Medium
Confidence
90% confidence
Finding
The helper writes resolved AOI data into a predictable cache directory in the user's home folder without user-facing disclosure. This can leave long-lived local artifacts about queried places that may be accessible to other local users, backup systems, or later forensic inspection, creating unnecessary privacy exposure.

Missing User Warnings

High
Confidence
99% confidence
Finding
The source contains hardcoded fallback credentials, including a plaintext Earthdata username and password. Embedding live or reusable credentials in code is a severe secret-management failure: anyone with source access can recover them, and any downstream logs, packaging, or forks may further leak them.

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
77% confidence
Finding
secrets.json

Unpinned Dependencies

Low
Category
Supply Chain
Content
numpy
rasterio
scipy
scikit-learn
Confidence
96% confidence
Finding
numpy

Unpinned Dependencies

Low
Category
Supply Chain
Content
numpy
rasterio
scipy
scikit-learn
Confidence
94% confidence
Finding
rasterio

Unpinned Dependencies

Low
Category
Supply Chain
Content
numpy
rasterio
scipy
scikit-learn
Confidence
96% confidence
Finding
scipy

Unpinned Dependencies

Low
Category
Supply Chain
Content
numpy
rasterio
scipy
scikit-learn
Confidence
97% confidence
Finding
scikit-learn

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
84% 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
86% confidence
Finding
scipy

Known Vulnerable Dependency: scikit-learn — 6 advisory(ies): CVE-2020-13092 (scikit-learn Deserialization of Untrusted Data); CVE-2024-5206 (scikit-learn sensitive data leakage vulnerability); CVE-2020-28975 (scikit-learn Denial of Service) +3 more

Critical
Category
Supply Chain
Confidence
92% confidence
Finding
scikit-learn

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