Skip to content

fix(security): [OBE-10709,OBE-10718,OBE-11236] bound gcs and wef allocation paths - #144

Closed
JuanMantica45 wants to merge 3 commits into
Sentinel-One:masterfrom
JuanMantica45:oom-stcp-gcs-wef-bounds
Closed

fix(security): [OBE-10709,OBE-10718,OBE-11236] bound gcs and wef allocation paths#144
JuanMantica45 wants to merge 3 commits into
Sentinel-One:masterfrom
JuanMantica45:oom-stcp-gcs-wef-bounds

Conversation

@JuanMantica45

@JuanMantica45JuanMantica45 commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

What

Bumps `lib/observo/private`. Depends on `dataplane-private` PR #69 (branch `gcs-wef-oom-bounds`).

gcs

  • `max_decompressed_bytes` (4 GiB): runaway-decompressor guard; above BigQuery/Cloud Logging maxima so real objects aren't truncated. Truncations counted by `gcs_object_truncated_total`.

wef

  • `max_content_length` now enforced via `Limited`; independent from `max_envelope_size`, so the effective cap is `max(configured, 4× max advertised envelope)`
  • `sldc::decompress` size errors now rejected instead of silently falling back to raw UTF-16

Testing

`wef` 119 · `gcs` 7 — all passing.

Jira: OBE-10709, OBE-10718, OBE-11236

Bumps the private submodule. Contents:
stcp
- max_frame_bytes bounds the per-connection receive buffer, defaulting to 4x
max_event_size. The cap covers a partially-read frame plus anything the peer
pipelined behind it, so at parity with max_event_size a single legitimate
max-size event arriving with one trailing byte would close the connection.
- max_lines_per_event (1e6) bounds the O(N*M) clone amplification from a large
RAW field with many newlines combined with a large field map.
- read_leb128_i64 returned Ok(0) on buffer exhaustion, a silent truncation that
let a zero count bypass downstream loop guards; it now returns
InSufficientData so the framer waits for more bytes.
- `warn!` was used without being imported, so the crate did not compile.
gcs
- max_decompressed_bytes (4 GiB) caps decompressor output. Objects are streamed
line-by-line and never buffered whole, so this is a runaway-decompressor guard
rather than the memory bound; it sits above documented producer maxima
(BigQuery exports 1 GB uncompressed per file, Cloud Logging 3.5 GiB) so real
objects are not truncated. Truncation is logged and counted.
wef
- max_content_length is enforced on the HTTP body via Limited. It and
max_envelope_size are independent settings, so the enforced value is
max(configured, 4x largest advertised envelope) -- otherwise raising the
advertised size alone would 413 every batch. The body is strictly larger than
the envelope it carries: the Kerberos path adds multipart framing and a GSS
wrap header.
- sldc::decompress returns a typed SizeLimitExceeded. Both call sites treated
any error as "input was not compressed" and fell back to the raw bytes, so an
oversized stream was silently reinterpreted as plaintext UTF-16.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
JuanMantica45and others added 2 commits August 11, 2026 17:39
… to gcs/wef-only bounds branch
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@JuanMantica45JuanMantica45 changed the title fix(security): [OBE-10709,OBE-10718,OBE-11234,OBE-11236,OBE-11238,OBE-11556] bound stcp, gcs and wef allocation pathsfix(security): [OBE-10709,OBE-10718,OBE-11236] bound gcs and wef allocation pathsAug 11, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@JuanMantica45