Aceste informații le sunt destinate dezvoltatorilor ale căror aplicații conțin o vulnerabilitate de redirecționare a schemei Intent.
Ce se întâmplă
Una sau mai multe dintre aplicațiile dvs. au o problemă de redirecționare a schemei Intent, care poate permite aplicațiilor rău intenționate să acceseze componentele sau fișierele aplicațiilor private. Consultați pașii prezentați în detaliu mai jos pentru a remedia problema cu aplicațiile dvs. După termenele limită afișate în Play Console, toate aplicațiile care conțin vulnerabilități de securitate neremediate vor fi eliminate din Google Play.
Acțiune necesară
- Conectați-vă la Play Console și navigați la secțiunea Alerte ca să vedeți ce aplicații sunt afectate și care sunt termenele limită pentru remedierea problemelor.
- Actualizați aplicațiile afectate cu ajutorul pașilor evidențiați mai jos.
- Trimiteți versiunile actualizate ale aplicațiilor afectate.
După retrimiterea solicitării, aplicația dvs. va fi examinată din nou. Procesul poate dura câteva ore. Dacă aplicația trece de etapa de examinare și este publicată, nu mai este necesară nicio acțiune din partea dvs. Dacă aplicația nu trece de examinare, noua versiune a aplicației nu va fi publicată și veți primi o notificare prin e-mail.
Detalii suplimentare
Folosirea unei intenții care nu prezintă încredere pentru a lansa o componentă (de exemplu, apelând startActivity) sau pentru a returna date (de exemplu, apelând setResult) este periculoasă și poate permite aplicațiilor rău intenționate să cauzeze următoarele probleme:
- să fure fișiere sau date de sistem sensibile (de exemplu, SMS-uri) din aplicație;
- să lanseze componente private ale aplicației cu argumente rău intenționate.
Este important ca aplicația să nu apeleze startActivity, startService, sendBroadcast sau setResult pentru intenții care nu prezintă încredere, fără a valida sau a curăța intențiile respective.
Vă recomandăm să evitați această vulnerabilitate printr-unul dintre următoarele moduri.
Opțiunea 1: setați ca privată componenta aplicației afectate, din care este redirecționată schema Intent extrasă.
În cazul în care componenta aplicației afectate nu are nevoie să primească scheme Intent de la alte aplicații, o puteți seta ca privată dacă setați android:exported=”false” în fișierul dvs. manifest.
Opțiunea 2: asigurați-vă că schema Intent extrasă provine dintr-o sursă de încredere.
Vă puteți asigura că activitatea din care provine este de încredere folosind metode precum getCallingActivity. De exemplu:
// check if the originating Activity is from trusted package
if (getCallingActivity().getPackageName().equals(“known”)) {
Intent intent = getIntent();
// extract the nested Intent
Intent forward = (Intent) intent.getParcelableExtra(“key”);
// redirect the nested Intent
startActivity(forward);
}
Notă:
- nu este suficient să verificați dacă getCallingActivity() returnează o valoare care nu este nulă pentru a preveni vulnerabilitatea. Aplicațiile rău intenționate pot afișa o valoare nulă pentru această funcție.
- În cazul API-ului SMS Retriever Auth pentru servicii Google Play, dacă protejați un broadcast receiver prin permisiunea SEND_PERMISSION, vă asigurați că schema Intent provine din serviciile Play.
Opțiunea 3: asigurați-vă că schema Intent care urmează să fie redirecționată nu este dăunătoare.
Trebuie să vă asigurați că schema Intent redirecționată
- nu va fi trimisă la niciuna dintre componentele private ale aplicației dvs. și că
- nu va fi trimisă la o componentă a unei aplicații externe. Dacă redirecționarea are rolul de a viza o aplicație externă, asigurați-vă că intenția nu va acorda o permisiune URI unuia dintre furnizorii de conținut privat pentru aplicația dvs. sau la datele de sistem.
Aplicațiile pot să verifice componenta care va fi folosită pentru a gestiona schema Intent înainte de a o redirecționa, folosind metode precum resolveActivity. De exemplu:
Intent intent = getIntent();
// extract the nested Intent
Intent forward = (Intent) intent.getParcelableExtra(“key”);
// get the component name
ComponentName name = forward.resolveActivity(getPackageManager());
// check that the package name and class name are as intended
if (name.getPackageName().equals(“safe_package”) &&
name.getClassName().equals(“safe_class”)) {
// redirect the nested Intent
startActivity(forward);
}
Aplicațiile pot să verifice dacă o intenție acordă o permisiune URI, folosind metode precum getFlags. De exemplu:
// extrageți intenția imbricată
Intent forward = (Intent) intent.getParcelableExtra(“key”);
// preluați semnalele
int flags = forward.getFlags();
// verificați dacă intenția imbricată nu acordă permisiuni URI
if ((flags & Intent.FLAG_GRANT_READ_URI_PERMISSION == 0) &&
(flags & Intent.FLAG_GRANT_WRITE_URI_PERMISSION == 0)) {
// redirecționați intenția imbricată
startActivity(forward);
}
Aplicațiile pot și să elimine permisiunile URI acordate folosind removeFlags. De exemplu:
// intenție care nu prezintă încredere
Intent intent = getIntent();
// eliminați permisiunile URI acordate din intenția care nu prezintă încredere
intent.removeFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.removeFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
// transmiteți intenția care nu prezintă încredere
setResult(intent);
Înțelegerea alertelor și alegerea unei opțiuni de prevenție
Alertele din Play Console indică locul în care aplicația dvs. apelează startActivity, startActivityForResult, startService, sendBroadcast sau setResult folosind o intenție care nu prezintă încredere. Pentru a înțelege mai bine care este cea mai potrivită opțiune de prevenție, descoperiți sursa și analizați elementele de apelare a metodelor pentru a afla de unde provine intenția care nu prezintă încredere. De exemplu, în cazul Opțiunii 1, descoperiți sursa pentru a stabili ce componentă va fi privată.
Vă stăm la dispoziție pentru ajutor
Dacă aveți întrebări tehnice cu privire la vulnerabilitate, puteți posta pe Stack Overflow cu eticheta „android-security”. Ca să înțelegeți mai bine pașii pe care trebuie să-i urmați pentru a rezolva problema, contactați echipa de asistență pentru dezvoltatori.