Webview Attacks

Support HackTricks

Οδηγός για τις Ρυθμίσεις και την Ασφάλεια του WebView

Επισκόπηση των Ευπαθειών του WebView

Ένας κρίσιμος τομέας της ανάπτυξης Android περιλαμβάνει τη σωστή διαχείριση των WebViews. Αυτός ο οδηγός επισημαίνει βασικές ρυθμίσεις και πρακτικές ασφάλειας για τη μείωση των κινδύνων που σχετίζονται με τη χρήση του WebView.

Πρόσβαση σε Αρχεία στα WebViews

Από προεπιλογή, τα WebViews επιτρέπουν την πρόσβαση σε αρχεία. Αυτή η λειτουργία ελέγχεται από τη μέθοδο setAllowFileAccess(), διαθέσιμη από το επίπεδο API 3 (Cupcake 1.5) του Android. Οι εφαρμογές με την άδεια android.permission.READ_EXTERNAL_STORAGE μπορούν να διαβάσουν αρχεία από εξωτερική αποθήκευση χρησιμοποιώντας ένα σχήμα URL αρχείου (file://path/to/file).

Καταργημένες Λειτουργίες: Καθολική και Πρόσβαση σε Αρχεία Από URLs

  • Καθολική Πρόσβαση Από URLs Αρχείων: Αυτή η καταργημένη λειτουργία επέτρεπε διασυνοριακά αιτήματα από URLs αρχείων, θέτοντας σημαντικό κίνδυνο ασφάλειας λόγω πιθανών επιθέσεων XSS. Η προεπιλεγμένη ρύθμιση είναι απενεργοποιημένη (false) για εφαρμογές που στοχεύουν το Android Jelly Bean και νεότερες εκδόσεις.

  • Για να ελέγξετε αυτή τη ρύθμιση, χρησιμοποιήστε getAllowUniversalAccessFromFileURLs().

  • Για να τροποποιήσετε αυτή τη ρύθμιση, χρησιμοποιήστε setAllowUniversalAccessFromFileURLs(boolean).

  • Πρόσβαση σε Αρχεία Από URLs Αρχείων: Αυτή η λειτουργία, επίσης καταργημένη, ελέγχει την πρόσβαση σε περιεχόμενο από άλλα URLs σχήματος αρχείου. Όπως και η καθολική πρόσβαση, η προεπιλεγμένη της ρύθμιση είναι απενεργοποιημένη για αυξημένη ασφάλεια.

  • Χρησιμοποιήστε getAllowFileAccessFromFileURLs() για να ελέγξετε και setAllowFileAccessFromFileURLs(boolean) για να ρυθμίσετε.

Ασφαλής Φόρτωση Αρχείων

Για να απενεργοποιήσετε την πρόσβαση στο σύστημα αρχείων ενώ εξακολουθείτε να έχετε πρόσβαση σε περιουσιακά στοιχεία και πόρους, χρησιμοποιείται η μέθοδος setAllowFileAccess(). Με το Android R και άνω, η προεπιλεγμένη ρύθμιση είναι false.

  • Ελέγξτε με getAllowFileAccess().

  • Ενεργοποιήστε ή απενεργοποιήστε με setAllowFileAccess(boolean).

WebViewAssetLoader

Η κλάση WebViewAssetLoader είναι η σύγχρονη προσέγγιση για τη φόρτωση τοπικών αρχείων. Χρησιμοποιεί http(s) URLs για την πρόσβαση σε τοπικά περιουσιακά στοιχεία και πόρους, ευθυγραμμισμένη με την πολιτική Same-Origin, διευκολύνοντας έτσι τη διαχείριση CORS.

loadUrl

Αυτή είναι μια κοινή λειτουργία που χρησιμοποιείται για τη φόρτωση αυθαίρετων URLs σε ένα webview:

webview.loadUrl("<url here>")

Ofc, ένας πιθανός επιτιθέμενος δεν θα πρέπει ποτέ να μπορεί να ελέγξει το URL που θα φορτώσει μια εφαρμογή.

JavaScript και Διαχείριση Σχεδίου Intent

  • JavaScript: Απενεργοποιημένο από προεπιλογή σε WebViews, μπορεί να ενεργοποιηθεί μέσω του setJavaScriptEnabled(). Συνιστάται προσοχή καθώς η ενεργοποίηση του JavaScript χωρίς κατάλληλες προστασίες μπορεί να εισάγει ευπάθειες ασφαλείας.

  • Σχέδιο Intent: Τα WebViews μπορούν να διαχειριστούν το σχέδιο intent, ενδεχομένως οδηγώντας σε εκμεταλλεύσεις αν δεν διαχειριστούν προσεκτικά. Ένα παράδειγμα ευπάθειας περιλάμβανε μια εκτεθειμένη παράμετρο WebView "support_url" που θα μπορούσε να εκμεταλλευτεί για την εκτέλεση επιθέσεων cross-site scripting (XSS).

Παράδειγμα εκμετάλλευσης χρησιμοποιώντας adb:

adb.exe shell am start -n com.tmh.vulnwebview/.SupportWebView –es support_url "https://example.com/xss.html"

Javascript Bridge

Μια δυνατότητα παρέχεται από το Android που επιτρέπει στο JavaScript σε ένα WebView να καλεί λειτουργίες εγγενών εφαρμογών Android. Αυτό επιτυγχάνεται με τη χρήση της μεθόδου addJavascriptInterface, η οποία ενσωματώνει το JavaScript με τις εγγενείς λειτουργίες του Android, που ονομάζεται WebView JavaScript bridge. Συνιστάται προσοχή καθώς αυτή η μέθοδος επιτρέπει σε όλες τις σελίδες εντός του WebView να έχουν πρόσβαση στο καταχωρημένο αντικείμενο JavaScript Interface, θέτοντας σε κίνδυνο την ασφάλεια αν ευαίσθητες πληροφορίες εκτεθούν μέσω αυτών των διεπαφών.

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

Implementing a JavaScript Bridge

  • JavaScript interfaces μπορούν να αλληλεπιδρούν με τον εγγενή κώδικα, όπως φαίνεται στα παραδείγματα όπου μια μέθοδος κλάσης εκτίθεται στο JavaScript:

@JavascriptInterface
public String getSecret() {
return "SuperSecretPassword";
};
  • Η γέφυρα JavaScript ενεργοποιείται προσθέτοντας μια διεπαφή στο WebView:

webView.addJavascriptInterface(new JavascriptBridge(), "javascriptBridge");
webView.reload();
  • Πιθανή εκμετάλλευση μέσω JavaScript, για παράδειγμα, μέσω μιας επίθεσης XSS, επιτρέπει την κλήση εκτεθειμένων Java μεθόδων:

<script>alert(javascriptBridge.getSecret());</script>
  • Για να μετριαστούν οι κίνδυνοι, περιορίστε τη χρήση της γέφυρας JavaScript στον κώδικα που αποστέλλεται με το APK και αποτρέψτε τη φόρτωση JavaScript από απομακρυσμένες πηγές. Για παλαιότερες συσκευές, ορίστε το ελάχιστο επίπεδο API σε 17.

Εκτέλεση Κώδικα μέσω Αντανάκλασης (RCE)

  • Μια τεκμηριωμένη μέθοδος επιτρέπει την επίτευξη RCE μέσω αντανάκλασης εκτελώντας ένα συγκεκριμένο payload. Ωστόσο, η αναγνώριση @JavascriptInterface αποτρέπει την μη εξουσιοδοτημένη πρόσβαση σε μεθόδους, περιορίζοντας την επιφάνεια επίθεσης.

Απομακρυσμένος Εντοπισμός Σφαλμάτων

  • Απομακρυσμένος εντοπισμός σφαλμάτων είναι δυνατός με τα Chrome Developer Tools, επιτρέποντας την αλληλεπίδραση και την αυθαίρετη εκτέλεση JavaScript μέσα στο περιεχόμενο του WebView.

Ενεργοποίηση Απομακρυσμένου Εντοπισμού Σφαλμάτων

  • Ο απομακρυσμένος εντοπισμός σφαλμάτων μπορεί να ενεργοποιηθεί για όλα τα WebViews μέσα σε μια εφαρμογή με:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
WebView.setWebContentsDebuggingEnabled(true);
}
  • Για να ενεργοποιήσετε την αποσφαλμάτωση με βάση την κατάσταση αποσφαλμάτωσης της εφαρμογής:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
if (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE))
{ WebView.setWebContentsDebuggingEnabled(true); }
}

Εξαγωγή αυθαίρετων αρχείων

  • Δείχνει την εξαγωγή αυθαίρετων αρχείων χρησιμοποιώντας ένα XMLHttpRequest:

var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState == XMLHttpRequest.DONE) {
alert(xhr.responseText);
}
}
xhr.open('GET', 'file:///data/data/com.authenticationfailure.wheresmybrowser/databases/super_secret.db', true);
xhr.send(null);

Αναφορές

Υποστήριξη HackTricks

Last updated