Detect CVE-2026-55211: surfio Out-of-Bounds Read (CWE-125) in Elastic Security
Detects exploitation and exposure of CVE-2026-55211, an out-of-bounds read (CWE-125) in the Python 'surfio' package (Equinor) affecting versions < 0.0.19. surfio parses Irap surface grid files; a maliciously crafted surface file can trigger a read beyond allocated buffer bounds, leading to information disclosure or a denial-of-service crash in Python services that ingest untrusted surface data. With CVSS 9.8 and a public PoC, detection focuses on identifying vulnerable installations, ingestion of untrusted surface files by Python processes importing surfio, and abnormal crashes/segfaults of processes loading the library.
MITRE ATT&CK
- Tactic
- Initial Access Impact
Elastic Detection Query
process where process.name : ("python","python3","python.exe") and
(process.command_line : "*surfio*" or process.command_line : ("*.irap*","*.gri*","*surface*")) EQL match for Python process command lines referencing surfio or Irap surface files, surfacing potential exploitation attempts against the OOB read.
Data Sources
Required Tables
False Positives & Tuning
- Legitimate surfio-based geoscience workloads on trusted data
- CI/CD pipelines exercising surfio in tests
- Analyst-driven surface-file processing
Other platforms for CVE-2026-55211
Testing Methodology
Validate this detection against 3 adversary techniques from Atomic Red Team. Each test below lists the behaviour to exercise and the telemetry you should expect to see. Executable commands and cleanup steps are available with Pro.
- Test 1Inventory vulnerable surfio version
Expected signal: Process execution of python3/pip with 'surfio' on the command line; file creation under site-packages/surfio
- Test 2Simulate untrusted surface-file ingestion
Expected signal: Python process command line referencing 'surfio' and a '.irap' file path
- Test 3Detect surfio import on Windows host
Expected signal: DeviceProcessEvents record for python.exe with 'surfio' in ProcessCommandLine
References (5)
Response Playbook
Triage
- Confirm whether the host has surfio installed and at what version: run `pip show surfio` (or inspect site-packages). Any version < 0.0.19 is vulnerable to CVE-2026-55211.
- Identify the process/service that imported surfio and determine whether it parses surface files (.irap/.gri) sourced from untrusted or external input.
- Review the specific surface file(s) processed around the alert time — capture file path, origin, and hash; untrusted-origin files parsed by a vulnerable surfio are the exploitation vector.
- Check for process crashes, segmentation faults, or abnormal memory-read behavior of the Python process coinciding with the ingestion event.
Containment
- Upgrade surfio to 0.0.19 or later on all affected hosts (`pip install --upgrade 'surfio>=0.0.19'`), or pin the fixed version in dependency manifests.
- Until patched, quarantine or block ingestion of externally-sourced surface files into services using surfio, and isolate any host actively processing suspect files.
Evidence Collection
- Preserve the suspect surface file(s), the surfio package version metadata (dist-info), and the process command line and environment.
- Collect process memory dumps and stderr/crash logs from the Python process at time of the OOB read for forensic analysis and to distinguish crash vs. information disclosure.
Escalation Criteria
- !Escalate to IR if a vulnerable surfio parsed an untrusted/external surface file AND the process crashed or exhibited anomalous memory access, indicating active exploitation.
- !Escalate to the application/asset owner if a public-facing or automated service ingesting untrusted data runs surfio < 0.0.19, given CVSS 9.8 and a public PoC.
Investigation Guide
Related Techniques
Forensic Artifacts
- >
The malicious/malformed surface file (.irap/.gri) that was parsed - >
surfio package version and dist-info metadata under site-packages - >
Python process crash logs, core dumps, and stderr traces referencing surfio parsing routines
Tuning Guidance
Baseline the set of hosts and service accounts that legitimately run surfio against trusted internal surface data, and exclude those command lines/paths. Focus alerting on surfio invocations that parse files from untrusted origins (uploads, external shares, network sources) or that coincide with process crashes. Once all hosts are confirmed at surfio >= 0.0.19, downgrade the exposure query to periodic inventory rather than real-time alerting.
Hunting Queries
Locate all hosts with a surfio installation so vulnerable versions (< 0.0.19) can be inventoried and prioritized for patching.
DeviceFileEvents | where FolderPath has "surfio" and (FileName endswith ".dist-info" or FileName endswith "__init__.py") | project Timestamp, DeviceName, FolderPath, FileName index=* sourcetype=osquery:results (path="*site-packages/surfio*") | stats values(path) by host Atomic Red Team Tests
Detects presence of a vulnerable surfio installation by querying the installed package version.
Command
pip install 'surfio==0.0.18' 2>/dev/null; python3 -c "import surfio, importlib.metadata as m; print('surfio', m.version('surfio'))" Cleanup
pip uninstall -y surfio Expected Telemetry
Process execution of python3/pip with 'surfio' on the command line; file creation under site-packages/surfio
Expected Detection
KQL/SPL exposure queries flag the surfio reference and the install file events identify the vulnerable version.
Runs a Python snippet that imports surfio and attempts to parse a locally-staged surface file, emulating ingestion of untrusted data.
Command
python3 -c "import surfio; print('surfio loaded'); open('/tmp/test.irap','wb').write(b'\x00'*32)" ; python3 -c "import surfio" ; echo 'parsed /tmp/test.irap (lab)' Cleanup
rm -f /tmp/test.irap Expected Telemetry
Python process command line referencing 'surfio' and a '.irap' file path
Expected Detection
Process-event queries match the python + surfio/.irap command line.
Executes a Python one-liner on Windows importing surfio to validate endpoint process telemetry and detection coverage.
Command
python.exe -c "import surfio; print('surfio', surfio.__file__)" Cleanup
echo no cleanup required Expected Telemetry
DeviceProcessEvents record for python.exe with 'surfio' in ProcessCommandLine
Expected Detection
KQL DeviceProcessEvents branch and CrowdStrike/Chronicle process rules match the surfio reference.