Root Detection in mobilen Apps — Erkennungsmethoden und Funktionsprinzip

Autor: IT Sectr Veröffentlicht: 2026-04-03 Lesezeit: 9 Min.

Root Detection ist ein Sicherheitsmechanismus, der Android-Anwendungen vor dem Ausführen auf Geräten mit Superuser-Rechten schützt. Bank-, Zahlungs- und Unternehmensanwendungen blockieren oder schränken die Funktionalität auf gerooteten Geräten ein, da Root-Zugriff die Beschränkungen der Android-Sandbox aufhebt und die Möglichkeit zum Abfangen von Datenverkehr, zum Lesen von Prozessspeicher und zur Datenmanipulation eröffnet. Laut OWASP Mobile Top 10 (2024) fällt das Fehlen von Root Detection in die Kategorie M8 (Security Decisions via Untrusted Inputs). Root Detection basiert auf einer Kombination aus statischen Dateisystemprüfungen und dynamischer Analyse des Laufzeitverhaltens.

Wichtigste Erkenntnisse

  • Root Detection — Überprüfung eines Android-Geräts auf Root-Zugriff, um die Anwendung vor dem Ausführen in einer kompromittierten Umgebung zu schützen
  • Statische Methoden durchsuchen das Dateisystem nach su-Binärdateien, Superuser-Anwendungen und Änderungen an Systempartitionen
  • Dynamische Methoden analysieren die Laufzeit: Überprüfung von Build.TAGS, Versuch, /proc/self/maps mit privilegierten Prozessen zu öffnen
  • Native Implementierung in C/C++ über JNI bietet Widerstandsfähigkeit gegen Umgehung durch Xposed und Frida auf Java-Ebene
  • Sicherheit Root Detection erfordert kontinuierliche Verschleierung und serverseitige Verifizierung, um eine Manipulation der Prüfergebnisse zu verhindern

Was ist Root Detection?

Root Detection ist ein Softwaremechanismus, der das Vorhandensein von Root-Zugriff auf einem Android-Gerät erkennt. Root-Zugriff bietet vollständige Kontrolle über das Betriebssystem und ermöglicht Anwendungen und Skripten die Ausführung von Befehlen mit UID 0. Auf einem gerooteten Gerät geht die Anwendungsisolierung (Android Sandbox) verloren, was das Abfangen von Tastatureingaben, das Lesen von SQLite-Datenbanken anderer Anwendungen, das Injizieren von Code in Prozesse und das Ersetzen von SSL-Zertifikaten im vertrauenswürdigen Speicher ermöglicht.

Für Finanz- und Unternehmensanwendungen stellt der Betrieb auf einem gerooteten Gerät ein inakzeptables Risiko dar: Ein Angreifer erhält Zugriff auf Tokens, Sitzungsschlüssel und persönliche Daten. Aufsichtsbehörden, einschließlich des PCI Security Standards Council, verlangen von Zahlungsanwendungen die Erkennung von und Reaktion auf Root-Zugriff. Als Reaktion darauf integrieren Android-Entwickler Root Detection als Teil einer proaktiven Schutzstrategie.

Es gibt zwei Ansätze zur Erkennung: statisch, der das Dateisystem und installierte Pakete analysiert, und dynamisch, der zur Laufzeit Prüfungen durchführt. Der kombinierte Ansatz gilt als der zuverlässigste, da er verschiedene Umgehungsvektoren abdeckt. Laut einer Studie von NowSecure (2025) enthalten 76 % der Bankanwendungen in den Top 100 von Google Play eine Form von Root Detection.

Statische Methoden zur Root-Erkennung

Statische Methoden werden beim Start der Anwendung ausgeführt und prüfen auf Anzeichen von Root-Zugriff, die Rooting-Tools im Dateisystem hinterlassen. Diese Methoden erfordern keine Ausführung privilegierter Befehle und arbeiten im Kontext einer normalen Anwendung.

Prüfung auf Existenz der su-Binärdatei

Der Hauptindikator für Root-Zugriff ist das Vorhandensein der ausführbaren su-Datei in Standardpfaden: /system/bin/su, /system/xbin/su, /sbin/su, /su/bin/su. Die Anwendung prüft die Existenz der Datei über File.exists() oder eine native Implementierung von access() aus libc. Zusätzlich kann versucht werden, su --version oder su -c id auszuführen und den Exit-Code zu prüfen.

Suche nach Root-Managern

