GIS vulnerability scanner — ArcGIS REST, embedded maps, secret detection, KVKK/GDPR-aware
Project description
gisweep
In a six-second passive scan of a publicly indexed Turkish municipal ArcGIS REST root,
gisweepreturned 99 findings — 9 critical, 17 high — including anonymous write capability on seven feature-service layers, a reachable/arcgis/adminendpoint, 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 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
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.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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b9dda40aec3d0ad0a88a5d8f2d33da957113fb35105a4118e5a114f439198a5c
|
|
| MD5 |
823760dd50330e1cf6637b69bba9de9b
|
|
| BLAKE2b-256 |
a39289cf54787d9c20a1d8030e4d4027230971f8b3d4be5a26b80024f6afbdd1
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6e83c304720b3a090dbdfd1fc6a053ab96f117d3a819d1fd9d080163c7e02e6a
|
|
| MD5 |
e41294e5212c10ef3ac9fcff85f97f65
|
|
| BLAKE2b-256 |
0dcd83f2426bc3a640606d4bca37490ed057db545b9e2511441d3d9b96215b93
|