GIS vulnerability scanner — ArcGIS REST, embedded maps, secret detection, KVKK/GDPR-aware
Project description
gisweep
GIS vulnerability scanner — ArcGIS REST, OGC (WMS/WFS), embedded web maps, secret detection, KVKK/GDPR-aware.
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. 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.
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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file gisweep-0.1.0.tar.gz.
File metadata
- Download URL: gisweep-0.1.0.tar.gz
- Upload date:
- Size: 128.5 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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
abfe024a985b14636e5f04d0b023ec138c93c4e4796c0165b5dee05a48dec8b2
|
|
| MD5 |
701603daf8934286cd420fcc44c2ffca
|
|
| BLAKE2b-256 |
82fd6d452adf78cce22a41aae1ce373521f0247290b36bdd7552a53b2dd22c64
|
File details
Details for the file gisweep-0.1.0-py3-none-any.whl.
File metadata
- Download URL: gisweep-0.1.0-py3-none-any.whl
- Upload date:
- Size: 142.5 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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
54ec6ea6a0f391e8658772149c984a667e7ff7afe7962d208e2311131deab5ec
|
|
| MD5 |
b4751008775d3d224593cc4af05692d5
|
|
| BLAKE2b-256 |
0bea83d29c97172c00ee7eb4681c813098c66fb7c31228e7907cdc844e19bf31
|