Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessAuthenticate as tenant worker
-
DeliveryObtain victim tenant's durable task UUID
-
ExploitOpen DurableTask stream on same dispatcher process
-
ExecutionRegistered in tenant-blind routing map
-
ImpactReceive victim's durable callback payload
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V8 - Authorization Object-level authorization, IDOR prevention
|
| Exploitation Conditions | Exploitation requires ALL of the following: (1) a multi-tenant Hatchet deployment running a version prior to 0.95.3 - single-tenant deployments are unaffected in practice; (2) valid authenticated tenant-worker credentials (PR:L); (3) prior knowledge of a victim tenant's durable task UUID, which is a non-enumerable UUIDv4 and therefore cannot be brute-forced or guessed (must be obtained out-of-band); and (4) the attacker's DurableTask stream must be held open on the SAME dispatcher process that is handling the victim's durable task, so that the tenant-blind durableInvocations routing map delivers the callback to the attacker. These conditions - non-enumerable identifier plus same-process co-location timing - are the primary limiting factors (AC:H) and confine exploitation to targeted rather than opportunistic attacks; impact is confidentiality-only (leak of the durable callback result payload). |
| Impact | This is a genuine but low-priority multi-tenant confidentiality flaw, and the signals are consistent rather than conflicting. The vendor CVSS 3.1 score of 3.1 (AV:N/AC:H/PR:L/UI:N/S:U/C:L/I:N/A:N) accurately reflects a narrow, high-complexity, authenticated-only issue with limited (low) confidentiality impact and no integrity or availability effect - I concur with this vector. AC:H is well justified: the description explicitly states UUIDv4 task identifiers are not enumerable, and successful exploitation additionally requires the attacker's stream to remain open on the SAME dispatcher process handling the victim's callback, a race/co-location condition the attacker cannot reliably force. No EPSS score, no CISA KEV listing, and no public POC are present in the input; the fix commit (9555bfdd) is confirmed but does not constitute an exploit. Net: this is a real defect worth patching for multi-tenant/SaaS Hatchet operators, but it is NOT a high-real-risk issue - it is a low-CVSS flaw whose low score correctly matches its constrained, targeted exploitation profile. The single-tenant caveat further shrinks the exposed population. |
| Exploit ScenarioDerived | A malicious but legitimately authenticated tenant on a shared multi-tenant Hatchet deployment obtains another tenant's durable task UUID (e.g., leaked via logs, a chained info-disclosure bug, or an insider) and opens a DurableTask stream on the dispatcher process that is servicing the victim's task. Because the durableInvocations routing map is keyed only by task UUID without tenant identity, the victim's durable callback result payload is delivered to the attacker's stream. No public exploit code was identified at time of analysis, and the non-enumerable UUID plus same-process co-location requirement make this opportunistic and targeted rather than mass-exploitable. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Sep 21, 2026
Cross-tenant disclosure of durable workflow callback results in Hatchet before 0.95.3 lets an authenticated tenant worker receive another tenant's durable callback result payload. The V1 DurableTask stream handler stores worker-supplied task_external_id values in the durableInvocations routing map before tenant ownership is verified, and callback delivery resolves that map by task UUID alone with no tenant identity, so a tenant worker that knows a victim's durable task UUID and holds a stream open on the same dispatcher process can be handed the victim's payload. Exploitation requires out-of-band knowledge of a non-enumerable UUIDv4 plus same-process co-location, giving an assessed CVSS of 3.1 (AV:N/AC:H/PR:L/UI:N/S:U/C:L/I:N/A:N); no public exploit identified at time of analysis, and single-tenant deployments are unaffected in practice.
RemediationAI
Upgrade Hatchet to version 0.95.3 or later, which is the vendor-released patch; the fix commit 9555bfdd1e97f61d25e614ccaa107c5fb7dc4976 rekeys the durableInvocations routing map on a composite (tenantId, taskId) key and propagates tenant identity through all callback delivery paths, and the vendor advisory is at https://github.com/hatchet-dev/hatchet/security/advisories/GHSA-9q4h-f4x5-ffq8. Where immediate upgrading is not feasible, the most effective compensating control is to eliminate the same-process co-location precondition by running separate Hatchet dispatcher deployments per tenant or per trust boundary, rather than pooling mutually untrusted tenants onto a shared dispatcher; the trade-off is higher infrastructure cost and loss of pooled scheduling efficiency. Organizations should also treat durable task UUIDs as sensitive identifiers, avoid logging or surfacing them across tenant boundaries, and audit whether any multi-tenant channel could expose a victim UUID out-of-band, since without that UUID the flaw is not exploitable. Note that because the root cause is a missing tenant scoping on an identifier rather than a credential weakness, no authentication-hardening or rate-limiting change removes the exposure, and there is no vendor-provided configuration toggle identified in the available data; single-tenant deployments can be considered unaffected in practice but should still be upgraded to 0.95.3 to stay on the maintained release.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 2 packages in go, euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
Hatchet's dispatcher process maintains an in-memory syncx.Map named durableInvocations that routes durable task invocations to the correct worker stream. In the vulnerable code (internal/services/dispatcher/dispatcher_v1.go and server_v1.go), that map is keyed on a bare uuid.UUID taken from the worker-supplied task_external_id, and the registration path (d.durableInvocations.Store(taskExtId, invocation)) occurs before tenant ownership is validated. Callback delivery functions such as DeliverDurableEventLogEntryCompletion and deliverSatisfiedEntries then load the entry using only the task UUID, so lookups are tenant-blind. This is CWE-639 (Authorization Bypass Through User-Controlled Key): an attacker-influenced identifier is used as the direct lookup key for a protected resource without being scoped to the caller's authorization context. The upstream fix introduces a durableInvocationsKey struct carrying both tenantId and taskId, rekeys every Store, Delete and Load call on that composite, and threads the invocation's tenantId through deliverSatisfiedEntries, handleMemo, handleTriggerRuns and handleWaitFor, as well as adding task.TenantID in handleDurableCallbackCompleted. The CVSS vector confirms network reachability (AV:N) and low privileges (PR:L, i.e. an authenticated tenant worker), with high attack complexity (AC:H) reflecting the need for a non-enumerable UUID and dispatcher co-location, and confidentiality-only impact (C:L).
Know when Hatchet gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
AV:N/AC:H/PR:L/UI:N/S:U/C:L/I:N/A:N
Network-reachable but requires a non-enumerable UUID plus same-dispatcher-process co-location (AC:H) and an authenticated tenant worker (PR:L); leaks only a callback payload (C:L), no integrity or availability impact.
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
1DescriptionCVE.org
Hatchet is a platform for orchestrating background tasks, AI agents, and durable workflows at scale. Prior to 0.95.3, the V1 DurableTask stream handler stores worker-supplied task_external_id values in the durableInvocations routing map before tenant ownership is verified, and callback delivery resolves that map by task UUID without tenant identity. An authenticated tenant worker that knows another tenant's durable task UUID and keeps a stream open on the same dispatcher process can receive that task's durable callback result payload. UUIDv4 values are not enumerable, and single-tenant deployments are unaffected in practice. This issue is fixed in version 0.95.3.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Account fixation in Hatchet's OAuth callback handling lets an unauthenticated attacker bind a victim's existing Hatchet
Cross-tenant information disclosure in Hatchet before 0.106.1 allows an authenticated tenant worker in a multi-tenant de
Unauthenticated remote attackers can exhaust server memory in Hatchet 0.110.5 and earlier by sending arbitrarily large o
Hatchet deployments prior to 0.91.1 expose a cross-tenant insecure direct object reference (IDOR) on the durable-task ev
Server-side request forgery in Hatchet versions prior to 0.91.1 lets an authenticated tenant of the platform coerce the
EUVD-2026-83979
GHSA-9q4h-f4x5-ffq8
NVD
CVE.org
EPSS
Vulnrichment
Exploit-DB