Scudo

Scudo ist ein dynamischer Benutzer-Modus - Speicherzuteiler oder heap Zuordner, entworfen federnde gegen heap bezogene Schwachstellen zu sein (wie Heap-basierten Pufferüberlauf , den Einsatz nach freiem und Doppelfrei ) bei gleichbleibender Leistung. Es bietet die Standard - C - Zuweisung und Freigabe Primitive (wie malloc und kostenlos), sowie den C ++ Primitive (wie neu und löscht).

Scudo ist eher eine Abschwächung als ein vollwertiger Speicherfehlerdetektor wie AddressSanitizer (ASAN) .

Ab der Version Android 11 wird scudo für den gesamten nativen Code verwendet (außer auf Geräten mit geringem Speicher, auf denen noch immer jemalloc verwendet wird). Zur Laufzeit werden alle nativen Heap-Zuordnungen und -Aufhebungen von Scudo für alle ausführbaren Dateien und ihre Bibliotheksabhängigkeiten bedient, und der Prozess wird abgebrochen, wenn eine Beschädigung oder ein verdächtiges Verhalten im Heap festgestellt wird.

In Android 10, Scudo , indem der auf einer pro-binary Basis aktiviert werden mußte LOCAL_SANITIZE := scudo Option in der .mk Datei oder sanitize: { scudo: true, } in der .BP Datei.

Scudo ist Open - Source und ein Teil des LLVM Compiler-rt - Projekt. Die Dokumentation ist verfügbar unter https://llvm.org/docs/ScudoHardenedAllocator.html . Die Scudo Laufzeit Schiffe als Teil der Android - Toolchain und Unterstützung wurden zu Soong und machen einfach zu ermöglichen in einem binären das allocator ermöglicht.

Mit den unten beschriebenen Optionen können Sie zusätzliche Risikominderung innerhalb des Allocators aktivieren oder deaktivieren.

Anpassung

Einige Parameter des Allokators können auf verschiedene Weise pro Prozess definiert werden:

  • Statisch: Definieren Sie ein __scudo_default_options im Programm funktionieren, die die Optionen String zurückgibt analysiert werden. Diese Funktion muss den folgenden Prototyp hat: extern "C" const char *__scudo_default_options() .
  • Dynamisch: Verwenden Sie die Umgebungsvariable SCUDO_OPTIONS analysiert werden , um die Optionen Zeichenfolge enthält. Optionen auf diese Weise definiert außer Kraft setzen jede Definition gemacht durch __scudo_default_options .

Die folgenden Optionen stehen zur Verfügung.

Möglichkeit 64-Bit-Standard 32-Bit-Standard Beschreibung
QuarantineSizeKb 256 64 Die Größe (in KB) der Quarantäne, die verwendet wird, um die tatsächliche Freigabe von Blöcken zu verzögern. Ein niedrigerer Wert kann die Speicherauslastung verringern, aber die Wirksamkeit der Abschwächung verringern. ein negativer Wert fällt auf die Standardwerte zurück. Einstellen sowohl dieses als auch ThreadLocalQuarantineSizeKb auf Null deaktiviert vollständig die Quarantäne.
QuarantineChunksUpToSize 2048 512 Die Größe (in Byte), bis zu der Chunks unter Quarantäne gestellt werden können.
ThreadLocalQuarantineSizeKb 64 16 Die Größe (in KB) des Caches pro Thread, der zum Auslagern der globalen Quarantäne verwendet wird. Ein niedrigerer Wert kann die Speicherauslastung verringern, aber die Konflikte in der globalen Quarantäne erhöhen. Einstellen sowohl dieses als auch QuarantineSizeKb auf Null deaktiviert vollständig die Quarantäne.
DeallocationTypeMismatch false false Aktiviert Fehlerberichte zu malloc/delete, new/free, new/delete[]
DeleteSizeMismatch true true Aktiviert Fehlerberichte bei Nichtübereinstimmung zwischen den Größen von new und delete.
ZeroContents false false Aktiviert Zero-Chunk-Inhalte bei der Zuweisung und Aufhebung der Zuweisung.
allocator_may_return_null false false Gibt an, dass der Allocator null zurückgeben kann, wenn ein behebbarer Fehler auftritt, anstatt den Prozess zu beenden.
hard_rss_limit_mb 0 0 Wenn die RSS des Prozesses diese Grenze erreicht, wird der Prozess beendet.
soft_rss_limit_mb 0 0 Wenn der RSS-Prozess diese Grenze erreicht, weitere Zuweisungen fehlschlagen oder Rückgabe null (auf dem Wert von je allocator_may_return_null ), bis die RSS nach unten geht zurück für neue Zuweisungen zu ermöglichen.
allocator_release_to_os_interval_ms N / A 5000 Betrifft nur einen 64-Bit-Allocator. Wenn gesetzt, wird versucht, ungenutzten Speicher an das Betriebssystem freizugeben, jedoch nicht häufiger als dieses Intervall (in Millisekunden). Wenn der Wert negativ ist, wird kein Speicher für das Betriebssystem freigegeben.
abort_on_error true true Wenn gesetzt, das Werkzeug Anrufe abort() statt _exit() nach dem Drucken der Fehlermeldung.

