Back to skill

Security audit

geoskill-network-routing

Security checks across malware telemetry and agentic risk

Overview

The main routing command appears local, but the package includes under-disclosed network, download, and credential-handling code that does not fit the advertised offline routing purpose.

Review before installing. The routing command itself appears to operate on local files, but the package includes extra helpers that can contact external services, download URLs, cache results, and read local credential stores if used. Install only if you are comfortable auditing or removing those unused modules and pinning dependencies.

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

Lp3

Medium
Category
MCP Least Privilege
Confidence
88% confidence
Finding
The skill declares fully offline/local behavior, but the detected capabilities include network, shell, environment access, and file read/write without any corresponding permission disclosure. That mismatch reduces transparency and can enable unexpected data access, command execution, or outbound communication if the underlying skill implementation actually uses those capabilities.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
This is a significant description-behavior mismatch: the skill is presented as an offline Dijkstra/A* routing tool, yet analysis indicates geocoding, remote API usage, caching, file downloading, credential handling, and even hardcoded NASA Earthdata fallback credentials. Hidden network access and embedded credentials materially increase the risk of data exfiltration, supply-chain abuse, unauthorized third-party access, and user deception about privacy and execution boundaries.

Description-Behavior Mismatch

Medium
Confidence
94% confidence
Finding
The vendored metadata claims the bundled component is 'landsat-download', which does not match the declared purpose of a network-routing skill. This kind of capability mismatch is a supply-chain integrity red flag because it can conceal unexpected code paths, hidden functionality, or repurposed components that operators would not reasonably expect in a routing package.

Context-Inappropriate Capability

Medium
Confidence
91% confidence
Finding
The presence of modules such as safe_download.py and credentials.py is unjustified for a network-routing skill and expands the attack surface into network access and secret handling. In context, this is more dangerous because the skill's stated purpose does not require download or credential logic, so these files may enable unintended external communication, secret collection, or dormant functionality that would evade casual review.

Context-Inappropriate Capability

Medium
Confidence
79% confidence
Finding
The code sends user-supplied place queries to third-party geocoding services, creating an external data-flow that may expose sensitive user input such as addresses or operational locations. In a skill described as network routing, this hidden network dependency increases privacy and supply-chain risk because user data leaves the local trust boundary without clear necessity or disclosure.

Intent-Code Divergence

Medium
Confidence
89% confidence
Finding
The module documentation claims bbox values crossing the antimeridian must be checked, but the implementation only flags crossings when longitude values fall outside [-180, 180]. Valid antimeridian-crossing boxes can still be represented with in-range coordinates where W > E, and this logic merely reports a generic ordering issue instead of correctly identifying and handling wrap-around, which can lead downstream geospatial computations to validate or reject data incorrectly. In a routing/geospatial context, malformed spatial bounds can cause incorrect area calculations, skipped data, or wrong route preprocessing decisions.

Description-Behavior Mismatch

High
Confidence
96% confidence
Finding
This module implements broad credential management for multiple unrelated external services despite the skill being described as a network-routing/path-planning skill. Expanding a routing skill to load Earthdata, FIRMS, CMA, EOG, and OpenAI credentials increases privilege scope and creates unnecessary access to sensitive secrets, which is dangerous even if no exfiltration is shown in this file.

Context-Inappropriate Capability

High
Confidence
97% confidence
Finding
The code defines access paths for unrelated credentials, including OPENAI_API_KEY and multiple remote data-provider accounts, without clear relation to Dijkstra/A* routing. This violates least privilege and creates a larger secret-harvesting surface if the skill or any dependent code is later abused.

Description-Behavior Mismatch

Medium
Confidence
95% confidence
Finding
This file implements a general-purpose network downloader with retries, resume, atomic replacement, and optional hash verification, which materially exceeds the stated routing-focused purpose of the skill. In an agent setting, arbitrary download capability expands the attack surface by enabling retrieval of untrusted remote content, making the skill useful as a fetch primitive even when that behavior is not justified by the manifest.

Context-Inappropriate Capability

Medium
Confidence
93% confidence
Finding
The _http_get helper performs arbitrary HTTP fetching from attacker-controlled URLs using requests or urllib, with no domain restrictions, no scheme restrictions, and no guarantee of checksum validation by callers. In a routing skill, this is unjustified capability and can be abused to fetch malicious payloads, contact internal services in SSRF-like scenarios, or stage untrusted data for later processing by other components.

Missing User Warnings

Medium
Confidence
84% confidence
Finding
User-provided place strings are transmitted to external services without any visible warning, consent flow, or privacy controls. This is dangerous because location queries can contain home addresses, customer sites, or other sensitive operational metadata, and the skill context does not clearly signal that such data will be shared with third parties.

Missing User Warnings

High
Confidence
99% confidence
Finding
The module contains hardcoded fallback credentials, including a plaintext Earthdata username and password. Hardcoded secrets in source are inherently sensitive because they can be recovered from the repository, reused unintentionally in production, and may grant unauthorized access if still valid.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
User-supplied place queries are sent to third-party services (Open-Meteo and Nominatim) without any explicit warning or consent mechanism in this file. This can leak sensitive location intent, addresses, or operational context to external providers, which is especially relevant because the skill is presented as network-routing/planning rather than a clearly disclosed geocoding proxy.

Natural-Language Policy Violations

Medium
Confidence
84% confidence
Finding
The code hardcodes an Accept-Language header of zh-CN for Nominatim requests, overriding user locale expectations without opt-in. While not a severe security bug, it can cause unnecessary disclosure of inferred regional preference and produce biased or unexpected results that may affect downstream routing decisions.

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
86% 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
90% 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
90% 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
88% 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
91% confidence
Finding
secrets.json

Unpinned Dependencies

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

Unpinned Dependencies

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

Unpinned Dependencies

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

Unpinned Dependencies

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

Unpinned Dependencies

Low
Category
Supply Chain
Content
rasterio
scipy
geopandas
shapely
Confidence
96% 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
90% confidence
Finding
numpy

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