Αποκατάσταση για την ευπάθεια Ανακατεύθυνσης Intent

Αυτές οι πληροφορίες προορίζονται για προγραμματιστές με εφαρμογές που περιέχουν την ευπάθεια Ανακατεύθυνσης Intent.

Τι συμβαίνει

Μία ή περισσότερες από τις εφαρμογές σας αντιμετωπίζουν ένα πρόβλημα Ανακατεύθυνσης Intent, το οποίο μπορεί να επιτρέψει σε κακόβουλες εφαρμογές την πρόσβαση σε στοιχεία ή αρχεία ιδιωτικών εφαρμογών. Ανατρέξτε στα λεπτομερή βήματα παρακάτω, για να διορθώσετε το πρόβλημα με τις εφαρμογές σας. Μετά την πάροδο των προθεσμιών που εμφανίζονται στο Play Console, όλες οι εφαρμογές που περιέχουν ευπάθειες ασφαλείας που δεν έχουν αντιμετωπιστεί θα καταργηθούν από το Google Play.

Απαιτείται ενέργεια​

  1. Συνδεθείτε στο Play Console και μεταβείτε στην ενότητα Ειδοποιήσεις, για να δείτε τις επηρεαζόμενες εφαρμογές και τις προθεσμίες για την επίλυση των σχετικών ζητημάτων.
  2. Ενημερώστε τις επηρεαζόμενες εφαρμογές, ακολουθώντας τα βήματα που περιγράφονται παρακάτω.
  3. Υποβάλετε τις ενημερωμένες εκδόσεις των επηρεαζόμενων εφαρμογών.

Μετά την επανυποβολή, η εφαρμογή σας θα ελεγχθεί ξανά. Αυτή η διαδικασία μπορεί να διαρκέσει αρκετές ώρες. Εάν ο έλεγχος της εφαρμογής ολοκληρωθεί χωρίς προβλήματα και η εφαρμογή δημοσιευτεί με επιτυχία, τότε δεν απαιτείται καμία άλλη ενέργεια. Εάν ο έλεγχος της εφαρμογής αποτύχει, τότε η νέα έκδοση της εφαρμογής δεν θα δημοσιευτεί και θα λάβετε σχετική ειδοποίηση με ένα μήνυμα ηλεκτρονικού ταχυδρομείου.

Πρόσθετα στοιχεία

Η χρήση μη αξιόπιστου Intent για την εκκίνηση ενός στοιχείου (για παράδειγμα, με κλήση του startActivity) ή για την εμφάνιση δεδομένων (για παράδειγμα, με κλήση του setResult) είναι επικίνδυνη και μπορεί να επιτρέψει σε κακόβουλες εφαρμογές να προκαλέσουν τα παρακάτω προβλήματα: 

  1. Κλοπή ευαίσθητων αρχείων ή δεδομένων συστήματος (όπως μηνυμάτων SMS) από την εφαρμογή σας
  2. Εκκίνηση των ιδιωτικών στοιχείων της εφαρμογής σας με προσβεβλημένα ορίσματα

Είναι σημαντικό η εφαρμογή σας να μην καλεί το startActivity, startService, sendBroadcast ή setResult σε μη αξιόπιστα Intent χωρίς επικύρωση ή εξυγίανση αυτών των Intent.

Σας συνιστούμε να αποτρέψετε αυτήν την ευπάθεια με έναν από τους παρακάτω τρόπους:

Επιλογή 1: Κάντε το επηρεαζόμενο στοιχείο εφαρμογής, από το οποίο ανακατευθύνεται το Intent που έχει εξαχθεί, ιδιωτικό.

Εάν το επηρεαζόμενο στοιχείο εφαρμογής δεν χρειάζεται να λαμβάνει Intent από άλλες εφαρμογές, τότε μπορείτε να κάνετε αυτό το στοιχείο της εφαρμογής ιδιωτικό, ορίζοντας την παράμετρο android:exported=”false” στο μανιφέστο.

Επιλογή 2: Βεβαιωθείτε ότι το Intent που έχει εξαχθεί προέρχεται από αξιόπιστη πηγή.

Μπορείτε να επαληθεύσετε ότι η δραστηριότητα δημιουργίας μπορεί να θεωρηθεί έμπιστη, χρησιμοποιώντας μεθόδους όπως τη μέθοδο getCallingActivity. Για παράδειγμα:

 // ελέγξτε αν η δραστηριότητα δημιουργίας προέρχεται από αξιόπιστο πακέτο
 if (getCallingActivity().getPackageName().equals(“known”)) {
   Intent intent = getIntent();
   // εξαγάγετε το ενσωματωμένο Intent
   Intent forward = (Intent) intent.getParcelableExtra(“key”);
   // ανακατευθύνετε το ενσωματωμένο Intent
   startActivity(forward);
 }

