Resilience Gaps in Android IPC, SavedState and Text Layout

Thursday, July 30, 2026
Structured Text Amplification (STA)
Architectural Model + Full Technical Evidence of Resilience Gaps in Android IPC, SavedState and Text Layout
Full titleStructured Text Amplification (STA) — An Architectural and Technical Study of Text-Driven Resource Amplification Across the Android Ecosystem
VersionUnified Full — July 2026 (merges STA Architectural Study v6.0 + Resilience Gaps Technical Report)
ResearcherManuel García Peña (Lostmon)
Vectors32 documented (Class A IPC/SavedState + Class B UI-thread/libminikin)
Companies notifiedGoogle · Meta · Microsoft · Mozilla · Opera · DuckDuckGo · Brave · Tor Project · Xiaomi · INCIBE (CNA Spain)
Also affectedSamsung (STA-023 series — documented)
Public disclosure30 July 2026 — lostmon.blogspot.com

CLASS A — IPC State Amplification: absent safe fallback in FragmentManager.restoreAllState() and system services when serialized SavedState exceeds the Binder limit. Result: persistent crash loops.

CLASS B — Interaction Surface Amplification: absent defensive limits on synchronous URL/text processing in Android’s text layout engine (libminikin.so). Result: reproducible ANR across Chromium and Gecko engines.

Architectural frame: Both classes are concrete manifestations of the same higher-level pattern — Structured Text Amplification (STA).


Executive Summary

This whitepaper documents Structured Text Amplification (STA), an architectural pattern in which valid structured textual input (URLs, deep links, drafts, Intent extras) propagates through Android framework layers and progressively amplifies computational cost or state size until stability limits are exceeded.

Five key findings:

  1. An internal fix for parts of the Class A root cause exists but is not public. Google’s LargePayloadSupport (AOSP CL 3989977) and androidx.savedstate 1.5.0 address part of the Class A root cause; the July 2026 Android Security Bulletin contained no public patches for any STA vector.
  2. 32 reproducible vectors across Class A (IPC/SavedState crash loops) and Class B (libminikin ANR), confirmed on production devices running Android 13–16.
  3. Independent vendor validation. Xiaomi reproduced, confirmed and rewarded a persistent HyperOS vector (STA-015b). INCIBE (CNA Spain) reviewed technical reports and referred the case to MITRE (CNA Top-Level Root for the Google ecosystem) for CVE assignment.
  4. Highest impact: STA-015-DL (CVSS 8.6). A single click on a Google Drive HTML link can escalate to a SystemUI crash loop requiring a hard reboot. Scope is Changed (browser is delivery vehicle; SystemUI is the target).
  5. Cross-engine, cross-vendor. The same libminikin blocking path appears in Chromium and Gecko; the same persistence pattern appears in WhatsApp, Threads, Firefox, Opera, DuckDuckGo, Edge Ask Copilot and core system services.

Primary recommendation: Framework-level hard length thresholds in libminikin and safe degradation (try/catch + discard) in FragmentManager / TaskPersister / SystemUI restore paths. Application-level URL and draft size caps are necessary but insufficient defense-in-depth.


Threat Model

Class A — IPC / SavedStateClass B — libminikin / UI thread
AttackerRemote (crafted link, Drive HTML, deep link) or local (paste large text)Remote (crafted URL/link) or local (long-press, focus address bar)
VictimAndroid 13–16 users of WhatsApp, Threads, browsers, SystemUI, OEM skinsAny app rendering long structured text via TextView / Compose / context menu
PrerequisitesOne click or paste; no special privilegesOne click, long-press or focus event; no special privileges
GoalPersistent DoS (crash loop until data clear / reboot)Transient DoS (ANR 5–16 s); can become persistent if combined with history/TaskPersister
Impact scopeSingle app → shared inbox → SystemUI (device UI)Browser / app UI thread; can cascade into SystemUI on some OEMs

Assumptions: Attacker can deliver a syntactically valid but oversized structured payload (URL, draft, Intent extra). No memory corruption or code execution is required. The attack relies solely on missing defensive limits and missing safe-degradation paths.


Testing Methodology

Research was conducted on six physical production devices running stock or OEM firmware (no custom ROMs, no root required for primary evidence). Cross-OEM validation used devices shared by the independent research community (Xiaomi, Samsung, OPPO, OnePlus, Pixel).

  • Google Pixel 7 (Android 13–15 stock AOSP-derived)
  • Xiaomi Redmi Note 14 5G (HyperOS 3.0 / Android 16) — primary field evidence device
  • OPPO A78, OnePlus 11, Lenovo Tablet, and additional devices covering Android 9–16

A substantial portion of framework path analysis was performed by reading public AOSP sources from a phone browser (no traditional multi-monitor lab). Bugreports and ANR traces were captured on-device where available. Google VRP rewarded the Binder/IPC research area ($250); Xiaomi independently confirmed and rewarded a HyperOS vector ($300 via HackerOne).

Tools and artefacts:

  • Bugreport / full bugreport ZIPs (DROPBOX SYSTEM APP CRASHES, ANR traces, tombstones)
  • chrome://crashes report IDs (uploaded to Google infrastructure)
  • Native stack unwinding from ANR traces (libminikin.so BuildId confirmed)
  • AOSP source inspection for FragmentManager, TaskPersister, LineBreakOptimizer

Generalizations to “all Android OEMs” or “all versions” are inferences from this sample, not exhaustive enumeration. Behaviour can vary with OEM patches, available memory and security bulletin level. iOS was used as a negative control (same payloads do not reproduce the Android-specific failures).


Research Context

This work is independent security research conducted over approximately four years (observations from 2022; formal STA framing and expanded evidence through July 2026). It was not performed in a traditional multi-monitor laboratory environment.

Primary conditions:

  • Lead researcher: Manuel García Peña (Lostmon), independent researcher; president of BojosXtu (mental-health support association).
  • Primary device: Xiaomi Redmi Note 14 5G (HyperOS 3.0 / Android 16) — field bugreports, SystemUI crash statistics, and native ANR stacks were captured on this handset under normal use and controlled reproduction.
  • Analysis setup: A substantial share of AOSP path reconstruction (TextView → StaticLayout → LineBreaker → libminikin; FragmentManager / TaskPersister / SystemUI) was done by reading public Android source in a phone browser, following call chains function by function when concentration allowed.
  • Cross-OEM validation: Additional devices (Pixel, Samsung, OPPO, OnePlus and others) were made available through the independent research community so that behaviour could be checked beyond a single manufacturer.
  • Vendor outcomes (selected): Google Android VRP rewarded the Binder/IPC research area ($250, case A-477279924). Xiaomi independently reproduced a persistent HyperOS vector and awarded a bounty via HackerOne ($300). Other vendors received reports with mixed classifications (see Section 17–18).

The technical claims in this whitepaper stand on bugreports, native stacks, measured Bundle sizes, and public AOSP inspection. The research context is included so readers understand the constraints under which the evidence was gathered — not as a substitute for that evidence.

Narrative account of the investigation (Spanish): Desafiar Android desde el sofá y un smartphone (17 July 2026). Timeline and related technical posts are listed under References.


Abstract

Android applications continuously process structured textual input originating from web pages, messaging platforms, documents, deep links, accessibility services, inter-process communication (IPC) and user-generated content.

Over approximately four years of independent analysis, 32 reproducible attack vectors were documented across multiple Android subsystems. Although these vectors differ in entry points, affected applications and observable behaviour, they consistently exhibit a common architectural characteristic: structured textual input propagates through several framework layers while progressively amplifying computational cost, memory pressure or internal application state until stability boundaries are exceeded.

This recurring behaviour is defined as Structured Text Amplification (STA).

STA is not a single vulnerability. It is an architectural resource-amplification pattern. It materialises in two primary concrete forms:

  • Class A — IPC / SavedState Amplification: when serialized state exceeds the Binder transaction limit (1 048 576 bytes), Android has no safe degradation path. The TransactionTooLargeException propagates uncaught, the app (or SystemUI) crashes, and the same oversized state is re-persisted → permanent crash loop.
  • Class B — Interaction Surface Amplification: algorithmic complexity inside Android’s native text layout engine (libminikin.so) produces reproducible ANRs across Chromium and Gecko when processing oversized but syntactically valid structured URLs/text.

