Back to skill

Security audit

Geoskill: Geospatial Data Quality Audit

Security checks across malware telemetry and agentic risk

Overview

This is mostly a local geospatial audit tool, but it has review-worthy packaging and report-safety issues before use.

Install only in an isolated environment, audit trusted or sandboxed data packages first, and avoid opening generated HTML reports from untrusted inputs until report escaping is fixed. Expect local report files to be written or overwritten in the chosen output directory, and review the unresolved geoskill-data-fetcher dependency before relying on the tool.

SkillSpector

By NVIDIA
Vulnerability Patterns
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (19)

Dynamic attribute access via getattr()

Low
Category
Dangerous Code Execution
Content
ds = netCDF4.Dataset(path, "r")
        result["dimensions"] = dict(ds.dimensions)
        result["variables"] = list(ds.variables.keys())
        result["global_attrs"] = {k: str(getattr(ds, k)) for k in ds.ncattrs()}
        ds.close()
    except ImportError:
        result["checks"].append({"id": "NETCDF4_MISSING", "severity": "warning",
Confidence
50% confidence
Finding
result["global_attrs"] = {k: str(getattr(ds, k)) for k in ds.ncattrs()}

Lp3

Medium
Category
MCP Least Privilege
Confidence
70% confidence
Finding
Without declared permissions the skill's intent is opaque and cannot be validated.

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding
This is mostly aligned with the declared geospatial QA purpose: the script scans local files, performs raster/vector/table/NetCDF checks, runs cross-file consistency checks, and writes JSON/HTML reports, issue GeoJSON, checksums, and machine-readable exit codes. However, the description says it checks raster, vector, table, NetCDF, and directory structure, while the code additionally exposes a synthetic data generation mode and recognizes LAS and document files. The LAS handling is especially incomplete: LAS files are detected but then effectively skipped as unknown in the audit workflow, so the top-level docstring overstates that part. The optional bbox/aoi interface is not used for downloading, only recorded in the manifest, so that is a minor extra behavior rather than a major concern. Overall, because the code includes capabilities not represented in the declared description, this should be flagged as a mismatch, though it remains closely related to the stated purpose.

Context-Inappropriate Capability

Medium
Confidence
95% confidence
Finding
The manifest describes a geospatial data quality audit skill that validates GIS data packages and produces reports, which implies local inspection of supplied datasets. The documented dependency on a shared data-download library for Planetary Computer, NASA POWER, and OSM introduces external data acquisition capability that is not justified by the stated QA-audit purpose.

Description-Behavior Mismatch

Medium
Confidence
91% confidence
Finding
The requirements comment explicitly states use of a shared data-download library for external sources such as Planetary Computer, NASA POWER, and OSM. This behavior is absent from the manifest, which frames the skill as a unified data quality audit tool for provided GIS packages rather than a downloader or externally enriched validator.

Context-Inappropriate Capability

Medium
Confidence
93% confidence
Finding
The manifest describes a geospatial data quality audit tool for checking supplied GIS data packages and generating QA outputs. This function creates new raster and GeoJSON content on disk as demo input, which is a content-generation capability not justified by the stated auditing purpose.

Intent-Code Divergence

Medium
Confidence
96% confidence
Finding
The generated GeoJSON labels issues such as "Sample raster has no CRS metadata" and "Self-intersecting polygon detected," but the code writes a raster with CRS set to EPSG:4326 and creates simple box polygons that are valid. This is active intent/documentation divergence because the emitted issue metadata asserts defects that the generated geometries and raster do not actually contain.

Natural-Language Policy Violations

Medium
Confidence
90% confidence
Finding
The section header and prerequisite text switch to Chinese for critical setup guidance, including the 'must read' warning and prerequisite instructions. This imposes a language constraint on users without opt-in or justification, which matches the policy category for forced language or locale.

Missing User Warnings

Low
Confidence
88% confidence
Finding
This code creates an output directory and writes several files including JSON, HTML, GeoJSON, checksum, manifest, and QA summary artifacts. Although some paths are printed after writing, there is no prior confirmation prompt and the module/docstring does not clearly warn that running the tool will create or overwrite files in the target output location.

Natural-Language Policy Violations

Medium
Confidence
96% confidence
Finding
The generated HTML explicitly sets lang="zh-CN", which forces a specific locale in the output regardless of the user's preferences or environment. This is a natural-language locale policy concern because the skill does not offer a language choice or document why a Chinese locale is required.

Scope Creep

Low
Category
Excessive Agency
Content
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
Confidence
70% confidence
Finding
NOT LIMITED TO

Unpinned Dependencies

Low
Category
Supply Chain
Content
geoskill-data-fetcher>=0.2.0

# Third-party dependencies used by this skill
fiona
netCDF4
numpy
rasterio
Confidence
60% confidence
Finding
fiona

Unpinned Dependencies

Low
Category
Supply Chain
Content
# Third-party dependencies used by this skill
fiona
netCDF4
numpy
rasterio
shapely
Confidence
60% confidence
Finding
netCDF4

Unpinned Dependencies

Low
Category
Supply Chain
Content
# Third-party dependencies used by this skill
fiona
netCDF4
numpy
rasterio
shapely
Confidence
60% confidence
Finding
numpy

Unpinned Dependencies

Low
Category
Supply Chain
Content
fiona
netCDF4
numpy
rasterio
shapely
Confidence
60% confidence
Finding
rasterio

Unpinned Dependencies

Low
Category
Supply Chain
Content
netCDF4
numpy
rasterio
shapely
Confidence
60% confidence
Finding
shapely

Unpinned Dependencies

Low
Category
Supply Chain
Content
# Requirements for geospatial-data-quality-audit
# Shared data-download library (Planetary Computer / NASA POWER / OSM)
geoskill-data-fetcher>=0.2.0

# Third-party dependencies used by this skill
fiona
Confidence
50% confidence
Finding
geoskill-data-fetcher>=0.2.0

Known Vulnerable Dependency: fiona — 2 advisory(ies): GHSA-g4m4-9q4c-mfw6 (Fiona affected by CVE-2020-14152 related to madler-zlib); GHSA-q5fm-55c2-v6j9 (Fiona affected by CVE-2023-45853 related to MiniZip madler-zlib)

Critical
Category
Supply Chain
Confidence
90% confidence
Finding
fiona

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

No suspicious patterns detected.