Files
sunfish-admin 12d2179c20 AXP Magisk resurrection track: Speckit 009 port AXP/LOS22 to LOS23.
Ship Magisk like GOLDEN; KernelSU optional recycle only; parallel to sunfish-a16-rom standby.
2026-09-16 21:56:22 +00:00

278 lines
13 KiB
Markdown
Raw Permalink 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.
# Feature Specification: Restricted native signature spoofing
**Feature Branch**: `005-restricted-signature-spoofing`
**Created**: 2026-09-15
**Status**: Draft
**Input**: Advance spoofing after `004` packaging: LAB Play/microG Self-Check and
Google auth fail without AXP-style restricted signature spoofing. GOLDEN capture
2026-09-15 is the behavioural oracle. Prefer modern LOS 23.2 / A16 path to the
**same end state** as AXP (not Magisk modules).
## First working stack (this phase — before `006`/`007`)
This feature closes the **first usable Google-compat stack on LAB**:
| Must work in this phase | Owner |
|-------------------------|--------|
| Official microG + GSF (PRESIGNED, F-Droid-updatable) | `004` packaging + `005` ship |
| Patched Phonesky priv-app (project-signed, disable/enable OK) | `004` + `005` ship |
| Restricted spoofing (Developer Options + grants) | **`005` core** |
| Self-Check correct signature + Play auth (no API-console mismatch) | **`005`** |
| Modern network location (BeaconDB / Ichnaea-compatible URL; not Déjà Vu NLP) | `005` validation / docs |
| `004` packaging leftovers that block a clean flashable zip | **`005` ship gate** (`REPLACE_PREBUILT`, Play FGS privapp) |
**Explicitly later (do not pull forward):**
- `006` — Insular / Yuh / Swissquote banking hard-gates
- `007` — KernelSU-Next / SusFS / root hide
## User Scenarios & Testing *(mandatory)*
### User Story 1 - Developer Options master switch (Priority: P1)
As the developer (and later daily-driver user), I can enable **Allow signature
spoofing** under Developer Options. When off, spoofing has no effect even if
per-app grants remain. When on, authorized apps may use spoofing after grant.
**Why this priority**: Matches GOLDEN/AXP (`settings secure allow_signature_fake`)
and constitution (not unrestricted platform fake-signature).
**Independent Test**: On LAB build with `005`, toggle the setting; read
`settings get secure allow_signature_fake` (0/1); confirm UI strings exist.
**Acceptance Scenarios**:
1. **Given** a `005` build on LAB, **When** Developer Options is opened,
**Then** a **Signature spoofing support** category exposes **Allow signature
spoofing** (AXP-equivalent UX).
2. **Given** the toggle is OFF, **When** an app holds a prior spoofing grant,
**Then** spoofing has **no effect** (same as AXP documented behaviour).
3. **Given** the toggle is ON, **When** `settings get secure allow_signature_fake`
is read, **Then** the value is `1`.
---
### User Story 2 - microG + Phonesky Self-Check signatures (Priority: P1)
As the developer, with global spoofing ON and spoofing permission granted to
microG GmsCore and patched Phonesky, microG Self-Check marks **correct
signature** for both `com.google.android.gms` and `com.android.vending`
(Companion/Play Store line), not only “installed”.
**Why this priority**: Unblocks the `004` gap that packaging alone cannot fix;
required before Play OAuth works.
**Independent Test**: LAB only; no GOLDEN modification; screenshots/log of
Self-Check before/after grants.
**Acceptance Scenarios**:
1. **Given** `004` packages present and global spoofing ON, **When**
`FAKE_PACKAGE_SIGNATURE` is granted to GmsCore and Phonesky, **Then**
Self-Check shows positive **correct signature** for both.
2. **Given** Self-Check, **When** the user taps the resolution for correct
signature on Play/microG, **Then** a grant path exists (system permission UI
or equivalent) — not a missing activity / unknown permission.
3. **Given** global spoofing OFF, **When** Self-Check runs, **Then** correct
signature checks fail even if packages are installed.
---
### User Story 3 - Play login / auth without API-console mismatch (Priority: P1)
As the developer, after spoofing is enabled and granted for Phonesky, Google
account sign-in in Play no longer fails with
`UNREGISTERED_ON_API_CONSOLE` / “SHA-1 certificate fingerprint” mismatch caused
by presenting the project signing key as the Play identity.
**Why this priority**: Owner-observed LAB failure; AXP GOLDEN works with spoofing.
**Independent Test**: LAB logcat during Play sign-in; compare to pre-`005`
failure mode.
**Acceptance Scenarios**:
1. **Given** spoofing ON + Phonesky granted, **When** signing into Play,
**Then** auth token acquisition does not fail with `UNREGISTERED_ON_API_CONSOLE`
due to project cert fingerprint.
2. **Given** Play update prompts that AXP intentionally blocks, **When** the
user tries in-app self-update, **Then** failure remains acceptable (out of
scope to enable stock Play self-update).
---
### User Story 4 - Restricted allow-list only (Priority: P1)
As the project owner, spoofing is **not** a general capability for arbitrary
apps. Only explicitly authorized packages/signers may obtain effective spoofing
(at minimum official microG GmsCore and project-signed patched Phonesky).
**Why this priority**: Constitution: native, restricted, auditable; no LSPosed.
**Independent Test**: Attempt spoofing from a third-party test APK that requests
`FAKE_PACKAGE_SIGNATURE` without being allow-listed → denied.
**Acceptance Scenarios**:
1. **Given** global spoofing ON, **When** a non-authorized app requests
spoofing, **Then** it cannot effectively impersonate Google/platform
signatures.
2. **Given** documentation, **When** reviewed, **Then** the authorized set and
how to extend it are written (for future packages if needed).
---
### User Story 5 - Survives without root (Priority: P2)
As the developer, microG and Phonesky spoofing keep working when optional root /
Zygisk-style functionality is unavailable (Compatibility MVP is rootless).
**Why this priority**: Constitution Compatibility MVP ends at `006` rootless.
**Independent Test**: LAB build without Magisk/KSU; spoofing + Self-Check still
pass.
**Acceptance Scenarios**:
1. **Given** no Magisk/KSU on the `005` validation build, **When** spoofing is
configured, **Then** Self-Check signature lines and basic Play auth path
still succeed.
---
### User Story 6 - First working stack ship gate (Priority: P1)
As the developer, one LAB flash of the `005` validation build includes a
**complete** first stack: packaging fixes from `004` that never landed in a
clean zip, spoofing, and documented modern location setup — without waiting for
banking (`006`) or root (`007`).
**Why this priority**: Owner: this phase must work before later features.
**Independent Test**: Single zip flash on LAB; follow quickstart; no Magisk/KSU.
**Acceptance Scenarios**:
1. **Given** the `005` artifact zip, **When** flashed to LAB, **Then** Phonesky
registers (`pm path`) without remount hacks; APK signatures verify (no
PRESIGNED strip).
2. **Given** that build, **When** spoofing is configured per quickstart,
**Then** Self-Check signature lines and Play auth meet SC-003/SC-004.
3. **Given** microG Location settings, **When** configured for a modern
Ichnaea-compatible endpoint (BeaconDB), **Then** the procedure is documented
and does not depend on legacy UnifiedNlp backend APKs.
---
### Edge Cases
- Stock LOS 23.2 tree on `rom-dev01` has **no** `FAKE_PACKAGE_SIGNATURE` /
`allow_signature_fake` (inventory 2026-09-15) → must port/adapt from
AXP/EXTENDROM patterns, not “enable a hidden LOS flag”.
- Phonesky privapp XML on AXP binds permissions to **cert SHA-256 digest**; our
project digest differs from AXP’s — XML must use **our** digest.
- Play 52.x FGS / privapp extras (`FOREGROUND_SERVICE_SYSTEM_EXEMPTED`, etc.)
remain packaging/`004` follow-ups; `005` must not regress them.
- Disabling Play via App info remains supported (owner: useful on AXP).
- Island/work profile: spoofing grants may need to exist per user — verify at
least owner user 0 for P1; note multi-user as follow-up if broken.
## Requirements *(mandatory)*
### Functional Requirements
- **FR-001**: ROM MUST provide a Developer Options control equivalent to AXP
**Allow signature spoofing**, persisted as a global setting (GOLDEN:
`settings secure allow_signature_fake`).
- **FR-002**: ROM MUST define and enforce `android.permission.FAKE_PACKAGE_SIGNATURE`
(or AOSP-equivalent restricted spoofing permission) so PackageManager can
honour `meta-data fake-signature` for authorized packages when the global
toggle is ON and the permission is granted.
- **FR-003**: Spoofing MUST be restricted to an explicit allow-list of packages
and/or signers; at minimum `com.google.android.gms` (official microG signer)
and `com.android.vending` (project Phonesky signer). Unrestricted spoofing is
forbidden.
- **FR-004**: With toggle ON and grants present, microG Self-Check MUST report
positive **correct signature** for GmsCore and Phonesky/Play.
- **FR-005**: With toggle ON and Phonesky granted, Play account auth MUST NOT
fail with `UNREGISTERED_ON_API_CONSOLE` caused by exposing the project signing
certificate as Play’s identity.
- **FR-006**: Spoofing MUST NOT depend on Magisk, Zygisk, LSPosed, or other
root modules.
- **FR-007**: Behaviour and UX SHOULD match GOLDEN/AXP where compatible with
Android 16 / LOS 23.2; if the AXP patch set does not apply cleanly, redesign
the path to the **same end state** and record deltas in `docs/a15-a16-delta.md`.
- **FR-008**: Validation MUST be LAB-only (`11231JEC207477`); GOLDEN remains
sample-only.
- **FR-009**: Implementation MUST be attributable (source-linked patches /
EXTENDROM/AXP/LOS references); no opaque megapatch.
- **FR-010**: The `005` validation build MUST incorporate outstanding `004`
packaging fixes required for a clean flashable image: PRESIGNED APKs installed
via replace-prebuilt (no v2/v3 strip), and Phonesky privapp entries needed for
Android 16 / Play 52 FGS (e.g. system-exempted foreground service + exact
alarm) so Play does not crash on setup/download services.
- **FR-011**: First-stack validation MUST document modern microG network
location configuration (Ichnaea-compatible service URL such as BeaconDB); MUST
NOT require shipping legacy UnifiedNlp backend packages (Déjà Vu, Nominatim
NLP apps).
### Key Entities
- **Global spoofing toggle**: User-facing Developer Options switch; gates all
spoofing effect.
- **Spoofing permission**: Per-app dangerous/runtime-style permission the user
(or approved default path) grants to authorized packages.
- **Authorized package set**: microG GmsCore + patched Phonesky (extensible
later under constitution rules).
- **Oracle capture**: `.local-artifacts/002-golden/20260915-spoofing-phonesky/`
(settings, `er_*` XMLs, framework strings, dumpsys grants).
## Success Criteria *(mandatory)*
### Measurable Outcomes
- **SC-001**: On LAB, Developer Options exposes the spoofing master switch;
`allow_signature_fake` reads `1` when enabled.
- **SC-002**: `pm` / permission APIs show `FAKE_PACKAGE_SIGNATURE` defined;
grants visible for GmsCore and Phonesky when configured.
- **SC-003**: microG Self-Check shows **correct signature** checked for GmsCore
and Play/Companion within one configuration session after flash.
- **SC-004**: Play sign-in logcat no longer shows `UNREGISTERED_ON_API_CONSOLE`
fingerprint mismatch for Phonesky under the spoofed identity.
- **SC-005**: A non-allow-listed test app cannot obtain effective Google
signature spoofing with the global toggle ON.
- **SC-007**: One LAB flash of the `005` zip boots without remount overlays for
Phonesky; `apksigner verify` equivalent on-device package is registered; Play
does not crash-loop on VpaService/DownloadService for missing FGS privapp
allowlist entries.
- **SC-008**: Quickstart includes BeaconDB (or successor) location steps;
Self-Check / location UI does not depend on empty UnifiedNlp backend lists.
## Assumptions
- `004` packaging (PRESIGNED `LOCAL_REPLACE_PREBUILT_APK_INSTALLED`, Phonesky
patch with `fake-signature`, privapp XMLs) remains the base; `005` does not
replace FakeStore for Play. Unmerged `004` leftovers ship in the same `005`
validation build (single first-stack artifact).
- Default for the global toggle is **OFF** until the user enables it (AXP
“explicitly enable” model), unless plan proves a safer first-boot prompt.
- Official microG continues to update via F-Droid same-signer; Phonesky via
project JKS.
- Primary patch reference: AXP/EXTENDROM signature spoofing + GOLDEN 2026-09-15
capture; inventory shows stock LOS 23.2 lacks these hooks. Spoofing MUST also
cover modern `PackageInfo.signingInfo` (not only legacy `signatures[]`).
- Play self-update remaining broken/blocked is acceptable (AXP parity).
- Multi-user/Island spoofing parity is best-effort for P1 (user 0 first).
- MLS (Mozilla Location Service) is retired; BeaconDB (or documented successor)
is the modern network-location endpoint for microG 0.3.x.
## Out of Scope
- KernelSU / Magisk / DenyList (`007`)
- Banking Insular hard-gates / Yuh / Swissquote (`006`)
- Call recording / FLAG_SECURE (`008`/`009`)
- Changing Phonesky to Google’s proprietary signer
- Unrestricted signature spoofing for all apps
- Reintroducing UnifiedNlp backend APKs as the primary location design