The most severe chain (STA-015-DL) escalates from a single click on a Google Drive HTML link to a SystemUI crash loop requiring a hard reboot (CVSS 8.6). The same underlying amplification principles appear in WhatsApp, Threads, Firefox, Opera, DuckDuckGo, Brave, Samsung Internet and core framework components.

This unified whitepaper presents both the architectural model that explains the common pattern and the complete technical evidence (native stack traces, production bugreports, AOSP commit analysis, CVSS scores and vendor responses) that substantiates it.


1. Structured Text Amplification — Architectural Model

Fact vs. interpretation: The STA model is an architectural interpretation proposed by the researcher to explain recurring patterns observed across multiple vectors. Empirical evidence (native stack traces, production bugreports, measured Bundle sizes, vendor confirmations) is presented in the corresponding technical sections. Amplification factors and the unified model itself should be treated as analytical conclusions, not as factory-documented behaviour.

1.1 Formal Definition

Structured Text Amplification (STA) is an architectural resource amplification pattern in which structured textual input traverses multiple software layers, causing progressively increasing computational cost, memory consumption or state propagation that may ultimately exceed the stability limits of one or more downstream components.

Unlike a traditional software vulnerability, STA does not represent a single implementation defect or memory corruption. The amplification emerges from the interaction between multiple independent components that sequentially transform, validate, serialize, deserialize, render, persist or redistribute the same logical data. Each component may operate correctly in isolation; the cumulative effect becomes significantly larger than anticipated by any individual subsystem.

1.2 Recurring Characteristics

PropertyDescription
Structured InputHierarchical or encoded textual information (URLs, HTML, JSON, Intent extras, Markdown…), not arbitrary binary data.
Multi-stage ProcessingThe same logical content traverses multiple independent framework layers.
Progressive AmplificationProcessing cost increases at successive stages.
Shared InfrastructureUnrelated applications reuse identical Android framework components (libminikin, FragmentManager, TaskPersister, SystemUI…).
Non-linear BehaviourResource consumption frequently disproportionate to input size.
Cross-component ImpactFailures appear far from the original entry point (e.g. browser click → SystemUI crash).

1.3 General Amplification Pipeline

Structured Input (URL / HTML / Intent / Clipboard / Deep Link)
        ↓
Parser / Validation
        ↓
Framework APIs
        ↓
Binder IPC
        ↓
Rendering Engine (TextView → StaticLayout → LineBreaker → libminikin)   ← Class B
        ↓
Layout / Compose
        ↓
State Persistence (TaskPersister / SavedStateRegistry)                   ← Class A
        ↓
SystemUI / OEM recovery
        ↓
Observed Failure (ANR / Crash Loop / Hard Reboot)

2. Class A vs Class B — Concrete Mechanisms

Table 1. Comparison of the two concrete amplification mechanisms under the STA model. Rows marked “Observed factor” and “Result” are empirical; “Primary fix owner” is a proposed responsibility assignment.

Class A — IPC / SavedState AmplificationClass B — Interaction Surface Amplification
MechanismSavedState serialization → Bundle → Parcel → Binder > 1 MBSynchronous text layout on UI thread (libminikin line breaking)
Resource exhaustedBinder transaction buffer (1 048 576 bytes)Main thread CPU time (ANR threshold ~5 s)
Amplification driverFragment nesting depth + metadata (architectural)URL character composition (# / % €) (content-driven)
Observed factor×2.8 to ×20.6 (WhatsApp field measurement)10–20× multiplier before O(n²)/blocking
ResultTransactionTooLargeException → permanent crash loopMain thread block → ANR (5–16 s)
PersistenceYes — until data cleared or rebootNo (unless combined with history / TaskPersister)
Primary fix ownerGoogle / AOSP (FragmentManager + SystemUI + TaskPersister)Google / AOSP (libminikin) + browser vendors (defense-in-depth)

Two distinct amplification models that share a common root-cause category (absent input validation before expensive operations), but are not reducible to a single mathematical model. The fix for one does not address the other.


3. Root Cause Detail

This section separates documented platform behaviour (Binder limit, missing catch in restore paths, measured Bundle sizes, native stacks) from the researcher’s interpretation (STA as a unifying pattern) and from proposed mitigations (Section 16).

3.1 What IS “Working as Intended”

The 1 MB Binder limit is intentional. An app storing large data in a Bundle and hitting the limit is a documented consequence of misusing the mechanism — not a vulnerability by itself. This report does not claim the Binder limit or Fragment nesting are bugs.

3.2 The Real Problem — Absent Safe Fallback (Class A)

When FragmentManager.restoreAllState() encounters a Bundle exceeding the Binder limit, Android has no safe degradation mechanism. The TransactionTooLargeException propagates uncaught, the process crashes, and the same oversized state is persisted to disk for the next launch → permanent crash loop the user cannot escape without clearing application data.

// Current Android behaviour — no safe fallback
void restoreAllState(Bundle savedState) {
    // No try-catch. TransactionTooLargeException propagates uncaught.
    // Same oversized state re-persisted → crash loop on next launch.
    fragmentManager.restoreState(savedState);
}

// Recommended — safe degradation
void restoreAllState(Bundle savedState) {
    try {
        if (isBundleOverLimit(savedState)) {
            Log.e(TAG, "SavedState over limit — discarding for safe restart");
            return;  // clean start — no crash loop
        }
        fragmentManager.restoreState(savedState);
    } catch (TransactionTooLargeException e) {
        // safe degradation: app starts as if first launch
    }
}

3.3 Empirical Amplification — WhatsApp Android 15 (×20.6)

W/Bundle: childFragmentManager [L1]  size=1,636,412
W/Bundle: childFragmentManager [L2]  size=1,614,072
W/Bundle: childFragmentManager [L3]  size=1,603,852
W/Bundle: registryState             size=  479,948
W/Bundle: compose_text (origin)     size=   80,484  ← input data
W/Bundle: TOTAL                     size=1,661,088  ← +58% over Binder limit
// Binder limit: 1,048,576 bytes · Overflow: +612,512 bytes · Factor: ×20.6
InputFragment depthBundleFactorExceeds limit
10,000 bytes2 levels~28,000×2.8No
50,000 bytes4 levels~275,000×5.5No
80,000 bytes5 levels+meta~1,021,000×12.8Near
82,431 bytes5 levels+meta~1,124,352×13.6YES
80,484 bytes5 lvls+Meta AI~1,661,088×20.6YES +58%

3.4 Class B — libminikin Algorithmic Amplification

Characters with special meaning in URLs force the line-breaking algorithm to evaluate many more break candidates:

# — creates a logical boundary, doubling break decisions
/ — each slash adds a candidate break point
% — expands UTF-8 to UTF-16 and fragments the string
€ — ambiguous line-break properties force algorithm to explore both options

// Combined pattern: %E2%A0%80%E2%82%AC%23
// Multiplies algorithmic cost by 10-20x BEFORE O(n²) or greedy blocking applies

4. Affected Browsers (12 Confirmed)

Engine familyBrowsers
Chromium-basedGoogle Chrome, Microsoft Edge, Microsoft Bing, Opera Browser, DuckDuckGo Browser, Brave Browser, Samsung Internet
Gecko-basedMozilla Firefox, Firefox Focus, Firefox Nightly, Tor Browser
Proxy-basedOpera Mini (independently reproduced)
BrowserEngineConfirmed vector(s)Notified
Google ChromeChromiumSTA-001, STA-017 (Tier A), STA-020Yes — Google VRP
Microsoft EdgeChromiumSTA-017 (Tier A), STA-020Yes — MSRC
Microsoft BingChromium (Sapphire)STA-013, STA-015-DLYes — MSRC
Opera BrowserChromiumSTA-016, STA-017Yes
DuckDuckGo BrowserChromiumSTA-022, STA-022bYes — HackerOne
Brave BrowserChromiumSTA-021, STA-017Yes — HackerOne
Samsung InternetChromiumSTA-023/023b/023cDocumented, not formally notified
Mozilla FirefoxGeckoSTA-019a/b/c/d, STA-017Yes
Firefox Focus / NightlyGeckoSTA-019 familyYes — via Mozilla
Tor BrowserGeckoSTA-017, STA-019a/b/cYes
Opera, Opera MiniProxy-basedSTA-016Yes — via Opera

5. Evidence Taxonomy

TierCriteriaVectors
Tier A — ConfirmedFull stack trace + exception + Bundle analysisSTA-005/005b/005c/005d, STA-006, STA-007, STA-009, STA-010/010b, STA-011, STA-012/012e, STA-015, STA-015b, STA-015-DL, STA-016, STA-017 Chrome+Firefox, STA-018, STA-019a/b/c/d, STA-022
Tier B — BehavioralCrash/ANR observed; mechanism inferred by analogySTA-001, STA-003, STA-004, STA-008, STA-013, STA-020, STA-021, STA-022b, STA-023/023b/023c
Tier C — MitigatedTested; no crash — positive controlYouTube (all scenarios)

6. STA-017 — Cross-Engine ANR: Tier A Evidence

Evidence (observed): STA-017 upgraded to Tier A for BOTH Chrome (Chromium) AND Firefox (Gecko). Blocking call: libminikin.so::LineBreakOptimizer::computeBreaks. This is an Android system library — not Chromium or Gecko code.

6.1 Chrome — Full Native Stack Trace (bugreport 2026-05-24)

Listing 1. Native main-thread stack from production bugreport (Xiaomi Redmi Note 14 5G, Android 16).

Device: Xiaomi Redmi Note 14 5G · HyperOS 3.0 · Android 16. Chrome versionCode 777818033. Two ANR files, identical stack.

// ANR 1 — 2026-05-24 13:38:44 — Chrome PID 3533
// Waited 5000ms for MotionEvent — ChromeTabbedActivity

"main" prio=5 tid=1 Native   ← UI THREAD BLOCKED

native: minikin::getPrevWordBreakForCache     libminikin.so
native: minikin::LayoutCacheKey::LayoutCacheKey  libminikin.so
native: minikin::LayoutCache::getOrCreate     libminikin.so
native: minikin::StyleRun::getLineMetrics     libminikin.so
native: minikin::MeasuredText::getLineMetrics libminikin.so
native: minikin::LineBreakOptimizer::computeBreaks  ← O(n²) on long URL
native: minikin::breakLineOptimal             libminikin.so
native: android::nComputeLineBreaks           libhwui.so

at android.graphics.text.LineBreaker.nComputeLineBreaksWithHelperIndex (Native)
at android.text.StaticLayout.generate (StaticLayout.java:970)
at android.text.StaticLayout$Builder.build (StaticLayout.java:550)
at android.widget.TextView.makeSingleLayout (TextView.java:11263)
at android.widget.TextView.onMeasure (TextView.java:11486)
at android.widget.ListView.onMeasure (ListView.java:1321)
at org.chromium.chrome.browser.contextmenu.ContextMenuListView.onMeasure
   ↑ CHROME CONTEXT MENU — long-press on oversized URL link
at android.view.ViewRootImpl.performTraversals
at android.app.ActivityThread.main

6.2 Firefox — Full Native Stack Trace (bugreport 2026-06-12)

Process: org.mozilla.firefox (PID 3506). Activity: ExternalAppBrowserActivity. Duration: 16,006 ms. Trigger: REAL Gmail link (not a controlled test).

// org.mozilla.firefox PID 3506 — ANR 2026-06-10 19:42:19 — 16,006ms

"main" prio=5 tid=1 Native   ← UI THREAD BLOCKED 16,006ms

native: minikin::LayoutCacheKey::LayoutCacheKey+120  libminikin.so
native: minikin::LayoutCache::getOrCreate             libminikin.so
native: minikin::LayoutPieces::getOrCreate            libminikin.so
native: minikin::StyleRun::getLineMetrics             libminikin.so
native: minikin::MeasuredText::getLineMetrics         libminikin.so
native: minikin::LineBreakOptimizer::computeBreaks+1752  ← O(n²)
native: minikin::breakLineOptimal+476                 libminikin.so
native: android::nComputeLineBreaks+356               libhwui.so

at android.graphics.text.LineBreaker.nComputeLineBreaksWithHelperIndex (Native)
at android.text.StaticLayout.generate / Builder.build
at android.widget.TextView.onMeasure
at org.mozilla.fenix.customtabs.ExternalAppBrowserActivity URL rendering
AttributeChrome (Chromium)Firefox (Gecko)
Native entrylibminikin::LineBreakOptimizer::computeBreakslibminikin::LineBreakOptimizer::computeBreaks
ANR duration5,000ms+ (threshold)16,006ms (3× longer)
TriggerControlled testREAL Gmail email link
TierTier ATier A

6.3 Additional Entry Points Confirmed (June 2026)

BugreportAppTriggerminikin functionEntry point
2026-05-24ChromeLong-press on linkbreakLineOptimalContextMenuListView.onMeasure
2026-06-10FirefoxReal Gmail linkbreakLineOptimalExternalAppBrowserActivity
2026-06-24EdgeSystemUI crash → omnibox re-layoutbreakLineOptimalOmniboxSuggestionsContainer
2026-06-28Google Appandroid.intent.action.TRANSLATEbreakLineGreedyDynamicLayout$ChangeWatcher.onTextChanged

Critical: breakLineGreedy is also vulnerable to blocking on long text. The naive “switch to greedy” fix is incomplete. A hard length threshold before either algorithm runs is required.

Reproduction steps (STA-017 — Chrome context menu)

  1. Create an HTML page containing a hyperlink whose href is a syntactically valid URL of approximately 80–120 KB with high density of #, / and % characters.
  2. Host or open the page in Chrome on Android 13–16.
  3. Long-press the link until the context menu appears.
  4. Observe main-thread ANR (typically ≥ 5 000 ms). Capture via adb bugreport; native stack shows libminikin::LineBreakOptimizer::computeBreaks.

Equivalent behaviour has been observed with real-world Gmail links (Firefox, 16 006 ms) and SystemUI-triggered omnibox re-layout (Edge).


6b. STA-027 — Edge Ask Copilot Deep Link Amplification ★NEW

STA IdentifierSTA-027
CategoryIntent / Compose Navigation Amplification (Class A + Class B)
Affected ComponentMicrosoft Edge Ask Copilot (com.microsoft.copilotn)
ImpactCrash / navigation failure via deep link with oversized initialText
CVSS 3.16.5
PersistenceYes (until data cleared / conversation state reset)
TierA ★NEW

STA-027 demonstrates simultaneous Class A and Class B behaviour inside Microsoft Edge’s Ask Copilot deep-link navigation path. An oversized structured payload supplied in the initialText query parameter is accepted by the deep-link handler and forwarded into Jetpack Compose Navigation. The resulting route string exceeds the expected structure of the NavGraph, producing an uncaught IllegalArgumentException.

java.lang.IllegalArgumentException: 
navigation destination com.microsoft.copilotn.features.deeplink.navigation.routes.HomeNavRoute.ChatNavRoute?
conversation_id=null&private_mode_chat=false&conversationTitle=null&initialText=ULTRA%20DESTRUCTIVE%20LAYOUT%20ATTACK...
is not a direct child of this NavGraph
at androidx.navigation.compose.c.a (NavGraph.kt:356)
at com.microsoft.copilotn.features.deeplink.navigation.routes.HomeNavRoute.ChatNavRoute

The oversized initialText value simultaneously:

  • Triggers expensive text layout / measurement work (Class B amplification path) when the destination attempts to render or pre-process the parameter.
  • Breaks Compose Navigation graph resolution because the fully-expanded route is no longer recognised as a direct child of the NavGraph (Class A style state / routing failure).

Remote activation: Unlike STA-017 (which requires a long-press or local UI interaction inside an already-open browser), STA-027 can be triggered remotely by a malicious deep link that opens Edge Ask Copilot with a crafted initialText parameter. No prior interaction with the Copilot UI is required beyond following the link.

Reproduction steps (STA-027)

  1. Construct a deep link targeting Microsoft Edge Ask Copilot that includes an oversized initialText query parameter (structured text large enough to expand the Compose navigation route beyond NavGraph expectations).
  2. Open the link from another app or browser (ACTION_VIEW / deep link).
  3. Observe uncaught IllegalArgumentException from androidx.navigation.compose (NavGraph.kt) when resolving HomeNavRoute.ChatNavRoute.
  4. Capture logcat / bugreport; confirm stack includes the navigation destination containing the expanded initialText.

7. AOSP Commit Evidence

7.1 Chromium Commit 3e62ece6 — LargePayloadSupport (May 7, 2026)

Commit: chromium.googlesource.com/chromium/src/+/3e62ece6

Commit message (verbatim):

“Implements ResultReceiver for large payloads in DigitalCredentialsPresentationDelegate to avoid TransactionTooLargeException when responses exceed Binder IPC limits. This aligns with updates in Jetpack libraries (AOSP CL 3989977) where large payloads are passed via file descriptors.”

1. Explicitly names TransactionTooLargeException — same as ALL Class A vectors.
2. References AOSP CL 3989977 (LargePayloadSupport) — internal, not public.
3. Fix: file descriptors instead of Binder.
4. Google named this: LargePayloadSupport.

Related historical trackers:

7.2 androidx.savedstate 1.5.0 — Bug #425919375

DateEventT+ VRP
Jun 19, 2025Bug #425919375 created — SavedState serialization— (inactive 7 months)
Jan 20, 2026VRP submission to Google Android VRPT+0
Feb 10, 2026Google responds for FIRST timeT+21 days
Mar 4, 2026Commit: Support generic serialization for SavedStateT+43 days
Mar 11, 2026Bug Fixed — savedstate 1.5.0-alpha01T+50 days
May 19, 2026savedstate 1.5.0 STABLE — CBOR/JSON decoupled from BinderT+119 days

savedstate 1.5.0 decouples SavedState from the Bundle/Binder pipeline — an architectural fix for part of the Class A root cause. Bug inactive 7 months. Reactivated 21 days after VRP. Fixed in ~30 days. Google framed it as “multiplatform support” — no security motivation mentioned publicly.

7.3 libminikin design debt — multi-file pipeline (AOSP forensic summary)

Independent AOSP source review identifies a systemic design gap across multiple minikin files: no length validation before expensive line-breaking or layout work. Oldest relevant code paths date to 2013. Key files:

FileSinceIssueFunction
FontFamily.cpp2013Null / closest-match edge casesgetClosestMatch()
Layout.cpp2013Long text processed without cache guarddoLayoutWord()
OptimalLineBreaker.cpp2015Knuth-Plass O(n²) without input limitcomputeBreaks()
GreedyLineBreaker.cpp2017Nested loops; worst-case costlyprocessLineBreak()
LineBreaker.cpp2018Chooses Optimal/Greedy with no size checkbreakIntoLines()
LayoutCache.h2018Over CHAR_LIMIT_FOR_CACHE → direct process (no cache)getOrCreate()
LineBreaker::breakIntoLines()     — no textBuffer.size() guard
        ↓
Optimal / Greedy breaker          — O(n²) / nested work on long input
        ↓
Layout::doLayoutWord()
        ↓
LayoutCache::getOrCreate()        — long ranges bypass cache → full work
        ↓
HarfBuzz shaping
        ↓
UI thread blocked (5–16 s ANR)

Public Issue Tracker history (examples): #161830416, #167014931, #188985643, #40268980 / Chromium 1447465 (Samsung engineer ANR), #477202817 (Won’t Fix), #524288518 (out of scope), #531319203 (related pattern). Structural length limits were not applied across the pipeline as of the July 2026 bulletin, despite the existence of internal Google work addressing an adjacent root cause (AOSP CL 3989977, LargePayloadSupport).

Detail: libminikin: 10 años de vulnerabilidad · Algorithmic DoS en libminikin.so


8. Field Evidence — Android 16, Production Device

8.1 STA-015 — 85 SystemUI Crashes in 4 Days (bugreport 2026-05-26)

Device: Xiaomi Redmi Note 14 5G · HyperOS 3.0.3.0 · Android 16. Crash loop reproduced spontaneously during normal device use.

// SystemUI crash at bootstrap
android.os.BadParcelableException: Failure retrieving array; only received 1 of 4
  at android.content.pm.BaseParceledListSlice.<init>(BaseParceledListSlice.java:111)
  at android.window.ITaskOrganizerController$Stub$Proxy.registerTaskOrganizer(...)
  at android.window.TaskOrganizer.registerOrganizer(TaskOrganizer.java:76)
  at com.android.wm.shell.sysui.ShellInit.init(...)  ← crash at bootstrap
Caused by: android.os.DeadObjectException: Transaction failed on small parcel
Total SystemUI crashes85 entries — 4 days (May 23–26, 2026)
Fastest loop16 crashes in 92 seconds
Min survival time374 ms — crashes before any UI renders
Android versionAndroid 16 — first confirmed reproduction

8.2 STA-015b / STA-015-DL — HyperOS Auto-Re-Trigger (12-step flow)

STEP 1:  User opens HTML from Google Drive, clicks link
STEP 2:  Browser receives malformed URL via VIEW Intent
         callingPackage=com.google.android.apps.docs (certified by Android OS)
STEP 3:  libminikin O(n²) ANR in browser
STEP 4:  URL corrupts TaskPersister state on disk
STEP 5:  SystemUI reads corrupt state → BadParcelableException → CRASH
STEP 6:  Android auto-restarts SystemUI
STEP 7:  OEM Task State Interactor (HyperOS OEM) subscribes Flow:
         getFocusedRootTaskInfo() → reads SAME corrupt disk state → CRASH AGAIN
STEP 8:  Crash loop → Android forced to clear SystemUI data → LOCKSCREEN
STEP 9:  User enters PIN/pattern/fingerprint
STEP 10: Android restores session → BROWSER RETURNS TO FOREGROUND
STEP 11: OEM Task State Interactor reads task state → browser is active
         → reads still-corrupt TaskPersister state → SECOND CRASH LOOP
STEP 12: NO ADDITIONAL USER ACTION REQUIRED — crash re-triggers automatically

// Recovery: force reboot + clear browser data

STA-015-DL on HyperOS re-triggers AUTOMATICALLY after lockscreen unlock. No additional user action is required after the initial click. A single reboot may not be sufficient if the browser relaunches with the same corrupt state.


9. Complete Vector Catalog — 32 Vectors

Table 2. Documented STA vectors. CVSS scores are researcher estimates (see methodology note under the table). Tier A = full stack / exception evidence; Tier B = behavioural / analogy.

IDApp / ComponentCVSSPersistTier
STA-015-DLGoogle Drive + Any Browser → SystemUI crash loop (hard reboot)8.6Reboot onlyA
STA-018Google Drive + Print Service + SystemUI — ANR cascade7.5Until rebootA
STA-010SystemUI / Print Service — Drive → local printer7.2Until rebootA
STA-011SystemUI / Clipboard — paste preview crash7.2Until rebootA
STA-015WindowManager Shell / RecentTasksController7.2Auto-restart→lockscreenA
STA-015bHyperOS / OEM Task State Interactor (Xiaomi OEM)7.2Auto-recoveryA
STA-012Threads (Meta) — deep link /search?q=[payload]7.1Permanent (pm clear)A
STA-012eThreads via WhatsApp — HTML/WebView → Threads deep link7.1Permanent (pm clear)A
STA-019aFirefox — ClipboardManager DeadSystemException on address bar focus6.8Every focus eventA
STA-008System services — sync IPC call + oversized payload → ANR6.8Until app killedB
STA-005dWhatsApp deep link api.whatsapp.com/send?text=[payload]6.8PossibleB
STA-0176+ browsers — long-press URL → libminikin ANR (Chrome+Firefox Tier A)6.5NoA
STA-027Microsoft Edge Ask Copilot — deep link initialText NavGraph crash ★NEW6.5YesA ★
STA-005WhatsApp — paste large text in chat compose field6.5PermanentA
STA-005bWhatsApp Business — all agents in shared inbox6.5Permanent (all agents)A
STA-005cWhatsApp + Meta AI — oversized draft in AI chat6.5Permanent (entire app)A
STA-006Google App — Select text → Translate6.5PermanentA
STA-007Google Drive — invisible PDF → Select All → Translate6.5PermanentA
STA-009Google Drive — large DOCX → Print Preview6.5PermanentA
STA-010bGoogle Play Services — Drive → cloud printer6.5Until app closedA
STA-016Opera Browser — onResume → RuntimeException: Failure from system6.5PermanentA
STA-019dFirefox — address bar TextLayout lineIndex OOB6.5Every focus eventA
STA-020Chrome + Edge — address bar history pipeline ANR6.5Until history clearedB
STA-021Brave Browser — address bar ANR / rendering anomaly6.5Until history clearedB
STA-022DuckDuckGo — URL_EXTRA_ARG 920KB in Fragment args (965KB parcel)6.5Until tab closedA
STA-022bDuckDuckGo — history suggestion pipeline ANR (cross-session)6.5Until history clearedB
STA-013Microsoft Bing — contaminated address bar history crash6.0Until data clearedB
STA-019bFirefox — SearchDialogFragment IllegalStateException6.0Every focus eventA
STA-019cFirefox — Compose TextLayout lineIndex OOB (Jetpack Compose)6.0Every focus eventA
STA-023/b/cSamsung Internet — background tab / Share / tab group freeze5.4NoB
STA-004Google Maps — oversized geo: URI4.8PartialB
STA-001/003Chrome / Browsers — long-press context menu, Share link3.7NoB

CVSS methodology note: CVSS 3.1 scores are researcher estimates. For STA-015-DL the vector used is AV:N/AC:L/PR:N/UI:R/S:C/C:N/I:N/A:H (8.6). Other scores follow analogous reasoning (remote or local delivery, user interaction, availability impact, and whether scope changes to SystemUI). Scores are subject to vendor revision.


9b. Impact Matrix (Qualitative)

Table 3. Qualitative impact summary by vector group (researcher assessment; complements CVSS in Table 2).

Vector groupAvailabilityPersistenceUser interactionAttack complexityNotes
STA-015-DL / SystemUIHigh (device UI)Yes (reboot)One clickLowScope Changed; hard reboot
STA-010/011 Print/ClipboardHigh (SystemUI)Yes (until reboot)Print / pasteLowSystem service path
STA-005 WhatsApp familyHigh (app / shared inbox)Yes (delete chat)Paste / open chatLow×20.6 Bundle amplification
STA-012 ThreadsHigh (app)Yes (pm clear)Deep link clickLowPermanent until data clear
STA-017 libminikin ANRMedium (ANR 5–16 s)NoLong-press / focusLowCross-engine; framework lib
STA-027 Edge Ask CopilotMedium–High (crash)YesDeep link clickLowRemote; Compose NavGraph
STA-019 Firefox address barMediumYes (every focus)Focus address barLowRepeated until history cleared
STA-020/021/022 browsersMediumPartialFocus / historyLowHistory pipeline

10. STA-005 — WhatsApp Variants

Affected componentFragmentManager.restoreAllState() — AndroidX
TriggerBundle.dataSize() > 1,048,576 bytes during state restoration
Current behaviorTransactionTooLargeException uncaught → crash → state re-persisted → loop
Expected behaviorException caught → state discarded → clean start → no loop
Reproducibility100% — Pixel 7, Xiaomi Redmi 14, OPPO A78, OnePlus 11 (Android 13–16)
Confirmed appsWhatsApp, WhatsApp Business, Meta AI, Threads, Bing, Opera, DuckDuckGo, Firefox
CVSS 3.16.5 — AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:N/A:H

STA-005b (WhatsApp Business): When a conversation’s SavedState becomes contaminated, the crash loop affects ALL agents in a shared inbox simultaneously. The only recovery (deleting the conversation) destroys the entire communication history with that client.

STA-005c (WhatsApp + Meta AI): Oversized draft in AI chat can lock the entire application permanently.


11. STA-015 Series — SystemUI Vectors

These vectors extend Class A amplification into privileged system components. Impact is no longer confined to a single app.

VectorTriggerMechanismCVSS
STA-010Google Drive document → Print → local printerPrint Service builds preview Bundle from oversized text; exceeds Binder when handed to SystemUI7.2
STA-010bDrive → cloud/network printerSame root mechanism routed through Play Services6.5
STA-011Copy oversized clipboard → focus text field with assisted-pasteClipboard assisted-paste preview serializes full ClipData instead of truncated snippet7.2
STA-015Opening recent apps / task listRecentTasksController reads corrupt task state → DeadSystemException → SystemUI crash → lockscreen7.2
STA-015bHyperOS after SystemUI restartOEM Task State Interactor re-reads corrupt state → automatic re-crash7.2
STA-015-DLGoogle Drive HTML link → any browserFull remote chain (see section 8.2). Hard reboot required. Scope Changed.8.6

CVSS 3.1 for STA-015-DL: AV:N / AC:L / PR:N / UI:R / S:C / C:N / I:N / A:H = 8.6 HIGH. Remote, single click, changes scope to SystemUI, high availability impact.


12. STA-019 — Firefox: Four Failure Modes

  • STA-019a — ClipboardManager DeadSystemException on every address-bar focus (CVSS 6.8)
  • STA-019b — SearchDialogFragment IllegalStateException (CVSS 6.0)
  • STA-019c — Jetpack Compose TextLayout lineIndex out-of-bounds (CVSS 6.0)
  • STA-019d — address-bar TextLayout lineIndex OOB (CVSS 6.5)

All four can fire on every focus event once history/state is contaminated, producing a persistent unusable address bar.

13. STA-020 / 021 — Chrome / Edge / Brave Address-Bar Pipeline

History suggestion pipeline retains oversized URLs. Subsequent focus or suggestion rendering re-enters libminikin or causes ANR. Chromium applied a partial display-only truncation in 2023 that never covered the loading/history path — STA-020 still reproduces through the unpatched path.

14. STA-022 — DuckDuckGo

STA-022: URL_EXTRA_ARG of ~920 KB stored in Fragment arguments produces a 965 KB parcel → TransactionTooLargeException (Tier A). STA-022b: history suggestion pipeline ANR that survives across sessions until history is cleared.


15. Cross-Platform Validation — iOS Not Affected

Same payload does NOT crash Threads for iOS. Same app, same 20 000-character deep link, zero crash on iOS. Failure is isolated to Android-specific components: Binder (1 MB limit), TaskPersister, FragmentManager.restoreAllState(). The fix must come from Google / AOSP.


16. Recommended Fixes

Proposed mitigations (not observed factory behaviour). Code samples below are suggestions for framework and application owners; they have not been merged upstream as of the July 2026 bulletin.

16.1 Framework — Class B (libminikin)

Listing 2. Proposed length thresholds before Optimal/Greedy line breaking.

// CORRECTED FIX — LineBreakOptimizer.cpp (libminikin.so)
// Previous “switch to greedy only” is incomplete: breakLineGreedy also blocks.

LineBreakResult LineBreakOptimizer::computeBreaks(...) {
    const int textLength = end - start;

    // THRESHOLD 1 (HARD): Truncate before any algorithm runs.
    // Neither algorithm produces useful results for text > 8 KB of URL/text.
    if (textLength > MAX_SAFE_TEXT_LENGTH_ABSOLUTE) {
        end = start + MAX_SAFE_TEXT_LENGTH_ABSOLUTE;
    }

    // THRESHOLD 2: Prefer O(n) greedy for medium-length text.
    if ((end - start) > MAX_SAFE_TEXT_LENGTH_FOR_OPTIMIZER) {
        return computeBreaksGreedy(measured, start, end, constraints);
    }

    return computeBreaksOptimal(measured, start, end, constraints);
}

// Units are UTF-16 code units (Java/Android char), NOT bytes.
static const int MAX_SAFE_TEXT_LENGTH_ABSOLUTE     = 8192;  // hard truncate
static const int MAX_SAFE_TEXT_LENGTH_FOR_OPTIMIZER = 2048;  // switch to greedy

16.2 Framework — Class A (FragmentManager / SystemUI)

  • Catch TransactionTooLargeException inside FragmentManager.restoreAllState() and start clean.
  • Validate derived state size before persistence (TaskPersister, SavedStateRegistry).
  • SystemUI and OEM components must treat restored task lists as potentially toxic and degrade gracefully (do not crash the whole UI process).

16.3 Application-level (immediate workarounds)

// Truncate any text displayed in a TextView
public static String safeForTextView(String text) {
    final int MAX = 8192;
    if (text == null) return null;
    return text.length() > MAX ? text.substring(0, MAX) + "..." : text;
}

// Reject oversized VIEW Intents
if (Intent.ACTION_VIEW.equals(intent.getAction())) {
    Uri data = intent.getData();
    if (data != null && data.toString().length() > 50_000) {
        Log.w(TAG, "Incoming VIEW Intent URL exceeds safe length — discarding");
        finish();
        return;
    }
}

Coverage warning for CISOs: Updating to androidx.savedstate 1.5.0 does NOT protect against STA-015-DL (SystemUI), STA-015/015b, STA-017 (libminikin) or STA-019 (Firefox pipeline). Those require AOSP-level changes that only Google can ship.

16.4 Generic System UI / OEM Resiliency Pattern (STA-015b)

HyperOS component OEM Task State Interactor re-subscribes to task info after SystemUI restart and re-reads corrupt state. Safe degradation on DeadObjectException prevents the automatic second crash loop:

// STA-015b — Xiaomi / HyperOS OEM fix
// OEM Task State Interactor: safe degradation when TaskManager is dead

val focusedTaskFlow = interactor.getFocusedRootTaskInfoFlow()
    .catch { exception ->
        if (exception is DeadObjectException) {
            Log.e("SystemUI", "TaskManager service is dead. Resubscribing later.")
            emit(null) // Safe degradation — do not crash SystemUI
        } else {
            throw exception
        }
    }

17. Vendor Notification Status

VendorFirst notificationResponse / validationPatch status (Jul 2026)
Xiaomi2026Reproduced, confirmed, rewardedOEM-side mitigation feasible
Google (Android VRP)Jan 20, 2026Multiple reports; mixed outcomes; savedstate 1.5.0 progressNo public STA patches in Jul bulletin
Microsoft (MSRC)Jan / Jun 2026Individual cases (Edge, Bing, Ask Copilot STA-027)Pending
Mozilla2026Reports submitted (Firefox family)Pending
Opera / Brave / DuckDuckGo / Tor2026Reports submitted; classifications varyPending
SamsungDocumented only (no public VRP for this class)
INCIBE (CNA Spain)Jul 2026Referred to MITRE (CNA Root for Google). Technical reports and PoCs submitted.All STA vectors

18. Disclosure Timeline

Research span: 2022 → 30 July 2026. Primary laboratory device: Xiaomi Redmi Note 14 5G (HyperOS 3.0 / Android 16). Much of the AOSP path analysis was performed from a phone browser reading public source, without a traditional multi-monitor lab setup.

18.1 2022 — Origin

DateMilestone
28 Aug 2022Original discovery: TransactionTooLargeException / DeadSystemException in Firefox Focus & Nightly (clipboard, share, open-in-app)
12 Oct 2022First public advisory: “Mozilla Firefox Focus and Nightly for Android Remote Crash DoS” (lostmon.blogspot.com)
Nov 2022Chromium Issue 40879254 opened; security labels removed; partial UX patch; issue remained open
Nov 2022Mozilla Bugzilla #1802594 (S3) opened — still NEW / unresolved as of 2026

18.2 January–April 2026 — Formal investigation

DateMilestone
20 Jan 2026Formal reports to Google Android VRP (A-477279924) and Microsoft MSRC. Case A-477279924 received a $250 VRP reward for the Binder/IPC research area and remained open / blocked on internal dependency as of mid-2026. (A separate Chrome VRP filing, Issue 477202817, was closed the same day as “Won’t Fix (Intended Behavior)”.)
Feb 2026Whitepaper v4 distributed (27 vectors); STA-015-DL (CVSS 8.6) and STA-015b added
Mar 2026Meta (WhatsApp/Threads) notified — no response (113+ days by July)

18.3 May–June 2026 — Field evidence

DateMilestone
24 May 2026Chrome bugreport: 2 full native ANRs → STA-017 Tier A (libminikin)
26 May 2026SystemUI: 85 crashes in 4 days on Android 16 (first confirmed)
31 May 2026STA-015-DL remote attack confirmed via Google Drive (callingPackage=com.google.android.apps.docs) — 6 browsers
10 Jun 2026Vendor notifications: Mozilla, Opera, DuckDuckGo, Brave, Tor, Xiaomi (HackerOne)
10 Jun 2026Firefox ANR 16 006 ms (real Gmail link) → STA-017 Firefox Tier A
14 Jun 2026MSRC responds; requests separate cases; defers framework root cause to Google
15 Jun 2026Google closes libminikin-specific report (524288518) as “out of scope” — months after $250 reward
16 Jun 2026Appeal for STA-015-DL citing CVE-2023-21167 / A-259942964; Opera classifies P5 Informational
19 Jun 2026Brave rejects as “upstream / DoS out of scope”
20 Jun 2026Second spontaneous SystemUI crash loop; Edge ANR 25 s later → STA-017 Edge Tier A
24 Jun 2026Three separate MSRC cases filed; blog posts: STA framework + Algorithmic DoS in libminikin
28 Jun 2026Google App: 5 ANR + 3 TransactionTooLargeException in 14 min; breakLineGreedy also vulnerable; first simultaneous Class A+B
30 Jun 2026No public AOSP/Chromium/AndroidX commits addressing documented vectors; June bulletin empty for STA

18.4 July 2026 — Countdown to disclosure

DateMilestone
5 Jul 2026Google Issue #531319203 opened (system_server boot loop / BitmapCache — same architectural pattern)
6 Jul 2026July Android Security Bulletin published — zero patches for any STA vector
10 Jul 2026Blog: “libminikin: 10 años de vulnerabilidad”; Xiaomi device still vulnerable after June patch
11 Jul 2026Mozilla Bugzilla #2046725 opened for Firefox family
16 Jul 2026Xiaomi confirms vulnerability and awards bounty ($300 via HackerOne)
Jul 2026STA-027 (Edge Ask Copilot) documented; INCIBE (CNA Spain) reviewed the case and referred it to MITRE for CVE assignment
30 Jul 2026Public whitepaper disclosure — lostmon.blogspot.com

July 2026 Security Bulletin — zero mitigation. Google has not released the internal fix (LargePayloadSupport, AOSP CL 3989977) to the public branch as of the disclosure date. The $250 VRP reward for the Binder/IPC research area stands in contrast to the later “out of scope” classification of the related libminikin report.

Full narrative timeline and related articles: Timeline STA · Research story · libminikin 10 years · Algorithmic DoS · STA framework


19. Glossary

TermDefinition
STAStructured Text Amplification — architectural pattern of progressive resource amplification from structured textual input.
Class AIPC / SavedState amplification: Bundle exceeds Binder limit → crash loop.
Class BInteraction-surface amplification: libminikin line-breaking blocks UI thread → ANR.
BinderAndroid IPC mechanism; hard transaction limit 1 048 576 bytes.
TaskPersisterFramework component that persists task/activity state to disk for restoration.
SavedState / FragmentManager.restoreAllState()AndroidX/AOSP path that restores Fragment hierarchy from a Bundle after process death.
libminikinNative Android text layout library (line breaking, measurement); used by TextView and others.
LineBreakOptimizer::computeBreaksOptimal (often O(n²)) line-breaking path inside libminikin.
SystemUIPrivileged process that owns status bar, navigation bar, lockscreen, recent tasks.
OEM Task State InteractorXiaomi HyperOS OEM component that re-subscribes to task focus state after SystemUI restart.
LargePayloadSupportInternal Google/AOSP work (CL 3989977) to pass large payloads via file descriptors instead of Binder.
TransactionTooLargeExceptionException thrown when a Parcel/Binder transaction exceeds the 1 MB limit.
ANRApplication Not Responding — main thread blocked beyond the watchdog threshold (~5 s).
NavGraph (Compose)Jetpack Compose Navigation graph; routes must be direct children of the declared graph.

20. Limitations and Future Work

  • Research conducted on production consumer devices; no privileged access to proprietary vendor source beyond AOSP.
  • Exact behaviour varies with Android version, OEM customisations, available memory and security patches.
  • Not every documented vector has received independent vendor confirmation.
  • STA is proposed as a working architectural model derived from empirical observations. Its ultimate validity depends on independent reproduction and critical review.

20.1 Future work

  • Formal mathematical modelling of amplification thresholds (Class A nesting depth vs Bundle size; Class B character-composition cost).
  • Automated detection of STA-style execution paths (static analysis + dynamic instrumentation).
  • Broader cross-platform comparison (further iOS controls; other mobile OS text pipelines).
  • Upstream-ready patches for libminikin length thresholds and SystemUI safe degradation.

21. Conclusion

What initially appeared to be isolated denial-of-service conditions gradually revealed recurring architectural characteristics shared by otherwise unrelated execution paths. These observations motivated the introduction of the Structured Text Amplification (STA) model.

The primary contributions of this work are:

  1. Introduction of STA as an architectural framework for analysing structured input propagation across Android.
  2. Documentation of 32 reproducible vectors spanning Class A (IPC/SavedState) and Class B (libminikin) mechanisms, with full technical evidence.
  3. Correlation of apparently independent behaviours through execution-path analysis rather than symptom comparison.
  4. Concrete evidence (native stack traces from production devices, AOSP commit references, field crash statistics) supporting the most severe findings, including remote SystemUI crash loops (CVSS 8.6).
  5. Proposal of layered defensive strategies that address amplification at the architectural level.
Structured Text Amplification was not discovered in a single experiment. It emerged progressively through months of observation, reverse engineering, responsible disclosure and repeated empirical validation. The vectors documented in this whitepaper should therefore be understood not merely as isolated software behaviours, but as the experimental foundation from which the STA model was derived.

Whether future research confirms, refines or challenges this model, the underlying observations remain reproducible technical evidence.


References

  1. Chromium commit 3e62ece6 (LargePayloadSupport), May 2026: chromium.googlesource.com/chromium/src/+/3e62ece6
  2. Google Issue Tracker 40879254 (2022): issuetracker.google.com/issues/40879254
  3. Google Issue Tracker 40268979 / related Samsung Chrome ANR (2023): issuetracker.google.com/issues/40268979
  4. AOSP minikin repository: android.googlesource.com/platform/frameworks/minikin/
  5. androidx.savedstate 1.5.0 / Bug #425919375 (SavedState serialization)
  6. Android Open Source Project — FragmentManager, TaskPersister, WindowManager Shell
  7. Android Security Bulletins (historical Minikin resource-exhaustion ANR notes)
  8. Lostmon — Structured Text Amplification (STA), 23 Jun 2026: lostmon.blogspot.com/2026/06/structured-text-amplification-sta.html
  9. Lostmon — Algorithmic DoS en libminikin.so, 24 Jun 2026: lostmon.blogspot.com/2026/06/algorithmic-dos-en-libminikinso.html
  10. Lostmon — libminikin: 10 años de vulnerabilidad, 10 Jul 2026: lostmon.blogspot.com/2026/07/libminikin-10-anos-de-vulnerabilidad-en_0671440346.html
  11. Lostmon — Timeline investigación STA, 12 Jul 2026: lostmon.blogspot.com/2026/07/timeline-investigacion-sta-estilos.html
  12. Lostmon — Desafiar Android desde el sofá, 17 Jul 2026: lostmon.blogspot.com/2026/07/desafiar-android-desde-el-sofa-y-un.html

Appendix I — Additional External Corroboration (July 2026)

Google has publicly acknowledged, across multiple Android version cycles (4.4.2, 7.1, 8.1, 9.0), that Minikin is vulnerable to resource-exhaustion ANR triggered by attacker-controlled text content. The phenomenon matches the general failure category documented throughout this paper (STA-017 and related vectors).

An independent Chinese-language technical article (Volcengine, May 2026) describes the same practical symptom from an application-developer perspective and recommends truncating input to a bounded size in the 8–32 KB range — consistent with the 8192 UTF-16 code-unit threshold proposed here.

androidx.savedstate 1.5.0 addresses part of Class A for AndroidX consumers but does not cover SystemUI, TaskPersister, libminikin or OEM layers. The most severe vectors still require AOSP-level changes.

CNA referral note (INCIBE → MITRE). On July 14, 2026, INCIBE (Spain's national CSIRT and CVE Numbering Authority) was contacted for CVE assignment across the STA vectors documented in this paper. After internal review, INCIBE formally responded that the affected components fall under MITRE's jurisdiction as the CNA Top-Level Root for the Google ecosystem, and referred the case accordingly. The full whitepaper and supporting evidence are being submitted to MITRE upon public disclosure (July 30, 2026).

Note on external PoC activity. The researcher has been made aware of a public proof-of-concept tracked as CVE-2026-10702, reportedly addressing a related class of Android text-rendering denial-of-service behaviour. This paper has not independently verified the technical content of that CVE record or confirmed a direct mechanism overlap with the STA-017 vectors documented here. It is noted for context as a potential independent data point on the broader visibility of this vulnerability class, not as corroborated evidence within this paper's chain of proof.


Appendix II — Vendor Conduct & Acknowledgements: Xiaomi

While many vendors either dismissed the reports through procedural classifications or ignored them entirely, Xiaomi demonstrated that it is entirely possible to:

  • Recognize a systemic issue without disclaiming responsibility.
  • Deploy OEM-level mitigations while awaiting upstream fixes from AOSP.
  • Value and support the work of independent security researchers.
  • Conduct responsible disclosure with transparency, professionalism, and technical competence.

Acknowledgements

High-level vector behavior for STA-015 and STA-015b is documented in this paper for architectural completeness. However, specific internal component names, proprietary code traces, and exact patch implementations have been intentionally withheld out of respect for Xiaomi's internal patching process and in accordance with responsible disclosure agreements.

The researcher wishes to express sincere appreciation to Xiaomi's Security Team for their professionalism, technical rigor, and commitment to protecting their user base.

Xiaomi demonstrated that it is possible to do the right thing — even when the underlying issue originates beyond your immediate framework layers.


Structured Text Amplification (STA)
Unified Architectural + Full Technical Whitepaper
© 2026 Manuel García Peña (Lostmon)
Public disclosure: 30 July 2026 · lostmon.blogspot.com

Desafiar Android desde el sofá y un smartphone

Friday, July 17, 2026

¿Se puede desafiar la seguridad de Android usando SOLO un teléfono móvil?

La respuesta es sí.
Y esta es mi historia.


Soy Manuel García Peña (Lostmon), investigador independiente de seguridad y presidente de BojosXtu, una asociación de apoyo y empoderamiento en salud mental.

Durante los últimos cuatro años he perseguido un mismo patrón dentro de Android. Lo que comenzó como una intuición técnica terminó convirtiéndose en una investigación donde documento 31 vectores de ataque relacionados con un mismo fenómeno al que he llamado Structured Text Amplification (STA), un patrón que implica componentes críticos de Android como libminikin, SystemUI, el pipeline de renderizado de texto y distintos mecanismos internos de procesamiento y restauración del estado del sistema.

📅 La investigación completa verá la luz el próximo 30 de julio.

Pero lo más importante no es el hallazgo técnico.
Lo importante es cómo llegué hasta él.


🧒 Antes del diagnóstico: perseguir bugs era mi forma de entender el mundo

Mucho antes de recibir un diagnóstico de salud mental, ya era el típico chaval que desmontaba todo para descubrir cómo funcionaba.

Mientras otros jugaban, yo abría aplicaciones, observaba comportamientos extraños y me hacía siempre la misma pregunta:

"¿Y si esto se puede romper?"

No sabía lo que era un Bug Bounty. No sabía lo que era AOSP. Ni siquiera imaginaba que algún día investigaría vulnerabilidades.

Simplemente tenía una curiosidad casi obsesiva por comprender cómo funcionaban los sistemas.

Con los años empecé a encontrar fallos reales, a reportarlos y a aprender de forma completamente autodidacta.

Antes de tener que retirarme por problemas de salud mental, llegué a descubrir y documentar, más de 400 vulnerabilidades.


🖤 El momento en que tuve que dejarlo

Después llegó el diagnóstico.

Y con él, una realidad que me costó mucho aceptar.

Ya no podía pasar horas delante de un ordenador como antes.

Mi mente empezó a jugarme malas pasadas. Cuando llega. los Fantasmas, cada uno debe librar sus batallas con sus propios demonios.

Cuanto más tiempo permanecía frente a una pantalla grande, más me absorbía el mundo que había dentro de ella. Perdía la noción del tiempo, perdía el entorno y, a veces, sentía que me perdía yo mismo entre miles de líneas de código.

Tuve que dejar de investigar y alejarme de la tecnología que tanto me apasiona. ¿Como borras algo de tu vida que ha estado siempre?

Y fue durísimo.

Porque no estaba perdiendo simplemente un hobby.
Sentía que estaba perdiendo una parte de mí.

Pensé que todo había terminado.


📱 Mi laboratorio: un Xiaomi Redmi 14 5G y una tablet Lenovo.

Pero la curiosidad seguía ahí.

Y encontré otra forma de poder de vivir, sin estar rodeado de tanta tecnología.

Gran parte de esta investigación se ha realizado desde un Xiaomi Redmi 14 5G y la tablet Lenovo .

Desde el sofá.

En mis días buenos.
Cuando la cabeza me dejaba concentrarme un rato.

Sin un laboratorio.
Sin una estación de trabajo.
Sin varios monitores.
Sin ADB.
Sin Android Studio.
Se ha usado AI para la asistencia en la redaccion y formato de los documentos.

Solo una pantalla pequeña, AOSP abierto en el navegador y miles de líneas de código leídas función a función, siguiendo llamadas entre clases para intentar comprender cómo pensaba Android.

Durante cuatro años fui reconstruyendo ese enorme puzle.

Había días en los que solo podía revisar unas pocas funciones.

Otros encontraba una pista y pasaba horas siguiendo llamadas entre TextView, StaticLayout, LineBreaker, libminikin, SystemUI y muchos otros componentes del framework.

Así comenzó la persecución de un patrón que aparecía una y otra vez.


🔍 Cuatro años persiguiendo el mismo fantasma

La primera vez que observé un comportamiento extraño fue hace años, en Android 9.

Lo reproduje.
Tomé notas.
Y seguí investigando.

Con el tiempo aparecieron nuevos síntomas:

  • • bloqueos en navegadores;
  • ANRs provocados por determinadas estructuras de texto;
  • • problemas durante la impresión;
  • • corrupción de estado en aplicaciones;
  • crash loops persistentes de SystemUI;
  • • comportamientos aparentemente distintos que, una y otra vez, me llevaban al mismo lugar.

La mayoría habría pensado que eran errores independientes.

Yo no conseguía quitarme de la cabeza la sensación de que todos compartían un mismo origen.

Cada vez que encontraba un síntoma nuevo volvía al mismo sitio del código.

Fue entonces cuando empecé a sospechar que no estaba persiguiendo treinta y un errores distintos.
Estaba persiguiendo un único patrón que se manifestaba de formas diferentes.


🧠 La neurodivergencia también puede aportar otra forma de mirar

Durante mucho tiempo pensé que mi diagnóstico era un obstáculo para investigar.

Hoy lo veo de otra manera.

Con el tiempo comprendí que mi forma de procesar la información también tenía fortalezas: una enorme capacidad para detectar patrones, mantener el foco durante semanas sobre un mismo problema y conectar detalles que parecían no tener relación.

No romantizo la salud mental.
Hay días malos.
Hay agotamiento.
Hay frustración.
Hay momentos en los que la cabeza simplemente no coopera.

Pero también he aprendido que cada persona observa el mundo de una manera distinta.

Y, a veces, esa mirada diferente permite encontrar conexiones que habían pasado desapercibidas.


🤝 La comunidad hizo posible continuar

Yo solo no habría podido validar todo esto.

Compañeros y amigos me prestaron dispositivos para reproducir los distintos vectores en fabricantes y versiones diferentes de Android.

Gracias a ellos pude comprobar comportamientos en Xiaomi, Samsung, OPPO, OnePlus, LG y otros terminales.

La investigación independiente también se construye así.

Con personas que comparten tiempo, hardware y confianza sin esperar nada a cambio.


💰 Y un día llegaron dos mensajes que jamás olvidaré

En medio de todo este proceso llegaron dos validaciones que nunca habría imaginado cuando empecé leyendo AOSP desde la pantalla de un teléfono móvil.

Google confirmó una vulnerabilidad relacionada con Binder y me concedió una recompensa a través de su programa de vulnerabilidades.

Y hace apenas unas horas Xiaomi confirmó otra vulnerabilidad y me concedió una recompensa mediante HackerOne.

No es una cuestión de dinero.

Lo verdaderamente importante fue leer una frase muy sencilla:

"This vulnerability is confirmed."

Después de tantos años investigando en silencio, esa frase significó mucho más que una recompensa económica.

Fue la confirmación de que todo aquel esfuerzo, todas aquellas horas leyendo código y persiguiendo un patrón que casi nadie veía, estaban dando fruto.


🚀 La investigación continúa

El próximo 30 de julio publicaré el whitepaper completo con la metodología, el marco teórico de Structured Text Amplification (STA), los 31 vectores documentados y todas las evidencias recogidas durante estos años.

No sé cuál será su impacto.
No sé cuántas personas lo leerán.

Pero sí sé una cosa.

La curiosidad no depende del hardware.

No depende de tener el mejor laboratorio.
Ni de disponer de cuatro monitores.

Depende de seguir haciéndote preguntas.

Depende de no dejar de preguntarte:

"¿Y si nadie ha mirado aquí?"

Porque, al final, investigar nunca ha consistido en tener el mejor equipo.

Ha consistido en no perder nunca la capacidad de hacerse preguntas.

Y después de todo este tiempo sigo creyendo exactamente lo mismo que cuando era un chaval persiguiendo bugs sin saber siquiera cómo se llamaban.

"La curiosidad es lo que hace mover la mente." 🛡️

La investigación continúa.
Y yo también.


#Lostmon #Android #AOSP #Ciberseguridad #MobileSecurity #SystemUI #libminikin #STA #StructuredTextAmplification #BugBounty #GoogleVRP #Xiaomi #HackerOne #SaludMental #InvestigaciónIndependiente #BojosXtu
Manuel García Peña (Lostmon)
lostmon.blogspot.com · lostmon@gmail.com
 

Browse

About:Me

My blog:http://lostmon.blogspot.com
Mail:Lostmon@gmail.com
Lostmon Google group
Lostmon@googlegroups.com

La curiosidad es lo que hace
mover la mente...

Friends