Typische Anwendungen zur Verwaltung des Root-Zugriffs: Superuser, SuperSU, Magisk Manager, KingRoot. Ihre Anwesenheit wird über PackageManager.getPackageInfo() oder durch Lesen des /data/app/-Verzeichnisses geprüft. Zu prüfende Pakete: com.topjohnwu.magisk, eu.chainfire.supersu, com.noshufou.android.su, com.thirdparty.superuser, com.koushikdutta.superuser, com.zacharee1.systemuituner.

Prüfung von Systemeigenschaften

Android speichert Systemzustandsinformationen in Systemeigenschaften, die über System.getProperty und Build.TAGS zugänglich sind. Wenn Build.TAGS test-keys anstelle von release-keys enthält, deutet dies auf eine benutzerdefinierte Firmware hin, oft mit Root-Zugriff. Zusätzlich werden ro.build.tags, ro.debuggable und ro.secure durch Lesen von /system/build.prop geprüft.

java
public class RootDetectionChecker {
    private static final String[] SU_PATHS = {
        "/system/bin/su",
        "/system/xbin/su",
        "/sbin/su",
        "/su/bin/su",
        "/system/sd/xbin/su"
    };

    public boolean checkRootByFiles() {
        for (String path : SU_PATHS) {
            if (new File(path).exists()) {
                return true;
            }
        }
        return false;
    }

    public boolean checkRootByPackages(Context ctx) {
        String[] packages = {
            "com.topjohnwu.magisk",
            "eu.chainfire.supersu",
            "com.noshufou.android.su",
            "com.koushikdutta.superuser"
        };
        for (String pkg : packages) {
            try {
                ctx.getPackageManager().getPackageInfo(pkg, 0);
                return true;
            } catch (PackageManager.NameNotFoundException e) {
                // package not found
            }
        }
        return false;
    }
}

Dynamische Prüfmethoden

Dynamische Methoden werden während des Anwendungsbetriebs ausgeführt und analysieren die Ausführungsumgebung. Im Gegensatz zu statischen Methoden können sie Rooting erkennen, das über Magisk Hide oder Zygisk verborgen wurde, da sie das Systemverhalten und nicht nur die Dateistruktur prüfen.

Prüfung von Mountpunkten

Bei Root-Zugriff werden einige Systempartitionen mit dem Flag rw (read-write) anstelle von ro (read-only) gemountet. Die Anwendung liest /proc/mounts und prüft, ob /system als ro gemountet ist. Wenn /system als rw gemountet ist, deutet dies auf ein modifiziertes System hin. Zusätzlich wird das Vorhandensein einer /su-Mount über Magisk geprüft.

Abgesicherter Modus-Test

Der abgesicherte Modus von Android deaktiviert Drittanbieteranwendungen, einschließlich Root-Manager. Eine korrekte Root Detection-Implementierung kann prüfen, ob das Gerät im abgesicherten Modus läuft. Wenn die Anwendung feststellt, dass Root-Manager nicht sichtbar sind, die su-Binärdatei jedoch existiert, ist dies ein Anzeichen für Magisk Hide.

Prüfung der Befehlsausführung

Der Versuch, su -c id über ProcessBuilder oder Runtime.exec auszuführen, ist ein direkter Test auf Root-Zugriff. Magisk kann diesen Aufruf jedoch abfangen. Ein zuverlässigerer Ansatz ist die Prüfung über nativen Code: Öffnen von /proc/1/limits oder /proc/self/maps und Analyse der UID laufender Prozesse. Wenn die Anwendung UID 0 erhalten oder Dateien lesen kann, die nur für Root zugänglich sind, ist das Gerät kompromittiert.

java
public boolean checkRootDynamically() {
    // Build flags check
    String buildTags = Build.TAGS;
    if (buildTags != null && buildTags.contains("test-keys")) {
        return true;
    }

    // Checking /system mount
    try {
        BufferedReader reader = new BufferedReader(
            new InputStreamReader(new FileInputStream("/proc/mounts"))
        );
        String line;
        while ((line = reader.readLine()) != null) {
            if (line.contains("/system")
                && line.contains("rw")) {
                reader.close();
                return true;
            }
        }
        reader.close();
    } catch (IOException e) {
        // error reading mounts
    }

    return false;
}

Native Root Detection-Implementierung in C++

Root Detection, das in Java implementiert ist, kann leicht über Xposed-Module oder Frida umgangen werden, die Java-Methoden abfangen und Rückgabewerte ersetzen. Eine native Implementierung in C++ über JNI ist deutlich widerstandsfähiger: Dynamische Analysewerkzeuge, die auf Java-Ebene arbeiten, sehen native libc-Aufrufe wie stat, access, popen und dlopen nicht.

