009: Polish bacon fixes, OTA host scripts, and migration docs.

Restore disable_configstore, EuiccDisabler and thermal CDEV guards, branding
and rebuild/sync helpers; document device roles, laptop migration, and Gitea.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
sunfish-adminandCursor committed 2026-10-16 21:06:45 +02:00
1 parent 3f941e8451
commit 2d145c2878
3193 files changed
+21264 -371

No files matched your search

+372
View File
@@ -0,0 +1,372 @@
# AXP Resurrection Pro (AXPR) — Presentación de la ROM
**Dispositivo:** Google Pixel 4a (`sunfish`)
**Base upstream:** LineageOS **23.2** / Android **16** (`BP4a`, `lineage_sunfish-user`)
**Producto:** **AXP Resurrection Pro** — clon funcional de AXP.OS Pro (LOS22 / GOLDEN) sobre LOS23
**Repositorio:** `AXP_Resurection` (rama Magisk / `009`)
**Documento:** síntesis enriquecida para lectura o exportación a PDF — **2026-10-11**
**Público / usuarios:** ver [`public/AXP-Resurrection-Pro-sunfish.md`](public/AXP-Resurrection-Pro-sunfish.md) y lista CVE [`public/kernel-cve-backport-list.txt`](public/kernel-cve-backport-list.txt).
---
### Exportar a PDF (en el laptop)
```bash
cd /home/aventura/Workspaces/AXP_Resurection
# Opción A — pandoc (si está instalado)
pandoc docs/009-axpr-rom-presentation.md -o docs/009-axpr-rom-presentation.pdf \
--pdf-engine=xelatex -V geometry:margin=2.5cm -V lang=es
# Opción B — navegador / VS Code: vista previa Markdown → Imprimir → Guardar como PDF
```
**Fuentes normativas:** `specs/009-axp-los23-port/spec.md`, `.specify/memory/constitution.md`, `docs/009-handoff-20261008.md`. Este archivo es **presentación**; no sustituye el spec.
---
## Tabla de contenidos
1. [Resumen ejecutivo](#1-resumen-ejecutivo)
2. [Arco del proyecto (punto 0 → hoy)](#2-arco-del-proyecto-punto-0--hoy)
3. [Línea base LineageOS vs identidad AXPR](#3-línea-base-lineageos-vs-identidad-axpr)
4. [Qué se clonó de AXP.OS / EXTENDROM](#4-qué-se-clonó-de-axpos--extendrom)
5. [Kernel: AXP, GrapheneOS-class, CVE](#5-kernel-axp-grapheneos-class-cve)
6. [Userspace: parches AXP en Android 16](#6-userspace-parches-axp-en-android-16)
7. [Debloob / de-Google selectivo](#7-debloob--de-google-selectivo)
8. [microG, Play y apps empaquetadas](#8-microg-play-y-apps-empaquetadas)
9. [Magisk preroot (sin KernelSU en ship)](#9-magisk-preroot-sin-kernelsu-en-ship)
10. [Hardening userspace y malloc](#10-hardening-userspace-y-malloc)
11. [Toggles y políticas de privacidad](#11-toggles-y-políticas-de-privacidad)
12. [Firma, AVB y actualizaciones](#12-firma-avb-y-actualizaciones)
13. [Inspiración GrapheneOS (qué sí / qué no)](#13-inspiración-grapheneos-qué-sí--qué-no)
14. [Verificación y hitos en LAB](#14-verificación-y-hitos-en-lab)
15. [Build de referencia actual (oct 2026)](#15-build-de-referencia-actual-oct-2026)
16. [Abierto / no objetivo](#16-abierto--no-objetivo)
17. [Apéndice: scripts de integración](#17-apéndice-scripts-de-integración)
18. [Apéndice: lecciones LAB (Magisk / flash)](#18-apéndice-lecciones-lab-magisk--flash)
---
## 1. Resumen ejecutivo
**AXP Resurrection Pro (AXPR)** no es un LineageOS con “algunos APKs”: es un **resurrection track** que toma **LineageOS 23.2 vanilla** probado en LAB (`003`) y reintegra el **conjunto de capacidades AXP.OS Pro** (referencia **GOLDEN** en Pixel 4a con AXP 22.2 / Android 15), adaptado a **Android 16** y **Magisk 30.7**, con:
- **Kernel** `msm-4.14` de LOS + **Stage 1** Graphene/AXP (~30 parches) + **FORTIFY** + **~429 CVE** “clean-offset” + **lotes high-offset** + endurecimiento **US-S5-1** (sin Yama como GOLDEN).
- **Userspace** microG + **Phonesky** parcheado del proyecto + **sigspoof** y **call recording** con toggles + DNS privado / connectivity check al estilo AXP (sin servidores `axp.os`).
- **Debloob** en **4 oleadas** (euicc Google, carrier/RCS, herramientas Lineage, comandos solo-LAB) — **no** el `Deblob.sh` ciego de AXP.
- **Magisk** embebido en **build** (EXTENDROM `EXTENDROM_PREROOT_BOOT`), manager **dormant** hasta activación; **KernelSU/SusFS** fuera del bacon de ship (`007` en paralelo).
- **Firma** `release-keys` de proyecto, **AVB flags=0** (track desbloqueado + Magisk), **SPL vendor** fijado en **2023-09-05** (guardia anti-downgrade).
Paridad bancaria **Swissquote en Island: PASS** en cierre 2026-10-09; **Yuh** sigue abierto.
---
## 2. Arco del proyecto (punto 0 → hoy)
| Fase | Feature | Qué se logró |
|------|---------|----------------|
| **Host** | `001` | `rom-dev01`, artefactos bajo `/srv/rom/artifacts/`, builds largos en tmux (`rom-detach`) |
| **Oracle** | `002` | Inventario **GOLDEN** (`11071JEC203839`) — solo lectura `adb` |
| **Baseline** | `003` | **LOS 23.2 UNOFFICIAL** vanilla en LAB (`20260914`), smoke hardware, **sin** AXP/microG |
| **MicroG track (standby)** | `004`–`008` | microG, spoof, call rec, etc. — reutilizado por `009` |
| **KernelSU track (paralelo)** | `007` | Boot OK sept 2026; **no mezclar** en bacon Magisk |
| **Ship activo** | `009` | **AXP → LOS23** resurrection; spec `009-axp-los23-port` |
**Dispositivos:**
| Rol | Serial | Uso |
|-----|--------|-----|
| **GOLDEN** | `11071JEC203839` | Oracle AXP 22.2 — **nunca** flashear |
| **LAB** | `11231JEC207477` | Flash, sideload, Magisk, banca en Island |
---
## 3. Línea base LineageOS vs identidad AXPR
### 3.1 Vanilla LOS (`003`)
- Build: `lineage-23.2-20260914-UNOFFICIAL-sunfish`
- `ro.lineage.version` UNOFFICIAL, test-keys, sin microG ni Magisk AXP
- Vendor SPL **2023-09-05** (EOL Pixel; documentado)
- **Gate:** smoke LAB OK → autoriza integración AXP
### 3.2 Pin upstream OTA (oct 2026)
- Manifest pin: **Lineage nightly `20261008`** (`lineage-23.2-20261008-nightly-sunfish`)
- Zip de producto: `AXP-Resurection-Pro-23.2-20261008-sunfish.zip` (hermano de `lineage-23.2-20261008-PRO-sunfish.zip`)
- `LINEAGE_BUILDTYPE=PRO`, `user`, `TARGET_RELEASE=bp4a`
- Platform SPL: **2026-09-01** (merges LOS)
- Vendor SPL ship: **2023-09-05** (deliberado vs GOLDEN `2023-08-05` — guardia en `apply_009_axp_identity.py`)
### 3.3 Branding
- Nombre producto: **AXP Resurrection Pro**
- Bootanimation: **fullscreen sunfish** (mejora de tamaño vs banda Lineage); assets AXP PRO en payload aún limitados — animación puede seguir siendo clase Lineage en algunos builds
- **No** NeoLauncher — **Launcher3** Lineage
- **No** servidores OTA AXP ni repos de mercado externos (EOL)
---
## 4. Qué se clonó de AXP.OS / EXTENDROM
**Regla del repo (`AGENTS.md`):** copiar método AXP/EXTENDROM/GOLDEN **antes** de inventar política local.
| Área | Mecanismo AXP | Implementación AXPR |
|------|----------------|---------------------|
| **Magisk en boot** | `EXTENDROM_PREROOT_BOOT`, `patch.sh`, hook `releasetools` | `vendor/sunfish-a16/magisk/`, `out/.magisk/READY`, `SUNFISH_A16_MAGISK_PREROOT` |
| **Magisk no en PRODUCT** | Root dormant hasta activación | Stub manager; **no** `PRODUCT_PACKAGE` Magisk |
| **Env patcher** | `PREINITDEVICE=userdata`, `KEEPVERITY`, `KEEPFORCEENCRYPT` | Mismo en `vendor/sunfish-a16/magisk/patch.sh` |
| **Product wiring** | `gms.mk`, `magisk.mk`, `apps.mk` | `apply_009_product_includes.py` en cada bacon |
| **Identidad / certs** | `vendor/lineage-priv/keys`, `avb.pem` | `apply_009_axp_identity.py` + `/srv/rom/secrets/android-certs` |
| **Phonesky** | APK parcheado (exact alarm, etc.) | `/srv/rom/prebuilts/phonesky/` — **no** en git |
| **Toggles EXTENDROM** | `allow_signature_fake`, `extendrom_call_recording` | `005` sigspoof, `008` call rec / FLAG_SECURE |
| **Private DNS lista** | AXP Settings providers | `apply_009_private_dns_providers.py` |
| **Connectivity / INTERNET UX** | AXP-class | `apply_009_connectivity_check.py` |
| **Disable app clásico** | vs Archive A16 | `apply_009_disable_user_apps.py` |
| **OpenSSH en product** | Binarios fuera; `init.openssh.rc` queda | US-S4-1 + `hardening.mk` |
| **Referencias build** | EXTENDROM en `rom-dev01` | `/srv/rom/references/extendrom/` |
**FAQ AXP (Magisk):** tras flash, **sí** a descargar/instalar el **APK** del manager; el paso **Additional setup** que **re-parchea boot** suele **no hacer falta** en preroot (el boot ya va parcheado en bacon). Ver [AXP FAQ](https://github.com/AXP-OS/build/wiki/Frequently-Asked-Questions#magisk-requires-additional-setup-on-start).
---
## 5. Kernel: AXP, GrapheneOS-class, CVE
**Base:** `kernel/google/msm-4.14` @ `4.14.357-openela` (pin LOS `28f9290ae067`), **non-GKI**.
### 5.1 Ya en LOS (no duplicar)
CFI, shadow call stack, stack protector, KASLR, PAN, hardened usercopy, restricción perf events, etc. (`docs/009-kernel-hardening-map.md`).
### 5.2 Stage 1 — parches Graphene/AH vía AXP `kernel_patches`
~**30 parches** aplicados (deny USB toggle, allocsize, BUG_ON, FORTIFY intra-object, randomize, ro_after_init, sanitize, slab hardened, unused-fn, …).
**Omitido por política:** location lockdown (FR-018), LinuxIncrementals, mega CVE hasta fase estable.
### 5.3 Combo4 + Clang FORTIFY
- `CONFIG_FORTIFY_SOURCE=y` y opciones slab/init/on alloc tras Stage 1
- Fixes de build (LTO/modules qcacld, stubs acotados en bisect histórico)
### 5.4 CVE
| Etapa | Contenido |
|-------|-----------|
| **CVE clean-offset** | ~**429** IDs en `cve-clean-offset.list` (strict apply en bacon) |
| **High-offset batches 1–3** | Offsets grandes con `max_abs_offset` elevado |
| **Denylist** | p.ej. `CVE-2022-49980` (lock-scope USB) |
| **Política** | Atribución en logs `cve-stage/`; no megapatch opaco |
### 5.5 US-S5-1 (como GOLDEN)
- `CONFIG_SECURITY_YAMA` **no** activado (Yama `ptrace_scope=2` rompió **PairIP** / anti-debug)
- `SLAB_FREELIST_RANDOM=y`, USERFAULTFD off
- `KSYM_NAME_LEN=192`; **sin KernelSU** en defconfig ship
### 5.6 hardened_malloc (`012`)
- Integrado en bacon OTA (`009-bacon-hardened-malloc.sh`)
- Exclusiones SurfaceFlinger/cámara documentadas en árbol bionic
---
## 6. Userspace: parches AXP en Android 16
Scripts bajo `vendor/sunfish-a16/patches/009-axp-los23-port/` (puertos desde árbol AXP legacy **a A16**, no “SDK 35”):
| Script | Función |
|--------|---------|
| `apply_009_product_includes.py` | `gms.mk` + `magisk.mk` + **`apps.mk`** + BoardConfig |
| `apply_009_axp_identity.py` | release keys, AVB, SPL vendor guard |
| `apply_009_axp_branding.py` | branding Pro |
| `apply_009_private_dns_providers.py` | lista DNS privado AXP |
| `apply_009_connectivity_check.py` | checks de conectividad |
| `apply_009_disable_user_apps.py` | Disable clásico |
| `apply_009_supl_privacy.py` | SUPL / ubicación (sin lockdown extra FR-018) |
| `apply_009_cmdline_mode.py` | cmdline / modo debug (Magisk track) |
| `apply_009_yama_ptrace.py` | Yama inerte si no hay Yama en kernel |
| `apply_009_a15_*` | timeouts reboot/Wi‑Fi/BT, settings |
| `apply_005` / `apply_008` | sigspoof, call recording, FLAG_SECURE DO |
| `apply_009_drop_*` | deblob waves (ver §7) |
**WMS / FLAG_SECURE:** override global opcional (proyecto `008`), default off.
---
## 7. Debloob / de-Google selectivo
**No** se ejecuta `Deblob.sh` por defecto AXP. Oleadas controladas (`AXP_DEBLOB_WAVE4=1` en OTA):
| Wave | Contenido |
|------|-----------|
| **1** | Drop **Google EUICC** / LPA (`apply_009_drop_euicc_google.py`) — OpenEUICC en system_ext |
| **2** | Carrier Google + AOSP RCS (`apply_009_drop_carrier_google.py`) |
| **3** | Herramientas Lineage en system (`bash`, `htop`, `nano`, `unrar`, `addon.d/50-lineage.sh`) — **Swissquote** fallaba con estas en system |
| **4** | Comandos solo-LAB / diag (`apply_009_drop_lab_only_commands.py`) |
**Se mantiene (radio/IMS):** `ims`, `QtiTelephonyService`, `xtra-daemon`, Widevine, `EuiccSupportPixel` donde el spec lo exige, Qualcomm diag en wave 4 parcial según cierre.
---
## 8. microG, Play y apps empaquetadas
### 8.1 Stack deGoogle (servicios)
| Componente | Ubicación | Versión pin (ej.) |
|------------|-----------|-------------------|
| **GmsCore** (microG) | `system_ext/app/GmsCore` | `0.3.17.252432` |
| **GsfProxy** | `system_ext` | `0.1.0` |
| **Phonesky** | `system/priv-app/Phonesky` | `52.9.22-24` (artifact host) |
| **JNI GmsCore** | `.../lib/arm64/*.so` | Extraído en bacon (**obligatorio** para Maps) |
### 8.2 Apps usuario (system_ext / product)
| App | Paquete | Notas |
|-----|---------|-------|
| **Aurora Store** | `com.aurora.store` | system_ext |
| **Droidify** | `com.looker.droidify` | sustituye cliente F-Droid |
| **Fossify Gallery** | `org.fossify.gallery` | no Gallery2/Glimpse |
| **Jelly** | `org.lineageos.jelly` | **product** |
| **OpenEUICC** | `im.angry.openeuicc` | LPA privilegiada |
| **WebView** | `com.android.webview` | **LOS 23** — no Aosmium (EOL); selector multi-proveedor en Dev options |
Postflight bacon: **US-S4-2** (Jelly), **US-S4-3** (Aurora/Droidify/Fossify en system_ext).
---
## 9. Magisk preroot (sin KernelSU en ship)
| Tema | Detalle |
|------|---------|
| **Versión** | **30.7** (pin; GOLDEN oracle **29.0**) |
| **Build** | Hook `common.py` + `patch.sh` en empaquetado `target_files/IMAGES/boot.img` |
| **Verificación host** | `magiskboot cpio ramdisk.cpio test` ≠ 0 en **ship** `boot.img` |
| **Artefacto forensics** | `boot-make-out.img` = `out/.../boot.img` **sin** Magisk — **no flashear** |
| **Activación** | Abrir app → **download/install** APK real; **evitar** re-parchear boot (Install / inactive slot) |
| **UI Ramdisk Yes/No** | Clasificación de **método de instalación**; con preroot puede quedar **No** sin impedir root |
| **Módulos GOLDEN** | **No** empaquetados (PIF, hosts, tee sim, …) — usuario instala después |
| **KernelSU** | Prohibido en mismo boot que Magisk ship |
---
## 10. Hardening userspace y malloc
| ID | Medida |
|----|--------|
| **US-S4-1** | Sin `sshd`/`ssh`/`rsync`/`procmem` en product; **sí** `init.openssh.rc` |
| **US-S4-2/3** | Superficie apps (Jelly + Fossify + stores) |
| **US-S6** | `lineage_sunfish-user` lunch |
| **012** | **hardened_malloc** en bionic (ship OTA) |
| **SELinux** | Enforcing (medido en LAB) |
| **Encryption** | FBE/file encryption estándar |
| **Bootloader lock** | **Wont** — AXP/LOS/Magisk asumen unlock |
---
## 11. Toggles y políticas de privacidad
| Toggle / setting | Origen | Comportamiento |
|------------------|--------|----------------|
| **Signature spoofing** | AXP / `005` | Restricted; Developer Options |
| **Call recording unlock** | EXTENDROM / `008` | SQLite / settings key |
| **FLAG_SECURE override** | Proyecto `008` | Default off |
| **Private DNS providers** | AXP lista | Sin endpoints `axp.os` |
| **Connectivity check** | AXP-class | Sin branding AXP en URLs |
| **SUPL / XTRA / IZat** | AXP timeouts + switches | Precisión GPS (no extra-cap FR-018) |
| **Native debug / Yama props** | `apply_009_yama_ptrace` | Inerte sin Yama en kernel |
| **Disable app** | AXP vs Archive A16 | Restaurar disable clásico |
---
## 12. Firma, AVB y actualizaciones
| Tema | Valor ship |
|------|------------|
| **Firma APK/OAT** | `vendor/lineage-priv/keys/releasekey` |
| **AVB key** | `vendor/sunfish-a16/certs/avb.pem` (SHA256_RSA4096) |
| **AVB flags** | **0** (runtime unlocked; no “hardened verified boot” Magisk track) |
| **Zip OTA** | `payload.bin` sideload; **no** OTA servidor AXP |
| **FR-019** | microG, Phonesky, apps — actualización **sideload** cada ~2–3 meses (stub doc) |
| **Downgrade** | User builds rechazan SPL vendor &lt; `2023-09-05` |
**Flash LAB recomendado:** recovery → factory reset → **sideload zip completo**.
**Evitar:** `fastboot -w`; mezclar `vbmeta`/`boot` de otro build; flashear solo `boot-make-out.img`.
---
## 13. Inspiración GrapheneOS (qué sí / qué no)
| GrapheneOS / AH | En AXPR |
|-----------------|---------|
| Parches **kernel** hardening (alloc, fortify, slab, sanitize, …) | **Sí** — vía AXP `kernel_patches` + Stage1 |
| **hardened_malloc** | **Sí** (`012`) |
| Árbol kernel A13 Graphene sunfish | **No** — base es LOS `msm-4.14` |
| Lockdown ubicación Graphene | **No** (FR-018) |
| Auditoría attestation bancaria tipo Graphene | **No** como gate; banking deferred |
| WebView Vanadium por defecto | **No** — WebView LOS + elección usuario |
---
## 14. Verificación y hitos en LAB
| Hito | Fecha / evidencia |
|------|-------------------|
| Vanilla LOS boot | `003` — 2026-09-14 |
| Stage1 kernel bacon | `20260918T180359Z-axp-kh-stage1` |
| CVE bacon | `20260918T215034Z-axp-kh-cve` |
| **Closure baseline** wave 3 | `20261009T145241Z` — Swissquote Island **PASS** |
| **Final ship** wave4 + malloc | `20261009T172104Z`, `bacon009final` |
| **OTA rebacon** pin `20261008` | `20261011T092526Z` — `bacon009ota-r13`, `bacon_exit=0` |
**Matrices:** `docs/009-capability-matrix.md`, `docs/009-closure-parity-20261009.md`, `docs/axp-pro-parity.md`.
---
## 15. Build de referencia actual (oct 2026)
| Campo | Valor |
|-------|--------|
| **Directorio** | `/srv/rom/artifacts/009-axp-los23-port/20261011T092526Z-axp-stage1-combo4-cve-hi-releasekeys` |
| **Zip** | `AXP-Resurection-Pro-23.2-20261008-sunfish.zip` |
| **SHA256 zip** | `91d7adf5435c4e7279123bca4ce72793754384bb341cfbb61522f3411eea2847` |
| **boot.img (ship)** | `9e6ec52543445b10279b681f69c055fb240f6910616f569914fe598d77ef7d4f` |
| **README artefacto** | Stage1+combo4+FORTIFY+CVE+hi1-3+US-S4+US-S5-1+wave1-4+malloc+releasekeys |
| **Script bacon** | `scripts/009-bacon-axp-stage1-combo4-cve-hi-releasekeys.sh` |
---
## 16. Abierto / no objetivo
**Abierto:** rebase LOS periódico (`009-upstream-rebase-ota.md`), **Yuh** en Island, FR-019 sideload playbook, llamada **SIM física** gate radio, postflight OTA boot hash = ship boot, animación AXP completa en payload.
**No objetivo / wont:** KernelSU en ship, NeoLauncher, Aosmium WebView, OTA/repositorios AXP externos, backup ROM integrado, bootloader relock, flash GOLDEN, mezclar track `007` en bacon Magisk.
**Paralelo:** `007` KernelSU/SusFS — `docs/007-parallel-on-009.md`.
---
## 17. Apéndice: scripts de integración
Bacon entry (host): `scripts/009-rebuild-from-los.sh` → rsync `vendor/sunfish-a16` → `009-bacon-axp-stage1-combo4-cve-hi-releasekeys.sh`.
Wrappers OTA: `009-bacon-hardened-malloc.sh`, `009-bacon-wave4-deblob.sh`.
Kernel: `vendor/sunfish-a16/patches/009-kernel-hardening/apply_stage1.sh`, `apply-cve-strict.sh`, listas `cve-clean-offset.list`, `cve-high-offset-batch*.list`.
Checklist pre-bacon: `docs/009-ota-rebuild-checklist.md`.
---
## 18. Apéndice: lecciones LAB (Magisk / flash)
1. **Sideload completo** tras wipe es el camino principal; no depender de reflashear solo `boot` salvo recovery rota.
2. **`boot.img` del artefacto** = Magisk; **`boot-make-out.img`** = stock.
3. Tras preroot: **download/install** del manager; **no** insistir en Additional setup que re-parchea boot ni **Install inactive slot** (conflicto slots / UI Ramdisk).
4. **Ramdisk: No** en la app **no** implica ROM sin Magisk si `magiskd` y **30.7** están activos.
5. Flash manual **boot+vbmeta+dtbo** debe ser **juego completo del mismo artefacto**; si no, riesgo de **fastboot loop**.
6. **No** bajar vendor SPL bajo **2023-09-05** en upgrades (`init_user0_failed` / rollback Keymaster).
---
*Fin del documento. Para el día a día del equipo: `docs/README.md` → `009-handoff-20261008.md`.*