BrowExt - permissions & host_permissions

Support HackTricks

Basic Information

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

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

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

Καρτέλες

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

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

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

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

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

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

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

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

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

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

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

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

Webcam, γεωεντοπισμός και φίλοι

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

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

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

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

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

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

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

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

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

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

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

Πρόληψη

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

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

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

Αναφορές

Υποστήριξη HackTricks

Last updated