Remediere pentru vulnerabilitatea de redirecționare a schemei Intent

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ă​

  1. 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.
  2. Actualizați aplicațiile afectate cu ajutorul pașilor evidențiați mai jos.
  3. 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:

  1. să fure fișiere sau date de sistem sensibile (de exemplu, SMS-uri) din aplicație;
  2. 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ă

  1. nu va fi trimisă la niciuna dintre componentele private ale aplicației dvs. și că
  2. 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.

false
Meniu principal
963459002311127822
true
Căutaţi în Centrul de ajutor
true
true
true
true
true
5016068
false
false