Back to skill

Security audit

geoskill-lidar-urban-modeling

Security checks across malware telemetry and agentic risk

Overview

The main LiDAR tool is local, but the package also ships under-disclosed network and credential helper code, including hardcoded Earthdata credentials.

Review this package before installing in an environment with valuable credentials. The main LiDAR command appears local, but the distribution includes extra helper modules that can use network services and read local credential stores, and it contains hardcoded Earthdata credentials. Prefer a cleaned package that removes unused network/credential helpers, rotates/removes embedded credentials, documents any online features, and pins 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 (21)

Lp3

Medium
Category
MCP Least Privilege
Confidence
84% confidence
Finding
The skill metadata claims fully offline local processing and declares no permissions, yet the detected capabilities include environment access, filesystem read/write, shell, and network. This mismatch weakens trust boundaries and can enable unexpected data access or command execution if the underlying implementation actually uses those capabilities.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding
This is a strong description-behavior mismatch: the skill presents itself as an offline LiDAR building-extraction workflow, but the analyzed behavior includes online geocoding, caching, HTTP download logic, and credential handling including reading secrets sources and hardcoded default Earthdata credentials. Hidden network and credential functionality in a data-processing skill is dangerous because it can exfiltrate data, fetch untrusted content, or misuse embedded credentials without user expectation.

Context-Inappropriate Capability

Medium
Confidence
82% confidence
Finding
The code sends user-supplied place names to third-party geocoding services over the network, which creates a privacy and data-governance risk even if the feature is functionally useful. In this skill context, AOI lookup may be relevant, but undisclosed outbound transmission of location queries can expose sensitive project locations or user intent.

Context-Inappropriate Capability

High
Confidence
88% confidence
Finding
This credential manager is far broader than the stated LiDAR urban modeling purpose and includes access paths for OpenAI, CMA, FIRMS, EOG, and Earthdata. That scope expansion increases the attack surface and creates opportunities for unrelated secret access from a skill that should primarily perform local geospatial processing.

Context-Inappropriate Capability

Medium
Confidence
91% confidence
Finding
The code automatically reads secrets from the user’s home directory and environment, which gives the skill ambient access to credentials outside its narrow advertised function. In a skill ecosystem, this is dangerous because users may invoke a geospatial workflow without realizing it can enumerate and consume broader account secrets.

Intent-Code Divergence

High
Confidence
90% confidence
Finding
The code unconditionally labels raster/vector outputs as EPSG:4326 even when the input point cloud may be arbitrary local-meter coordinates. This can cause downstream systems to trust false geospatial metadata, leading to misplacement of sensitive infrastructure data, bad operational decisions, or unsafe fusion with other spatial datasets.

Missing User Warnings

Medium
Confidence
90% confidence
Finding
User-entered place queries are transmitted to external services without any visible disclosure or consent mechanism. In geospatial workflows, location names can reveal sensitive sites, customer areas, or investigative targets, so silent exfiltration to third parties is a meaningful privacy/security weakness.

Missing User Warnings

Low
Confidence
76% confidence
Finding
The code persists resolved location data to disk in the user's home directory without explicit disclosure, which can leave sensitive place queries or AOI metadata behind for later access by other local users, backups, or support tooling. The impact is limited because this is local storage, but it still creates an avoidable privacy exposure.

Missing User Warnings

High
Confidence
99% confidence
Finding
The source code contains hardcoded fallback credentials, including a concrete Earthdata username and password. Hardcoded secrets are inherently unsafe because anyone with source access can recover and reuse them, and downstream logs, packages, or forks may unintentionally redistribute live credentials.

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
92% confidence
Finding
~/.netrc

Credential Access

High
Category
Privilege Escalation
Content
def _resolve(name: str) -> str:
    """env > 用户 secrets > .netrc > 默认. 空字符串视为未设."""
    env_val = os.environ.get(name, "").strip()
    if env_val:
        return env_val
Confidence
89% 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
91% 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
94% confidence
Finding
secrets.json

Unpinned Dependencies

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

Unpinned Dependencies

Low
Category
Supply Chain
Content
numpy
rasterio
scipy
geopandas
shapely
Confidence
98% 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
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
95% 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
93% 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
88% 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