You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Current state: documented dependency exception (deferred upgrade)
Rescoped 2026-08-20. This issue originally read as pending HIGH-severity
upgrade work. That is no longer accurate: the team formally deferred the
upgrade under a documented dependency exception and shipped compensating
controls (ADR-0004, spec/features/gdal-compensating-controls/). The issue
now tracks only the remaining work — replacing GDAL 3.9.2 once a trusted
3.13+ wheel exists. Original body preserved at the bottom for history.
Alerts: Dependabot 33, 34, 38 — all dismissed as "risk tolerable" Component:hastelib/pyproject.toml, api/hastefuncapi/requirements.txt, api/hastefuncqueues/requirements.txt, docker/imageryprep/requirements.txt
GDAL is not installable from PyPI for HASTE's runtime — the project consumes a
custom-built manylinux wheel. No trusted prebuilt wheel for the patched 3.13
line is currently available, so the upgrade is blocked on an external
dependency rather than on engineering effort.
Pre-parse driver allowlist.gdal_security.harden_gdal() deregisters
every driver outside raster GTiff, COG, VRT, JPEG, PNG, MEM and vector GPKG, GeoJSON, Memory, wired into every parse site. The vulnerable
HDF4/HDF-EOS drivers are not registered at runtime.
Subprocess coverage.GDAL_SKIP="HDF4 HDF4Image HDF5 HDF5Image netCDF"
in docker/imageryprep/Dockerfile and docker/training/Dockerfile, so
CLI tools (gdalwarp, gdal_translate) refuse them too.
Authenticated, allowlisted providers.utils/url_allowlist.py; PutLayer rejects off-allowlist hosts at submission.
Magic-byte pre-validation.gdal_security.sniff_file_type + core/processors/uploader.py verify the assembled file matches its
declared format before GDAL sees it. (Extension/MIME checks alone are
insufficient — GDAL sniffs content, per ADR-0004.)
Net effect: the specific code paths carrying these three CVEs are not
reachable from any HASTE runtime configuration.
Remaining work
Gated on external wheel availability — do not start until step 1 is satisfied.
A trusted prebuilt GDAL 3.13+ cp311 manylinux wheel becomes available
(or HASTE's deployment model changes to make one buildable/verifiable)
Publish it to the haste-binaries GitHub release tag
(https://github.com/microsoft/haste/releases/download/haste-binaries/)
— currently holds only GDAL-3.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Update the wheel URL in api/hastefuncapi/requirements.txt, api/hastefuncqueues/requirements.txt, docker/imageryprep/requirements.txt
Referenced triage report path was docs/security-triage-2026-06-23.md; the
file in the repo is docs/security-triage:2026- 06-23.md.
Follow-up worth splitting out
docker/training/env/env.yml:6 pins gdal<3.9 via conda-forge — a
different and older constraint than the 3.9.2 wheel, and it is not listed
in the Root Cause C affected-files inventory. The GDAL_SKIP control in docker/training/Dockerfile does cover it at runtime, but whether that conda
build falls in the advisories' affected ranges has not been verified. Suggest a
separate issue to confirm and to add it to the inventory.
Owner: GIS Agent + Backend Dev Agent Review cadence: weekly, per the dependency exception process
Alerts: Dependabot alerts 33, 34, 38 Severity: HIGH 7.8 (NIST NVD, CVE-2026-8087) / Medium for others — Dependabot rates all three LOW, but NIST disagrees on CVE-2026-8087 Component:hastelib/pyproject.toml, docker/imageryprep/requirements.txt
All three are file-parsing vulnerabilities. HASTE uses GDAL throughout hastelib to read satellite imagery (GeoTIFF, COG, HDF4-EOS) sourced from external providers. A malicious file delivered via imagery provider API could trigger these in the imageryprep pipeline or Azure Functions.
Fix
Upgrade GDAL from 3.9.2 to 3.13.x.
⚠️ HASTE uses a custom-built manylinux wheel
GDAL is not installable from PyPI — HASTE builds and hosts its own wheel at an Azure Blob URL. This is not a simple version bump.
Required steps:
Build GDAL-3.13.x-cp311-cp311-manylinux_2_17_x86_64.whl (see existing build process)
Upload new wheel to the HASTE binaries blob container (researchlabwuopendata.blob.core.windows.net/haste-binaries/)
Update the wheel URL in docker/imageryprep/requirements.txt
Update the pin in hastelib/pyproject.toml
Run full geospatial regression tests (imagery read/write, COG generation, reprojection, damage assessment pipeline)
Author an ADR in spec/architecture/decisions/ documenting the wheel build process
Owner: GIS Agent + Backend Dev Agent
Interim mitigations (until upgrade is complete)
Ensure all imagery input is received from authenticated, known-good provider APIs only
Consider adding magic-byte pre-validation before passing files to GDAL
Current state: documented dependency exception (deferred upgrade)
Alerts: Dependabot 33, 34, 38 — all dismissed as "risk tolerable"
Component:
hastelib/pyproject.toml,api/hastefuncapi/requirements.txt,api/hastefuncqueues/requirements.txt,docker/imageryprep/requirements.txtVulnerabilities
GDnentriesGDfieldinfoSWSDfldsrchAll three are in the HDF4/HDF-EOS driver family.
Why this is deferred, not stalled
GDAL is not installable from PyPI for HASTE's runtime — the project consumes a
custom-built manylinux wheel. No trusted prebuilt wheel for the patched 3.13
line is currently available, so the upgrade is blocked on an external
dependency rather than on engineering effort.
See
docs/known-vulnerabilities.md→ Root Cause C.Compensating controls — implemented ✅
Enforced in code and reviewed weekly. See
ADR-0004
(accepted 2026-06-26) and
spec/features/gdal-compensating-controls/(approved).
gdal_security.harden_gdal()deregistersevery driver outside raster
GTiff, COG, VRT, JPEG, PNG, MEMand vectorGPKG, GeoJSON, Memory, wired into every parse site. The vulnerableHDF4/HDF-EOS drivers are not registered at runtime.
GDAL_SKIP="HDF4 HDF4Image HDF5 HDF5Image netCDF"in
docker/imageryprep/Dockerfileanddocker/training/Dockerfile, soCLI tools (
gdalwarp,gdal_translate) refuse them too.utils/url_allowlist.py;PutLayerrejects off-allowlist hosts at submission.gdal_security.sniff_file_type+core/processors/uploader.pyverify the assembled file matches itsdeclared format before GDAL sees it. (Extension/MIME checks alone are
insufficient — GDAL sniffs content, per ADR-0004.)
HASTE_MAX_UPLOAD_BYTES,HASTE_MAX_IMAGERY_DOWNLOAD_BYTES.core/utils/downloader.pyandworkflows/prepare_imagery.pyrefuse to follow redirects.docs/triage-process.md.Net effect: the specific code paths carrying these three CVEs are not
reachable from any HASTE runtime configuration.
Remaining work
Gated on external wheel availability — do not start until step 1 is satisfied.
cp311manylinux wheel becomes available(or HASTE's deployment model changes to make one buildable/verifiable)
haste-binariesGitHub release tag(
https://github.com/microsoft/haste/releases/download/haste-binaries/)— currently holds only
GDAL-3.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whlapi/hastefuncapi/requirements.txt,api/hastefuncqueues/requirements.txt,docker/imageryprep/requirements.txt"gdal==3.9.2"inhastelib/pyproject.tomlreprojection, damage assessment pipeline)
yes — it is defence-in-depth independent of GDAL version)
docs/known-vulnerabilities.mdRoot Cause C and close the exceptionCorrections to the original body
Upload to—researchlabwuopendata.blob.core.windows.net/haste-binaries/stale. Since chore(build): host GDAL and hastegeo wheels on GitHub Releases #75, binaries are hosted in the
haste-binariesGitHubrelease tag.
Author an ADR— done, ADR-0004.Interim mitigation: authenticated known-good providers— done,url_allowlist.py.Interim mitigation: magic-byte pre-validation— done,gdal_security.sniff_file_type.docs/security-triage-2026-06-23.md; thefile in the repo is
docs/security-triage:2026- 06-23.md.Follow-up worth splitting out
docker/training/env/env.yml:6pinsgdal<3.9via conda-forge — adifferent and older constraint than the 3.9.2 wheel, and it is not listed
in the Root Cause C affected-files inventory. The
GDAL_SKIPcontrol indocker/training/Dockerfiledoes cover it at runtime, but whether that condabuild falls in the advisories' affected ranges has not been verified. Suggest a
separate issue to confirm and to add it to the inventory.
Owner: GIS Agent + Backend Dev Agent
Review cadence: weekly, per the dependency exception process
References
docs/known-vulnerabilities.md— Root Cause Cspec/features/gdal-compensating-controls/Original issue body (pre-rescope, 2026-06-24)
Current State: Dependency exception
Description
Alerts: Dependabot alerts 33, 34, 38
Severity: HIGH 7.8 (NIST NVD, CVE-2026-8087) / Medium for others — Dependabot rates all three LOW, but NIST disagrees on CVE-2026-8087
Component:
hastelib/pyproject.toml,docker/imageryprep/requirements.txtVulnerabilities
Three memory-safety bugs in GDAL 3.9.2:
GDnentriesGDfieldinfoSWSDfldsrchAll three are file-parsing vulnerabilities. HASTE uses GDAL throughout
hastelibto read satellite imagery (GeoTIFF, COG, HDF4-EOS) sourced from external providers. A malicious file delivered via imagery provider API could trigger these in the imageryprep pipeline or Azure Functions.Fix
Upgrade GDAL from 3.9.2 to 3.13.x.
GDAL is not installable from PyPI — HASTE builds and hosts its own wheel at an Azure Blob URL. This is not a simple version bump.
Required steps:
GDAL-3.13.x-cp311-cp311-manylinux_2_17_x86_64.whl(see existing build process)researchlabwuopendata.blob.core.windows.net/haste-binaries/)docker/imageryprep/requirements.txthastelib/pyproject.tomlspec/architecture/decisions/documenting the wheel build processOwner: GIS Agent + Backend Dev Agent
Interim mitigations (until upgrade is complete)
References
docs/security-triage-2026-06-23.md