hacktricks/src/pentesting-web/browser-extension-pentesting-methodology/browext-permissions-and-host_permissions.md

18 KiB
Raw Blame History

BrowExt - άδειες & host_permissions

{{#include ../../banners/hacktricks-training.md}}

Βασικές Πληροφορίες

permissions

Οι άδειες ορίζονται στο αρχείο manifest.json της επέκτασης χρησιμοποιώντας την ιδιότητα permissions και επιτρέπουν την πρόσβαση σχεδόν σε οτιδήποτε μπορεί να προσπελάσει ένας περιηγητής (Cookies ή Φυσική Αποθήκευση):

Το προηγούμενο μανιφέστο δηλώνει ότι η επέκταση απαιτεί την άδεια storage. Αυτό σημαίνει ότι μπορεί να χρησιμοποιήσει το API αποθήκευσης για να αποθηκεύσει τα δεδομένα της μόνιμα. Σε αντίθεση με τα cookies ή τα APIs localStorage που δίνουν στους χρήστες κάποιο επίπεδο ελέγχου, η αποθήκευση της επέκτασης μπορεί κανονικά να διαγραφεί μόνο με την απεγκατάσταση της επέκτασης.

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

Μπορείτε να βρείτε την πλήρη λίστα των αδειών που μπορεί να ζητήσει μια Επέκταση Περιηγητή Chromium εδώ και μια πλήρη λίστα για τις επεκτάσεις Firefox εδώ.

host_permissions

Η προαιρετική αλλά ισχυρή ρύθμιση host_permissions υποδεικνύει με ποιους hosts θα μπορεί να αλληλεπιδράσει η επέκταση μέσω APIs όπως cookies, webRequest, και tabs.

Οι παρακάτω host_permissions επιτρέπουν βασικά κάθε ιστό:

"host_permissions": [
"*://*/*"
]

// Or:
"host_permissions": [
"http://*/*",
"https://*/*"
]

// Or:
"host_permissions": [
"<all_urls>"
]

Αυτοί είναι οι hosts που μπορεί να έχει πρόσβαση η επέκταση του προγράμματος περιήγησης ελεύθερα. Αυτό συμβαίνει επειδή όταν μια επέκταση προγράμματος περιήγησης καλεί fetch("https://gmail.com/") δεν περιορίζεται από το CORS.

Κατάχρηση permissions και host_permissions

Καρτέλες

Επιπλέον, host_permissions ξεκλειδώνει επίσης τη “προχωρημένη” tabs API λειτουργικότητα. Επιτρέπουν στην επέκταση να καλεί tabs.query() και όχι μόνο να επιστρέφει μια λίστα με τις καρτέλες του χρήστη αλλά και να μαθαίνει ποια ιστοσελίδα (δηλαδή διεύθυνση και τίτλο) είναι φορτωμένη.

Caution

Όχι μόνο αυτό, οι ακροατές όπως tabs.onUpdated γίνονται πολύ πιο χρήσιμοι επίσης. Αυτοί θα ειδοποιούνται όποτε φορτώνει μια νέα σελίδα σε μια καρτέλα.

Εκτέλεση περιεχομένου scripts

Τα scripts περιεχομένου δεν είναι απαραίτητο να είναι γραμμένα στατικά στο μανιφέστο της επέκτασης. Δεδομένων επαρκών host_permissions, οι επεκτάσεις μπορούν επίσης να τα φορτώνουν δυναμικά καλώντας tabs.executeScript() ή scripting.executeScript().

Και οι δύο APIs επιτρέπουν την εκτέλεση όχι μόνο αρχείων που περιέχονται στις επεκτάσεις ως scripts περιεχομένου αλλά και τυχαίου κώδικα. Ο πρώτος επιτρέπει την παράδοση κώδικα JavaScript ως συμβολοσειρά, ενώ ο δεύτερος αναμένει μια συνάρτηση JavaScript που είναι λιγότερο επιρρεπής σε ευπάθειες εισαγωγής. Ωστόσο, και οι δύο APIs θα προκαλέσουν χάος αν χρησιμοποιηθούν λανθασμένα.

Caution

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

Έμμεσες προνόμια

Ορισμένα προνόμια επεκτάσεων δεν χρειάζεται να δηλωθούν ρητά. Ένα παράδειγμα είναι το tabs API: η βασική του λειτουργικότητα είναι προσβάσιμη χωρίς κανένα προνόμιο. Οποιαδήποτε επέκταση μπορεί να ειδοποιηθεί όταν ανοίγεις και κλείνεις καρτέλες, απλώς δεν θα γνωρίζει ποια ιστοσελίδα αντιστοιχεί σε αυτές τις καρτέλες.

Ακούγεται πολύ αθώο; Το tabs.create() API είναι κάπως λιγότερο. Μπορεί να χρησιμοποιηθεί για δημιουργία νέας καρτέλας, ουσιαστικά το ίδιο με το window.open() που μπορεί να κληθεί από οποιαδήποτε ιστοσελίδα. Ωστόσο, ενώ το window.open() υπόκειται στον φραγμό αναδυόμενων παραθύρων, το tabs.create() δεν υπόκειται.

Caution

Μια επέκταση μπορεί να δημιουργήσει οποιονδήποτε αριθμό καρτελών όποτε θέλει.

Αν κοιτάξεις τις πιθανές παραμέτρους του tabs.create(), θα παρατηρήσεις επίσης ότι οι δυνατότητές του ξεπερνούν κατά πολύ όσα επιτρέπεται να ελέγχει το window.open(). Και ενώ ο Firefox δεν επιτρέπει τη χρήση data: URIs με αυτό το API, ο Chrome δεν έχει τέτοια προστασία. Η χρήση τέτοιων URIs σε ανώτατο επίπεδο έχει απαγορευτεί λόγω κατάχρησης για phishing.

tabs.update() είναι πολύ παρόμοιο με το tabs.create() αλλά θα τροποποιήσει μια υπάρχουσα καρτέλα. Έτσι, μια κακόβουλη επέκταση μπορεί για παράδειγμα να φορτώσει τυχαία μια διαφημιστική σελίδα σε μία από τις καρτέλες σου, και μπορεί επίσης να ενεργοποιήσει την αντίστοιχη καρτέλα.

Webcam, γεωγραφική τοποθεσία και φίλοι

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

Caution

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

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

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

Η προσθήκη της λέξης-κλειδί history στην είσοδο permissions του μανιφέστ της επέκτασης χορηγεί πρόσβαση στο history API. Επιτρέπει την ανάκτηση ολόκληρης της ιστορικότητας περιήγησης του χρήστη ταυτόχρονα, χωρίς να περιμένει ο χρήστης να επισκεφθεί ξανά αυτές τις ιστοσελίδες.

Η άδεια bookmarks έχει παρόμοιο δυναμικό κατάχρησης, αυτή επιτρέπει την ανάγνωση όλων των σελιδοδεικτών μέσω του bookmarks API.

Άδεια αποθήκευσης

Η αποθήκευση της επέκτασης είναι απλώς μια συλλογή κλειδιού-τιμής, πολύ παρόμοια με το localStorage που θα μπορούσε να χρησιμοποιήσει οποιαδήποτε ιστοσελίδα. Έτσι, καμία ευαίσθητη πληροφορία δεν θα πρέπει να αποθηκεύεται εδώ.

Ωστόσο, οι διαφημιστικές εταιρείες θα μπορούσαν επίσης να καταχραστούν αυτή την αποθήκευση.

Περισσότερες άδειες

Μπορείς να βρεις τη συμπληρωματική λίστα αδειών που μπορεί να ζητήσει μια επέκταση Chromium Browser εδώ και μια συμπληρωματική λίστα για τις επεκτάσεις Firefox εδώ.

Πρόληψη

Η πολιτική των προγραμματιστών της Google απαγορεύει ρητά στις επεκτάσεις να ζητούν περισσότερα προνόμια από όσα είναι απαραίτητα για τη λειτουργικότητά τους, μειώνοντας αποτελεσματικά τις υπερβολικές αιτήσεις αδειών. Ένα παράδειγμα όπου μια επέκταση προγράμματος περιήγησης υπερέβη αυτό το όριο περιλάμβανε τη διανομή της με τον ίδιο τον περιηγητή αντί μέσω ενός καταστήματος προσθέτων.

Οι περιηγητές θα μπορούσαν περαιτέρω να περιορίσουν την κακή χρήση των προνομίων επεκτάσεων. Για παράδειγμα, τα tabCapture και desktopCapture APIs του Chrome, που χρησιμοποιούνται για την καταγραφή οθόνης, έχουν σχεδιαστεί για να ελαχιστοποιούν την κατάχρηση. Το API tabCapture μπορεί να ενεργοποιηθεί μόνο μέσω άμεσης αλληλεπίδρασης του χρήστη, όπως το κλικ στο εικονίδιο της επέκτασης, ενώ το desktopCapture απαιτεί επιβεβαίωση του χρήστη για το παράθυρο που θα καταγραφεί, αποτρέποντας κρυφές δραστηριότητες καταγραφής.

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

Αναφορές

{{#include ../../banners/hacktricks-training.md}}