Back to skill

Security audit

geoskill-ai-accuracy-assessment

Security checks across malware telemetry and agentic risk

Overview

The main tool is an offline accuracy evaluator, but the package also ships unrelated network, credential, cache, and downloader code that is not disclosed by the skill description.

Treat this as needing review before installation. The main accuracy-assessment script appears purpose-aligned, but the package should remove or clearly split out the geocoding, downloader, credential, and home-directory cache helpers, and the exposed Earthdata password should be rotated. Install only in a constrained environment if you need to test it before those issues are fixed.

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

Lp3

Medium
Category
MCP Least Privilege
Confidence
72% confidence
Finding
The skill declares itself as an offline local evaluation tool, but the detected capabilities include network, shell, environment access, and file read/write without corresponding declared permissions. That mismatch can cause users or orchestrators to grant trust to a skill that may access local secrets, modify files, or initiate external connections unexpectedly.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding
This is a strong description-behavior mismatch: the skill is presented as an offline NumPy-equivalent accuracy assessor, yet analysis indicates hidden support for network requests, remote downloads, credential harvesting from env/.netrc/secrets, and even embedded Earthdata credentials. In this context, the discrepancy is especially dangerous because users handling local geospatial data may trust the skill as privacy-safe while it can exfiltrate data, use unintended credentials, or expand scope far beyond evaluation.

Description-Behavior Mismatch

Medium
Confidence
97% confidence
Finding
The vendored core metadata claims the packaged core belongs to a different skill ('landsat-download') than the declared accuracy-assessment skill. This is a supply-chain integrity problem because it can indicate copy/paste packaging mistakes, stale or substituted components, or mislabeled vendored code, all of which weaken trust in what code is actually being shipped and reviewed.

Description-Behavior Mismatch

High
Confidence
96% confidence
Finding
The file implements AOI resolution, online geocoding, and local persistence even though the skill is described as an offline accuracy-assessment tool. This capability mismatch is dangerous because it expands the trust boundary: users may run the skill expecting isolated local computation, while the code can process location inputs, make network calls, and retain data on disk.

Context-Inappropriate Capability

High
Confidence
98% confidence
Finding
The code sends user-supplied place names to external services (Open-Meteo and optionally Nominatim), which is inconsistent with an offline-only evaluation skill and creates an undisclosed data egress path. In this skill context, that is more dangerous because operators are likely to assume no outbound traffic, so sensitive project AOIs or user interests could be exposed to third parties unexpectedly.

Context-Inappropriate Capability

Medium
Confidence
90% confidence
Finding
The module defines a default persistent cache under the user's home directory, which exceeds the expected behavior of a local offline accuracy report generator. Persisting AOI-related queries can leave location traces on disk, creating privacy and data handling risks, especially on shared systems or managed environments.

Description-Behavior Mismatch

High
Confidence
98% confidence
Finding
This module materially exceeds the declared offline accuracy-assessment scope by bundling credential resolution for multiple external services, including Earthdata, FIRMS, CMA, OpenAI, and EOG. In a skill advertised as offline/numpy-equivalent, broad credential handling increases the attack surface and enables unauthorized access to unrelated secrets if imported or invoked by other code.

Context-Inappropriate Capability

High
Confidence
97% confidence
Finding
The code actively reads sensitive values from environment variables, ~/.geoskill/secrets.json, and ~/.netrc for external services without clear justification from the skill's stated purpose. Even without immediate exfiltration in this file, harvesting or normalizing local credentials inside an unrelated skill is dangerous because it makes secret access available to the broader runtime and any dependent code paths.

Description-Behavior Mismatch

High
Confidence
95% confidence
Finding
This file vendors a general-purpose network downloader into a skill described as an offline accuracy-assessment tool, creating unnecessary outbound network capability and remote content ingress. Even though the downloader includes safeguards like atomic writes and optional SHA256 checks, the mere presence of reusable download functionality broadens the attack surface and can enable unintended data exfiltration, unreviewed dependency fetching, or retrieval of attacker-controlled content if invoked elsewhere in the skill.

Context-Inappropriate Capability

High
Confidence
94% confidence
Finding
The _http_get implementation performs outbound HTTP requests and supports arbitrary URL retrieval via requests or urllib, which is inconsistent with the declared offline purpose of the skill. In this context, network access is especially risky because it allows importing untrusted remote data into the execution flow and undermines user expectations that the skill operates purely locally.

Description-Behavior Mismatch

High
Confidence
96% confidence
Finding
This file implements place-resolution/geocoding logic, including fallback network lookups, which is materially inconsistent with a skill described as an offline accuracy-assessment tool. That mismatch expands the skill's capability surface beyond user expectations and can lead to unintended data egress or review bypass because operators may treat it as harmless offline analytics.

Description-Behavior Mismatch

High
Confidence
99% confidence
Finding
The manifest says the skill is an offline NumPy-equivalent accuracy-assessment implementation, but these functions make HTTP requests to external geocoding services. In a supposedly offline skill, undisclosed outbound requests are dangerous because they leak user-provided queries and violate trust, policy, or deployment assumptions about network isolation.

Context-Inappropriate Capability

Medium
Confidence
91% confidence
Finding
External geocoding is not justified by the stated purpose of computing confusion-matrix/OA/mIoU/F1 and producing spatial accuracy reports offline. Unnecessary network capability increases attack surface, introduces privacy and dependency risk, and may enable unexpected behavior in environments that assume pure local processing.

Intent-Code Divergence

Medium
Confidence
88% confidence
Finding
The module docstring openly describes AOI/place delegation and migration shims, contradicting the manifest's claim that the skill is for offline accuracy assessment. This kind of intent mismatch is dangerous because it suggests code reuse or packaging errors that can conceal capabilities reviewers and users would not expect in this context.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
User place queries are written to persistent cache files without visible disclosure or consent in this file. Even if the content seems innocuous, place names can reveal sensitive operational locations, research targets, or personal travel interests, and silent persistence increases exposure on disk.

Missing User Warnings

Medium
Confidence
97% confidence
Finding
The code transmits user-supplied place data to third-party geocoding providers without any visible in-file disclosure, which is a privacy and trust issue. In the context of a supposedly offline skill, this hidden external sharing is especially problematic because it violates likely user expectations about local-only processing.

Missing User Warnings

High
Confidence
100% confidence
Finding
The module hardcodes fallback credentials, including a plaintext Earthdata username and password, directly in source. Hardcoded secrets are highly dangerous because anyone with code access can reuse them, and the application may silently authenticate with embedded credentials without user awareness, causing credential leakage, account compromise, and unauthorized third-party resource use.

Missing User Warnings

Medium
Confidence
94% confidence
Finding
The code sends user-supplied place queries to third-party geocoding endpoints without any explicit warning or consent flow in this file. Even seemingly simple place names can reveal sensitive locations, projects, or investigative targets, so silent transmission creates a privacy and compliance risk.

Natural-Language Policy Violations

Medium
Confidence
84% confidence
Finding
The Nominatim request forces the Accept-Language header to zh-CN/zh without user choice. While not severe on its own, it can bias results, disclose locale assumptions, and produce behavior users did not request, which is especially inappropriate in a skill already making undisclosed network calls.

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
96% 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
95% 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
97% confidence
Finding
secrets.json

Unpinned Dependencies

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

Unpinned Dependencies

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

Unpinned Dependencies

Low
Category
Supply Chain
Content
numpy
rasterio
scipy
scikit-learn
geopandas
shapely
Confidence
99% confidence
Finding
scipy

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