flagged as insecure / outdated root detection (OWASP MASTG-KNOW-0027) and unreliable on modern Android devices (refs #5525, #2495)
Los mantenedores suelen responder en 1 día
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 5/5
- Tiempo estimado
- Más de una semana
- Aptitud para principiantes
- 35/100
- Tipo de issue
- Error
- Claridad
- Bastante claro
- Estado de actividad
- Tranquilo
- Área
- mobile-dev, security
Línea de trabajo
Comienza con firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/common/CommonUtils.java, en isRooted(), alrededor de la línea 321. Revisa el comportamiento descrito para Android 10, 12 y 13+, y después compara los informes relacionados en #5525 y #2495. Se considera terminado cuando el comportamiento de detección de root sea fiable en los entornos indicados, o cuando su condición de no tener un nivel de seguridad adecuado esté claramente documentada, marcada como deprecated o eliminada.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
[READ] Step 1: Are you in the right place?
Issues filed here should be about bugs in the code in this repository. If you have a general
question, need help debugging, or fall into some other category use one of these other channels:
- For general technical questions, post a question on StackOverflow
with the firebase tag. - For general Firebase discussion, use the
firebase-talk google group. - For help troubleshooting your application that does not fall under one of the above categories,
reach out to the personalized Firebase support channel.
[REQUIRED] Step 2: Describe your environment
- Android Studio version: Otter 2025.2.3
- Firebase Component: Crashlytics (Database, Firestore, Storage, Functions, etc)
- Component version: 19.4.0 -> latest
[REQUIRED] Step 3: Describe the problem
The method CommonUtils.isRooted() is currently being flagged by third-party independent security researchers during mobile application assessments based on OWASP Mobile Application Security Testing Guide (MASTG), specifically MASTG-KNOW-0027: Root Detection.
While OWASP clearly states that root detection is not a vulnerability by itself, the current implementation in Firebase appears to:
Rely on outdated / simplistic heuristics (e.g., static file checks, basic binaries presence).
Produce unreliable results on modern Android versions, including false positives and false negatives.
Not align with modern root detection practices (multi-layered, runtime-aware, obfuscation-resistant approaches).
Be easily bypassable, which reduces its value even as a soft anti-tampering signal.
Additionally, this method has already shown instability and incorrect behavior on newer Android devices, as discussed in:
Issue #5525 (detection on Android 13+)
Issue #2495 (detection on emulators)
These reports suggest that isRooted() may no longer behave consistently across API levels and device configurations (e.g., scoped storage, system-as-root, modern SELinux policies, Magisk hiding, etc.).
Steps to reproduce:
Use Firebase Crashlytics in an Android app.
Run the app on:
- Android devices across modern API levels (Android 10 / 12 and 13+)
- Either rooted (with Magisk hiding) or non-rooted device
Observe: - Inconsistent isRooted() results depending on environment
- Security scanners flagging the implementation as insufficient / non-compliant with OWASP recommendations
Security review tools specifically flag:
- Static file path checks (/system/xbin/su, etc.)
- Lack of runtime or behavioral checks
- No mitigation for modern root-hiding techniques
Expected behavior:
CommonUtils.isRooted() should either:
- Use a modern, more reliable root detection approach compatible with current Android versions, or
- Be clearly documented (or deprecated/removed) as non-security-grade, so it is not flagged during security reviews.
Given that Firebase Crashlytics is widely embedded across production applications, its internal utilities should not introduce audit friction or trigger OWASP-related findings in downstream apps.
Relevant Code:
- Lenguaje dominante
- Java
- Estrellas
- 2.6k
- Forks
- 733
- Merge medio
- 2 d 15 h
- PR fusionados (30 d)
- 72
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Sin plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de firebase/firebase-android-sdk
-
api: remoteconfig
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
firebase/firebase-android-sdk#8827 ·
Los mantenedores suelen responder en 1 día
-
Crashlytics plugin writes build ID lists in directory listing order, so APKs can differ between machinesPosiblemente ocupada @mrober la tomó hace 8 días. Abiertoapi: crashlytics
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
firebase/firebase-android-sdk#8789 · 1 comentario · 1 asignado ·
Los mantenedores suelen responder en 1 día
-
api: auth
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
firebase/firebase-android-sdk#8505 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
Dificultad 4/5 3-5 días Aptitud para principiantes 15/100
firebase/firebase-android-sdk#8835 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 4/5 3-5 días Aptitud para principiantes 25/100
firebase/firebase-android-sdk#8832 ·
Los mantenedores suelen responder en 1 día
Todos los issues de firebase/firebase-android-sdk
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 80/100
Los mantenedores suelen responder en 1 día
-
RIS export splits an organization name containing “and” into multiple authorsPosiblemente ocupada @Gautam-aman la tomó hoy. Abiertostatus: needs-triage
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
JabRef/jabref#17821 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
FailureContext.java rounds down thresholds in lastedAtLeast()Posiblemente ocupada Un pull request vinculado a esta issue está abierto o ya se fusionó. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
Los mantenedores suelen responder en 1 día
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 86/100
Los mantenedores suelen responder en 1 día