β¬’ DragonFlyBSD Kernel Audit
← triage Β· dashboard
DF-3945

CVE-2019-14615 carried: Gen9 indirect-context WA batch lacks the EU residual-state cleardown PIPE_CONTROL (cross-context GPU info leak on SKL/KBL/BXT/GLK/CFL)

Summary

This tree's i915 is a 4.19-rc-era snapshot that carries every other intel_lrc.c stable fix of its vintage (both 2018 execlists write-serialisation mb() fixes verbatim) but NOT the January 2020 stable backport dd4f3b3508f6 (CVE-2019-14615). That fix inserts the WaClearSlmSpaceAtContextSwitch PIPE_CONTROL into gen9_init_indirectctx_bb between the coherent-L3 flush WA and emit_lri; our gen9 BB jumps straight across, and the only similar pipe control is KBL-A0-stepping-gated. Gen8 has the cleardown - exactly matching the upstream commit's premise. On Gen9 hardware the EU register residual state is not cleared at context switch, so one GPU context's residual data is observable by the next - the disclosed cross-context info leak. Carriage proof is source-equivalence (guest-side dump of the BB + upstream patch hunk matching line-for-line); runtime leak needs Gen9 hardware. Backport fix (git-apply-clean).

Discussion (0)

No comments yet.

PoC verification

Evidence pack

findings/poc/DF-3945 Β· 6 files
FileTypeDescriptionSize
check_cve_carriage.sh β€” 706 B view raw
run.log β€” 665 B view raw
env.txt β€” 68 B view raw
VERDICT.md β€” 3.7 KB ↓ raw
fix.diff β€” 696 B view raw
verdict.json β€” 2.6 KB view raw
VERDICT.md
↓ download raw

VERDICT β€” DF-3945

Bottom line

not_reproduced on the audit guest (no Intel Gen9 GPU; virtio-gpu only) β€” carriage of CVE-2019-14615 is certain by source equivalence.

Proof of carriage

  1. Upstream stable history (github gregkh/linux, path drivers/gpu/drm/i915/intel_lrc.c, linux-4.19.y): the newest post-2018 commit touching this file is dd4f3b3508f6 (2020-01-14), the backport of bc8a76a152c5 fixing CVE-2019-14615. Its full 9-line patch adds a WaClearSlmSpaceAtContextSwitch:skl,bxt,kbl,glk,cfl pipe control to gen9_init_indirectctx_bb between gen8_emit_flush_coherentl3_wa() and emit_lri(). Fetched and diffed against this tree: - intel_lrc.c:1581 batch = gen8_emit_flush_coherentl3_wa(engine, batch); - intel_lrc.c:1583 batch = emit_lri(batch, lri, ARRAY_SIZE(lri)); β€” nothing in between. The patch's exact insertion context matches our file (the 4.19.y patch hunk pre-context "WaFlushCoherentL3CacheLinesAtContextSwitch:skl,bxt,glk" is at our :1580).
  2. Our snapshot otherwise includes everything else from that stable history: the Nov 2018 write-serialisation mb() (0a823e8fd4fd) and the Dec 2018 Braswell full-mb (cf66b8a0ba14) are both present verbatim in execlists_update_context() (intel_lrc.c:440-456). So the CVE fix is the one carried gap, not a wholesale version skew.
  3. Gen8's cleardown exists in-tree (intel_lrc.c:1509-1517), matching the upstream commit message ("this workaround is already in place for gen8"); Gen9's is absent, and the only Gen9 pipe control resembling it is A0-stepping-gated (intel_lrc.c:1587 IS_KBL_REVID(..., 0, KBL_REVID_A0)), which does not cover production SKL/KBL/BXT/GLK/CFL steppings.

Impact

Cross-context GPU info disclosure on Intel Gen9 (SKL/KBL/BXT/GLK/CFL) when two security domains share the GPU (multi-user machine, containers, or unprivileged user vs setuid GPU consumer). Intel PSIRT-TA-201910-001 / CVE-2019-14615, NVD Medium. Confidentiality-only, local, requires Gen9 hardware β€” hardware-gated for this audit guest (env.txt: no /dev/dri, virtio-gpu 1af4:1100).

Hunt-list cross-check (intel_lrc.c pass 2)

  • (a) context pin/unpin lifetimes: execlists_context_pin/unpin/destroy (:1288-1414) balanced; ce->state NULL-guard present (upstream "Check for ce->state before destroy" carried, :1292); request holds hw_context ref through execlists_reset (:1983).
  • (b) priolist RB walks: lookup_priolist/__unwind_incomplete_requests/ execlists_schedule DFS match upstream 4.19-rc; alloc-failureβ†’priority-bump (:293-308) and default_priolist embedding are stock.
  • (c) LRI emission: all ring_begin() sizes match emitted dword counts (emit_pdps 18/18, bb_start 6/6, flush 4/4, flush_render len-exact, breadcrumbs 6+2 and 8+2); emit_lri count ≀63 guarded (:1541).
  • (d) wa-tail/tail writebacks: unwind_wa_tail/gen8_emit_wa_tail wrap via intel_ring_wrap (:319-323, :2233-2239) β€” the "Wrap around the tail offset" stable fix is carried.
  • (e) upstream CVEs: 0a823e8fd4fd and cf66b8a0ba14 carried (mb() at :455); CVE-2019-14615 NOT carried β†’ this finding. No other intel_lrc.c CVEs exist in the 4.19.y history (checked the full per-path commit list).

Fix validation

Not possible on this guest (no Gen9 GPU): fix_status=not_testable. fix.diff is the upstream fix adapted to this tree's i915_scratch_offset() API, git apply --check clean.

Fix status (batch validation)

Applied with the 36 sibling fix.diffs of this batch in findings/poc/_batch41/all_fixes.patch; single in-guest make -j6 nativekernel KERNCONF=X86_64_GENERIC completed RC=0 with zero errors under -Werror (full log: findings/poc/_batch41/fix_build8.log). Behavior A/B intentionally skipped for this Info-tier item.

Fix verification

not_testable
baseline no→ patch + rebuild →patched clean

no Gen9 GPU on the audit guest; fix.diff = upstream CVE fix adapted to i915_scratch_offset(), applies clean to sys/

fix.diff; git apply --check clean
↓ fix.diffper-fix-DF-3945

Confirmed kernel references

Detail

Exploit chain

on Gen9 HW: victim context computes on secrets (e.g. crypto via EGL/VA-API) -> attacker's unprivileged context submits a shader reading uninitialized EU registers before first write -> residual victim data disclosed

Evidence (decisive lines)

run.log (guest-side gen9/gen8 BB dumps showing missing cleardown; FLUSH_L3 only at :1512 gen8 and :1589 KBL-A0), VERDICT.md (upstream 4.19.y history walk + patch-context match), fix.diff (adapted upstream fix, git-apply-clean)

PoC changes

no seed; source-presence checker vs upstream patch dd4f3b3508f6

Verified recommended fix

Backport the upstream gen9 cleardown pipe control (fix.diff) into gen9_init_indirectctx_bb

Verdict

CVE-2019-14615 (Intel PSIRT-TA-201910-001) is carried: the Gen9 indirect-context workaround batch gen9_init_indirectctx_bb (intel_lrc.c:1553-1627) lacks the unconditional WaClearSlmSpaceAtContextSwitch:skl,bxt,kbl,glk,cfl PIPE_CONTROL that upstream bc8a76a152c5 / stable dd4f3b3508f6 insert between the coherent-L3 flush WA (:1581) and emit_lri (:1583); only a KBL-A0-stepping-gated variant exists (:1587). Gen8 has the cleardown (:1509-1517), matching the upstream commit text. The tree carries all other intel_lrc.c stable fixes of its vintage (Nov/Dec 2018 execlists write-serialisation mb() fixes present at :455), isolating this as the carried gap. Impact on real Gen9 hardware (SKL/KBL/BXT/GLK/CFL): EU residual state is not cleared on context switch -> cross-context/cross-user info disclosure. Guest has no Intel GPU, so not reproduced at runtime.