Comunidade

Gaps de Resiliência em IPC Android, SavedState e Layout de Texto

Um estudo independente identificou 32 vulnerabilidades críticas no sistema operacional Android que podem levar a loops de falha persistente e interrupções não respondidas (ANRs). As descobertas, divulgadas em julho de 2026, apontam para gaps na resiliência do Android relacionados à manipulação de texto estruturado nas camadas de IPC e libminikin.

Compartilhar
Resilience Gaps in Android IPC, SavedState and Text Layout
Título completoAmplicação Estruturada de Texto (STA) — Estudo Arquitetônico e Técnico da Amplificação de Recursos Impulsionados por Texto na Ecossistema Android
VersãoUnificada Completa — Julho 2026 (merge STA Estudo Arquitetônico v6.0 + Relatório Técnico de Gaps de Resiliência)
PesquisadorManuel García Peña (Lostmon)
Vetores32 documentados (IPC/SavedState Classe A + UI-thread/libminikin Classe B)
Empresas notificadasGoogle · Meta · Microsoft · Mozilla · Opera · DuckDuckGo · Brave · Tor Project · Xiaomi · INCIBE (CNA Espanha)
Affetados tambémSamsung (Série STA-023 — documentada)
Divulgação pública30 de julho de 2026 — lostmon.blogspot.com

CLASSE A — Amplificação do Estado IPC: ausência de fallback seguro em FragmentManager.restoreAllState() e serviços do sistema quando o SavedState serializado excede o limite Binder. Resultado: loops de crash persistentes.

CLASSE B — Amplificação da Superfície de Interacão: ausência de limites defensivos na processamento síncrono de URL/texto no motor de layout de texto do Android (libminikin.so). Resultado: ANR reproduzível em todo o ecossistema.

Estrutura arquitetônica: ambas as classes são manifestações concretas do mesmo padrão mais elevado — Amplicação Estruturada de Texto (STA).


Resumo Executivo

Este whitepaper documenta a Amplicação Estruturada de Texto (STA), um padrão arquitetônico no qual entrada textual estruturada válida (URLs, links profundos, rascunhos, extras Intent) se propaga através das camadas do framework Android e amplifica progressivamente o custo computacional ou tamanho do estado até que os limites de estabilidade sejam excedidos.

Cinco descobertas-chave:

  1. Uma correção interna para partes da causa raiz Classe A existe, mas não é pública. O LargePayloadSupport do Google (AOSP CL 3989977) e androidx.savedstate 1.5.0 abordam parte da causa raiz Classe A; o Boletim de Segurança Android de julho de 2026 contém nenhuma correção pública para qualquer vetor STA.
  2. 32 vetores reproduzíveis entre a Classe A (loops de crash IPC/SavedState) e Classe B (ANR libminikin), confirmados em dispositivos de produção executando Android 13–16.
  3. Validação independente do fornecedor. Xiaomi reproduziu, confirmou e recompensou um vetor HyperOS persistente (STA-015b). INCIBE (CNA Espanha) revisou os relatórios técnicos e encaminhou o caso para MITRE (CNA Top-Level Root para o ecossistema Google) para atribuição de CVE.
  4. Maior impacto: STA-015-DL (CVSS 8.6). Um único clique em um link HTML do Google Drive pode se escalar a um loop de crash SystemUI que requer reinicialização dura. Escopo alterado (navegador é veículo de entrega; SystemUI é o alvo).
  5. Entre motores e fornecedores. O mesmo caminho de bloqueio libminikin aparece no Chromium e Gecko; o mesmo padrão de persistência aparece em WhatsApp, Threads, Firefox, Opera, DuckDuckGo, Edge Ask Copilot e serviços do sistema básico.

Recomendação primária: Limite de comprimento rígido no libminikin e degradação segura (try/catch + descarte) nas rotas de restauração FragmentManager / TaskPersister / SystemUI. Limites de URL e tamanho do rascunho aplicativos são necessários, mas insuficientes como defesa em profundidade.


Modelo de Ameaça

Classe A — IPC / SavedStateClasse B — libminikin / thread UI
Autor da AmeaçaDireta (link manipulado, HTML do Google Drive, deep link) ou local (colar texto grande)Direta (URL/link manipulado) ou local (long-press, foco na barra de endereço)
VítimaUsuários do Android 13–16 dos aplicativos WhatsApp, Threads, navegadores e SystemUI, bem como peles OEMA qualquer aplicativo renderizando texto longo estruturado via TextView / Compose / menu de contexto
Pré-requisitosUm clique ou colar; sem privilégios especiais necessáriosUm clique, long-press ou evento de foco; sem privilégios especiais necessários
ObjetivoDos persistente (loop de crash até limpar os dados / reiniciar)Dos transitório (ANR 5–16 s); pode se tornar persistente se combinado com histórico/TaskPersister
Escopo do impactoApenas um aplicativo → compartilhada inbox → SystemUI (interface de usuário do dispositivo)Thread UI do navegador / aplicativo; pode se propagar para SystemUI em alguns OEMs

Suposições: O atacante pode entregar uma carga estruturada sintaticamente válida, mas grande demais. Não é necessário corrupção de memória ou execução de código. A ameaça depende exclusivamente da falta de limites defensivos e caminhos seguros de degradação.


Metodologia de Teste

A pesquisa foi realizada em seis dispositivos físicos de produção, executando firmware stock ou OEM (nenhum ROM personalizado, nenhum root necessário para a evidência primária). A validação cruzada-OEM usou dispositivos compartilhados pela comunidade de pesquisa independente (Xiaomi, Samsung, OPPO, OnePlus, Pixel).

  • Google Pixel 7 (Android 13–15 stock AOSP)
  • Xiaomi Redmi Note 14 5G (HyperOS 3.0 / Android 16) — principal dispositivo de evidência em campo
  • OPPO A78, OnePlus 11, Lenovo Tablet e dispositivos adicionais cobrindo o Android 9–16

Uma parte substancial da análise do caminho do framework foi realizada lendo fontes públicas de AOSP em um navegador telefônico (nenhum laboratório tradicional multi-monitor). Bugreports e rastros ANR foram capturados no dispositivo quando disponíveis. O Google VRP recompensou a pesquisa na área Binder/IPC ($250); a Xiaomi confirmou e recompensou independentemente um vetor do HyperOS ($300 via HackerOne).

Ferramentas e artefatos:

  • Bugreport / ZIPs de bugreport completo (DROPBOX SYSTEM APP CRASHES, rastros ANR, tumbstones)
  • ID de relatório chrome://crashes (enviado para a infraestrutura do Google)
  • Desenrolamento nativo da pilha a partir dos rastros ANR (libminikin.so BuildId confirmado)
  • Análise das fontes de AOSP para FragmentManager, TaskPersister, LineBreakOptimizer

Generalizações para “todos os OEMs do Android” ou “todas as versões” são inferências a partir desta amostra, não uma enumeração exaustiva. O comportamento pode variar com patches OEM, memória disponível e nível de boletim de segurança. iOS foi usado como controle negativo (mesmas cargas não reproduzem os falhas específicas do Android).


Contexto da Pesquisa

Este trabalho é pesquisa independente de segurança realizada aproximadamente durante quatro anos (observações a partir de 2022; estruturação formal STA e evidência expandida até julho de 2026). Não foi realizado em um ambiente laboratorial tradicional multi-monitor.

Condições primárias:

  • Pesquisador principal: Manuel García Peña (Lostmon), pesquisador independente; presidente da BojosXtu (associação de apoio à saúde mental).
  • Aparelho primário: Xiaomi Redmi Note 14 5G (HyperOS 3.0 / Android 16) — relatórios de falhas, estatísticas de crash do SystemUI e pilhas nativas ANR foram capturados neste aparelho durante uso normal e reprodução controlada.
  • Configuração da análise: Uma grande parte da reconstrução de caminhos AOSP (TextView → StaticLayout → LineBreaker → libminikin; FragmentManager / TaskPersister / SystemUI) foi feita lendo fontes públicas do Android em um navegador telefônico, seguindo cadeias de funções função por função quando a concentração permitia.
  • Validação entre OEMs: Dispositivos adicionais (Pixel, Samsung, OPPO, OnePlus e outros) foram disponibilizados pela comunidade de pesquisa independente para que o comportamento pudesse ser verificado além de um único fabricante.
  • Resultados dos fornecedores (selecionados): O VRP do Google Android recompensou a área de pesquisa Binder/IPC ($250, caso A-477279924). A Xiaomi reproduziu independentemente um vetor persistente do HyperOS e concedeu uma recompensa via HackerOne ($300). Outros fornecedores receberam relatórios com classificações mistas (veja Seção 17–18).

As afirmações técnicas neste whitepaper se baseiam em relatórios de falhas, pilhas nativas, tamanhos medidas de Bundles e inspeção pública do AOSP. O contexto da pesquisa é incluído para que os leitores entendam as restrições sob as quais a evidência foi coletada — não como uma substituição por essa evidência.

Conto narrativo da investigação (em espanhol): Desafiando o Android do sofá e com um smartphone (17 de julho de 2026). O cronograma e posts técnicos relacionados são listados sob Referências.


Resumo

Aplicativos Android processam continuamente entrada textual estruturada originária de páginas da web, plataformas de mensagens, documentos, deep links, serviços de acessibilidade, comunicação interprocesso (IPC) e conteúdo gerado pelo usuário.

No decorrer de aproximadamente quatro anos de análise independente, 32 vetores de ataque reproduzíveis foram documentados em vários subsistemas Android. Embora esses vetores diferem nos pontos de entrada, aplicativos afetados e comportamento observável, eles exibem consistentemente uma característica arquitetônica comum: a entrada textual estruturada se propaga por várias camadas do framework enquanto progressivamente amplia o custo computacional, pressão de memória ou estado interno da aplicação até que os limites de estabilidade sejam excedidos.

Este comportamento recorrente é definido como Amplicação de Texto Estruturado (STA).

O STA não é uma única vulnerabilidade. É um padrão de amplificação de recursos arquitetônicos. Ele materializa em duas formas principais:

  • Classe A — Amplificação IPC / SavedState: quando o estado serializado excede o limite da transação Binder (1 048 576 bytes), o Android não tem um caminho seguro de degradação. A TransactionTooLargeException é propagada sem ser capturada, a aplicação (ou SystemUI) crasha e o mesmo estado oversized é re-persistido → loop de crash permanente.
  • Classe B — Amplificação da Superfície de Interação: complexidade algorítmica dentro do motor nativo de layout de texto do Android (libminikin.so) produz ANRs reproduzíveis em Chromium e Gecko ao processar URLs/texto oversized mas sintaticamente válidos.

A cadeia mais grave (STA-015-DL) escala a partir de um único clique em um link HTML do Google Drive para um loop de crash SystemUI que requer reinicialização dura (CVSS 8.6). Os mesmos princípios de amplificação aparecem no WhatsApp, Threads, Firefox, Opera, DuckDuckGo, Brave, Samsung Internet e componentes fundamentais do framework.

Este whitepaper unificado apresenta tanto o modelo arquitetônico que explica o padrão comum quanto a evidência técnica completa (traces de pilha nativa, relatórios de falhas em produção, análise de commits AOSP, pontuações CVSS e respostas dos fornecedores) que sustenta isso.


1. Amplificação de Texto Estruturado — Modelo Arquitetônico

Fato vs interpretação: O modelo STA é uma interpretação arquitetônica proposta pelo pesquisador para explicar padrões recorrentes observados em múltiplos vetores. Evidências empíricas (stacks nativos, relatórios de falhas em produção, tamanhos medidos de Bundles, confirmações de fornecedores) são apresentadas nas seções técnicas correspondentes. Os fatores de amplificação e o modelo unificado devem ser tratados como conclusões analíticas, não como comportamento documentado pela fabricante.

1.1 Definição Formal

Amplificação de Texto Estruturado (STA) é um padrão arquitetônico de ampliação de recursos no qual entrada textual estruturada atravessa várias camadas de software, causando custos computacionais crescentes, consumo de memória ou propagação de estado que podem eventualmente exceder os limites de estabilidade de um ou mais componentes downstream.

Diferentemente de uma vulnerabilidade de software tradicional, o STA não representa um único defeito de implementação ou corrupção de memória. A ampliação emerge da interação entre vários componentes independentes que transformam, validam, serializam, desserializam, renderizam, persistem ou redistribuem a mesma informação lógica. Cada componente pode operar corretamente em isolamento; o efeito cumulativo se torna significativamente maior do que previsto por qualquer sub-sistema individual.

1.2 Características Recorrentes

PropriedadeDescrição
Entrada EstruturadaInformação textual hierárquica ou codificada (URLs, HTML, JSON, extras de Intent, Markdown...), não dados binários arbitrários.
Processamento MultifásicoO mesmo conteúdo lógico atravessa várias camadas independentes do framework.
Amplicação ProgressivaCusto de processamento aumenta nas fases sucessivas.
Infraestrutura CompartilhadaAplicações não relacionadas reutilizam componentes idênticos do Android framework (libminikin, FragmentManager, TaskPersister, SystemUI...).
Comportamento Não LinearO consumo de recursos frequentemente desproporcional ao tamanho da entrada.
Impacto IntercomponenteFalhas aparecem longe do ponto de entrada original (por exemplo, clique no navegador → crash do SystemUI).

1.3 Pipeline Geral de Amplificação

Entrada Estruturada (URL / HTML / Intent / Clipboard / Deep Link)
        ↓
Parser / Validação
        ↓
APIs do Framework
        ↓
IPC Binder
        ↓
Motor de Renderização (TextView → StaticLayout → LineBreaker → libminikin)   ← Classe B
        ↓
Layout / Composição
        ↓
Persistência de Estado (TaskPersister / SavedStateRegistry)                   ← Classe A
        ↓
SystemUI / Recuperação OEM
        ↓
Falha Observada (ANR / Loop de Crash / Reinicialização Dura)

2. Classe A vs Classe B — Mecanismos Concretos

Tabela 1. Comparação dos dois mecanismos de amplificação concretos sob o modelo STA. As linhas marcadas “Fator Observado” e “Resultado” são empíricas; “Proprietário da correção primária” é uma atribuição proposta de responsabilidade.

Classe A — Amplificação em IPC / SavedStateClasse B — Amplificação na Superfície de Interacção
MecanismoSavedState serialização → Bundle → Parcel → Binder > 1 MBLayout de texto síncrono na thread principal (quebra de linha libminikin)
Recursos esgotadosTamanho do buffer de transação Binder (1 048 576 bytes)Tempo de CPU da thread principal (limite ANR ~5 s)
Diretor amplificadorNivelamento de fragmentos + metadados (arquitetural)Composição de caracteres URL (# / % €) (baseada em conteúdo)
Fator observado×2,8 a ×20,6 (medida no campo do WhatsApp)Multiplicador 10–20× antes de O(n²)/bloqueio
ResultadoTransactionTooLargeException → loop de falha permanenteBloqueio da thread principal → ANR (5–16 s)
PersistênciaSim — até que os dados sejam limpos ou o dispositivo reiniciadoNão (a menos que seja combinada com histórico / TaskPersister)
Proprietário principal da correçãoGoogle / AOSP (FragmentManager + SystemUI + TaskPersister)Google / AOSP (libminikin) + fornecedores de navegadores (defesa em profundidade)

Duas modelos de amplificação distintos que compartilham uma categoria comum de causa raiz (ausência de validação de entrada antes de operações caras), mas não são reduzíveis a um único modelo matemático. A correção para um não aborda o outro.


3. Detalhe da Causa Raiz

Esta seção separa comportamento documentado da plataforma (limite Binder, falta de catch em caminhos de restauração, tamanhos Bundle medidos, pilhas nativas) da interpretação do pesquisador (STA como um padrão unificador) e das mitigações propostas (Seção 16).

3.1 O que É “Funcionando Como Intencionado”

O limite de 1 MB do Binder é intencional. Um aplicativo armazenando dados grandes em um Bundle e atingindo o limite é uma consequência documentada da má utilização do mecanismo — não uma vulnerabilidade por si só. Este relatório não afirma que o limite Binder ou a aninhagem de fragmentos são bugs.

3.2 O Problema Real — Ausência de Fallback Seguro (Classe A)

Quando FragmentManager.restoreAllState() encontra um Bundle que excede o limite do Binder, o Android não tem uma mecanismo de degradação seguro. A TransactionTooLargeException é propagada sem ser capturada, o processo falha e o mesmo estado oversized é persistido em disco para a próxima inicialização → loop de falha permanente que o usuário não pode escapar sem limpar os dados do aplicativo.

// Comportamento atual do Android — sem fallback seguro
void restauraTodosOsDados(Bundle estadoSalvo) {
    // Sem try-catch. TransactionTooLargeException é propagada não capturada.
    // Mesmo estado oversized re-persistido → loop de crash na próxima inicialização.
    fragmentManager.restauraEstado(estadoSalvo);
}

// Recomendado — degradação segura
void restauraTodosOsDados(Bundle estadoSalvo) {
    try {
        if (ehBundleOverLimit(estadoSalvo)) {
            Log.e(TAG, "SavedState acima do limite — descartando para reinicialização segura");
            return;  // inicialização limpa — sem loop de crash
        }
        fragmentManager.restauraEstado(estadoSalvo);
    } catch (TransactionTooLargeException e) {
        // degradação segura: o aplicativo inicia como se fosse a primeira inicialização
    }
}

3.3 Amplificação Empírica — WhatsApp Android 15 (×20,6)

W/Bundle: childFragmentManager [L1]  tamanho=1.636.412
W/Bundle: childFragmentManager [L2]  tamanho=1.614.072
W/Bundle: childFragmentManager [L3]  tamanho=1.603.852
W/Bundle: registryState             tamanho=  479.948
W/Bundle: compose_text (origem)     tamanho=   80.484  ← dados de entrada
W/Bundle: TOTAL                     tamanho=1.661.088  ← +58% sobre o limite do Binder
// Limite do Binder: 1.048.576 bytes · Overflow: +612.512 bytes · Fator: ×20,6
Dados de EntradaProfundidade do FragmentoPacoteFatorSobrepõe o Limite?
10.000 bytes2 níveis~28.000×2,8Não
50.000 bytes4 níveis~275.000×5,5Não
80.000 bytes5 níveis+meta~1.021.000×12,8Próximo
82.431 bytes5 níveis+meta~1.124.352×13,6SIM
80.484 bytes5 lvls+Meta AI~1.661.088×20,6SIM +58%

3.4 Classe B — Amplificação Algorítmica da libminikin

Caracteres com significado especial em URLs forçam o algoritmo de quebra de linha a avaliar muitos mais candidatos:

# — cria uma fronteira lógica, duplicando decisões de quebra
/ — cada barra adiciona um ponto de quebra candidato
% — expande UTF-8 para UTF-16 e fragmenta a string
euro — propriedades de quebra de linha ambíguas forçam o algoritmo a explorar ambas as opções

4. Navegadores afetados (12 confirmados)

Família do motorNavegadores
Baseado em ChromiumGoogle Chrome, Microsoft Edge, Microsoft Bing, Opera Browser, DuckDuckGo Browser, Brave Browser, Samsung Internet
Baseado em GeckoMozilla Firefox, Firefox Focus, Firefox Nightly, Tor Browser
Proxy-basedOpera Mini (reproduzido independentemente)
NavegadorMotorVetores confirmadosAvisado
Google ChromeChromiumSTA-001, STA-017 (Tier A), STA-020Sim — Google VRP
Microsoft EdgeChromiumSTA-017 (Tier A), STA-020Sim — MSRC
Microsoft BingChromium (Sapphire)STA-013, STA-015-DLSim — MSRC
Opera BrowserChromiumSTA-016, STA-017Sim
DuckDuckGo BrowserChromiumSTA-022, STA-022bSim — HackerOne
Brave BrowserChromiumSTA-021, STA-017Sim — HackerOne
Samsung InternetChromiumSTA-023/023b/023cDocumentado, não notificado formalmente
Mozilla FirefoxGeckoSTA-019a/b/c/d, STA-017Sim
Firefox Focus / NightlyGeckoFamília STA-019Sim — via Mozilla
Tor BrowserGeckoSTA-017, STA-019a/b/cSim
Opera, Opera MiniProxy-basedSTA-016Sim — via Opera

5. Taxonomia de evidências

TierCritériosVetores
Tier A — ConfirmadoRastreamento completo da pilha + exceção + análise do BundleSTA-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, Família STA-019, STA-022
Tier B — ComportamentalPanorama ou ANR observado; mecanismo inferido por analogiaSTA-001, STA-003, STA-004, STA-008, STA-013, Família STA-020, Família STA-021, STA-022b, Família STA-023
Tier C — MitigadoTestado; nenhum crash — controle positivoYouTube (todos os cenários)

6. STA-017 — ANR transversal a motores: Evidências do Tier A

Evidência (observada): STA-017 foi elevado para Tier A tanto no Chrome (Chromium) quanto no Firefox (Gecko). Chamada de bloqueio: libminikin.so::LineBreakOptimizer::computeBreaks. Esta é uma biblioteca do sistema Android — não código Chromium ou Gecko.

6.1 Chrome — Rastreamento completo da pilha nativa (bugreport 2026-05-24)

Listagem 1. Pilha principal do thread nativo de um relatório de produção (Xiaomi Redmi Note 14 5G, Android 16).

Dispositivo: Xiaomi Redmi Note 14 5G · HyperOS 3.0 · Android 16. Versão do Chrome 777818033. Dois arquivos ANR, pilha idêntica.

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

"main" prio=5 tid=1 Native   ← THREAD DE INTERFACE BLOQUEADA

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²) em URL longa
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
   ↑ MENU DE CONTEXTO DO CHROME — long-press em link de URL grande
at android.view.ViewRootImpl.performTraversals
at android.app.ActivityThread.main

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

Processo: org.mozilla.firefox (PID 3506). Atividade: ExternalAppBrowserActivity. Duração: 16,006 ms. Desencadeado por: REAL link do Gmail (não um teste controlado).

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

"main" prio=5 tid=1 Native   ← THREAD DE INTERFACE BLOQUEADA por 16,006 ms

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
AtributoChrome (Chromium)Firefox (Gecko)
Entrada nativalibminikin::LineBreakOptimizer::computeBreakslibminikin::LineBreakOptimizer::computeBreaks
Duração do ANR5,000ms+ (limite)16,006ms (3× mais longo)
DesencadeadorTeste controladoREAL link do Gmail
NívelNível ANível A

6.3 Entradas Adicionais Confirmadas (junho de 2026)

BugreportApliicaçãoDesencadeadorfunção minikinPonto de entrada
2026-05-24ChromeLong-press em linkbreakLineOptimalContextMenuListView.onMeasure
2026-06-10FirefoxReal link do GmailbreakLineOptimalExternalAppBrowserActivity
2026-06-24EdgeCrash da SystemUI → re-layout do omniboxbreakLineOptimalOmniboxSuggestionsContainer
2026-06-28Google Appandroid.intent.action.TRANSLATEbreakLineGreedyDynamicLayout$ChangeWatcher.onTextChanged

Critico: breakLineGreedy também é vulnerável a bloqueio em texto longo. A solução ingênua de "mudar para greedy" é incompleta. É necessário um limite de comprimento rígido antes que qualquer algoritmo seja executado.

Passo a passo para reprodução (STA-017 — Menu de contexto do Chrome)

  1. Crie uma página HTML que contenha um hyperlink cujo href é uma URL sintaticamente válida com cerca de 80–120 KB e alta densidade de caracteres #, / e %.
  2. Hospede ou abra a página no Chrome em um dispositivo Android 13-16.
  3. Mantenha pressionado o link até que o menu de contexto apareça.
  4. Observe ANR (tempos de espera da thread principal, geralmente ≥ 5000 ms). Capture via adb bugreport; a pilha nativa mostra libminikin::LineBreakOptimizer::computeBreaks.

Comportamento equivalente foi observado com links reais do Gmail (Firefox, 16006 ms) e re-layout da barra de endereços desencadeada pelo SystemUI (Edge).


6b. STA-027 — Amplificação de Link Profundo do Edge Ask Copilot ★NOVO

Identificador STASTA-027
CategoriaNavegação de Intents / Composição (Classe A + Classe B)
Componente afetadoMicrosoft Edge Ask Copilot (com.microsoft.copilotn)
ImpactoCrash ou falha de navegação via link profundo com initialText muito grande.
CVSS 3.16.5
PersistênciaSim (até que os dados sejam limpos ou o estado da conversa seja reiniciado)
NívelA ★NOVO

STA-027 demonstra comportamento simultâneo de Classe A e B dentro do caminho de navegação profundo do Microsoft Edge Ask Copilot. Um payload estruturado muito grande fornecido no parâmetro initialText é aceito pelo manipulador de links profundos e encaminhado para Jetpack Compose Navigation. O resultado da rota excede a estrutura esperada do NavGraph, produzindo um IllegalArgumentException não capturado.

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

O valor initialText muito grande simultaneamente:

  • Inicia trabalho de layout / medição de texto caro (caminho de amplificação Classe B) quando o destino tenta renderizar ou pré-processar o parâmetro.
  • Quebra a resolução do gráfico de navegação Compose porque a rota totalmente expandida não é mais reconhecida como um filho direto do NavGraph (falha de estado / roteamento estilo Classe A).

Ativação remota: Diferentemente da STA-017 (que requer um long press ou interação local com a IU dentro de um navegador já aberto), a STA-027 pode ser acionada remotamente por um link profundo malicioso que abre o Edge Ask Copilot com um parâmetro initialText personalizado. Não é necessário nenhum prévio contato com a IU do Copilot além de seguir o link.

Passo a passo para reprodução (STA-027)

  1. Crie um link profundo que alvo o Microsoft Edge Ask Copilot e inclua um parâmetro initialText muito grande (texto estruturado suficientemente grande para expandir a rota de navegação Compose além das expectativas do NavGraph).
  2. Abrir o link de outro aplicativo ou navegador (ACTION_VIEW / link profundo).
  3. Observe IllegalArgumentException não capturado do androidx.navigation.compose (NavGraph.kt) ao resolver HomeNavRoute.ChatNavRoute.
  4. Capture logcat / bugreport; confirme que a pilha inclui o destino de navegação contendo o initialText expandido.

7. Evidências de commit do AOSP

7.1 Commit Chromium 3e62ece6 — LargePayloadSupport (07/05/2026)

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

Mensagem do commit (exata):

“Implementa ResultReceiver para grandes payloads no DigitalCredentialsPresentationDelegate para evitar TransactionTooLargeException quando as respostas excedem os limites do IPC Binder. Isso se alinha com atualizações nas bibliotecas Jetpack (AOSP CL 3989977) onde payloads grandes são passados via descritores de arquivo.”

1. Nomeia explicitamente TransactionTooLargeException — igual a todos os vetores Classe A.
2. Referencia AOSP CL 3989977 (LargePayloadSupport) — interno, não público.
3. Correção: descritores de arquivo em vez de Binder.
4. Google nomeou isso como: LargePayloadSupport.

Rastreadores históricos relacionados:

7.2 androidx.savedstate 1.5.0 — Bug #425919375

DataEventoT+ VRP
Junho 19, 2025Bug #425919375 criado — serialização SavedState— (inativo há 7 meses)
Janeiro 20, 2026Submissão VRP ao Google Android VRPT+0
Fevereiro 10, 2026Google responde pela primeira vezT+21 dias
Martço 4, 2026Commit: Suporte genérico de serialização para SavedStateT+43 dias
Martço 11, 2026Bug corrigido — savedstate 1.5.0-alpha01T+50 dias
Maio 19, 2026savedstate 1.5.0 STABLE — CBOR/JSON desacoplado do BinderT+119 dias

A versão savedstate 1.5.0 desacopla SavedState da pipeline Bundle/Binder — uma correção arquitetural para parte da causa raiz Classe A. O bug estava inativo por 7 meses e foi reativado 21 dias após a submissão VRP. Corrigido em aproximadamente 30 dias. O Google descreveu isso como “suporte multiplataforma” — sem menção pública de motivações de segurança.

7.3 libminikin dívida técnica — pipeline multifile (resumo forense do AOSP)

A revisão independente da fonte AOSP identifica uma déficit sistemática de design em vários arquivos minikin: falta de validação de comprimento antes de trabalhos caros de quebra de linha ou layout. As rotas de código mais antigas datam de 2013. Arquivos-chave:

ArquivoDesdeProblemaFunção
FontFamily.cpp2013Casos de borda nulos / mais próximosgetClosestMatch()
Layout.cpp2013Texto longo processado sem guarda de cachedoLayoutWord()
OptimalLineBreaker.cpp2015Knuth-Plass O(n²) sem limite de entradacomputeBreaks()
GreedyLineBreaker.cpp2017Lacos aninhados; pior caso custosoprocessLineBreak()
LineBreaker.cpp2018Escolhe Optimal/Greedy sem verificação de tamanhobreakIntoLines()
LayoutCache.h2018Maior que CHAR_LIMIT_FOR_CACHE → processamento direto (sem cache)getOrCreate()
LineBreaker::breakIntoLines()     — sem guarda textBuffer.size()
        ↓
Quebra de linha ótima / gulosa          — O(n²) / trabalho aninhado em entrada longa
        ↓
Layout::doLayoutWord()
        ↓
LayoutCache::getOrCreate()        — intervalos longos bypassam cache → trabalho completo
        ↓
Shaping HarfBuzz
        ↓
Thread UI bloqueada (5–16 s ANR)

Histórico do rastreador público de problemas (exemplos): #161830416, #167014931, #188985643, #40268980 / Chromium 1447465 (ANR do engenheiro da Samsung), #477202817 (Não corrigido), #524288518 (fora de escopo), #531319203 (padrão relacionado). Limites estruturais de comprimento não foram aplicados ao longo da pipeline até o boletim de julho de 2026, apesar do trabalho interno do Google que abordava uma causa raiz adjacente (AOSP CL 3989977, LargePayloadSupport).

Detalhe: libminikin: 10 anos de vulnerabilidade · Algorithmic DoS en libminikin.so


8. Evidências do Campo — Android 16, Dispositivo de Produção

8.1 STA-015 — 85 Crashes no SystemUI em 4 Dias (bugreport 2026-05-26)

Dispositivo: Xiaomi Redmi Note 14 5G · HyperOS 3.0.3.0 · Android 16. Loop de crash reproduzido espontaneamente durante uso normal do dispositivo.

// Sistema UI falha ao inicializar
android.os.BadParcelableException: Falha ao recuperar array; apenas 1 de 4 recebido
  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(...)  ← falha ao inicializar
Causado por: android.os.DeadObjectException: Transação falhou em pequeno parcele
Total de falhas do Sistema UI85 entradas — 4 dias (23 a 26 de maio de 2026)
Maior loop rápido16 falhas em 92 segundos
Tempo mínimo de sobrevivência374 ms — falha antes que qualquer UI seja renderizada
Versão do AndroidAndroid 16 — primeira reprodução confirmada

8.2 STA-015b / STA-015-DL — Auto-Re-Trigger (fluxo de 12 etapas) no HyperOS

PASO 1: O usuário abre HTML do Google Drive e clica em um link
PASO 2: O navegador recebe URL malformada via INTENT VIEW
callingPackage=com.google.android.apps.docs (certificado pelo OS Android)
PASO 3: libminikin O(n²) ANR no navegador
PASO 4: A URL corrompe o estado TaskPersister em disco
PASO 5: Sistema UI lê estado corrompido → BadParcelableException → CRASH
PASO 6: Android reinicia automaticamente o Sistema UI
PASO 7: OEM Task State Interactor (HyperOS OEM) se inscreve no fluxo:
         getFocusedRootTaskInfo() → lê MESMO estado corrompido em disco → CRASH NOVAMENTE
PASO 8: Loop de falhas → Android forçado a limpar dados do Sistema UI → TELA DE BLOQUEIO
PASO 9: O usuário entra com PIN/padrão/digital
PASO 10: Android restaura sessão → NAVEGADOR RETORNA AO PRIMEIRO PLANO
PASO 11: OEM Task State Interactor lê estado da tarefa → navegador está ativo
         → lê ainda o estado corrompido TaskPersister → SEGUNDO LOOP DE FALHAS
PASO 12: NENHUMA AÇÃO ADICIONAL DO USUÁRIO É NECESSÁRIA — falha re-trigger automaticamente

// Recuperação: reinicialização forçada + limpeza de dados do navegador

STA-015-DL no HyperOS re-trigger automaticamente após o desbloqueio da tela inicial. Nenhuma ação adicional do usuário é necessária após o clique inicial. Uma reinicialização pode não ser suficiente se o navegador relançar com o mesmo estado corrompido.


9. Catálogo Completo de Vetores — 32 Vetores

Tabela 2. Vetores STA documentados. As pontuações CVSS são estimativas dos pesquisadores (veja nota metodológica sob a tabela). Tier A = evidência completa da pilha / exceção; Tier B = comportamental / analogia.

IDAplicativo / ComponenteCVSSPersistênciaNível
STA-015-DLGoogle Drive + Qualquer Navegador → Loop de reinicialização do SystemUI (reinicialização dura)8.6Apenas reinicializaçãoA
STA-018Google Drive + Serviço de Impressão + SystemUI — Cadeia ANR7.5Até reinicializaçãoA
STA-010SystemUI / Serviço de Impressão — Drive → impressora local7.2Até reinicializaçãoA
STA-011SystemUI / Área de transferência — colar preview crash7.2Até reinicializaçãoA
STA-015WindowManager Shell / RecentTasksController7.2Auto-restart→lockscreenA
STA-015bHyperOS / Interator de Estado da Tarefa OEM (OEM Xiaomi)7.2Auto-recoveryA
STA-012Threads (Meta) — deep link /search?q=[payload]7.1Permanente (pm clear)A
STA-012eThreads via WhatsApp — HTML/WebView → Threads deep link7.1Permanente (pm clear)A
STA-019aFirefox — ClipboardManager DeadSystemException ao focar na barra de endereços6.8Em cada evento de focoA
STA-008Serviços do sistema — chamada de sincronização IPC + payload grande → ANR6.8Até o app ser encerradoB
STA-005dWhatsApp deep link api.whatsapp.com/send?text=[payload]6.8PossívelB
STA-0176+ navegadores — long-press URL → libminikin ANR (Chrome+Firefox Tier A)6.5NãoA
STA-027Microsoft Edge Ask Copilot — deep link initialText NavGraph crash ★NOVO6.5SimA ★
STA-005WhatsApp — colar texto grande no campo de composição da mensagem6.5PermanenteA
STA-005bWhatsApp Business — todos os agentes na caixa de entrada compartilhada6.5Permanente (todos os agentes)A
STA-005cWhatsApp + Meta AI — draft grande em chat de IA6.5Permanente (todo o app)A
STA-006Google App — Selecionar texto → Traduzir6.5PermanenteA
STA-007Google Drive — PDF invisível → Selecionar tudo → Traduzir6.5PermanenteA
STA-009Google Drive — DOCX grande → Visualização de impressão6.5PermanenteA
STA-010bGoogle Play Services — Drive → impressora em nuvem6.5Até o app ser fechadoA
STA-016Opera Browser — onResume → RuntimeException: Falha do sistema6.5PermanenteA
STA-019dFirefox — barra de endereços TextLayout lineIndex OOB6.5Em cada evento de focoA
STA-020Chrome + Edge — pipeline histórico da barra de endereços ANR6.5Até o histórico ser limpoB
STA-021Brave Browser — barra de endereços ANR / anormalidade na renderização6.5Até o histórico ser limpoB
STA-022DuckDuckGo — URL_EXTRA_ARG 920KB em Fragment args (965KB parcel)6.5Até a aba ser fechadaA
STA-022bDuckDuckGo — pipeline de sugestão de histórico ANR (entre sessões)6.5Até o histórico ser limpoB
STA-013Microsoft Bing — crash de histórico da barra de endereços contaminado6.0Até os dados serem limposB
STA-019bFirefox — SearchDialogFragment IllegalStateException6.0Em cada evento de focoA
STA-019cFirefox — Compose TextLayout lineIndex OOB (Jetpack Compose)6.0Em cada evento de focoA
STA-023/b/cSamsung Internet — congelamento de aba em segundo plano / Compartilhar / grupo de abas5.4NãoB
STA-004Google Maps — URI geo: oversized4.8ParcialB
STA-001/003Chrome / Navegadores — menu de contexto long press, Compartilhar link3.7NãoB

Nota metodológica CVSS: As pontuações do CVSS 3.1 são estimativas dos pesquisadores. Para STA-015-DL, o vetor usado é AV:N/AC:L/PR:N/UI:R/S:C/C:N/I:N/A:H (8.6). Outras pontuações seguem um raciocínio análogo (entrega remota ou local, interação do usuário, impacto na disponibilidade e se a escopo muda para SystemUI). As pontuações estão sujeitas à revisão dos fornecedores.


9b. Matriz de Impacto (Qualitativa)

Tabela 3. Resumo qualitativo por grupo de vetores (avaliação dos pesquisadores; complementa o CVSS na Tabela 2).

Grupo de vetoresDisponibilidadePersistênciaInteração do usuárioComplexidade da ataqueObservações
STA-015-DL / SystemUIBaixa (interface do dispositivo)Sim (reinicialização)Clique únicoBaixaMudança de escopo; reinicialização dura
STA-010/011 Print/ClipboardBaixa (SystemUI)Sim (até a reinicialização)Impressão / colarBaixaCaminho do serviço do sistema
STA-005 Família WhatsAppBaixa (app / caixa de entrada compartilhada)Sim (excluir conversa)Colar / abrir conversaBaixa×20.6 Amplificação do Bundle
STA-012 ThreadsBaixa (app)Sim (pm clear)Clique em link profundoBaixaPermanente até a limpeza dos dados
STA-017 libminikin ANRMédia (ANR 5–16 s)NãoClique longo / focoBaixaCross-engine; biblioteca do framework
STA-027 Edge Ask CopilotMédia–Baixa (crash)SimClique em link profundoBaixaDirecionamento remoto; Compose NavGraph
STA-019 Firefox barra de endereçosMédiaSim (em cada foco)Foco na barra de endereçosBaixaRepetido até a limpeza do histórico
STA-020/021/022 navegadoresMédiaParcialFoco / históricoBaixaPipeline de histórico

10. STA-005 — Variantes do WhatsApp

Componente afetadoFragmentManager.restoreAllState() — AndroidX
CausaBundle.dataSize() > 1,048,576 bytes durante a restauração do estado
Comportamento atualTransactionTooLargeException não capturado → crash → estado re-persistido → loop
Comportamento esperadoExceção capturada → estado descartado → início limpo → sem loop
Reprodutibilidade100% — Pixel 7, Xiaomi Redmi 14, OPPO A78, OnePlus 11 (Android 13–16)
Apliques confirmadosWhatsApp, 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): Quando o SavedState de uma conversa fica contaminado, o loop de crash afeta SIMULTANEAMENTE todos os agentes em uma caixa de entrada compartilhada. A única recuperação (excluir a conversa) destrói toda a história de comunicação com aquele cliente.

STA-005c (WhatsApp + Meta AI): Rascunho oversized no chat AI pode travar permanentemente o aplicativo inteiro.


11. Série STA-015 — Vetores do SystemUI

Esses vetores estendem a amplificação de Classe A para componentes do sistema privilegiados. O impacto não está mais confinado a um único aplicativo.

VetorCausaMecanismoCVSS
STA-010Documento do Google Drive → Impressão → impressora localO serviço de impressão constrói o Bundle de prévia a partir de texto oversized; excede Binder quando passado para SystemUI7.2
STA-010bDrive → impressora em nuvem/redeMesmo mecanismo raiz direcionado através do Play Services6.5
STA-011Copiar clipboard oversized → focar campo de texto com assistido-pasteO assistido-paste do clipboard serializa o ClipData completo em vez de um snippet truncado7.2
STA-015Abrir lista de aplicativos recentes / lista de tarefasRecentTasksController lê o estado da tarefa corrompido → DeadSystemException → crash do SystemUI → bloqueio na tela inicial7.2
STA-015bHyperOS após reinicialização do SystemUIO OEM Task State Interactor re-lê o estado corrompido → recrash automático7.2
STA-015-DLLigação HTML do Google Drive → qualquer navegadorCadeia remota completa (veja a seção 8.2). Reinicialização dura necessária. Mudança de escopo.8.6

CVSS 3.1 para STA-015-DL: AV:N / AC:L / PR:N / UI:R / S:C / C:N / I:N / A:H = 8.6 ALTA. Remoto, clique único, muda o escopo para SystemUI, impacto de alta disponibilidade.


12. STA-019 — Firefox: Quatro Modos de Falha

  • STA-019a — DeadSystemException do ClipboardManager em cada foco na barra de endereços (CVSS 6.8)
  • STA-019b — IllegalStateException do SearchDialogFragment (CVSS 6.0)
  • STA-019c — Índice fora dos limites em TextLayout do Jetpack Compose (CVSS 6.0)
  • STA-019d — Índice fora dos limites em TextLayout da barra de endereços (CVSS 6.5)

Todos os quatro podem ser acionados a cada evento de foco uma vez que o histórico/estado seja contaminado, resultando em uma barra de endereços inutilizável.

13. STA-020 / 021 — Pipeline da Barra de Endereços do Chrome / Edge / Brave

A pipeline de sugestões de histórico retém URLs oversized. A subsequente focagem ou renderização de sugestão reentra no libminikin ou causa ANR. O Chromium aplicou uma truncagem parcial somente para exibição em 2023 que nunca cobriu o caminho de carregamento/histórico — STA-020 ainda reproduz pelo caminho não corrigido.

14. STA-022 — DuckDuckGo

STA-022: Fragment arguments armazenam URL_EXTRA_ARG de ~920 KB, produzindo um parcel de 965 KB → TransactionTooLargeException (Tier A). STA-022b: pipeline de sugestões de histórico ANR que sobrevive entre sessões até que o histórico seja limpo.


15. Validação Multiplataforma — iOS Não Atingido

A mesma carga não faz crash no Threads para iOS. O mesmo aplicativo, a mesma deep link de 20 000 caracteres, zero crash em iOS. A falha é isolada aos componentes específicos do Android: Binder (limite de 1 MB), TaskPersister, FragmentManager.restoreAllState(). A correção deve vir da Google / AOSP.


16. Correções Recomendadas

Mitigações propostas (comportamento não observado em fábrica). Os exemplos de código abaixo são sugestões para proprietários do framework e aplicativos; eles ainda não foram incorporados no upstream conforme o boletim de julho de 2026.

16.1 Framework — Classe B (libminikin)

Tabela 2. Propostas de limites de comprimento antes da quebra de linha ótima/gananciosa.

// CORREÇÃO APROVADA — LineBreakOptimizer.cpp (libminikin.so)
// O anterior “switch para ganancioso apenas” é incompleto: breakLineGreedy também bloqueia.

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

    // LIMITE 1 (DURO): Truncar antes que qualquer algoritmo seja executado.
    // Nenhum algoritmo produz resultados úteis para texto > 8 KB de URL/texto.
    if (textLength > MAX_SAFE_TEXT_LENGTH_ABSOLUTE) {
        end = start + MAX_SAFE_TEXT_LENGTH_ABSOLUTE;
    }

    // LIMITE 2: Preferir O(n) ganancioso para textos de médio comprimento.
    if ((end - start) > MAX_SAFE_TEXT_LENGTH_FOR_OPTIMIZER) {
        return computeBreaksGreedy(measured, start, end, constraints);
    }

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

// As unidades são unidades de código UTF-16 (Java/Android char), NÃO bytes.
static const int MAX_SAFE_TEXT_LENGTH_ABSOLUTE     = 8192;  // truncar duro
static const int MAX_SAFE_TEXT_LENGTH_FOR_OPTIMIZER = 2048;  // switch para ganancioso

16.2 Framework — Classe A (FragmentManager / SystemUI)

  • Capturar TransactionTooLargeException dentro de FragmentManager.restoreAllState() e iniciar limpo.
  • Validar o tamanho do estado derivado antes da persistência (TaskPersister, SavedStateRegistry).
  • O SystemUI e os componentes OEM devem tratar as listas de tarefas restauradas como potencialmente tóxicas e se comportarem com elegância (não fazer crash no processo inteiro do UI).

16.3 Nível de Aplicativo (soluções imediatas)

// Truncar qualquer texto exibido em um 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;
}

// Rejeitar intents oversized VIEW
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;
    }
}

Aviso de cobertura para CISOs: A atualização para androidx.savedstate 1.5.0 NÃO protege contra STA-015-DL (SystemUI), STA-015/015b, STA-017 (libminikin) ou STA-019 (pipeline do Firefox). Esses requerem alterações de nível AOSP que apenas a Google pode enviar.

16.4 Padrão Geral de UI do Sistema / Resiliência OEM (STA-015b)

O componente HyperOS OEM Task State Interactor re-subscribe para informações sobre tarefas após a reinicialização da SystemUI e re-lê o estado corrompido. A degradação segura em caso de DeadObjectException previne um segundo loop de falhas automáticas:

// STA-015b — Xiaomi / HyperOS OEM fix
// OEM Task State Interactor: degradação segura quando o TaskManager está morto

val focusedTaskFlow = interactor.getFocusedRootTaskInfoFlow()
    .catch { exception ->
        if (exception is DeadObjectException) {
            Log.e("SystemUI", "O serviço TaskManager está morto. Re-subscribe mais tarde.")
            emit(null) // Degradação segura — não faça o SystemUI falhar
        } else {
            throw exception
        }
    }

17. Status de Notificação do Fornecedor

FornecedorPrimeira notificaçãoResposta / validaçãoStatus de patch (Jul 2026)
Xiaomi2026Reproduzido, confirmado, recompensadoMitigação OEM viável
Google (Android VRP)Jan 20, 2026Vários relatórios; resultados mistos; progresso com savedstate 1.5.0Nenhum patch público STA no boletim de julho
Microsoft (MSRC)Jan / Jun 2026Casos individuais (Edge, Bing, Ask Copilot STA-027)Pendente
Mozilla2026Relatórios enviados (família Firefox)Pendente
Opera / Brave / DuckDuckGo / Tor2026Relatórios enviados; classificações variadasPendente
SamsungApenas documentado (nenhum VRP público para esta classe)
INCIBE (CNA Spain)Jul 2026Encaminhado ao MITRE (CNA Root for Google). Relatórios técnicos e PoCs enviados.Todos os vetores STA

18. Linha do Tempo de Divulgação

Período de pesquisa: 2022 → 30 Julho 2026. Dispositivo principal do laboratório: Xiaomi Redmi Note 14 5G (HyperOS 3.0 / Android 16). Muita da análise da rota AOSP foi realizada a partir de um navegador telefônico lendo fontes públicas, sem uma configuração tradicional de multi-monitor.

18.1 2022 — Origem

DataMilestone
28 Ago 2022Descoberta original: TransactionTooLargeException / DeadSystemException em Firefox Focus & Nightly (clipboard, compartilhar, abrir no app)
12 Out 2022Primeiro aviso público: “Mozilla Firefox Focus e Nightly para Android Remote Crash DoS” (lostmon.blogspot.com)
Nov 2022Caso Chromium 40879254 aberto; rótulos de segurança removidos; patch parcial da UX; caso permaneceu aberto
Nov 2022Bugzilla Mozilla #1802594 (S3) aberto — ainda em estado NEW / não resolvido até 2026

18.2 Janeiro–Abril 2026 — Investigação formal

DataMilestone
20 Jan 2026Relatórios formais para Google Android VRP (A-477279924) e Microsoft MSRC. O caso A-477279924 recebeu um prêmio VRP de R$ 250 na área de pesquisa Binder/IPC e permaneceu aberto / bloqueado em dependência interna até meados de 2026. (Um registro separado do Chrome VRP, Issue 477202817, foi fechado no mesmo dia como “Não Fixar (Comportamento Intencionado)”.)
Fev 2026Paper v4 distribuído (27 vetores); STA-015-DL (CVSS 8.6) e STA-015b adicionados
Mar 2026Meta (WhatsApp/Threads) notificada — sem resposta (mais de 113 dias até julho)

18.3 Maio–Junho 2026 — Evidências do campo

DataMilestone
24 Mai 2026Bugreport Chrome: 2 ANRs nativos completos → STA-017 Tier A (libminikin)
26 Mai 2026SistemaUI: 85 crashes em 4 dias no Android 16 (primeira confirmação)
31 Mai 2026ATA-015-DL ataque remoto confirmado via Google Drive (callingPackage=com.google.android.apps.docs) — 6 navegadores
10 Jun 2026Avisos de fornecedores: Mozilla, Opera, DuckDuckGo, Brave, Tor, Xiaomi (HackerOne)
10 Jun 2026Firefox ANR 16 006 ms (link real do Gmail) → STA-017 Firefox Tier A
14 Jun 2026MSRC responde; solicita casos separados; adia causa raiz do framework para o Google
15 Jun 2026O Google fecha relatório específico libminikin (524288518) como “fora de escopo” — meses após prêmio de R$ 250
16 Jun 2026Apeal para STA-015-DL citando CVE-2023-21167 / A-259942964; Opera classifica como P5 Informativo
19 Jun 2026O Brave rejeita como “upstream / DoS fora de escopo”
20 Jun 2026Segunda falha espontânea do loop SystemUI; ANR Edge 25 s depois → STA-017 Edge Tier A
24 Jun 2026Tres casos separados MSRC abertos; posts de blog: STA framework + DoS Algorítmico em libminikin
28 Jun 2026Aplicativo Google: 5 ANR e 3 TransactionTooLargeException em 14 min; breakLineGreedy também vulnerável; primeiro Class A+B simultâneo
30 Jun 2026Nenhuma alteração pública no AOSP/Chromium/AndroidX para vetores documentados; boletim de junho vazio para STA

18.4 Julho 2026 — Contagem regressiva para divulgação

DataMilestone
5 Jul 2026Caso Google #531319203 aberto (boot loop do system_server / BitmapCache — mesmo padrão arquitetônico)
6 Jul 2026Boletim de Segurança Android de julho publicado — zero patches para qualquer vetor STA
10 Jul 2026Blog: “libminikin: 10 anos de vulnerabilidade”; dispositivo Xiaomi ainda vulnerável após patch de junho
11 Jul 2026Bugzilla Mozilla #2046725 aberto para família Firefox
16 Jul 2026Xiaomi confirma a vulnerabilidade e concede recompensa (R$ 300 via HackerOne)
Jul 2026STA-027 (Edge Ask Copilot) documentado; INCIBE (CNA Espanha) revisou o caso e encaminhou para MITRE para atribuição de CVE
21 Jul 2026Fechamento do Google Appesl 526330835 como “Não Reproduzível”
30 Jul 2026Divulgação pública da whitepaper — lostmon.blogspot.com
Bulletin de Segurança de Julho de 2026 — nenhuma mitigação. A Google não lançou a correção interna (LargePayloadSupport, AOSP CL 13989977) para o ramo público até a data da divulgação. O prêmio VRP no valor de US$ 250 para a pesquisa na área de Binder/IPC contrasta com a posterior classificação como “fora do escopo” do relatório relacionado ao libminikin.

Linha do tempo completa e artigos relacionados: Timeline STA · História da pesquisa · libminikin 10 anos · DoS algorítmico · Estrutura STA


19. Glossário

TermoDefinição
STAAmplicação Estruturada de Texto — padrão arquitetônico progressivo de amplificação de recursos a partir de entrada textual estruturada.
Classe AAmplicação IPC / SavedState: Bundle excede o limite do Binder → loop de falhas.
Classe BAmplicação da superfície de interação: libminikin quebra linhas e bloqueia a thread UI → ANR.
BinderMecanismo IPC do Android; limite rígido de transações 1 048 576 bytes.
TaskPersisterComponente da estrutura que persiste o estado da tarefa/atividade no disco para restauração.
SavedState / FragmentManager.restoreAllState()Caminho AndroidX/AOSP que restaure a hierarquia de Fragments de um Bundle após a morte do processo.
libminikinBiblioteca nativa de layout de texto do Android (quebra de linhas, medição); usada por TextView e outros.
LineBreakOptimizer::computeBreaksCaminho ótimo (geralmente O(n²)) para quebrar linhas dentro do libminikin.
SystemUIProcesso privilegiado que possui a barra de status, barra de navegação, tela bloqueada e tarefas recentes.
OEM Task State InteractorComponente OEM HyperOS da Xiaomi que se re-inscreve no estado foco de tarefa após o reinício do SystemUI.
LargePayloadSupportTrabalho interno Google/AOSP (CL 3989977) para passar grandes payloads por meio de descritores de arquivo em vez de Binder.
TransactionTooLargeExceptionExceção lançada quando uma transação Parcel/Binder excede o limite de 1 MB.
ANRApliação Não Responde — thread principal bloqueado além do limiar da watchdog (~5 s).
NavGraph (Compose)Grafos de navegação Jetpack Compose; rotas devem ser filhos diretos do gráfico declarado.

20. Limitações e Trabalho Futuro

  • A pesquisa foi realizada em dispositivos de produção para consumidores; nenhum acesso privilegiado ao código-fonte proprietário do fornecedor além do AOSP.
  • O comportamento exato varia com a versão do Android, personalizações OEM, memória disponível e patches de segurança.
  • Nem todos os vetores documentados receberam confirmação independente dos fornecedores.
  • A STA é proposta como um modelo arquitetônico em funcionamento derivado de observações empíricas. Sua validade final depende da reprodução independente e crítica.

20.1 Trabalho Futuro

  • Mapeamento matemático formal dos limites de amplificação (profundidade de aninhamento Classe A vs tamanho do Bundle; custo da composição de caracteres Classe B).
  • Deteção automatizada de caminhos de execução estilo STA (análise estática + instrumentação dinâmica).
  • Comparação mais ampla entre plataformas (controles adicionais para iOS; outros pipelines de texto móveis).
  • Patches prontos para upstream para os limites de comprimento do libminikin e a degradação segura do SystemUI.

21. Conclusão

O que inicialmente parecia ser condições isoladas de negação de serviço gradualmente revelou características arquiteturais recorrentes compartilhadas por caminhos de execução aparentemente não relacionados. Essas observações motivaram a introdução do modelo de Amplificação de Texto Estruturado (STA).

As principais contribuições deste trabalho são:

  1. A introdução do STA como um framework arquitetural para analisar a propagação de entrada estruturada em todo o Android.
  2. A documentação de 32 vetores reprodutíveis que abrangem as classes A (IPC/SavedState) e B (libminikin), com evidências técnicas completas.
  3. A correlação de comportamentos aparentemente independentes através da análise de caminhos de execução, em vez de comparação de sintomas.
  4. Evidência concreta (rastreamentos nativos de pilha de produção, referências a commits do AOSP, estatísticas de falhas no campo) que apoiam os achados mais graves, incluindo loops de falha remota do SystemUI (CVSS 8.6).
  5. A proposta de estratégias defensivas em camadas que abordam a amplificação ao nível arquitetural.

A Amplificação de Texto Estruturado não foi descoberta em um único experimento. Ela emergiu progressivamente através de meses de observação, engenharia reversa, divulgação responsável e validação empírica repetida. Os vetores documentados neste whitepaper devem ser entendidos não apenas como comportamentos isolados do software, mas como a base experimental a partir da qual o modelo STA foi derivado.

Se futuras pesquisas confirmarem, refinarem ou desafiarem este modelo, as observações subjacentes permanecem como evidências técnicas reprodutíveis.


Referências

  1. Chromium commit 3e62ece6 (LargePayloadSupport), Maio de 2026: chromium.googlesource.com/chromium/src/+/3e62ece6
  2. Google Issue Tracker 40879254 (2022): issuetracker.google.com/issues/40879254
  3. Google Issue Tracker 40268979 / ANR relacionado ao Samsung Chrome (2023): issuetracker.google.com/issues/40268979
  4. AOSP minikin repository: android.googlesource.com/platform/frameworks/minikin/
  5. androidx.savedstate 1.5.0 / Bug #425919375 (serialização SavedState)
  6. Android Open Source Project — FragmentManager, TaskPersister, WindowManager Shell
  7. Bulletins de Segurança do Android (notas históricas sobre ANR de esgotamento de recursos em Minikin)
  8. Lostmon — Amplificação de Texto Estruturado (STA), 23 Junho 2026: lostmon.blogspot.com/2026/06/structured-text-amplification-sta.html
  9. Lostmon — DoS algorítmico em libminikin.so, 24 Junho 2026: lostmon.blogspot.com/2026/06/algorithmic-dos-en-libminikinso.html
  10. Lostmon — libminikin: 10 anos de vulnerabilidade, 10 Julho 2026: lostmon.blogspot.com/2026/07/libminikin-10-anos-de-vulnerabilidad-en_0671440346.html
  11. Lostmon — Cronologia da investigação STA, 12 Julho 2026: lostmon.blogspot.com/2026/07/timeline-investigacion-sta-estilos.html
  12. Lostmon — Desafiar o Android do sofá, 17 Julho 2026: lostmon.blogspot.com/2026/07/desafiar-android-desde-el-sofa-y-un.html

Apêndice I — Corroboração Externa Adicional (Julho de 2026)

A Google reconheceu publicamente, em vários ciclos de versão do Android (4.4.2, 7.1, 8.1, 9.0), que o Minikin é vulnerável ao esgotamento de recursos ANR ativado por conteúdo de texto controlado pelo atacante. O fenômeno corresponde à categoria geral de falha documentada neste artigo (vetores STA-017 e relacionados).

O lançamento de segurança do Chrome em julho de 2026 contém várias vulnerabilidades que afetam componentes que se sobrepõem às superfícies arquiteturais analisadas neste trabalho, incluindo Views, Skia, Clipboard, Print Preview, WebView, UI e validação de entrada. Embora a Google não tenha vinculado publicamente essas correções ao Amplificação Estrutural de Texto (STA), a sobreposição funcional e a proximidade temporal sugerem que as áreas afetadas correspondem estreitamente aos caminhos de amplificação documentados nesta pesquisa. Esta observação deve ser interpretada como evidência corroborativa da relevância arquitetônica, não como prova.

Um artigo técnico em chinês independente (Volcengine, maio de 2026) descreve o mesmo sintoma prático do ponto de vista de desenvolvedores de aplicativos e recomenda truncar a entrada para um tamanho limitado entre 8 e 32 KB — consistente com o limite de 8192 unidades UTF-16 proposto aqui.

A versão androidx.savedstate 1.5.0 aborda parte da Classe A para consumidores AndroidX, mas não cobre SystemUI, TaskPersister, libminikin ou camadas OEM. Os vetores mais graves ainda exigem alterações no nível do AOSP.

Nota de referência CNA (INCIBE → MITRE). Em 14 de julho de 2026, a INCIBE (CSIRT nacional da Espanha e Autoridade de Numeração CVE) foi contatada para atribuição de CVE ao longo dos vetores STA documentados neste artigo. Após uma revisão interna, a INCIBE respondeu formalmente que os componentes afetados estão sob jurisdição do MITRE como CNA Top-Level Root para o ecossistema Google e encaminhou o caso conforme necessário. O whitepaper completo e as evidências de suporte serão enviadas ao MITRE após a divulgação pública (30 de julho de 2026).

Nota sobre atividade PoC externa. O pesquisador foi informado de um proof-of-concept público rastreado como CVE-2026-10702, supostamente abordando uma classe relacionada de comportamento de negação de serviço de renderização de texto no Android. Este artigo não verificou independentemente o conteúdo técnico do registro CVE ou confirmou uma sobreposição direta com os vetores STA-017 documentados aqui. É mencionado para contexto como um potencial ponto de dados independente na visibilidade geral desta classe de vulnerabilidade, não como evidência corroborativa dentro da cadeia de prova deste artigo.


Anexo II — Conduta de Fornecedores e Reconhecimentos: Xiaomi

Enquanto muitos fornecedores ou rejeitaram os relatórios através de classificações procedimentais ou ignoraram completamente, a Xiaomi demonstrou que é inteiramente possível:

  • Reconhecer um problema sistêmico sem eximir-se da responsabilidade.
  • Implementar mitigações OEM enquanto aguarda correções upstream do AOSP.
  • Avaliar e apoiar o trabalho de pesquisadores de segurança independentes.
  • Realizar uma divulgação responsável com transparência, profissionalismo e competência técnica.

Reconhecimentos

O comportamento vetorial em alto nível para STA-015 e STA-015b é documentado neste artigo por completo arquitetônico. No entanto, nomes específicos de componentes internos, rastreamentos de código proprietário e implementações exatas de patches foram intencionalmente retidos em respeito ao processo interno de patching da Xiaomi e conforme acordado com as práticas de divulgação responsável.

O pesquisador deseja expressar sincera gratidão à equipe de segurança da Xiaomi por sua profissionalismo, rigor técnico e compromisso em proteger sua base de usuários.

A Xiaomi demonstrou que é possível fazer a coisa certa — mesmo quando o problema subjacente origina-se além das camadas do seu próprio framework.


Amplificação Estrutural de Texto (STA)
Whitepaper Arquitetônico Completo + Técnico
© 2026 Manuel García Peña (Lostmon)
Divulgação pública: 30 de julho de 2026 · lostmon.blogspot.com

Fonte original

Conteúdo traduzido e adaptado pela redação do Notícias Mobile. Confira também a matéria na fonte original.

Leia a matéria completa