BrowExt - άδειες & host_permissions

Reading time: 9 minutes

tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Μάθετε & εξασκηθείτε στο Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks

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

permissions

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

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

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

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

host_permissions

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

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

json
"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

Όχι μόνο αυτό, οι listeners όπως 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 σε ολόκληρο το διαδίκτυο, επιτρέποντας στις επεκτάσεις να έχουν πρόσβαση μόνο στην τρέχουσα καρτέλα κατόπιν ρητής ενεργοποίησης από τον χρήστη. Αυτό το μοντέλο είναι αποτελεσματικό για επεκτάσεις που απαιτούν ενέργειες που ξεκινούν ο χρήστης αλλά αποτυγχάνει για εκείνες που απαιτούν αυτόματες ή προληπτικές ενέργειες, υπονομεύοντας έτσι την ευκολία και την άμεση ανταπόκριση.

Αναφορές

tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Μάθετε & εξασκηθείτε στο Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks