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)
PoC verification
Evidence pack
findings/poc/DF-3945 Β· 6 files| File | Type | Description | Size | |
|---|---|---|---|---|
| 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 β 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
- 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,cflpipe control togen9_init_indirectctx_bbbetweengen8_emit_flush_coherentl3_wa()andemit_lri(). Fetched and diffed against this tree: - intel_lrc.c:1581batch = gen8_emit_flush_coherentl3_wa(engine, batch);- intel_lrc.c:1583batch = 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). - 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. - 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->stateNULL-guard present (upstream "Check for ce->state before destroy" carried, :1292); request holds hw_context ref throughexeclists_reset(:1983). - (b) priolist RB walks:
lookup_priolist/__unwind_incomplete_requests/execlists_scheduleDFS 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_tailwrap 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_testableno 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
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.
No comments yet.