Validierung

Derzeit gibt es keine CTS-Tests speziell für Scudo. Stellen Sie stattdessen sicher, dass CTS-Tests mit oder ohne aktiviertem Scudo für eine bestimmte Binärdatei bestanden werden, um sicherzustellen, dass dies keine Auswirkungen auf das Gerät hat.

Fehlerbehebung

Wenn ein nicht behebbares Problem erkannt wird, zeigt der Zuordner eine Fehlermeldung an den Standardfehlerdeskriptor an und beendet dann den Prozess. Stacktraces, die zum Abbruch führen, werden im Systemprotokoll hinzugefügt. Die Ausgabe beginnt in der Regel mit Scudo ERROR: gefolgt von einer kurzen Zusammenfassung des Problems zusammen mit allen Zeigern.

Hier eine Auflistung der aktuellen Fehlermeldungen und deren mögliche Ursachen:

  • corrupted chunk header - corrupted chunk header : Die Überprüfung der Prüfsumme des Chunk - Header ist fehlgeschlagen. Dies liegt wahrscheinlich an einem von zwei Dingen: Der Header wurde (teilweise oder vollständig) überschrieben oder der an die Funktion übergebene Zeiger ist kein Stück.
  • race on chunk header - race on chunk header : Zwei verschiedene Threads versuchen , den gleichen Kopf zur gleichen Zeit zu manipulieren. Dies ist normalerweise symptomatisch für eine Race-Bedingung oder ein allgemeines Fehlen von Sperren, wenn Operationen an diesem Chunk ausgeführt werden.
  • invalid chunk state : Der Brocken ist nicht im erwarteten Zustand für einen bestimmten Betrieb, zum Beispiel, ist es nicht zugewiesen , wenn es zu befreien versuchen, oder es ist nicht unter Quarantäne gestellt , wenn es zu recyceln versuchen. Ein doppeltes Frei ist die typische Ursache für diesen Fehler.
  • misaligned pointer : Grundausrichtungsanforderungen stark durchgesetzt: 8 Bytes auf 32-Bit - Plattformen und 16 Bytes auf 64-Bit - Plattformen. Wenn ein an unsere Funktionen übergebener Zeiger nicht zu diesen passt, ist der an eine der Funktionen übergebene Zeiger nicht richtig ausgerichtet.
  • allocation type mismatch : Wenn diese Option aktiviert ist, wird eine Freigabe - Funktion auf einem Stück namens hat die Art der Funktion entspricht , die es zu vergeben genannt wurden. Diese Art von Nichtübereinstimmung kann zu Sicherheitsproblemen führen.
  • invalid sized delete : Wenn der C ++ 14 Größe Delete - Operator verwendet wird, und die optionale Prüfung aktiviert ist, gibt es eine Diskrepanz zwischen der Größe, die übergeben wurde , als ein Stück und die Größe Aufheben der Zuordnung , die angefordert wurde , wenn es zuordnet. Dies ist typischerweise ein Compiler Problem oder eine Art Verwirrung auf dem Objekt freigegeben wird.
  • RSS limit exhausted : Die maximale RSS optional angegeben wurde überschritten.

Wenn Sie einen Absturz im Betriebssystem selbst debuggen, können Sie ein verwenden Hwasan OS Build . Wenn Sie einen Absturz in einer App debuggen, ist es möglich , eine verwenden Hwasan App bauen zu.