A partire dal 27 marzo 2025, ti consigliamo di utilizzare android-latest-release anziché aosp-main per compilare e contribuire ad AOSP. Per ulteriori informazioni, vedi Modifiche ad AOSP.
Mantieni tutto organizzato con le raccolte
Salva e classifica i contenuti in base alle tue preferenze.
Scudo è un allocatore di memoria dinamico in modalità utente o allocatore di heap, progettato per essere resiliente alle vulnerabilità correlate all'heap (come overflow del buffer basato sull'heap, uso dopo il rilascio e doppio rilascio) mantenendo le prestazioni. Fornisce le primitive di allocazione e deallocazione C standard (come
malloc e free), nonché le primitive C++ (come new ed delete).
Scudo è più una misura di mitigazione che un rilevatore di errori di memoria completo come AddressSanitizer (ASan).
Dalla release di Android 11, scudo viene utilizzato per tutto il codice nativo
(tranne sui dispositivi con poca memoria, dove viene ancora utilizzato jemalloc). In fase di esecuzione, tutte le allocazioni e le dealocation dell'heap nativo vengono gestite da Scudo per tutti gli eseguibili e le relative dipendenze della libreria e il processo viene interrotto se viene rilevata una corruzione o un comportamento sospetto nell'heap.
Scudo è
open source e fa parte del progetto compiler-rt di LLVM. La documentazione è disponibile all'indirizzo
https://llvm.org/docs/ScudoHardenedAllocator.html. Il runtime Scudo viene fornito come parte della toolchain di Android e il supporto è stato aggiunto a Soong e Make per consentire l'attivazione facile dell'allocatore in un file binario.
Puoi attivare o disattivare ulteriori mitigazioni all'interno
dell'allocatore utilizzando le opzioni descritte di seguito.
Personalizzazione
Alcuni parametri dell'allocatore possono essere definiti in base al processo
in diversi modi:
In modo statico: definisci una funzione __scudo_default_options nel programma che restituisce la stringa di opzioni da analizzare. Questa funzione deve avere il seguente prototipo: extern "C" const char
*__scudo_default_options().
In modo dinamico: utilizza la variabile di ambiente SCUDO_OPTIONS
contenente la stringa di opzioni da analizzare. Le opzioni definite in questo modo
sovrascrivono qualsiasi definizione effettuata tramite __scudo_default_options.
Sono disponibili le seguenti opzioni.
Opzione
Valore predefinito a 64 bit
Valore predefinito a 32 bit
Descrizione
QuarantineSizeKb
256
64
Le dimensioni (in KB) della quarantena utilizzata per ritardare la deallocazione effettiva dei chunk. Un valore inferiore può ridurre l'utilizzo della memoria, ma diminuire l'efficacia del mitigatore. Un valore negativo restituisce i valori predefiniti. Impostare su zero sia questo valore sia ThreadLocalQuarantineSizeKb disattiva completamente la quarantena.
QuarantineChunksUpToSize
2048
512
Le dimensioni (in byte) fino a cui è possibile mettere in quarantena i chunk.
ThreadLocalQuarantineSizeKb
64
16
Le dimensioni (in KB) della cache per thread utilizzata per scaricare la quarantena globale.
Un valore inferiore potrebbe ridurre l'utilizzo della memoria, ma potrebbe aumentare le contese sulla quarantena globale. Impostare su zero sia questo valore sia QuarantineSizeKb
disattiva completamente la quarantena.
DeallocationTypeMismatch
false
false
Attiva la segnalazione degli errori su malloc/delete, new/free, new/delete[]
DeleteSizeMismatch
true
true
Attiva la generazione di report sugli errori relativi alla mancata corrispondenza tra le dimensioni di operazione di inserimento e di eliminazione.
ZeroContents
false
false
Consente di attivare i contenuti dei chunk zero durante l'allocazione e la disallocazione.
allocator_may_return_null
false
false
Specifica che l'allocatore può restituire null quando si verifica un errore recuperabile, anziché terminare il processo.
hard_rss_limit_mb
0
0
Quando l'RSS del processo raggiunge questo limite, il processo viene interrotto.
soft_rss_limit_mb
0
0
Quando l'RSS del processo raggiunge questo limite, le ulteriori allocazioni non vanno a buon fine o
resistono null (a seconda del valore di allocator_may_return_null), finché
l'RSS non si riduce per consentire nuove allocazioni.
allocator_release_to_os_interval_ms
5000
N/D
Riguarda solo un allocatore a 64 bit. Se impostato, tenta di rilasciare la memoria inutilizzata al sistema operativo, ma non più spesso di questo intervallo (in millisecondi).
Se il valore è negativo, la memoria non viene rilasciata al sistema operativo.
abort_on_error
true
true
Se impostato, lo strumento chiama abort() anziché _exit()
dopo aver stampato il messaggio di errore.
Convalida
Al momento non sono disponibili test CTS specifici per Scudo. Assicurati invece che i test CTS vengano superati con o senza Scudo abilitato per un determinato file binario per verificare che non influisca sul dispositivo.
Risoluzione dei problemi
Se viene rilevato un problema non recuperabile, l'allocatore visualizza un messaggio di errore nel descrittore di errore standard e termina il processo.
Le tracce dello stack che portano all'interruzione vengono aggiunte nel log di sistema.
L'output di solito inizia con Scudo ERROR:, seguito da un breve riepilogo del problema e da eventuali suggerimenti.
Di seguito è riportato un elenco dei messaggi di errore attuali e delle relative potenziali cause:
corrupted chunk header: la verifica della checksum dell'intestazione del frammento non è riuscita. Ciò è probabilmente dovuto a una delle due cose: l'intestazione è stata sovrascritta (parzialmente o totalmente) o il puntatore passato alla funzione non è un chunk.
race on chunk header: due thread diversi stanno tentando di manipulare la stessa intestazione contemporaneamente. In genere, si tratta di un sintomo di una condizione di gara o di una mancanza generale di blocco durante l'esecuzione di operazioni su quel blocco.
invalid chunk state: il chunk non è nello stato previsto per una determinata operazione, ad esempio non è allocato quando si tenta di liberarlo o non è messo in quarantena quando si tenta di riciclarlo. Un doppio scambio è la causa tipica di questo errore.
misaligned pointer: i requisiti di allineamento di base sono fortemente applicati: 8 byte su piattaforme a 32 bit e 16 byte su piattaforme a 64 bit.
Se un puntatore passato alle nostre funzioni non è adatto, il puntatore passato a una delle funzioni non è allineato.
allocation type mismatch: quando questa opzione è attivata,
una funzione di deallocazione chiamata su un chunk deve
corrispondere al tipo di funzione chiamata per allocarlo.
Questo tipo di mancata corrispondenza può comportare problemi di sicurezza.
invalid sized delete: quando viene utilizzato l'operatore di eliminazione con dimensioni C++14 e il controllo facoltativo è abilitato, non c'è corrispondenza tra le dimensioni che sono state passate durante la deallocazione di uno chunk e quelle richieste durante l'allocazione.
Di solito si tratta di un problema del compilatore o di confusione di tipo sull'oggetto da deallocare.
RSS limit exhausted: il numero massimo di RSS specificato facoltativamente è stato superato.
Se stai eseguendo il debug di un arresto anomalo nel sistema operativo stesso, puoi utilizzare una
build del sistema operativo HWASan. Se stai debugging un arresto anomalo in un'app, puoi anche utilizzare una build dell'app HWASan.
I campioni di contenuti e codice in questa pagina sono soggetti alle licenze descritte nella Licenza per i contenuti. Java e OpenJDK sono marchi o marchi registrati di Oracle e/o delle sue società consociate.
Ultimo aggiornamento 2025-07-27 UTC.
[[["Facile da capire","easyToUnderstand","thumb-up"],["Il problema è stato risolto","solvedMyProblem","thumb-up"],["Altra","otherUp","thumb-up"]],[["Mancano le informazioni di cui ho bisogno","missingTheInformationINeed","thumb-down"],["Troppo complicato/troppi passaggi","tooComplicatedTooManySteps","thumb-down"],["Obsoleti","outOfDate","thumb-down"],["Problema di traduzione","translationIssue","thumb-down"],["Problema relativo a esempi/codice","samplesCodeIssue","thumb-down"],["Altra","otherDown","thumb-down"]],["Ultimo aggiornamento 2025-07-27 UTC."],[],[],null,["# Scudo is a dynamic user-mode memory allocator, or *heap* allocator, designed\nto be resilient against heap-related vulnerabilities (such as [heap-based buffer\noverflow](https://cwe.mitre.org/data/definitions/122.html), [use after free](https://cwe.mitre.org/data/definitions/416.html),\nand [double free](https://cwe.mitre.org/data/definitions/415.html))\nwhile maintaining performance. It provides the standard C allocation and\ndeallocation primitives (such as [malloc](http://pubs.opengroup.org/onlinepubs/009695399/functions/malloc.html) and free), as well as the C++ primitives (such as new and delete).\n\nScudo is more of a mitigation than a fully fledged memory error\ndetector like [AddressSanitizer (ASan)](/docs/security/test/sanitizers#addresssanitizer).\n\nSince the Android 11 release, scudo is used for all native code\n(except on low-memory devices, where jemalloc is still used). At runtime, all native heap\nallocations and deallocations are serviced by Scudo for all executables and their library\ndependencies, and the process is aborted if a corruption or suspicious\nbehavior is detected in the heap.\n\nScudo is [open source](https://github.com/llvm/llvm-project/tree/main/compiler-rt/lib/scudo) and part of LLVM's compiler-rt project. Documentation is\navailable at \u003chttps://llvm.org/docs/ScudoHardenedAllocator.html\u003e. The Scudo runtime ships\nas part of the Android toolchain and support was added to [Soong and Make](https://android.googlesource.com/platform/build/soong/)\nto allow for easy enabling of the allocator in a binary.\n\nYou can enable or disable extra mitigation within\nthe allocator using the options described below.\n\nCustomization\n-------------\n\nSome parameters of the allocator can be defined on a per-process basis\nthrough several ways:\n\n- **Statically:** Define a `__scudo_default_options` function in the program that returns the options string to be parsed. This function must have the following prototype: `extern \"C\" const char\n *__scudo_default_options()`.\n- **Dynamically:** Use the environment variable `SCUDO_OPTIONS` containing the options string to be parsed. Options defined this way override any definition made through `__scudo_default_options`.\n\nThe following options are available.\n| **Note:** Frontend options have a different name format than backend options.\n\n| Option | 64-bit default | 32-bit default | Description |\n|---------------------------------------|----------------|----------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `QuarantineSizeKb` | `256` | `64` | The size (in KB) of quarantine used to delay the actual deallocation of chunks. A lower value may reduce memory usage but decrease the effectiveness of the mitigation; a negative value falls back to the defaults. Setting both this and `ThreadLocalQuarantineSizeKb` to zero disables the quarantine entirely. |\n| `QuarantineChunksUpToSize` | `2048` | `512` | The size (in bytes) up to which chunks can be quarantined. |\n| `ThreadLocalQuarantineSizeKb` | `64` | `16` | The size (in KB) of per-thread cache use to offload the global quarantine. A lower value may reduce memory usage but might increase contention on the global quarantine. Setting both this and `QuarantineSizeKb` to zero disables the quarantine entirely. |\n| `DeallocationTypeMismatch` | `false` | `false` | Enables error reporting on malloc/delete, new/free, new/delete\\[\\] |\n| `DeleteSizeMismatch` | `true` | `true` | Enables error reporting on mismatch between sizes of new and delete. |\n| `ZeroContents` | `false` | `false` | Enables zero chunk contents on allocation and deallocation. |\n| `allocator_may_return_null` | `false` | `false` | Specifies that the allocator can return null when a recoverable error occurs, instead of terminating the process. |\n| `hard_rss_limit_mb` | `0` | `0` | When the process's RSS reaches this limit, the process terminates. |\n| `soft_rss_limit_mb` | `0` | `0` | When the process's RSS reaches this limit, further allocations fail or return `null` (depending on the value of `allocator_may_return_null`), until the RSS goes back down to allow for new allocations. |\n| `allocator_release_to_os_interval_ms` | `5000` | N/A | Only affects a 64-bit allocator. If set, tries to release unused memory to the OS, but not more often than this interval (in milliseconds). If the value is negative, memory isn't released to the OS. |\n| `abort_on_error` | `true` | `true` | If set, the tool calls `abort()` instead of `_exit()` after printing the error message. |\n\nValidation\n----------\n\nCurrently, there are no CTS tests specifically for Scudo. Instead, make sure\nthat CTS tests pass with or without Scudo enabled for a given binary to verify\nthat it doesn't impact the device.\n\nTroubleshooting\n---------------\n\nIf a non-recoverable issue is detected, the allocator\ndisplays an error message to the standard error descriptor and then terminates the process.\nStack traces that lead to the termination are added in the system log.\nThe output usually starts with `Scudo ERROR:` followed by a\nshort summary of the problem along with any pointers.\n| **Note:** Again, Scudo is meant to be a mitigation. Consider using ASan to determine the root cause of the issue.\n\nHere is a list of the current error messages and their potential\ncauses:\n\n- `corrupted chunk header`: The checksum verification of the chunk header has failed. This is likely due to one of two things: the header was overwritten (partially or totally), or the pointer passed to the function is not a chunk.\n- `race on chunk header`: Two different threads are attempting to manipulate the same header at the same time. This is usually symptomatic of a race-condition or general lack of locking when performing operations on that chunk.\n- `invalid chunk state`: The chunk isn't in the expected state for a given operation, for example, it's not allocated when trying to free it, or it's not quarantined when trying to recycle it. A double free is the typical reason for this error.\n- `misaligned pointer`: Basic alignment requirements are strongly enforced: 8 bytes on 32-bit platforms and 16 bytes on 64-bit platforms. If a pointer passed to our functions does not fit those, the pointer passed to one of the functions is out of alignment.\n- `allocation type mismatch`: When this option is enabled, a deallocation function called on a chunk has to match the type of function that was called to allocate it. This type of mismatch can introduce security issues.\n- `invalid sized delete`: When the C++14 sized delete operator is used, and the optional check is enabled, there's a mismatch between the size that was passed when deallocating a chunk and the size that was requested when allocating it. This is typically a compiler issue or a [type confusion](https://cwe.mitre.org/data/definitions/843.html) on the object being deallocated.\n- `RSS limit exhausted`: The maximum RSS optionally specified has been exceeded.\n\n\nIf you're debugging a crash in the OS itself, you can use a\n[HWASan OS build](/devices/tech/debug/hwasan). If you're\ndebugging a crash in an app, it's possible to use a\n[HWASan app build](https://developer.android.com/ndk/guides/hwasan) too."]]