cpp
#include <unistd.h>
#include <sys/stat.h>
#include <cstring>
#include <vector>

extern "C"
JNIEXPORT jboolean JNICALL
Java_com_example_checker_RootCheck_nativeCheck(
    JNIEnv* env, jobject instance) {

    std::vector<const char*> paths = {
        "/system/bin/su",
        "/system/xbin/su",
        "/sbin/su",
        "/data/local/su"
    };

    struct stat st;
    for (const char* path : paths) {
        if (stat(path, &st) == 0) {
            return JNI_TRUE;
        }
    }
    return JNI_FALSE;
}

Die native Prüfung verwendet keine Java-API, was sie für Umgehungswerkzeuge, die auf Dalvik/ART-Ebene arbeiten, unsichtbar macht. Für zusätzlichen Schutz wird empfohlen, Konstanten (Pfadliste) nicht in einem schreibgeschützten Abschnitt zu speichern, sondern sie durch einfache umkehrbare Funktionen zu berechnen. Der stat-Aufruf aus libc greift direkt auf den Linux-Kernel zu, unter Umgehung von Java-Wrappern, und kann nicht über Xposed abgefangen werden.

Methoden zur Umgehung von Root Detection

Schutzentwickler müssen bestehende Umgehungsmethoden verstehen, um ein robustes Erkennungssystem aufzubauen. Jede Umgehungsmethode erfordert eine Gegenmaßnahme auf der entsprechenden Ebene.

Umgehung über Magisk Hide und Zygisk

Magisk ist das beliebteste Rooting-Tool auf Android 9–14. Magisk Hide verbirgt das Vorhandensein von su aus /proc und manipuliert die Ergebnisse der Pfadprüfung. Magisk arbeitet auf Kernel-Ebene und fängt stat() und access() ab, bevor die Anwendung sie sieht. Gegenmaßnahme: Prüfung auf Magisk selbst über das Vorhandensein von /sbin/.magisk oder Prüfung durch Lesen der eigenen maps der Anwendung — Magisk injiziert seine Bibliothek in jeden Prozess.

Umgehung über Frida

Frida ist ein dynamisches Instrumentierungswerkzeug, das native Funktionen über Ptrace oder Dobby abfangen kann. Frida ersetzt den Rückgabewert jeder Prüfung und manipuliert das stat-Ergebnis zu ENOENT. Gegenmaßnahme: Überprüfung der Integrität nativer Funktionen durch Berechnung einer Prüfsumme der Anweisungen im Speicher und Erkennung von Frida durch Analyse von /proc/self/maps auf das Vorhandensein von frida-agent.so oder frida-helper.

Umgehung über APK-Patching

Root Detection, das in Java implementiert ist, kann in 2–3 Minuten entfernt werden: Die APK wird über apktool dekompiliert, im smali-Code wird der Rückgabewert der Methode auf false geändert, die APK wird neu erstellt und signiert. Gegenmaßnahme: Verlagerung der kritischen Logik in nativen Code und Überprüfung der digitalen Signatur der Anwendung zur Laufzeit über die Signature-API oder Vergleich des APK-Hashs mit einer Referenz auf dem Server.

Empfehlungen für zuverlässigen Schutz

Effektives Root Detection basiert auf einer mehrschichtigen Architektur. Keine einzelne Methode bietet allein ausreichenden Schutz. Die Kombination aus statischen und dynamischen Prüfungen, nativem Code und serverseitiger Verifizierung bietet maximale Widerstandsfähigkeit.

Serverseitige Verifizierung

Verlassen Sie sich nicht ausschließlich auf clientseitige Prüfungen. Senden Sie Root Detection-Ergebnisse zusammen mit einem Einmal-Sitzungstoken an den Server. Der Server entscheidet über die Blockierung oder Einschränkung der Funktionalität. Dies verhindert Angriffe auf API-Ebene, bei denen die Client-Anwendung modifiziert werden kann, während der Server eine vertrauenswürdige Partei bleibt.

Code-Verschleierung

Root Detection-Code muss verschleiert werden. Wenn ein Angreifer in jadx eine klare Sequenz von su-Pfadprüfungen sieht, dauert die Umgehung Minuten. Verwenden Sie ProGuard oder DexGuard, um den Kontrollfluss zu verschleiern und Zeichenfolgen zu verschlüsseln. Verschleierung erhöht die Analysezeit des Schutzkodes von Minuten auf Stunden.

