.. | ||
browext-clickjacking.md | ||
browext-permissions-and-host_permissions.md | ||
browext-xss-example.md | ||
README.md |
Μεθοδολογία Ελέγχου Ασφάλειας Επέκτασης Προγράμματος Περιήγησης
Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!
Άλλοι τρόποι υποστήριξης του HackTricks:
- Αν θέλετε να δείτε την εταιρεία σας διαφημισμένη στο HackTricks ή να κατεβάσετε το HackTricks σε μορφή PDF ελέγξτε τα ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ!
- Αποκτήστε το επίσημο PEASS & HackTricks swag
- Ανακαλύψτε την Οικογένεια PEASS, τη συλλογή μας από αποκλειστικά NFTs
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @carlospolopm.
- Μοιραστείτε τα χάκινγκ κόλπα σας υποβάλλοντας PRs στα HackTricks και HackTricks Cloud αποθετήρια του github.
Βασικές Πληροφορίες
Οι επεκτάσεις προγράμματος περιήγησης γράφονται σε JavaScript και φορτώνονται από το πρόγραμμα περιήγησης στο παρασκήνιο. Διαθέτουν το DOM τους αλλά μπορούν να αλληλεπιδρούν με τα DOM άλλων ιστοσελίδων. Αυτό σημαίνει ότι μπορεί να διακινδυνεύσει την εμπιστευτικότητα, την ακεραιότητα και τη διαθεσιμότητα άλλων ιστοσελίδων (CIA).
Κύρια Στοιχεία
Οι διατάξεις των επεκτάσεων φαίνονται καλύτερες όταν οπτικοποιούνται και αποτελούνται από τρία στοιχεία. Ας εξετάσουμε κάθε στοιχείο αναλυτικά.
Σενάρια Περιεχομένου
Κάθε σενάριο περιεχομένου έχει άμεση πρόσβαση στο DOM μιας μόνο ιστοσελίδας και είναι έτσι εκτεθεισμένο σε ενδεχόμενη κακόβουλη είσοδο. Ωστόσο, το σενάριο περιεχομένου δεν περιλαμβάνει άλλες άδειες εκτός από τη δυνατότητα αποστολής μηνυμάτων στον πυρήνα της επέκτασης.
Πυρήνας Επέκτασης
Ο πυρήνας της επέκτασης περιέχει τις περισσότερες από τις προνομιακές/πρόσβασης της επέκτασης, αλλά ο πυρήνας της επέκτασης μπορεί να αλληλεπιδρά μόνο με το περιεχόμενο του ιστού μέσω XMLHttpRequest και σεναρίων περιεχομένου. Επίσης, ο πυρήνας της επέκτασης δεν έχει άμεση πρόσβαση στον υπολογιστή του χρήστη.
Φυσικός Δυαδικός Κώδικας
Η επέκταση επιτρέπει ένα φυσικό δυαδικό κώδικα που μπορεί να έχει πρόσβαση στον υπολογιστή του χρήστη με τις πλήρεις δικαιώματα του χρήστη. Ο φυσικός δυαδικός κώδικας αλληλεπιδρά με τον πυρήνα της επέκτασης μέσω της τυπικής διεπαφής Προγραμματισμού Εφαρμογών Προσθέτων Netscape (NPAPI) που χρησιμοποιείται από το Flash και άλλα πρόσθετα προγράμματα περιήγησης.
Όρια
{% hint style="danger" %} Για να αποκτήσει κάποιος τα πλήρη δικαιώματα του χρήστη, ένας επιτιθέμενος πρέπει να πείσει την επέκταση να περάσει κακόβουλη είσοδο από το σενάριο περιεχομένου στον πυρήνα της επέκτασης και από τον πυρήνα της επέκτασης στο φυσικό δυαδικό κώδικα. {% endhint %}
Κάθε στοιχείο της επέκτασης διαχωρίζεται μεταξύ του από ισχυρά προστατευτικά όρια. Κάθε στοιχείο λειτουργεί σε ένα ξεχωριστό διαδικτυακό διεργασία. Τα σενάρια περιεχομένου και οι πυρήνες επέκτασης λειτουργούν σε διεργασίες αμμοθόλειας που δεν είναι διαθέσιμες στις περισσότερες υπηρεσίες λειτουργικού συστήματος.
Επιπλέον, τα σενάρια περιεχομένου διαχωρίζονται από τις σχετικές ιστοσελίδες τους με τον τρόπο ότι λειτουργούν σε ξεχωριστή στοίβα JavaScript. Το σενάριο περιεχομένου και η ιστοσελίδα έχουν πρόσβαση στο ίδιο υποκείμενο DOM, αλλά τα δύο ποτέ δεν ανταλλάσσουν δείκτες JavaScript, αποτρέποντας τη διαρροή λειτουργικότητας JavaScript.
manifest.json
Μια επέκταση Chrome είναι απλά ένας φάκελος ZIP με την κατάληξη αρχείου .crx. Ο πυρήνας της επέκτασης είναι το manifest.json
αρχείο στη ρίζα του φακέλου, το οποίο καθορίζει τη διάταξη, τις άδειες και άλλες επιλογές διαμόρφωσης.
Παράδειγμα:
{
"manifest_version": 2,
"name": "My extension",
"version": "1.0",
"permissions": [
"storage"
],
"content_scripts": [
{
"js": [
"script.js"
],
"matches": [
"https://example.com/*",
"https://www.example.com/*"
],
"exclude_matches": ["*://*/*business*"],
}
],
"background": {
"scripts": [
"background.js"
]
},
"options_ui": {
"page": "options.html"
}
}
content_scripts
Τα content scripts φορτώνονται κάθε φορά που ο χρήστης πλοηγείται σε μια αντιστοιχη σελίδα, στην περίπτωσή μας οποιαδήποτε σελίδα που ταιριάζει με την έκφραση https://example.com/*
και δεν ταιριάζει με το *://*/*/business*
regex. Εκτελούνται όπως τα δικά της scripts της σελίδας και έχουν αυθαίρετη πρόσβαση στο Document Object Model (DOM).
"content_scripts": [
{
"js": [
"script.js"
],
"matches": [
"https://example.com/*",
"https://www.example.com/*"
],
"exclude_matches": ["*://*/*business*"],
}
],
Για να συμπεριλάβετε ή να αποκλείσετε περισσότερα URLs, είναι επίσης δυνατό να χρησιμοποιήσετε τα include_globs
και exclude_globs
.
Αυτό είναι ένα παράδειγμα script περιεχομένου που θα προσθέσει ένα κουμπί εξήγησης στη σελίδα όταν η αποθήκευση API χρησιμοποιείται για την ανάκτηση της τιμής message
από την αποθήκευση της επέκτασης.
chrome.storage.local.get("message", result =>
{
let div = document.createElement("div");
div.innerHTML = result.message + " <button>Explain</button>";
div.querySelector("button").addEventListener("click", () =>
{
chrome.runtime.sendMessage("explain");
});
document.body.appendChild(div);
});
Ένα μήνυμα στέλνεται στις σελίδες της επέκτασης από τον content script όταν αυτό το κουμπί πατηθεί, μέσω της χρήσης του API runtime.sendMessage(). Αυτό οφείλεται στον περιορισμό του content script στην άμεση πρόσβαση σε APIs, με το storage
να αποτελεί μία από τις λίγες εξαιρέσεις. Για λειτουργίες πέραν αυτών των εξαιρέσεων, τα μηνύματα στέλνονται στις σελίδες της επέκτασης με τις οποίες τα content scripts μπορούν να επικοινωνήσουν.
{% hint style="warning" %}
Ανάλογα με τον browser, οι δυνατότητες του content script μπορεί να διαφέρουν ελαφρώς. Για τους browsers βασισμένους σε Chromium, η λίστα των δυνατοτήτων είναι διαθέσιμη στην τεκμηρίωση των Chrome Developers, ενώ για το Firefox, το MDN λειτουργεί ως η κύρια πηγή.
Είναι επίσης σημαντικό να σημειωθεί ότι τα content scripts έχουν τη δυνατότητα να επικοινωνούν με τα background scripts, επιτρέποντάς τους να εκτελούν ενέργειες και να μεταδίδουν απαντήσεις πίσω.
{% endhint %}
Για την προβολή και αποσφαλμάτωση των content scripts στο Chrome, το μενού εργαλείων προγραμματιστή του Chrome μπορεί να προσπελαστεί από τις Επιλογές > Περισσότερα εργαλεία > Εργαλεία προγραμματιστή ή πατώντας Ctrl + Shift + I.
Με την εμφάνιση των εργαλείων προγραμματιστή, πρέπει να γίνει κλικ στην Καρτέλα Πηγής, ακολουθούμενη από την Καρτέλα Content Scripts. Αυτό επιτρέπει την παρατήρηση των εκτελούμενων content scripts από διάφορες επεκτάσεις και την ρύθμιση σημείων διακοπής για την παρακολούθηση της ροής εκτέλεσης.
Ενσωματωμένα content scripts
{% hint style="success" %}
Σημειώστε ότι τα Content Scripts δεν είναι υποχρεωτικά καθώς είναι επίσης δυνατό να ενσωματωθούν δυναμικά scripts και να ενσωματωθούν προγραμματικά σε ιστοσελίδες μέσω του tabs.executeScript
. Αυτό προσφέρει περισσότερο λεπτομερή έλεγχο.
{% endhint %}
Για την προγραμματική ενσωμάτωση ενός content script, η επέκταση πρέπει να έχει δικαιώματα κατοχυρωμένου χώρου για τη σελίδα στην οποία τα scripts θα ενσωματωθοϋν. Αυτά τα δικαιώματα μπορούν να ασφαλιστούν είτε μέσω του αιτήματος τους στον κατάλογο της επέκτασης είτε προσωρινά μέσω του activeTab.
Παράδειγμα επέκτασης με βάση το activeTab
{% code title="manifest.json" %}
{
"name": "My extension",
...
"permissions": [
"activeTab",
"scripting"
],
"background": {
"service_worker": "background.js"
},
"action": {
"default_title": "Action Button"
}
}
{% endcode %}
- Ενσωμάτωση ενός αρχείου JS με κλικ:
// content-script.js
document.body.style.backgroundColor = "orange";
//service-worker.js - Inject the JS file
chrome.action.onClicked.addListener((tab) => {
chrome.scripting.executeScript({
target: { tabId: tab.id },
files: ["content-script.js"]
});
});
- Ενσωμάτωση μιας συνάρτησης κατά το κλικ:
//service-worker.js - Inject a function
function injectedFunction() {
document.body.style.backgroundColor = "orange";
}
chrome.action.onClicked.addListener((tab) => {
chrome.scripting.executeScript({
target : {tabId : tab.id},
func : injectedFunction,
});
});
Παράδειγμα με δικαιώματα σεναρίου
// service-workser.js
chrome.scripting.registerContentScripts([{
id : "test",
matches : [ "https://*.example.com/*" ],
excludeMatches : [ "*://*/*business*" ],
js : [ "contentScript.js" ],
}]);
// Another example
chrome.tabs.executeScript(tabId, { file: "content_script.js" });
Σενάρια Περιεχομένου run_at
Το πεδίο run_at
ελέγχει πότε τα αρχεία JavaScript ενσωματώνονται στην ιστοσελίδα. Η προτιμώμενη και προεπιλεγμένη τιμή είναι "document_idle"
.
Οι δυνατές τιμές είναι:
document_idle
: Όποτε είναι δυνατόνdocument_start
: Μετά από οποιαδήποτε αρχεία απόcss
, αλλά πριν από την κατασκευή οποιουδήποτε άλλου DOM ή την εκτέλεση οποιουδήποτε άλλου script.document_end
: Αμέσως μετά την ολοκλήρωση του DOM, αλλά πριν από τη φόρτωση υπο-πόρων όπως εικόνες και frames.
Μέσω manifest.json
{
"name": "My extension",
...
"content_scripts": [
{
"matches": ["https://*.example.com/*"],
"run_at": "document_idle",
"js": ["contentScript.js"]
}
],
...
}
Μέσω του service-worker.js
chrome.scripting.registerContentScripts([{
id : "test",
matches : [ "https://*.example.com/*" ],
runAt : "document_idle",
js : [ "contentScript.js" ],
}]);
Υπόβαθρο
Τα μηνύματα που στέλνονται από τα content scripts λαμβάνονται από τη σελίδα υποβάθρου, η οποία διαδραματίζει ένα κεντρικό ρόλο στον συντονισμό των στοιχείων της επέκτασης. Ιδιαίτερα, η σελίδα υποβάθρου διατηρείται καθ' όλη τη διάρκεια ζωής της επέκτασης, λειτουργώντας διακριτικά χωρίς άμεση αλληλεπίδραση με τον χρήστη. Διαθέτει το δικό της Document Object Model (DOM), επιτρέποντας πολύπλοκες αλληλεπιδράσεις και διαχείριση καταστάσεων.
Κύρια Σημεία:
- Ρόλος της Σελίδας Υποβάθρου: Δρα ως το κέντρο νεύρων για την επέκταση, εξασφαλίζοντας την επικοινωνία και τον συντονισμό μεταξύ των διαφόρων τμημάτων της επέκτασης.
- Διατήρηση: Είναι μια συνεχώς υπάρχουσα οντότητα, αόρατη για τον χρήστη αλλά ουσιώδης για τη λειτουργικότητα της επέκτασης.
- Αυτόματη Δημιουργία: Αν δεν οριστεί ρητά, ο περιηγητής θα δημιουργήσει αυτόματα μια σελίδα υποβάθρου. Αυτή η αυτόματη δημιουργημένη σελίδα θα περιλαμβάνει όλα τα σενάρια υποβάθρου που καθορίζονται στο αρχείο περιγραφής της επέκτασης, εξασφαλίζοντας την άνετη λειτουργία των εργασιών υποβάθρου της επέκτασης.
chrome.runtime.onMessage.addListener((request, sender, sendResponse) =>
{
if (request == "explain")
{
chrome.tabs.create({ url: "https://example.net/explanation" });
}
})
Χρησιμοποιεί το API runtime.onMessage για να ακούει μηνύματα. Όταν λάβει ένα μήνυμα "explain"
, χρησιμοποιεί το API tabs για να ανοίξει μια σελίδα σε ένα νέο tab.
Για να εντοπίσετε σφάλματα στο σενάριο φόντου, μπορείτε να μεταβείτε στις λεπτομέρειες της επέκτασης και να επιθεωρήσετε τον υπηρεσιακό εργαζόμενο, αυτό θα ανοίξει τα εργαλεία προγραμματιστή με το σενάριο φόντου:
Σελίδες επιλογών και άλλες
Οι επεκτάσεις προγραμμάτων περιήγησης μπορούν να περιέχουν διάφορα είδη σελίδων:
- Σελίδες δράσης εμφανίζονται σε ένα αναπτυσσόμενο μενού όταν γίνει κλικ στο εικονίδιο της επέκτασης.
- Σελίδες που η επέκταση θα φορτώσει σε ένα νέο tab.
- Σελίδες Επιλογών: Αυτή η σελίδα εμφανίζεται επάνω από την επέκταση όταν γίνει κλικ. Στο προηγούμενο μανιφέστο στην περίπτωσή μου μπόρεσα να έχω πρόσβαση σε αυτήν τη σελίδα στο
chrome://extensions/?options=fadlhnelkbeojnebcbkacjilhnbjfjca
ή κάνοντας κλικ:
Σημειώστε ότι αυτές οι σελίδες δεν είναι μόνιμες όπως οι σελίδες φόντου καθώς φορτώνουν δυναμικά περιεχόμενο όταν απαιτείται. Παρόλα αυτά, μοιράζονται ορισμένες ικανότητες με τη σελίδα φόντου:
- Επικοινωνία με Σενάρια Περιεχομένου: Παρόμοια με τη σελίδα φόντου, αυτές οι σελίδες μπορούν να λαμβάνουν μηνύματα από σενάρια περιεχομένου, διευκολύνοντας την αλληλεπίδραση εντός της επέκτασης.
- Πρόσβαση σε Ειδικές Εφαρμογές Επέκτασης: Αυτές οι σελίδες απολαμβάνουν πλήρη πρόσβαση σε ειδικές εφαρμογές επέκτασης, υπόκειται στις άδειες που έχουν οριστεί για την επέκταση.
permissions
& host_permissions
Τα permissions
και host_permissions
είναι καταχωρήσεις από το manifest.json
που υποδεικνύουν ποιες άδειες έχουν οι επεκτάσεις προγραμμάτων περιήγησης (αποθήκευση, τοποθεσία...) και σε ποιες ιστοσελίδες.
Καθώς οι επεκτάσεις προγραμμάτων περιήγησης μπορεί να έχουν τόσο προνομιούχες δυνατότητες, μια κακόβουλη επέκταση ή μια που έχει διαρρεύσει θα μπορούσε να επιτρέψει στον εισβολέα διαφορετικά μέσα για να κλέψει ευαίσθητες πληροφορίες και να κατασκοπεύσει τον χρήστη.
Ελέγξτε πώς λειτουργούν αυτές οι ρυθμίσεις και πώς θα μπορούσαν να καταχραστούνται στο:
{% content-ref url="browext-permissions-and-host_permissions.md" %} browext-permissions-and-host_permissions.md {% endcontent-ref %}
content_security_policy
Μια πολιτική ασφαλείας περιεχομένου μπορεί να δηλωθεί επίσης μέσα στο manifest.json
. Αν υπάρχει μια ορισμένη, θα μπορούσε να είναι ευάλωτη.
Η προεπιλεγμένη ρύθμιση για τις σελίδες επέκτασης προγραμμάτων περιήγησης είναι αρκετά περιοριστική:
script-src 'self'; object-src 'self';
Για περισσότερες πληροφορίες σχετικά με το CSP και πιθανές παρακάμψεις ελέγξτε:
{% content-ref url="../content-security-policy-csp-bypass/" %} content-security-policy-csp-bypass {% endcontent-ref %}
web_accessible_resources
Προκειμένου για μια ιστοσελίδα να έχει πρόσβαση σε μια σελίδα ενός Πρόσθετου Περιήγησης, ένα αρχείο .html
για παράδειγμα, αυτή η σελίδα πρέπει να αναφέρεται στο πεδίο web_accessible_resources
του manifest.json
.
Για παράδειγμα:
{
...
"web_accessible_resources": [
{
"resources": [ "images/*.png" ],
"matches": [ "https://example.com/*" ]
},
{
"resources": [ "fonts/*.woff" ],
"matches": [ "https://example.com/*" ]
}
],
...
}
Αυτές οι σελίδες είναι προσβάσιμες στο URL όπως:
chrome-extension://<extension-id>/message.html
Στις δημόσιες επεκτάσεις το αναγνωριστικό της επέκτασης είναι προσβάσιμο:
Ωστόσο, εάν χρησιμοποιηθεί το όριο manifest.json
use_dynamic_url
, το αναγνωριστικό μπορεί να είναι δυναμικό.
Η δυνατότητα πρόσβασης σε αυτές τις σελίδες καθιστά αυτές τις σελίδες δυνητικά ευάλωτες στο ClickJacking:
{% content-ref url="browext-clickjacking.md" %} browext-clickjacking.md {% endcontent-ref %}
{% hint style="success" %} Επιτρέποντας τη φόρτωση αυτών των σελίδων μόνο από την επέκταση και όχι από τυχαίες διευθύνσεις URL μπορεί να αποτρέψει επιθέσεις CLickJacking. {% endhint %}
externally_connectable
Σύμφωνα με τα έγγραφα, η ιδιότητα μανιφέστου "externally_connectable"
δηλώνει ποιες επεκτάσεις και ιστοσελίδες μπορούν να συνδεθούν στην επέκτασή σας μέσω runtime.connect και runtime.sendMessage.
- Εάν το κλειδί
externally_connectable
δεν δηλώνεται στο μανιφέστο της επέκτασής σας ή αν δηλώνεται ως"ids": ["*"]
, όλες οι επεκτάσεις μπορούν να συνδεθούν, αλλά καμία ιστοσελίδα δεν μπορεί να συνδεθεί. - Εάν δηλώνονται συγκεκριμένα αναγνωριστικά, όπως σε
"ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"]
, μόνο αυτές οι εφαρμογές μπορούν να συνδεθούν. - Εάν δηλώνονται αντιστοιχίσεις, αυτές οι ιστοσελίδες θα μπορούν να συνδεθούν:
"matches": [
"https://*.google.com/*",
"*://*.chromium.org/*",
- Εάν οριστεί ως κενό:
"externally_connectable": {}
, κανένα app ή ιστοσελίδα δεν θα μπορεί να συνδεθεί.
Όσο λιγότερες επεκτάσεις και URLs υποδεικνύονται εδώ, τόσο μικρότερη θα είναι η επιφάνεια επίθεσης.
{% hint style="danger" %}
Εάν μια ιστοσελίδα είναι ευάλωτη σε XSS ή εξαγωγή, όπως υποδεικνύεται στο externally_connectable
, ένας επιτιθέμενος θα μπορεί να στείλει μηνύματα απευθείας στο φόντο σενάριο, παρακάμπτοντας εντελώς το Content Script και το CSP του.
Επομένως, αυτή είναι μια πολύ ισχυρή παράκαμψη.
Επιπλέον, εάν ο πελάτης εγκαταστήσει ένα ψεύτικο πρόσθετο, ακόμα κι αν δεν του επιτρέπεται να επικοινωνήσει με το ευάλωτο πρόσθετο, θα μπορούσε να ενθέσει δεδομένα XSS σε μια επιτρεπόμενη ιστοσελίδα ή να καταχραστεί τα APIs WebRequest
ή DeclarativeNetRequest
για να παραπλανήσει αιτήσεις σε έναν στοχευμένο τομέα, τροποποιώντας μια αίτηση σελίδας για ένα αρχείο JavaScript. (Σημειώστε ότι το CSP στη στοχευμένη σελίδα θα μπορούσε να αποτρέψει αυτές τις επιθέσεις). Αυτή η ιδέα προέρχεται από αυτήν την ανάλυση.
{% endhint %}
Επικοινωνία Ιστού ↔︎ Content Script
Τα περιβάλλοντα όπου λειτουργούν τα content scripts και όπου υπάρχουν οι σελίδες φιλοξενίας είναι διαχωρισμένα μεταξύ τους, εξασφαλίζοντας απομόνωση. Παρά την απομόνωση αυτή, και τα δύο έχουν τη δυνατότητα να αλληλεπιδρούν με το Document Object Model (DOM) της σελίδας, ένα κοινό πόρο. Για τη σελίδα φιλοξενίας να εμπλακεί στην επικοινωνία με το content script, ή έμμεσα με την επέκταση μέσω του content script, απαιτείται η χρήση του DOM που είναι προσβάσιμο από τις δύο πλευρές ως κανάλι επικοινωνίας.
Αποστολή Μηνυμάτων
{% code title="content-script.js" %}
var port = chrome.runtime.connect();
window.addEventListener("message", (event) => {
// We only accept messages from ourselves
if (event.source !== window) {
return;
}
if (event.data.type && (event.data.type === "FROM_PAGE")) {
console.log("Content script received: " + event.data.text);
port.postMessage(event.data.text);
}
}, false);
{% endcode %}
{% code title="example.js" %}
document.getElementById("theButton").addEventListener("click", () => {
window.postMessage(
{type : "FROM_PAGE", text : "Hello from the webpage!"}, "*");
}, false);
{% endcode %}
Μια ασφαλής επικοινωνία Post Message θα πρέπει να ελέγχει την αυθεντικότητα του ληφθέντος μηνύματος, αυτό μπορεί να γίνει ελέγχοντας:
event.isTrusted
: Αυτό είναι Αληθές μόνο εάν το συμβάν προκλήθηκε από μια ενέργεια χρήστη- Το script περιεχομένου μπορεί να περιμένει ένα μήνυμα μόνο εάν ο χρήστης εκτελέσει κάποια ενέργεια
- προέλευση domain: μπορεί να περιμένει ένα μήνυμα μόνο από λίστα επιτρεπόμενων domains.
- Εάν χρησιμοποιείται ένα regex, να είστε πολύ προσεκτικοί
- Πηγή:
received_message.source !== window
μπορεί να χρησιμοποιηθεί για να ελεγχθεί αν το μήνυμα ήταν από το ίδιο παράθυρο όπου το Content Script ακούει.
Οι προηγούμενοι έλεγχοι, ακόμη και αν πραγματοποιηθούν, μπορεί να είναι ευάλωτοι, οπότε ελέγξτε στην ακόλουθη σελίδα τις πιθανές παρακάμψεις Post Message:
{% content-ref url="../postmessage-vulnerabilities/" %} postmessage-vulnerabilities {% endcontent-ref %}
Iframe
Ένας άλλος πιθανός τρόπος επικοινωνίας μπορεί να είναι μέσω Iframe URLs, μπορείτε να βρείτε ένα παράδειγμα σε:
{% content-ref url="browext-xss-example.md" %} browext-xss-example.md {% endcontent-ref %}
DOM
Αυτό δεν είναι "ακριβώς" ένας τρόπος επικοινωνίας, αλλά το web και το script περιεχομένου θα έχουν πρόσβαση στο web DOM. Έτσι, εάν το script περιεχομένου διαβάζει κάποιες πληροφορίες από αυτό, εμπιστευόμενο το web DOM, το web θα μπορούσε να τροποποιήσει αυτά τα δεδομένα (επειδή το web δεν πρέπει να εμπιστεύεται, ή επειδή το web είναι ευάλωτο στο XSS) και να θέσει σε κίνδυνο το Content Script.
Μπορείτε επίσης να βρείτε ένα παράδειγμα ενός DOM based XSS για την απειλή μιας επέκτασης προγράμματος περιήγησης σε:
{% content-ref url="browext-xss-example.md" %} browext-xss-example.md {% endcontent-ref %}
Ευαίσθητες Πληροφορίες στη Μνήμη/Κώδικα
Εάν μια Επέκταση Προγράμματος Περιήγησης αποθηκεύει ευαίσθητες πληροφορίες μέσα στη μνήμη της, αυτές μπορεί να διαρρεύσουν (ειδικά σε μηχανές Windows) και να αναζητηθούν για αυτές τις πληροφορίες.
Συνεπώς, η μνήμη της Επέκτασης Περιήγησης δεν πρέπει να θεωρείται ασφαλής και ευαίσθητες πληροφορίες όπως διαπιστευτήρια ή μνημονικές φράσεις δεν πρέπει να αποθηκεύονται.
Φυσικά, μην τοποθετείτε ευαίσθητες πληροφορίες στον κώδικα, καθώς θα γίνουν δημόσιες.
Για να διαρρεύσετε τη μνήμη από τον περιηγητή μπορείτε να διαρρεύσετε τη μνήμη της διαδικασίας ή να πηγαίνετε στις ρυθμίσεις της επέκτασης του περιηγητή κάνοντας κλικ στο Επιθεώρηση pop-up
-> Στην ενότητα Μνήμη
-> Κάντε μια στιγμιότυπο
και CTRL+F
για αναζήτηση μέσα στο στιγμιότυπο για ευαίσθητες πληροφορίες.
Επικοινωνία Σεναρίου Περιεχομένου ↔︎ Σεναρίου Φόντου
Ένα Σενάριο Περιεχομένου μπορεί να χρησιμοποιήσει τις λειτουργίες runtime.sendMessage() ή tabs.sendMessage() για να στείλει ένα μήνυμα μιας φοράς που μπορεί να σειριοποιηθεί σε JSON.
Για να χειριστείτε τη απάντηση, χρησιμοποιήστε την επιστρεφόμενη Promise. Ωστόσο, για συμβατότητα προς τα πίσω, μπορείτε ακόμη να περάσετε ένα κλήση ως το τελευταίο όρισμα.
Η αποστολή ενός αιτήματος από ένα σενάριο περιεχομένου φαίνεται έτσι:
(async () => {
const response = await chrome.runtime.sendMessage({greeting: "hello"});
// do something with response here, not outside the function
console.log(response);
})();
Αποστολή αιτήματος από την επέκταση (συνήθως ένα σενάριο φόντου) Ένα Σενάριο Περιεχομένου μπορεί να χρησιμοποιήσει τις λειτουργίες, εκτός αν χρειάζεται να καθορίσετε σε ποια καρτέλα να το στείλετε. Παράδειγμα πώς να στείλετε μήνυμα στο σενάριο περιεχομένου στην επιλεγμένη καρτέλα:
// From https://stackoverflow.com/questions/36153999/how-to-send-a-message-between-chrome-extension-popup-and-content-script
(async () => {
const [tab] = await chrome.tabs.query({active: true, lastFocusedWindow: true});
const response = await chrome.tabs.sendMessage(tab.id, {greeting: "hello"});
// do something with response here, not outside the function
console.log(response);
})();
Στο άκρο παραλαβής, πρέπει να ρυθμίσετε έναν runtime.onMessage ακροατή γεγονότων για να χειριστείτε το μήνυμα. Αυτό φαίνεται το ίδιο είτε από ένα script περιεχομένου είτε από μια σελίδα επέκτασης.
// From https://stackoverflow.com/questions/70406787/javascript-send-message-from-content-js-to-background-js
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
console.log(sender.tab ?
"from a content script:" + sender.tab.url :
"from the extension");
if (request.greeting === "hello")
sendResponse({farewell: "goodbye"});
}
);
Στο παραδειγμα που τονίστηκε, το sendResponse()
εκτελέστηκε με σύγχρονο τρόπο. Για να τροποποιηθεί ο χειριστής συμβάντος onMessage
για ασύγχρονη εκτέλεση του sendResponse()
, είναι απαραίτητο να ενσωματωθεί το return true;
.
Ένα σημαντικό σημείο προς σκέψη είναι ότι σε περιπτώσεις όπου πολλές σελίδες έχουν οριστεί να λαμβάνουν συμβάντα onMessage
, η πρώτη σελίδα που εκτελεί το sendResponse()
για ένα συγκεκριμένο συμβάν θα είναι η μόνη που μπορεί να παραδώσει αποτελεσματικά την απόκριση. Οποιεσδήποτε επόμενες απαντήσεις στο ίδιο συμβάν δεν θα ληφθούν υπόψη.
Κατά τη δημιουργία νέων επεκτάσεων, η προτίμηση θα πρέπει να είναι προς τις υποσχέσεις αντί για τις επανακλήσεις. Όσον αφορά τη χρήση επανακλήσεων, η λειτουργία sendResponse()
θεωρείται έγκυρη μόνο εάν εκτελείται απευθείας εντός του συγχρόνου πλαισίου, ή εάν ο χειριστής συμβάντος υποδεικνύει μια ασύγχρονη λειτουργία επιστρέφοντας true
. Αν κανένας από τους χειριστές δεν επιστρέψει true
ή αν η λειτουργία sendResponse()
αφαιρεθεί από τη μνήμη (συλλεκτική απόρριών), η επανάκληση που σχετίζεται με τη λειτουργία sendMessage()
θα ενεργοποιηθεί από προεπιλογή.
Φόρτωση μιας Επέκτασης στον Περιηγητή
- Λήψη της Επέκτασης Περιηγητή & αποσυμπίεση
- Πηγαίνετε στο
chrome://extensions/
και ενεργοποιήστε τηνΛειτουργία Προγραμματιστή
- Κάντε κλικ στο κουμπί
Φόρτωση αποσυμπιεσμένου
Στο Firefox πηγαίνετε στο about:debugging#/runtime/this-firefox
και κάνετε κλικ στο κουμπί Φόρτωση Προσωρινής Προσθήκης
.
Λήψη του πηγαίου κώδικα από το κατάστημα
Ο πηγαίος κώδικας μιας επέκτασης Chrome μπορεί να ληφθεί μέσω διαφόρων μεθόδων. Παρακάτω παρέχονται λεπτομερείς εξηγήσεις και οδηγίες για κάθε επιλογή.
Λήψη Επέκτασης ως ZIP μέσω Εντολών Σύνταξης
Ο πηγαίος κώδικας μιας επέκτασης Chrome μπορεί να ληφθεί ως αρχείο ZIP χρησιμοποιώντας τη γραμμή εντολών. Αυτό περιλαμβάνει τη χρήση του curl
για τη λήψη του αρχείου ZIP από μια συγκεκριμένη διεύθυνση URL και στη συνέχεια την εξαγωγή των περιεχομένων του αρχείου ZIP σε έναν κατάλογο. Ορίστε τα ακόλουθα βήματα:
- Αντικαταστήστε το
"extension_id"
με το πραγματικό ID της επέκτασης. - Εκτελέστε τις παρακάτω εντολές:
extension_id=your_extension_id # Replace with the actual extension ID
curl -L -o "$extension_id.zip" "https://clients2.google.com/service/update2/crx?response=redirect&os=mac&arch=x86-64&nacl_arch=x86-64&prod=chromecrx&prodchannel=stable&prodversion=44.0.2403.130&x=id%3D$extension_id%26uc"
unzip -d "$extension_id-source" "$extension_id.zip"
Χρησιμοποιήστε τον ιστότοπο CRX Viewer
Χρησιμοποιήστε την επέκταση CRX Viewer
Μια άλλη βολική μέθοδος είναι η χρήση του Chrome Extension Source Viewer, το οποίο είναι ένα έργο ανοικτού κώδικα. Μπορεί να εγκατασταθεί από το Chrome Web Store. Ο πηγαίος κώδικας του viewer είναι διαθέσιμος στο αποθετήριο του στο GitHub.
Προβολή πηγής της τοπικά εγκατεστημένης επέκτασης
Οι επεκτάσεις Chrome που είναι εγκατεστημένες τοπικά μπορούν επίσης να ελεγχθούν. Ακολουθήστε τα παρακάτω βήματα:
- Αποκτήστε πρόσβαση στον τοπικό φάκελο προφίλ του Chrome επισκεπτόμενοι τη διεύθυνση
chrome://version/
και εντοπίζοντας το πεδίο "Διαδρομή προφίλ". - Μεταβείτε στον υποφάκελο
Extensions/
μέσα στον φάκελο προφίλ. - Αυτός ο φάκελος περιέχει όλες τις εγκατεστημένες επεκτάσεις, συνήθως με τον πηγαίο κώδικά τους σε μια ευανάγνωστη μορφή.
Για να αναγνωρίσετε τις επεκτάσεις, μπορείτε να αντιστοιχίσετε τα IDs τους με τα ονόματά τους:
- Ενεργοποιήστε τη λειτουργία Προγραμματιστή στη σελίδα
about:extensions
για να δείτε τα IDs κάθε επέκτασης. - Μέσα σε κάθε φάκελο επέκτασης, το αρχείο
manifest.json
περιέχει ένα ευανάγνωστο πεδίοname
, που σας βοηθά να αναγνωρίσετε την επέκταση.
Χρησιμοποιήστε ένα Αρχειοθετητή ή Αποσυμπιεστή
Πηγαίνετε στο Chrome Web Store και κατεβάστε την επέκταση. Το αρχείο θα έχει την κατάληξη .crx
. Αλλάξτε την κατάληξη του αρχείου από .crx
σε .zip
. Χρησιμοποιήστε οποιονδήποτε αρχειοθετητή (όπως WinRAR, 7-Zip, κλπ.) για να εξάγετε τα περιεχόμενα του αρχείου ZIP.
Χρησιμοποιήστε τη λειτουργία Προγραμματιστή στο Chrome
Ανοίξτε το Chrome και μεταβείτε στη διεύθυνση chrome://extensions/
. Ενεργοποιήστε το "Λειτουργία προγραμματιστή" στην πάνω δεξιά γωνία. Κάντε κλικ στο "Φόρτωση αποσυμπιεσμένης επέκτασης...". Πλοηγηθείτε στον κατάλογο της επέκτασής σας. Αυτό δεν κατεβάζει τον πηγαίο κώδικα, αλλά είναι χρήσιμο για την προβολή και την τροποποίηση του κώδικα μιας ήδη κατεβασμένης ή αναπτυγμένης επέκτασης.
Λίστα Ελέγχου Ασφάλειας
Ακόμα και αν οι Επεκτάσεις Περιήγησης έχουν μια περιορισμένη επιφάνεια επίθεσης, μερικές από αυτές ενδέχεται να περιέχουν ευπάθειες ή πιθανές βελτιώσεις στην ενίσχυση. Οι παρακάτω είναι οι πιο συνηθισμένες:
- Περιορίστε όσο το δυνατόν περισσότερες ζητούμενες
δικαιώματα
- Περιορίστε όσο το δυνατόν περισσότερο τα
host_permissions
- Χρησιμοποιήστε μια ισχυρή
content_security_policy
- Περιορίστε όσο το δυνατόν περισσότερο τα
externally_connectable
, αν δεν χρειάζεται κανένα και είναι δυνατόν, μην το αφήνετε από προεπιλογή, καθορίστε{}
- Αν η URL ευάλωτη σε XSS ή σε ανάληψη αναφέρεται εδώ, ένας επιτιθέμενος θα μπορεί να στείλει μηνύματα στα scripts φόντου απευθείας. Πολύ ισχυρή παράκαμψη.
- Περιορίστε όσο το δυνατόν περισσότερο τα
web_accessible_resources
, ακόμα και κενό αν είναι δυνατόν. - Αν το
web_accessible_resources
δεν είναι κανένα, ελέγξτε για ClickJacking - Αν υπάρχει οποιαδήποτε επικοινωνία από την επέκταση προς τη σελίδα,**ελέγξτε για XSS ευπάθειες που προκαλούνται στην επικοινωνία.
- Αν χρησιμοποιούνται Post Messages, ελέγξτε για ευπάθειες Post Message.
- Αν το Content Script έχει πρόσβαση σε λεπτομέρειες του DOM, ελέγξτε ότι δεν εισάγουν ένα XSS αν τροποποιηθούν από τον ιστό.
- Δώστε έμφαση εάν αυτή η επικοινωνία εμπλέκεται επίσης στη Επικοινωνία Σεναρίου Περιεχομένου -> Σεναρίου Φόντου
- Ευαίσθητες πληροφορίες δεν πρέπει να αποθηκεύονται μέσα στον Κώδικα της Επέκτασης Περιήγησης
- Ευαίσθητες πληροφορίες δεν πρέπει να αποθηκεύονται μέσα στη Μνήμη της Επέκτασης Περιήγησης
Εργαλεία
Tarnish
- Ανακτά οποιαδήποτε επέκταση Chrome από έναν σύνδεσμο που παρέχεται από το Chrome webstore.
- manifest.json viewer: απλά εμφανίζει μια μορφοποιημένη JSON έκδοση του προγράμματος επέκτασης.
- Ανάλυση Αποτυπώματος: Ανίχνευση των web_accessible_resources και αυτόματη δημιουργία JavaScript αποτυπώματος επέκτασης Chrome.
- Ανάλυση Πιθανού Clickjacking: Ανίχνευση σελίδων HTML επέκτασης με την οδηγία web_accessible_resources οι οποίες είναι ευάλωτες στο clickjacking ανάλογα με τον σκοπό των σελίδων.
- Προβολή Προειδοποιήσεων Δικαιωμάτων: που εμφανίζει μια λίστα με όλες τις προειδοποιήσεις δικαιωμάτων Chrome που θα εμφανιστούν όταν ένας χρήστης προσπαθήσει να εγκαταστήσει την επέκταση.
- Επικίνδυνες Λειτουργίες: εμφανίζει την τοποθεσία επικίνδυνων λειτουργιών που θα μπορούσαν ενδεχομένως να εκμεταλλευτεί ένας επιτιθέμενος (π.χ. λειτουργίες όπως innerHTML, chrome.tabs.executeScript).
- Σημεία Εισόδου: δείχνει πού η επέκταση δέχεται εισόδους χρήστη/εξωτερικές. Αυτό είναι χρήσιμο για την κατανόηση της επιφάνειας μιας επέκτασης και την αναζήτηση πιθανών σημείων για την αποστολή κακόβουλα διαμορφωμένων δεδομένων στην επέκταση.
- Και οι δύο σαρωτές Επικίνδυνων Λειτουργιών και Σημείων Εισόδου έχουν τα ακόλουθα για τις δημιουργημένες ειδοποιήσεις:
- Σχετικό απόσπασμα κώδικα και γραμμή που προκάλεσε την ειδοποίηση.
- Περιγραφή του προβλήματος.
- Ένα κουμπί "Προβ
- Εάν θέλετε να δείτε την εταιρεία σας διαφημισμένη στο HackTricks ή να κατεβάσετε το HackTricks σε μορφή PDF ελέγξτε τα ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ!
- Αποκτήστε το επίσημο PEASS & HackTricks swag
- Ανακαλύψτε Την Οικογένεια PEASS, τη συλλογή μας από αποκλειστικά NFTs
- Εγγραφείτε στη 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @carlospolopm.
- Μοιραστείτε τα κόλπα σας στο χάκινγκ υποβάλλοντας PRs στα HackTricks και HackTricks Cloud αποθετήρια του github.