Skip to main content

GIS vulnerability scanner — ArcGIS REST, embedded maps, secret detection, KVKK/GDPR-aware

Project description

gisweep

PyPI Python CI Downloads License GitHub stars

In a six-second passive scan of a publicly indexed Turkish municipal ArcGIS REST root, gisweep returned 99 findings — 9 critical, 17 high — including anonymous write capability on seven feature-service layers, a reachable /arcgis/admin endpoint, and PII fields (national ID, address, phone) exposed on five MapServer layers. Each finding cites the exact KVKK and GDPR article it triggers. That's what this tool does.

gisweep arcgis demo

gisweep is an open-source CLI that audits GIS surfaces for the misconfigurations nobody else looks for: ArcGIS REST services exposing anonymous write capabilities, GeoServer/MapServer endpoints with public WFS-Transactional, admin directories reachable from the public internet, embedded web maps leaking API keys, feature services returning PII without authentication, and outdated server / client-side libraries with public CVEs. Every finding is mapped to KVKK and GDPR articles so audits are usable directly in compliance reports.

Why

ArcGIS REST and the open-source OGC stack (GeoServer, MapServer, QGIS Server) are everywhere — municipalities, utilities, transport, public health — and they are consistently misconfigured. Existing OSS scanners (nuclei, trivy, semgrep) do not understand ArcGIS or OGC semantics, and existing compliance tools don't speak GIS. gisweep fills that gap with a protocol-aware engine plus a Playwright-driven web crawler that finds embedded maps in the wild and follows their network traffic back to the underlying services. Every finding leaves the scanner pre-mapped to KVKK Madde 12 / 9 and GDPR Art. 32 / 5(1)(f) so a compliance officer can route it without translating from CVSS-speak.

What it covers today

Subcommand Targets Checks
gisweep arcgis <url> ArcGIS REST root ARC-001 anonymous enumeration · ARC-002 anonymous write capability · ARC-003 admin endpoint exposed · ARC-011 Sync/Extract enabled · ARC-012 ExportTiles enabled · ARC-013 unbounded query · ARC-014 PII fields exposed · ARC-015 outdated ArcGIS Server CVE
gisweep ogc <url> WMS / WFS via GeoServer / MapServer / QGIS Server / deegree OGC-001 anonymous GetCapabilities · OGC-002 outdated server CVE · OGC-005 WFS-T anonymous write
gisweep web <url> Any web page (Playwright headless Chromium) WEB-001 embedded data-plane endpoint inventory · WEB-002 secret leakage in HTML/JS/XHR · WEB-007 outdated client-side GIS library CVE
gisweep secrets <url-or-path> Any URL or local file/directory SEC-001 hardcoded API keys / tokens / private keys
gisweep scan <url> Auto-detect (probes URL, dispatches arcgis / ogc / web) All of the above

Cross-cutting compliance overlay:

  • COMP-001 KVKK Madde 12 aggregate — ≥5 PII-bearing layers exposed anonymously.
  • COMP-003 GDPR Art. 32 technical-measures gap — admin exposed AND data unauthenticated.

Bundled CVE database (regenerable from NIST NVD via scripts/refresh_cve_db.py): ArcGIS Server, GeoServer, MapServer, plus product slots for QGIS Server, deegree, GeoNetwork, Leaflet, OpenLayers, Mapbox GL JS, Cesium, ArcGIS API for JavaScript.

Output formats

  • Rich console (default)
  • JSON (stable schema gisweep.report.v1)
  • SARIF 2.1.0 (consumable by GitHub Code Scanning, Azure DevOps)
  • HTML (self-contained, embedded CSS, KVKK/GDPR pills)
  • Markdown (GitHub-friendly, KVKK/GDPR matrix)

Every format surfaces the KVKK / GDPR / CWE / CVSS metadata of every finding.

Install

pip install gisweep
playwright install chromium  # one-time browser download for `gisweep web`

Or via Docker (Playwright + Chromium pre-installed):

docker run --rm ghcr.io/enisgetmez/gisweep:latest arcgis \
    https://example.gov/arcgis/rest/services

Quick start

gisweep version
gisweep checks list
gisweep checks info ARC-002

# ArcGIS REST passive scan with multi-format report
gisweep arcgis https://example.gov/arcgis/rest/services \
    -o report.json -o report.sarif -o report.html

# OGC scan against a GeoServer instance
gisweep ogc https://geo.example.org/geoserver

# Headless-Chromium audit of a city portal
gisweep web https://city-portal.example/map -o web-report.json

# Secret scan over a build directory
gisweep secrets ./build/static/js/

# Auto-detect: figure out from the URL whether to dispatch ArcGIS / OGC / web
gisweep scan https://opaque.example/something

Active mode

--active runs intrusive checks: it actually attempts a write on a discovered FeatureServer or WFS-T endpoint, exercises SSRF vectors via Geometry/Print services, and probes default credentials. It is opt-in twice — both --active and --i-own-this-target (or --authorized-by <ticket>) are required, and every active call is appended to ~/.gisweep/audit.jsonl.

gisweep arcgis https://my-server.example/arcgis/rest/services \
    --active --i-own-this-target \
    --ssrf-canary https://my-canary.example/abc123

Never run --active against infrastructure you do not own or have written authorization to test. See SECURITY.md.

Refreshing the CVE database

uv run python -m scripts.refresh_cve_db --rate-delay 7

The script pulls from services.nvd.nist.gov/rest/json/cves/2.0 for every tracked CPE, dedupes by CVE id, and rewrites src/gisweep/data/cve_db.json. Pass --api-key <key> for the higher NVD rate limit.

License

Apache-2.0 — © 2026 Enis Getmez and contributors.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

gisweep-0.2.0.tar.gz (144.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

gisweep-0.2.0-py3-none-any.whl (158.1 kB view details)

Uploaded Python 3

File details

Details for the file gisweep-0.2.0.tar.gz.

File metadata

  • Download URL: gisweep-0.2.0.tar.gz
  • Upload date:
  • Size: 144.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for gisweep-0.2.0.tar.gz
Algorithm Hash digest
SHA256 b9dda40aec3d0ad0a88a5d8f2d33da957113fb35105a4118e5a114f439198a5c
MD5 823760dd50330e1cf6637b69bba9de9b
BLAKE2b-256 a39289cf54787d9c20a1d8030e4d4027230971f8b3d4be5a26b80024f6afbdd1

See more details on using hashes here.

File details

Details for the file gisweep-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: gisweep-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 158.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for gisweep-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 6e83c304720b3a090dbdfd1fc6a053ab96f117d3a819d1fd9d080163c7e02e6a
MD5 e41294e5212c10ef3ac9fcff85f97f65
BLAKE2b-256 0dcd83f2426bc3a640606d4bca37490ed057db545b9e2511441d3d9b96215b93

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page