Σημείωση:

  • Ο έλεγχος για το αν η μέθοδος getCallingActivity() εμφανίζει μια τιμή που δεν είναι null, δεν επαρκεί για να αποτρέψει την ευπάθεια. Οι κακόβουλες εφαρμογές μπορούν να παρέχουν τιμή null για αυτήν τη συνάρτηση.
  • Στην περίπτωση του Ελέγχου ταυτότητας SMS Retriever των υπηρεσιών Google Play, η προστασία ενός δέκτη μετάδοσης με το SEND_PERMISSION θα διασφαλίσει ότι ένα Intent προέρχεται από τις Υπηρεσίες Play.

Επιλογή 3: Βεβαιωθείτε ότι το Intent που προορίζεται για ανακατεύθυνση δεν είναι επιβλαβές.

Θα πρέπει να επαληθεύσετε ότι το ανακατευθυνόμενο Intent:

  1. δεν θα σταλεί σε κανένα από τα ιδιωτικά στοιχεία της εφαρμογής σας, και
  2. Δεν θα σταλεί σε στοιχείο μιας εξωτερικής εφαρμογής. Εάν η ανακατεύθυνση προορίζεται για τη στόχευση μιας εξωτερικής εφαρμογής, βεβαιωθείτε ότι το intent δεν θα εκχωρήσει άδεια URI σε έναν από τους ιδιωτικούς παρόχους περιεχομένου ή τα δεδομενα συστήματος της εφαρμογής σας.

Οι εφαρμογές μπορούν να ελέγξουν ποιο στοιχείο θα χρησιμοποιηθεί για τον χειρισμό του Intent πριν από την ανακατεύθυνσή του, χρησιμοποιώντας μεθόδους όπως τη μέθοδο resolveActivity. Για παράδειγμα:

 Intent intent = getIntent();
 // εξαγάγετε το ενσωματωμένο Intent
 Intent forward = (Intent) intent.getParcelableExtra(“key”);
 // λάβετε το όνομα του στοιχείου
 ComponentName name = forward.resolveActivity(getPackageManager());
 // ελέγξτε ότι το όνομα πακέτου και το όνομα κλάσης είναι είναι όπως αναμενόταν
 if (name.getPackageName().equals(“safe_package”) &&
     name.getClassName().equals(“safe_class”)) {
   // ανακατευθύνετε το ενσωματωμένο Intent
   startActivity(forward);
 }

Οι εφαρμογές μπορούν να ελέγξουν αν ένα Intent εκχωρεί αδεια URI, χρησιμοποιώντας μεθόδους όπως τη μέθοδο getFlags. Για παράδειγμα:

 // εξαγάγετε το ενσωματωμένο Intent
 Intent forward = (Intent) intent.getParcelableExtra(“key”);
 // λάβετε τις επισημάνσεις
 int flags = forward.getFlags();
 // ελέγξτε ότι το ενσωματωμένο Intent δεν εκχωρεί άδειες URI
 if ((flags & Intent.FLAG_GRANT_READ_URI_PERMISSION == 0) &&
     (flags & Intent.FLAG_GRANT_WRITE_URI_PERMISSION == 0)) {
   // ανακατευθύνετε το ενσωματωμένο Intent
   startActivity(forward);
 }

Οι εφαρμογές μπορούν επίσης να καταργήσουν εκχωρήσεις αδειών URI, χρησιμοποιώντας τη μέθοδο removeFlags. Για παράδειγμα:

 // μη αξιόπιστο Intent
 Intent intent = getIntent();
 // καταργήστε την εκχώρηση αδειών URI στο μη αξιόπιστο Intent
 intent.removeFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
 intent.removeFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
 // μεταβιβάστε το μη αξιόπιστο Intent
 setResult(intent);

Κατανόηση των ειδοποιήσεων και ορισμός επιλογής πρόληψης 

Η ειδοποίηση του Play Console αναφέρει πού η εφαρμογή σας καλεί το startActivity, startActivityForResult, startService, sendBroadcast ή setResult χρησιμοποιώντας μη αξιόπιστο Intent. Για να κατανοήσετε καλύτερα ποια επιλογή πρόληψης είναι η πιο κατάλληλη, άντε ανίχνευση και ελέγξτε τις κλήσεις των μεθόδων για να βρείτε από πού προέρχεται το μη αξιόπιστο Intent. Για παράδειγμα, για την Επιλογή 1, κάντε ανίχνευση για να προσδιορίσετε ποιο στοιχείο θα γίνει ιδιωτικό.

Είμαστε εδώ, για να σας βοηθήσουμε

Εάν έχετε ερωτήσεις σχετικά με την ευπάθεια, μπορείτε να δημοσιεύσετε αναρτήσεις στο Stack Overflow και να χρησιμοποιήσετε την ετικέτα android-security. Για διευκρινίσεις σχετικά με τα βήματα που πρέπει να ακολουθήσετε για την επίλυση αυτού του προβλήματος, μπορείτε να επικοινωνήσετε με την ομάδα υποστήριξης για προγραμματιστές.

false
Κύριο μενού
15896347628179978169
true
Αναζήτηση στο Κέντρο Βοήθειας
true
true
true
true
true
5016068
false
false