{"id":"CVE-2026-48036","aliases":["GHSA-32g3-35g9-wc9g"],"title":"@hulumi/drift: Drift classifier fails open on adapter errors and over-promotes Mixed verdicts","summary":"@hulumi/drift: Drift classifier fails open on adapter errors and over-promotes Mixed verdicts","severity":"high","cwe":["CWE-755"],"vendor":"hulumi","product":"@hulumi/drift","ecosystem":"npm","affected":["@hulumi/drift < 1.4.0"],"patched":["@hulumi/drift 1.4.0"],"published":"2026-06-10","updated":"2026-06-10","source":"GHSA","sourceUrl":"https://github.com/advisories/GHSA-32g3-35g9-wc9g","references":[{"url":"https://github.com/kerberosmansour/hulumi/security/advisories/GHSA-32g3-35g9-wc9g"},{"url":"https://github.com/kerberosmansour/hulumi/pull/178"},{"url":"https://github.com/advisories/GHSA-32g3-35g9-wc9g"}],"tags":["ghsa","npm"],"ingestedAt":"2026-07-07T15:41:59.573Z","epss":0.0029,"epssPercentile":0.21753,"slug":"CVE-2026-48036","body":"## Overview\n\n**Affected:** `@hulumi/drift` `< 1.4.0` — **Fixed in:** `1.4.0` — **Severity:** Medium — **CWE-755 (Improper Handling of Exceptional Conditions)**\n\n#### Summary\n\n`@hulumi/drift` runs four adapters that each ask a different question about whether a resource has drifted (Pulumi-state diff, provider-version change, CloudTrail event, etc.). A classifier combines the adapters' answers into a verdict like `None / none`, `ConsoleBreakGlass / high`, or `Mixed / high`, and caches the verdict for 6 hours by default.\n\nTwo related bugs from one root cause — the classifier only read each adapter's `detected: true/false` field and ignored whether the adapter itself succeeded:\n\n1. **Cached \"all clear\" on adapter failure.** When an adapter failed (e.g. transient network error from the Automation API), the classifier read `detected: false`, concluded \"no drift\", and cached the verdict as `None / none` for 6 hours. A single transient failure could mask real console-break-glass mutations for the rest of the window.\n2. **Mixed verdicts without real evidence.** The `Mixed / high` and `ConsoleBreakGlass / high` verdicts (incident severity) could fire on the \"the CloudTrail probe round-tripped successfully\" signal rather than actual evidence that anything had been changed via the console. Normal provider-API churn could end up falsely escalated to incident severity.\n\n#### Impact\n\nConsumers running drift detection in CI / cron could see transient adapter failures silently cached as \"all clear\" — masking real attacks for up to six hours — or see ordinary provider-version churn falsely promoted to incident severity. Either way, the verdict source was unreliable for downstream incident workflows that gate on it.\n\n#### Patches\n\nUpgrade to `@hulumi/drift@1.4.0`. Classifier-only fix (the TLA+-verified 6-row verdict matrix is byte-identical):\n\n- adapter failures now fail closed to `Unknown / low`, and degraded verdicts are not written to the cache;\n- the `Mixed` / `ConsoleBreakGlass` promotion now requires real CloudTrail event evidence rather than probe liveness.\n\n#### Workarounds\n\nSetting `options.minConfidence: \"medium\"` on the classifier call prevents the degraded `None / none` from being cached (it doesn't meet the threshold), partially mitigating case (1). No workaround for case (2).\n\n#### Resources\n\n- [PR #178](https://github.com/kerberosmansour/hulumi/pull/178) (Cluster D); regression tests in `packages/drift/tests/classifier-fail-closed.test.ts`.\n\n## Affected packages\n\n- `@hulumi/drift < 1.4.0`\n\n## Remediation\n\nUpgrade to a patched release:\n\n- `@hulumi/drift 1.4.0`","depth":"twilight","depthScore":41,"depthScoreParts":{"impact":41.3,"likelihood":0.1,"exploitation":0,"ransomware":0},"changes":[]}