observal: initial integration - #15991
Open
RAWx18 wants to merge 1 commit into
Open
Conversation
Observal is an agent-centric registry and observability platform for AI coding agents (https://github.com/Observal/Observal). Four Atheris targets are maintained in the project's own repository under fuzz/ and cover its untrusted input boundaries: session_jsonl_fuzzer harness session transcripts, ingest classification and read-path parsing for every supported harness session_structure_fuzzer the same pipeline driven by Hypothesis-generated records rather than raw bytes secrets_redactor_fuzzer server-side secret redaction applied before storage support_redaction_fuzzer CLI support-bundle redaction Every target runs in-process, opens no sockets and touches no databases, so findings reproduce from their input alone. Seed corpora and dictionaries are picked up automatically by build.sh. Validated locally with build_image, build_fuzzers for the address, undefined and coverage configurations, check_build for address and undefined, and run_fuzzer over all four targets.
|
Thanks for your pull request! It looks like this may be your first contribution to a Google open source project. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA). View this failed invocation of the CLA check for more information. For the most up to date status, view the checks section at the bottom of the pull request. |
|
RAWx18 is integrating a new project: |
Merged
6 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
This PR integrates Observal into OSS-Fuzz.
Observal is an Apache-2.0 licensed registry and observability control plane for AI
coding agents. Its core job is to ingest, parse, redact and replay session
transcripts produced by ten different AI coding harnesses. That parsing surface is
fed entirely by data the project does not control, which is what we want fuzzed
continuously.
Four Atheris targets already exist and are maintained in the project's own
repository under
fuzz/.This PR adds only the three-file project configuration.
The project
>=3.11)observal-cli, GHCR container images, Helm chartAdoption and project health
As of 2026-08-13:
Why this project should be fuzzed
Observal's largest untrusted input is the harness session transcript. The flow is:
Goose, Antigravity, Pi, Copilot CLI) writes JSONL to disk.
observal reconcile, uploads the raw lines toPOST /api/v1/ingest/session.a session.
That is ten independent per-harness parsers operating on attacker-influenced data,
with a write path and a read path that must agree.
The second reason is redaction. Observal handles authentication tokens, API
keys and enterprise telemetry. Two redaction layers are the single chokepoint that
strips credentials before anything is stored or bundled into a support archive. A
parsing or redaction bug there is a credential-disclosure bug, not just a crash.
Fuzz targets
session_jsonl_fuzzerparse_raw_eventson the read path. The first input byte selects which harness parser to drive, so one target covers all ten.session_structure_fuzzersecrets_redactor_fuzzerservices.secrets_redactor.redact_secrets, applied to every line and preview before storage.support_redaction_fuzzerobserval_cli.support.redaction, the chokepoint forobserval support bundle.Harness design
PostgreSQL, ClickHouse or Redis. Nothing depends on the clock. A crash reproduces
from its input alone.
as timeouts.
malformed input is not a bug; any other exception is.
fuzz/corpus/and
fuzz/dictionaries/and are picked up automatically bybuild.sh. A repotest asserts every registered harness parser still has a seed reaching it.
What this PR adds
Nothing else is touched.
build.shglobsfuzz/*_fuzzer.py, so new targets addedupstream are picked up without further changes here.
Build notes
uv.lock, exported to arequirements file, and installed with
--require-hashes, so the image build isreproducible and hash-verified.
because
compile_python_fuzzerruns the base image's PyInstaller, which resolvesimports against
/usr/localsite-packages only. This is called out in a commentin the Dockerfile.
supply-chain pinning on our side; happy to drop the digest if you would rather
projects always track the freshest base image.
Local validation
Everything below was run against the real base images before opening this PR:
docker build --no-cache --pull -t gcr.io/oss-fuzz/observal projects/observalinfra/helper.py build_fuzzers observalinfra/helper.py check_build observalinfra/helper.py build_fuzzers --sanitizer undefined observalinfra/helper.py check_build --sanitizer undefined observalinfra/helper.py build_fuzzers --sanitizer coverage observalinfra/helper.py run_fuzzer observal <each target> -- -runs=3000infra/presubmit.pyThe build was verified with a cold, cache-free image build to confirm it does not
depend on any local layer cache.
Maintenance
fuzz/oss-fuzz/and arecurrently byte-identical. The project's contributor docs require both copies to be
updated in the same change, so they do not drift.
will keep them building.
in-repo regression tests alongside the fix.