CVE-2026-88978 Overview
Hatchet is a platform for orchestrating background tasks, AI agents, and durable workflows at scale. A cross-tenant authorization flaw in versions prior to 0.106.1 allows an authenticated tenant worker to read another tenant's durable event-log records. The WorkerStatus gRPC polling path in pkg/repository/durable_events.go forwards caller-supplied durable task, node, and branch identifiers to ListSatisfiedEntries without a tenant filter. An attacker who knows a target tenant's durable-task UUID can retrieve matching records. The issue is fixed in version 0.106.1.
Critical Impact
Authenticated tenant workers can read durable event-log records belonging to other tenants when they know the target tenant's UUIDv4 durable-task identifier. Single-tenant deployments are unaffected in practice.
Affected Products
- Hatchet (hatchet-dev/hatchet) versions prior to 0.106.1
- Multi-tenant Hatchet deployments using the gRPC WorkerStatus polling path
- Component: pkg/repository/durable_events.go and pkg/repository/sqlcv1/durable_event_log.sql
Discovery Timeline
- 2026-09-21 - CVE-2026-88978 published to NVD
- 2026-09-23 - Last updated in NVD database
Technical Details for CVE-2026-88978
Vulnerability Analysis
The vulnerability is an authorization flaw classified as [CWE-639] Authorization Bypass Through User-Controlled Key. In Hatchet's durable events subsystem, the gRPC WorkerStatus polling flow accepts durable task, node, and branch identifiers from the caller and passes them directly into the repository query ListSatisfiedEntries. The query did not scope its lookup to the caller's tenant, so any authenticated worker could retrieve durable event-log records for arbitrary tenants by supplying the correct identifiers. The impact is limited to confidentiality of durable event-log data; integrity and availability are not affected.
Root Cause
The repository layer relied on caller-supplied UUIDs as the sole selector for durable event-log rows. Neither the Go query builder in durable_events.go nor the underlying SQL in durable_event_log.sql applied a tenant_id predicate. This missing tenant isolation broke the multi-tenant boundary at the data-access layer, even though upstream gRPC authentication verified the caller's tenant identity.
Attack Vector
Exploitation requires an authenticated tenant worker (network-reachable gRPC access with low privileges) and knowledge of a target tenant's durable-task UUID. Because durable-task identifiers are UUIDv4 values, they are not enumerable in practice, which materially reduces exploitability. When the identifier is known — for example, through log exposure, misconfigured telemetry, or a compromised integration — the attacker can call the WorkerStatus gRPC path and receive durable event-log records for the target tenant.
// Patch in pkg/repository/durable_events.go: the tenant identifier
// is now included in the ListSatisfiedEntries parameters.
Taskexternalids: taskExternalIds,
Nodeids: nodeIds,
Branchids: branchIds,
+ Tenantid: tenantId,
})
if err != nil {
Source: GitHub commit 15bc7923
-- Patch in pkg/repository/sqlcv1/durable_event_log.sql: the CTE now
-- filters lookup rows by tenant_id, enforcing tenant isolation in SQL.
FROM inputs i
JOIN v1_lookup_table lt ON lt.external_id = i.external_id
JOIN v1_task t ON (t.id, t.inserted_at) = (lt.task_id, lt.inserted_at)
+ WHERE lt.tenant_id = @tenantId::UUID
)
SELECT
Source: GitHub commit 15bc7923
Detection Methods for CVE-2026-88978
Indicators of Compromise
- gRPC WorkerStatus calls originating from a worker whose authenticated tenant differs from the tenant that owns the requested durable-task, node, or branch identifiers.
- Repeated ListSatisfiedEntries lookups returning rows whose tenant_id does not match the caller's tenant context in application logs.
- Access patterns where a single worker enumerates or probes durable-task UUIDs that were not created by its own tenant.
Detection Strategies
- Instrument the repository layer to log the caller tenant_id alongside each ListSatisfiedEntries invocation and alert on tenant mismatches.
- Add server-side assertions that compare the tenant on returned rows to the authenticated caller and record violations.
- Review historical gRPC access logs for WorkerStatus calls carrying durable-task identifiers that were never emitted to the calling tenant.
Monitoring Recommendations
- Ship Hatchet application and gRPC logs to a centralized analytics platform and correlate durable-task identifiers with owning tenants.
- Alert on anomalous spikes in WorkerStatus polling volume or unusually broad identifier sets per worker.
- Track deployment inventory to confirm all Hatchet instances are on 0.106.1 or later.
How to Mitigate CVE-2026-88978
Immediate Actions Required
- Upgrade all Hatchet installations to version 0.106.1 or later, which adds the tenant filter in both the Go repository call and the SQL query.
- Rotate or invalidate any durable-task UUIDs that may have been exposed to untrusted parties, integrations, or shared logs.
- Audit gRPC access logs for evidence of cross-tenant WorkerStatus queries prior to the upgrade.
Patch Information
The fix is delivered in Hatchet 0.106.1. The patch adds a tenantId parameter to ListSatisfiedEntries in pkg/repository/durable_events.go and introduces a WHERE lt.tenant_id = @tenantId::UUID predicate in pkg/repository/sqlcv1/durable_event_log.sql. See the GitHub Security Advisory GHSA-992g-9cr3-vm5x and the upstream commit for full patch details.
Workarounds
- Restrict gRPC access to trusted workers only and ensure durable-task UUIDs are not exposed in shared telemetry, logs, or third-party integrations.
- Operate single-tenant deployments where feasible until the upgrade is complete, since single-tenant instances are not impacted in practice.
- Enforce network segmentation between tenant workers so that cross-tenant identifier leakage cannot be paired with reachable gRPC endpoints.
# Upgrade Hatchet to the patched release
git -C hatchet fetch --tags
git -C hatchet checkout v0.106.1
# Verify the installed version
hatchet-engine --version
Disclaimer: This content was generated using AI. While we strive for accuracy, please verify critical information with official sources.