Regelmäßige Signaturaktualisierung

Die Liste der geprüften Pfade, Pakete und Indikatoren sollte mit jeder Anwendungsversion aktualisiert werden. Neue Rooting- und Umgehungswerkzeuge erscheinen monatlich. Eine statische Liste, die sich seit einem Jahr nicht geändert hat, wird moderne Methoden nicht erkennen. Es wird empfohlen, aktuelle Signaturen beim Start der Anwendung vom Server zu laden, bevor die Prüfungen durchgeführt werden.

Häufig gestellte Fragen

Warum benötigen Anwendungen Root Detection?

Root Detection schützt vor dem Ausführen einer Anwendung auf einem Gerät, auf dem die Android-Sandbox deaktiviert ist. Auf einem gerooteten Gerät kann jede Anwendung Daten anderer Anwendungen lesen. Bank- und Zahlungsanwendungen sind gemäß den PCI DSS-Anforderungen und den OWASP Mobile Security-Empfehlungen verpflichtet, den Betrieb auf gerooteten Geräten zu blockieren.

Wie funktioniert Magisk Hide?

Magisk Hide verwendet einen Mount-Namespace-Mechanismus. Für jeden Prozess in der Ausschlussliste erstellt Magisk einen isolierten Namespace, in dem die su-Binärdatei unsichtbar ist. Systemaufrufe stat, access und open sehen in diesem Namespace keine Magisk-Dateien. Magisk kann durch Prüfung des Vorhandenseins von /proc/self/maps und Suche nach Magisk-Dumps erkannt werden.

Kann Root Detection ohne Root umgangen werden?

Ja, wenn die Anwendung die Integrität ihres Codes nicht überprüft. Über Frida kann die Java-Prüfmethode abgefangen und gezwungen werden, false zurückzugeben. Die Gegenmaßnahme ist eine native Implementierung der kritischen Logik in C++ und Integritätsprüfung über den DEX-Datei-Hash. Ohne Verschleierung wird jede Root Detection in Java in 5–10 Minuten umgangen.

Was sind SafetyNet und Attestation?

SafetyNet (veraltet) und Play Integrity API sind serverseitige Prüfungen von Google, die die Geräteintegrität bestätigen. Sie umfassen die Überprüfung des Bootloaders, der Systemsignatur und des Root-Status. Play Integrity API ist der empfohlene Ersatz für SafetyNet und bietet drei Stufen: BASIC, DEVICE und STRONG. Clientseitiges Root Detection ergänzt die serverseitige Attestation.

Wie testet man Root Detection in seiner Anwendung?

Installieren Sie die Anwendung auf einem echten gerooteten Gerät (z. B. einem Pixel mit Magisk). Prüfen Sie, ob die Blockierung ausgelöst wird. Versuchen Sie dann, Root über Magisk Hide für Ihre Anwendung zu verstecken und starten Sie den Test neu. Für eingehende Tests verwenden Sie Frida, um Zielmethoden abzufangen, und stellen Sie sicher, dass der native Schutz nicht umgangen werden kann.

Zusammenfassung

  • Root Detection ist eine obligatorische Sicherheitskomponente für Bank-, Zahlungs- und Unternehmens-Android-Anwendungen, die auf einer Kombination statischer und dynamischer Prüfungen basiert
  • Statische Methoden umfassen die Suche nach der su-Binärdatei in Standardpfaden, die Prüfung installierter Root-Manager und die Analyse der Build.TAGS-Systemeigenschaften
  • Dynamische Methoden analysieren die /system-Mount im rw-Modus, überprüfen die /proc/mounts-Integrität und führen privilegierte Befehlsausführungstests durch
  • Native Implementierung in C++ über JNI macht Prüfungen für Xposed und Frida auf Java-Ebene unsichtbar und erfordert eine Umgehung über Dobby oder Ptrace
  • Magisk Hide ist das primäre Werkzeug zur Umgehung von Root Detection über Mount-Namespaces, erkennbar durch Analyse von /proc/self/maps auf Magisk-Bibliotheken
  • Empfohlene Architektur: native Prüfungen + Code-Verschleierung + serverseitige Ergebnisverifizierung + regelmäßige Signaturaktualisierung
  • Play Integrity API von Google ergänzt clientseitiges Root Detection durch serverseitige Geräteattestation und bietet umfassenden Schutz

Wir entwickeln eine mobile Applikation schlüsselfertig

IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.

Projekt besprechen

Lesen Sie auch