Summary
Multiple GeoLens read/link endpoints authorized only the resource named in the
request URL (a map, a VRT, a source dataset, an AI request) and failed to
re-authorize a second, caller-influenced dataset that the request reached
through a relationship, layer reference, mosaic source, or request body. This
"authorize the URL resource, read a different dataset un-re-authorized"
pattern let callers read data from datasets they have no access to.
The most severe instances require no authentication at all (anonymous,
network-only). Others require only the default editor role that any
self-service signup / upload user receives.
All issues are fixed in 1.2.3. There is no complete configuration
workaround — upgrading is the only full remediation.
Impact
Depending on the endpoint, an attacker can read, for datasets they cannot
otherwise access:
- the dataset's vector tile data (actual feature geometries/attributes),
- the dataset's raster pixels,
- backing-table rows,
- and metadata — table name, column schema, feature count, extent, source
URL/filename, contacts, and sampled row values.
Affected versions
All versions prior to 1.2.3 (includes the published 1.0.0, 1.2.0, and
1.2.2 releases and their PyPI/npm/GHCR artifacts). Fixed in 1.2.3.
Findings
1. Anonymous metadata + private vector-tile disclosure via public maps (PR #235)
GET /maps/{id} and GET /maps/{id}/style.json authorized the map but not
each layer's backing dataset. A public map that references a private dataset
leaked that dataset's table name, column schema, feature count, extent, and
sampled values to anonymous callers. style.json additionally returned a
vector-tile URL carrying an HMAC signature bound to ,
which the tile endpoint accepts for non-public datasets with no user check —
so the signature is to read the private dataset's actual vector
tiles.