Skip to main content

GeoLens EUVDEUVD-2026-78775

| CVE-2026-55178 HIGH
Information Exposure (CWE-200)
2026-08-18 https://github.com/geolens-io/geolens GHSA-p23g-mvhj-jh3j PYSEC-2026-3662 PYSEC-2026-3663
7.5
CVSS 3.1 · Vendor: https://github.com/geolens-io/geolens
Share

Severity by source

Vendor (https://github.com/geolens-io/geolens) PRIMARY
7.5 HIGH
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N
vuln.today AI
7.5 HIGH

Anonymous network exploitation with no complexity, no privileges, and no user interaction required for the primary findings; confidentiality impact only, no integrity or availability effect.

3.1 AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N
4.0 AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N

Primary rating from Vendor (https://github.com/geolens-io/geolens).

CVSS VectorVendor: https://github.com/geolens-io/geolens

Attack Vector
Network
Attack Complexity
Low
Privileges Required
None
User Interaction
None
Scope
Unchanged
Confidentiality
High
Integrity
None
Availability
None

Lifecycle Timeline

3
Source Code Evidence Fetched
Aug 18, 2026 - 18:21 vuln.today
Analysis Generated
Aug 18, 2026 - 18:21 vuln.today
CVE Published
Aug 18, 2026 - 18:00 github-advisory
HIGH 7.5

DescriptionCVE.org

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 neither user nor map, which the tile endpoint accepts for non-public datasets with no user check - so the signature is replayable to read the private dataset's actual vector tiles. *(Anonymous · High)*

2. Anonymous private-row disclosure via dataset relationships (PR #234) The dataset FK-relationship APIs authorized only the source dataset from the URL, never the relationship target. A public dataset with a relationship to a private dataset let an anonymous caller enumerate the relationship (obtaining the private target's id/title and the relationship id) and then call the related-record endpoint to read rows from the private target's backing table. *(Anonymous · High)*

3. Anonymous metadata disclosure via OGC externalId lookup (PR #236) GET /collections/datasets/items?externalId=<uuid> resolved the dataset by id and returned the full OGC catalog record (title, summary, bbox, keywords, contacts, distributions, source org) with no visibility check - the user was never threaded into the lookup. An anonymous caller could read any private, restricted, or unpublished dataset's metadata by UUID. *(Anonymous · High)*

4. Cross-tenant raster pixel disclosure via VRT mosaics - SEC-C (PR #237) An authenticated user with the default editor upload permission could mosaic another user's private raster into a VRT they own, then read the victim's pixels back through raster tile / quicklook / COG endpoints that authorize only the attacker-owned VRT. VRT member pixels are compiled into one served asset and cannot be filtered at read time, so the fix authorizes every source dataset at write/link time. *(Authenticated editor · High)*

5. Cross-tenant metadata/sample-data disclosure via AI metadata endpoints - SEC-D (PR #238) The POST /ai/metadata/{summary,keywords,lineage,quality-statement} endpoints were gated only by the use_ai_chat permission (held by the default editor role). The attacker-controlled dataset_id in the request body flowed into the LLM prompt context with no visibility filter, rendering any dataset's title, summary, source URL, filename, column schema, and sample values into the response. *(Authenticated editor · High)*

6. Residual VRT member disclosure for legacy links - SEC-E (PR #237) Link-time authorization (finding 4) does not re-authorize pre-existing vrt_source_links, so legacy or authorization-drift links still leaked member metadata and health via the VRT source-listing/status endpoints until a per-member read filter was added. *(Medium)*

Patches

Fixed in 1.2.3 by, in order:

  • 31a103b9 - fix(catalog): authorize relationship targets in related-record endpoints (#234)
  • 01bc87da - fix(maps): re-authorize each layer's dataset on anonymous map read endpoints (#235)
  • 407c0688 - fix(ogc): enforce dataset visibility on the externalId OGC item lookup (#236)
  • 2c031da8 - fix(vrt): authorize VRT source datasets at link time + filter unauthorized members on read (#237)
  • 07dfb1c6 - fix(ai): authorize the requested dataset on AI metadata endpoints (#238)

The fixes follow the codebase's established per-dataset re-authorization pattern (can_access_dataset / check_dataset_access_or_anonymous), filtering at read time and authorizing cross-dataset references at link/write time.

Workarounds

There is no complete configuration workaround; the anonymous findings require only network access to the API. Operators who cannot upgrade immediately should restrict network exposure of the API and avoid co-locating private datasets with public maps/relationships, but upgrading to 1.2.3 is the only full remediation.

Remediation

Upgrade to GeoLens 1.2.3:

  • Container images: ghcr.io/geolens-io/geolens-api:1.2.3 (+ worker/frontend)
  • Python SDK: geolens1.2.3 · CLI: geolens-cli1.2.3 · npm: @geolens/sdk@1.2.3

AnalysisAI

Cross-dataset authorization bypass in GeoLens prior to 1.2.3 allows unauthenticated network callers and low-privileged authenticated users to read private dataset content - including vector tile geometries, raster pixels, backing-table rows, column schemas, and sampled values - that they have no access to. The root flaw is a consistent pattern across six distinct endpoints: the API authorizes the resource named in the URL but fails to re-authorize a second, caller-influenced dataset reached through a relationship, layer reference, VRT mosaic, or request body. No public exploit has been identified at time of analysis, but the most severe findings require zero authentication, making them trivially exploitable by any network-reachable caller.

Technical ContextAI

GeoLens is a geospatial data platform distributed as Python packages (pip/geolens, pip/geolens-cli) and an npm SDK (@geolens/sdk), with container images on GHCR. Its API is implemented in Python (FastAPI/SQLAlchemy based on the diff), and exposes OGC-compliant catalog, map tile, VRT raster mosaic, and AI metadata endpoints. The root cause is CWE-200 (Exposure of Sensitive Information to an Unauthorized Actor) instantiated six ways: each endpoint correctly gate-checks the primary resource in the URL but omits a second authorization call for a secondary dataset that is caller-controlled - via FK relationship targets, map layer references, VRT source links, or a JSON request body field (dataset_id). The HMAC replay in finding 1 is particularly severe: style.json issued tile-access signatures bound to neither user nor map, so a signature obtained from a public map could be replayed indefinitely to fetch tiles from any private dataset it referenced.

RemediationAI

Upgrade to GeoLens 1.2.3 immediately - this is the only complete fix, as the vendor explicitly states no configuration workaround exists. For Python deployments run 'pip install geolens1.2.3' and 'pip install geolens-cli1.2.3'. For npm consumers run 'npm install @geolens/sdk@1.2.3'. For containerized deployments pull ghcr.io/geolens-io/geolens-api:1.2.3 along with the corresponding worker and frontend images. Operators who cannot upgrade immediately should restrict network exposure of the GeoLens API to trusted networks only (e.g., firewall or reverse-proxy IP allowlisting), accepting the trade-off that legitimate anonymous/public access will also be blocked. Additionally, avoid creating public maps or FK relationships that reference private datasets until patching is complete, as co-location of public and private resources is the prerequisite for findings 1 and 2. These mitigations are partial: finding 3 (OGC externalId lookup) requires only the target dataset's UUID and is not mitigated by relationship isolation alone. Full advisory and patch PRs: https://github.com/geolens-io/geolens/security/advisories/GHSA-p23g-mvhj-jh3j.

More in Python

View all
CVE-2025-24016 CRITICAL POC
9.9 Feb 10

Wazuh SIEM platform versions 4.4.0 through 4.9.0 contain an unsafe deserialization vulnerability in the DistributedAPI t

CVE-2025-27520 CRITICAL POC
9.8 Apr 04

BentoML version 1.4.2 and earlier contains an unauthenticated remote code execution vulnerability through insecure deser

CVE-2025-2945 CRITICAL POC
9.9 Apr 03

pgAdmin 4 contains critical remote code execution vulnerabilities in the Query Tool download and Cloud Deployment endpoi

CVE-2013-5093 MEDIUM POC
6.8 Sep 27

The renderLocalView function in render/views.py in graphite-web in Graphite 0.9.5 through 0.9.10 uses the pickle Python

CVE-2025-32375 CRITICAL POC
9.8 Apr 09

BentoML is a Python library for building online serving systems optimized for AI apps and model inference. Rated critica

CVE-2014-0224 HIGH POC
7.4 Jun 05

OpenSSL before 0.9.8za, 1.0.0 before 1.0.0m, and 1.0.1 before 1.0.1h does not properly restrict processing of ChangeCiph

CVE-2024-21644 HIGH POC
7.5 Jan 08

pyLoad download manager version prior to 0.5.0b3.dev77 exposes the Flask SECRET_KEY through an unauthenticated endpoint.

CVE-2026-33017 CRITICAL POC
9.3 Mar 17

Langflow (a visual LLM pipeline builder) contains a critical unauthenticated code execution vulnerability (CVE-2026-3301

CVE-2017-9462 HIGH POC
8.8 Jun 06

In Mercurial before 4.1.3, "hg serve --stdio" allows remote authenticated users to launch the Python debugger, and conse

CVE-2026-49869 CRITICAL POC
10.0 Jun 26

Unauthenticated remote code execution affects Kestra OSS (the open-source event-driven orchestration platform) prior to

CVE-2026-39987 CRITICAL POC
9.3 Apr 08

Unauthenticated remote code execution in Marimo ≤0.20.4 allows attackers to execute arbitrary system commands via the `/

CVE-2024-21645 MEDIUM POC
5.3 Jan 08

pyLoad is the free and open-source Download Manager written in pure Python. Rated medium severity (CVSS 5.3), this vulne

Share

EUVD-2026-78775 vulnerability details – vuln.today

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy