Skip to content
KitploitKITPLOIT
StrumentiExploitsBlog
Log in
Invia
StrumentiExploitsBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
LeakValue — Exploit per CVE-2022-20452, elevazione dei privilegi su Android da app installata ad app di sistema (o un'altra app) tramite LazyValue utilizzando Parcel dopo recycle() | Kitploit
Strumenti/GitHubGitHub/michalbednarski/leakvalue
Sicurezza AndroidEscalation di PrivilegiAnalisi delle VulnerabilitàExploitSicurezza MobileBinary Exploitation
GitHubmichalbednarski/leakvalue

LeakValue

Exploit per CVE-2022-20452, elevazione dei privilegi su Android da app installata ad app di sistema (o un'altra app) tramite LazyValue utilizzando Parcel dopo recycle()

Vedi Repository
34765234 anni faRevisionato da Kitploit

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

Android 13 introduce numerose migliorie per indurire il meccanismo di serializzazione di Parcel

Ecco la presentazione del team Android Security and Privacy sulle migliorie apportate

È fantastico, sicuramente elimina o rende non sfruttabili molte vulnerabilità. Inoltre descrivono come hanno neutralizzato il mio precedente exploit, che consentiva alle app di caricare il proprio codice in altre app (incluse quelle di sistema)

Ma ora sono tornato con un nuovo exploit che ottiene lo stesso risultato, anche se in modo diverso. Si basa sulle seguenti vulnerabilità introdotte durante il summenzionato indurimento di Parcel:

  • CVE-2022-20452 (bollettino, patch)
  • CVE-2022-20474 (bollettino, patch)

Schermata di un'applicazione che mostra del testo. Titolo: LeakValue. Testo principale: Creati 6 ValueLeaker-s. Blocco di ActivityTaskManagerService. ActivityTaskManagerService bloccato. Sblocco di ActivityTaskManagerService. ActivityTaskManagerService sbloccato. leakedBinders=[android.os.BinderProxy@f06702e]. Interfaccia leakata: android.app.IApplicationThread. Richiesta di esecuzione del codice. Lo shellcode è stato eseguito in uid=1000 pid=6904 packageName=com.android.settings uid=1000(system) gid=1000(system) groups=1000(system),1007(log),1065(reserved_disk),1077(external_storage),3001(net_bt_admin),3002(net_bt),3003(inet),3007(net_bw_acct),9997(everybody) context=u:r:system_app:s0. Nella parte inferiore dello schermo ci sono due pulsanti: START e MANUAL TESTING

(Anche logcat dell'esecuzione dell'app, lo sfruttamento è rumoroso nei log)

Introduzione ai bug di mismatch tra Parcel e Parcelable

La classe Parcel di Android è la base della comunicazione tra processi

Gli oggetti possono implementare l'interfaccia Parcelable per consentire di scriverli su una Parcel, ad esempio (copiato da AOSP):```java public class UsbAccessory implements Parcelable { public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { public UsbAccessory createFromParcel(Parcel in) { String manufacturer = in.readString(); String model = in.readString(); String description = in.readString(); String version = in.readString(); String uri = in.readString(); IUsbSerialReader serialNumberReader = IUsbSerialReader.Stub.asInterface( in.readStrongBinder());

        return new UsbAccessory(manufacturer, model, description, version, uri,
                serialNumberReader);
    }
};

public void writeToParcel(Parcel parcel, int flags) {
    parcel.writeString(mManufacturer);
    parcel.writeString(mModel);
    parcel.writeString(mDescription);
    parcel.writeString(mVersion);
    parcel.writeString(mUri);
    parcel.writeStrongBinder(mSerialNumberReader.asBinder());

} }

Nota che `Parcel` memorizza internamente la posizione in cui viene eseguita la scrittura o la lettura, `readString()` analizza i dati in una String e fa anche avanzare la posizione. Tale posizione può essere letta/impostata manualmente tramite [`dataPosition()`](https://developer.android.com/reference/android/os/Parcel#dataPosition())/[`setDataPosition()`](https://developer.android.com/reference/android/os/Parcel#setDataPosition(int)). Le implementazioni dell'interfaccia `Parcelable` devono garantire che i loro `writeToParcel` e `createFromParcel` scrivano/leggano la stessa quantità di dati, altrimenti tutte le letture successive otterranno dati da offset errati.

[`Bundle`](https://developer.android.com/reference/android/os/Bundle) (mappa chiave-valore che può essere inviata tra processi) può contenere [una varietà di oggetti che possono essere scritti su Parcel tramite `writeValue()`](https://cs.android.com/android/platform/superproject/+/android-12.1.0_r8:frameworks/base/core/java/android/os/Parcel.java;l=1792-1937). Quando il contenuto di `Bundle` viene letto da `Parcel`, qualsiasi classe `Parcelable` disponibile nel sistema può essere letta.

`Bundle` rimanda l'effettiva analisi del contenuto facendo scrivere la lunghezza dell'intero dato impacchettato in `Parcel` e poi [copiando la parte rilevante del Parcel originale in un Parcel secondario memorizzato in `mParcelledData`](https://cs.android.com/android/platform/superproject/+/android-12.1.0_r8:frameworks/base/core/java/android/os/BaseBundle.java;l=1675-1683) (questo consente ad esempio a [`Activity.onSaveInstanceState()`](https://developer.android.com/reference/android/app/Activity#onSaveInstanceState(android.os.Bundle)) di fornire `Parcelable` non disponibili in `system_server`; l'intero `Bundle` viene quindi passato a `system_server` e restituito senza modifiche, senza analizzare il contenuto).

Tuttavia, una volta che si accedeva a un valore qualsiasi nel `Bundle`, tutti i valori all'interno del `Bundle` [venivano estratti dal `Parcel`](https://cs.android.com/android/platform/superproject/+/android-12.1.0_r8:frameworks/base/core/java/android/os/BaseBundle.java;l=227-313) e [ogni coppia chiave-valore presente veniva analizzata](https://cs.android.com/android/platform/superproject/+/android-12.1.0_r8:frameworks/base/core/java/android/os/Parcel.java;l=3613-3632). Se tale mappa conteneva un `Parcelable` con metodi `writeToParcel` e `createFromParcel` sbilanciati e successivamente tale `Bundle` veniva inoltrato a un altro processo, quell'altro processo poteva vedere contenuti diversi del `Bundle`. Questo ha reso tutte queste discrepanze nelle classi disponibili nel sistema delle vulnerabilità, poiché ci sono [punti nel sistema in cui `Bundle` viene ispezionato per accertarne la sicurezza](https://cs.android.com/android/platform/superproject/+/android-12.1.0_r8:frameworks/base/services/core/java/com/android/server/accounts/AccountManagerService.java;l=5037-5046) e poi inoltrato a un altro processo.

In questo articolo chiamo tale `Bundle`, che presenta un contenuto e poi un altro dopo essere stato inoltrato, `Bundle` auto-modificante.
Scarica lo strumento