Files
AXP-Resurection/docs/009-cve-bisect-plan.md
T
sunfish-admin deaaf42caa 009: Magisk ship pack through US-S5-1 + US-S4 OpenSSH/Jelly/Gallery2.
Release-keys/AVB, CVE clean+hi batches, Yama/slabrand, Pro branding,
bundled apps, and AXP-class product surface docs/scripts.
2026-10-05 10:42:00 +02:00

172 lines
9.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 009 CVE bisect plan (after full CVE Google-logo hang)
**Baseline GOOD:** Stage1 + combo4 + Clang FORTIFY
Artifact: `20260929T123401Z-axp-stage1-combo4` (LAB recovered 2026-09-29 via
`fastboot flash boot` of that pack’s Magisk `boot.img`).
**BAD:** Stage1+combo4+FORTIFY + full `cve-strict.list` (503)
Artifact: `20260929T181525Z-axp-stage1-combo4-cve` — compiles, wlan CRC OK,
**hangs at Google logo**. **Do not** re-flash the full 503 set.
## Audit before more flashes (2026-09-29 evening)
Owner review correctly flagged the applicator and asked for reject/partial
review **before** bisect flashes.
| Check | Result |
|-------|--------|
| Patch `FAIL` count on BAD build | **0** (`OK=503`) — no `.rej` from that run |
| Continue-on-fail + delete `.rej` | **Procedural defect** (fixed in `apply_cve_strict.sh`) — would hide incomplete applies on future drift |
| GNU patch “Succeeded with fuzz≥2” | **0** |
| Hunks with **\|offset\| ≥ 200 lines** | **168** of 503 — strong mis-apply risk even when `patch` exits 0 |
| \|offset\| ≥ 200 list | `cve-high-offset-ge200.txt` (**73 unique** paths in report extract; full 168 in host fuzz report) |
| Host report | `/srv/rom/artifacts/009-axp-los23-port/cve-stage/apply-cve-strict-20260929T173037Z-fuzz-report.txt` |
Logo hang alone does **not** identify a CVE id; “Additional Setup” is unrelated.
USB loss after sideload does **not** mean the zip was not installed.
### Applicator fix (`apply_cve_strict.sh`)
- Default: **abort** on first FAIL (no partial tree).
- Keep `*.rej` / `*.orig` under `CVE_REJECT_DIR` (no silent delete).
- **QUALITY_FAIL** if fuzz ≥ `CVE_MAX_FUZZ` (default 1) or
\|offset\| ≥ `CVE_MAX_ABS_OFFSET` (default **200**).
- Forensic only: `CVE_STRICT_CONTINUE=1`.
H1 bacon (`009-bacon-cve-h1`) **stopped** — do not flash that half until a
strict re-apply (offsets gated) produces a clean tree.
## Next method (revised)
1. Build allowlist = `cve-strict.list` **minus** high-offset (≥200) suspects
(and existing denylist).
2. Re-apply with new applicator (must finish with QUALITY_FAIL=0 / abort).
3. Bacon that “clean-offset” set → LAB boot test (**fastboot flash boot** only;
recover with Stage1 boot if needed).
4. If still BAD → classic binary bisect on the **clean** list only.
5. Separately, quarantine high-offset patches for manual review / port
(do not bulk-apply with huge offsets).
## Flash rules (LAB)
1. sunfish recovery is in `boot` — bad kernel ⇒ Recovery looks like logo loop.
2. Unbrick: `fastboot -s 11231JEC207477 flash boot <GOOD boot.img>` → reboot.
**Always** pin LAB serial. Never flash “any” fastboot device (GOLDEN risk).
3. No reboot-loop automation. No unscoped recover watchers.
4. One reboot after a deliberate flash.
## Diagnostic limits (owner review 2026-09-30)
- A BAD half **reproduces** the hang; it does **not** prove a single CVE is the
root cause (interactions / order / mis-apply semantics still possible).
- Applicator had **0 FAIL** on the original full set; abort/offset gates were
still required, but they did **not** clear this logo hang.
- Bisect flashes are **`boot.img` only** on `boot_a` (serial-pinned). No slot /
download / flash miss seen on H1a2: hang tracks what H1a2 changes vs Stage1
base. **No** demonstrated need to re-sideload full zip or wipe data for this
bisect.
- “CRC wlan OK” so far = host-side `kmalloc_caches` only (kernel
`Module.symvers` vs pack `wlan.ko`). Does **not** check all symbols nor the
on-device installed module (adb pull denied without root). Narrows one
suspicion; does **not** rule out module ABI skew.
- Next interpretation: if H1a2a boots, still test H1a2b. If **both** boot alone
but H1a2 fails → interaction/dependency, not a single-patch proof.
- **Applicability (owner 2026-10-01):** AXP A15 success ≠ correct port to
LOS23/A16 sunfish. Per [kernel CVE process](https://cdn.kernel.org/doc/html/latest/process/cve.html),
each CVE must be judged for *this* tree/config/modules — not bulk-trusted.
H1a2b includes useful fixes (USB gadget UAF, QC audio DSP bounds, F2FS
state, QRTR) but also arch/drivers off in our defconfig (x86/AMD, s390,
CAN/ATA/SAS/kprobes/brcmfmac, …). These are mostly **bugfixes**, not
transversal hardening like FORTIFY/allocator. Concrete hypothesis (unproven):
`CVE-2022-49980` (`udc_lock` on gadget events) — check whether this tree
already holds that lock on the same paths (possible deadlock). Also re-audit
F2FS patches vs exact sunfish F2FS version/deps. **In H1a2b1b list**
(not H1a2b1a).
### Code review: CVE-2022-49980 vs msm-4.14 (2026-10-01)
Patch only wraps `udc->driver` read in `usb_udc_uevent()` with
`mutex_lock(&udc_lock)`. On **our** `msm-4.14` `udc/core.c` (base
`28f9290ae067`, pre-CVE apply), `kobject_uevent()` is still invoked **while
holding `udc_lock`**:
- `usb_gadget_remove_driver()` → `KOBJ_CHANGE` (called from
`usb_del_gadget_udc` / `usb_gadget_unregister_driver` under lock)
- `udc_bind_to_driver()` → `KOBJ_CHANGE` (called from
`usb_gadget_probe_driver` under lock)
`dev_uevent` / `class->dev_uevent` run **synchronously** inside
`kobject_uevent`. `udc_lock` is a non-recursive `mutex`. Applying 49980 alone
⇒ same thread: lock → uevent → `usb_udc_uevent` → lock again ⇒ **deadlock**.
This matches community reports that backporting CVE-2022-49980 to older trees
(e.g. 5.10.y) introduces deadlock; mainline later needed **lock-scope**
changes (unbind/bind outside `udc_lock`), not the one-liner alone.
sunfish_defconfig: `CONFIG_USB_GADGET=y`, rich `CONFIG_USB_CONFIGFS_*` (ADB /
MTP / etc.) — gadget bind/unbind at boot is plausible. Still **hypothesis**
until H1a2b1b (or a 49980-only build) is LAB-tested; do **not** ship 49980
without the companion lock-order fix (or omit it from the allowlist).
**2026-10-01 evening:** 49980-only LAB = BAD (logo). Deadlock paths on this
tree include both (a) `device_add` / uevent under `udc_lock` at UDC register
and (b) `kobject_uevent` from remove/bind while lock held. Serial console /
pstore stack not captured yet — would confirm hang site; denylist stands.
## GPS
FR-018: no location lockdown.
## Status
- [x] Full CVE = BAD (logo); documented do-not-reflash
- [x] Audit apply log (0 FAIL, many huge offsets)
- [x] Fix applicator abort + keep rejects + offset/fuzz gate
- [x] Stop premature H1 bacon (full-503 halves archived `*.full503.bak`)
- [x] Clean-offset allowlist bacon + LAB boot
Artifact `20260929T203844Z-axp-stage1-combo4-cve-clean` (430 patches,
QUALITY_FAIL=0) — **BAD** 2026-09-29T20:42Z: `fastboot flash boot`
OK on `boot_a`, then Google-logo hang / USB dark (~4+ min). Recover =
Stage1 `20260929T123401Z-axp-stage1-combo4` boot only.
- [x] Clean H1 (215) bacon + LAB boot — artifact
`20260929T213532Z-axp-stage1-combo4-cve-h1` — **BAD** 2026-09-30
(logo). H1 **reproduces**; H2 untested; not a single-CVE ID yet.
- [x] H1a (108) — `20260930T075006Z-…-cve-h1a` **BAD** (logo). H1a
**reproduces**; interaction possible; module coherence not yet checked
for CVE boots.
- [x] H1a1 (54) — `20260930T084048Z-…-cve-h1a1` **BOOT_OK** 2026-09-30T19:21Z
(kernel `#38`, slot `_a`). Build-tree `wlan`/`kmalloc_caches` CRC
`0xe7ccd971` matches Stage1 Gate G (device pull of `wlan.ko` denied
without root; intra-pack CRC OK). H1a1 set alone does **not** reproduce
the hang.
- [x] H1a2 (54) — `20260930T200752Z-…-cve-h1a2` **BAD** (owner: Google logo
after flash; reproduces). H1a1 GOOD + H1a2 BAD ⇒ hang associated with
H1a2 set (still not a single id; module CRC intra-pack was Stage1-class
on prior boots).
- [x] H1a2a (27) — `20260930T213106Z-…-cve-h1a2a` **BOOT_OK** 2026-09-30T21:36Z
(kernel `#40`). Host `kmalloc_caches` match. Alone does **not** reproduce.
- [x] H1a2b (27) — `20260930T222148Z-…-cve-h1a2b` **BAD** (logo alone).
H1a2a GOOD + H1a2b BAD ⇒ hang associated with H1a2b set (not proven
single patch). Note: owner phrasing “combi” = this half failed on LAB;
interaction check already satisfied by testing halves separately.
- [x] H1a2b1 (14) — `20260930T231324Z-…-cve-h1a2b1` **BAD** (logo). Includes
`CVE-2022-49980` (udc_lock hypothesis). Set of 14 reproduces.
- [x] H1a2b1a (7) — `20261001T001808Z-…-cve-h1a2b1a` **BOOT_OK** 2026-10-01
(kernel `#43`). No `CVE-2022-49980` in this half.
- [x] H1a2b1b (7, includes `CVE-2022-49980`) —
`20261001T010705Z-…-cve-h1a2b1b` **BAD** 2026-10-01 (logo). H1a2b1a
GOOD + H1a2b1b BAD ⇒ hang associated with this 7-set (49980 still
unproven alone).
- [x] **49980-only** — `20261001T160836Z-…-cve-49980-only` **BAD** 2026-10-01
(logo). Single-patch reproduce on LAB. Added to `cve-denylist.txt`.
Do not re-apply without lock-scope companion fix.
- [x] H1a2b1b **without** 49980 (6) —
`20261001T170442Z-…-cve-h1a2b1b-no49980` **BOOT_OK** 2026-10-01
(kernel `#46`, LAB `11231JEC207477`). Confirms 49980 was the **sole**
hang trigger in the H1a2b→…→H1a2b1b BAD lineage (other six alone OK).
- [x] Clean-offset **minus 49980** (429) —
`20261001T180955Z-axp-stage1-combo4-cve-clean` **BOOT_OK** 2026-10-01
(kernel `#47`). List md5 `e05056f6…`; apply OK=429. Prior BAD 430 pack
`20260929T203844Z-…` kept. **49980 was the only logo hang** found in the
clean-offset set so far. 15m poll loop stopped after flash.