Browser Extension Pentesting Methodology

Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το htARTE (Ειδικός Ερυθρού Συνεργείου AWS του HackTricks)!

Άλλοι τρόποι υποστήριξης του HackTricks:

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

Οι επεκτάσεις προγράμματος περιήγησης γράφονται σε JavaScript και φορτώνονται από το πρόγραμμα περιήγησης στο παρασκήνιο. Διαθέτει το DOM του αλλά μπορεί να αλληλεπιδρά με τα DOM άλλων ιστοσελίδων. Αυτό σημαίνει ότι μπορεί να απειλήσει την εμπιστευτικότητα, την ακεραιότητα και τη διαθεσιμότητα άλλων ιστοσελίδων (CIA).

Κύρια Στοιχεία

Οι διατάξεις των επεκτάσεων φαίνονται καλύτερα όταν οπτικοποιούνται και αποτελούνται από τρία στοιχεία. Ας εξετάσουμε κάθε στοιχείο αναλυτικά.

Σενάρια Περιεχομένου

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

Πυρήνας Επέκτασης

Ο πυρήνας της επέκτασης περιέχει τις περισσότερες από τις προνομιακές/πρόσβασης της επέκτασης, αλλά ο πυρήνας της επέκτασης μπορεί να αλληλεπιδρά με το περιεχόμενο του ιστού μέσω του XMLHttpRequest και των σεναρίων περιεχομένου. Επίσης, ο πυρήνας της επέκτασης δεν έχει άμεση πρόσβαση στην κύρια μονάδα.

Φυσικός Δυαδικός

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

Όρια

Για να αποκτήσει κάποιος τις πλήρεις προνομιακές δικαιώματα του χρήστη, ένας επιτιθέμενος πρέπει να πείσει την επέκταση να περάσει κακόβουλη είσοδο από το σενάριο περιεχομένου στον πυρήνα της επέκτασης και από τον πυρήνα της επέκτασης στο φυσικό δυαδικό.

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

Επιπλέον, τα σενάρια περιεχομένου διαχωρίζονται από τις σχετικές ιστοσελίδες τους με το τρέξιμο σε ξεχωριστή στοίβα 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

Τα scripts περιεχομένου φορτώνονται κάθε φορά που ο χρήστης πλοηγείται σε μια αντίστοιχη σελίδα, στην περίπτωσή μας οποιαδήποτε σελίδα που ταιριάζει με την έκφραση https://example.com/* και δεν ταιριάζει με τον κανόνα *://*/*/business*. Εκτελούνται όπως τα δικά 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 μπορούν να επικοινωνήσουν.

Ανάλογα με τον browser, οι δυνατότητες του content script μπορεί να διαφέρουν ελαφρώς. Για τους browsers βασισμένους σε Chromium, η λίστα των δυνατοτήτων είναι διαθέσιμη στην τεκμηρίωση των Chrome Developers, ενώ για το Firefox, το MDN λειτουργεί ως η κύρια πηγή. Είναι επίσης σημαντικό να σημειωθεί ότι τα content scripts έχουν τη δυνατότητα να επικοινωνούν με τα background scripts, επιτρέποντάς τους να εκτελούν ενέργειες και να μεταδίδουν απαντήσεις πίσω.

Για την προβολή και αποσφαλμάτωση των content scripts στο Chrome, το μενού εργαλείων προγραμματιστή του Chrome μπορεί να προσπελαστεί από τις Επιλογές > Περισσότερα εργαλεία > Εργαλεία προγραμματιστή ή πατώντας Ctrl + Shift + I.

Μόλις εμφανιστούν τα εργαλεία προγραμματιστή, πρέπει να γίνει κλικ στην Καρτέλα Πηγής, ακολουθούμενη από την Καρτέλα Content Scripts. Αυτό επιτρέπει την παρατήρηση των εκτελούμενων content scripts από διάφορες επεκτάσεις και την ρύθμιση σημείων διακοπής για την παρακολούθηση της ροής εκτέλεσης.

Ενσωματωμένα content scripts

Σημειώστε ότι τα Content Scripts δεν είναι υποχρεωτικά καθώς είναι επίσης δυνατό να ενσωματώνονται δυναμικά scripts και να ενσωματώνονται προγραμματικά σε ιστοσελίδες μέσω του tabs.executeScript. Αυτό προσφέρει περισσότερο λεπτομερείς ελέγχους.

Για την προγραμματική ενσωμάτωση ενός content script, η επέκταση πρέπει να έχει δικαιώματα κατοχυρωμένα στον κεντρικό υπολογιστή για τη σελίδα στην οποία τα scripts θα ενσωματωθοώνται. Αυτά τα δικαιώματα μπορούν να ασφαλιστούν είτε μέσω του αιτήματος τους εντός του μεταφραστή της επέκτασης είτε προσωρινά μέσω του activeTab.

Παράδειγμα επέκτασης βασισμένης στο activeTab

manifest.json
{
"name": "My extension",
...
"permissions": [
"activeTab",
"scripting"
],
"background": {
"service_worker": "background.js"
},
"action": {
"default_title": "Action Button"
}
}
  • Ενσωμάτωση ενός αρχείου 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" ],
}]);

Υπόβαθρο

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

Κύρια Σημεία:

  • Ρόλος Σελίδας Υποβάθρου: Δρα ως το κέντρο νεύρων για την επέκταση, εξασφαλίζοντας την επικοινωνία και τον συντονισμό μεταξύ των διαφόρων τμημάτων της επέκτασης.

  • Διατήρηση: Είναι μια παρουσία που υπάρχει συνεχώς, αόρατη για τον χρήστη αλλά ουσιώδης για τη λειτουργικότητα της επέκτασης.

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

chrome.runtime.onMessage.addListener((request, sender, sendResponse) =>
{
if (request == "explain")
{
chrome.tabs.create({ url: "https://example.net/explanation" });
}
})

Χρησιμοποιεί το API runtime.onMessage για να ακούει μηνύματα. Όταν λάβει ένα μήνυμα "explain", χρησιμοποιεί το tabs API για να ανοίξει μια σελίδα σε ένα νέο tab.

Για να εντοπίσετε σφάλματα στο φόντο script μπορείτε να πάτε στις λεπτομέρειες της επέκτασης και να επιθεωρήσετε τον υπηρεσιακό εργαζόμενο, αυτό θα ανοίξει τα εργαλεία προγραμματιστή με το φόντο script:

Σελίδες επιλογών και άλλες

Οι επεκτάσεις προγραμμάτων περιήγησης μπορούν να περιέχουν διάφορα είδη σελίδων:

  • Σελίδες δράσης εμφανίζονται σε ένα αναπτυσσόμενο μενού όταν γίνει κλικ στο εικονίδιο της επέκτασης.

  • Σελίδες που η επέκταση θα φορτώσει σε ένα νέο tab.

  • Σελίδες Επιλογών: Αυτή η σελίδα εμφανίζεται επάνω από την επέκταση όταν γίνει κλικ. Στο προηγούμενο μανιφέστο στην περίπτωσή μου μπόρεσα να έχω πρόσβαση σε αυτήν τη σελίδα στο chrome://extensions/?options=fadlhnelkbeojnebcbkacjilhnbjfjca ή κάνοντας κλικ:

Σημειώστε ότι αυτές οι σελίδες δεν είναι μόνιμες όπως οι σελίδες φόντου καθώς φορτώνουν δυναμικά περιεχόμενο κατά ανάγκη. Παρόλα αυτά, μοιράζονται ορισμένες ικανότητες με τη σελίδα φόντου:

  • Επικοινωνία με Σενάρια Περιεχομένου: Παρόμοια με τη σελίδα φόντου, αυτές οι σελίδες μπορούν να λάβουν μηνύματα από σενάρια περιεχομένου, διευκολύνοντας την αλληλεπίδραση εντός της επέκτασης.

  • Πρόσβαση σε Ειδικές Εφαρμογές Επέκτασης: Αυτές οι σελίδες απολαμβάνουν πλήρη πρόσβαση σε ειδικές εφαρμογές επέκτασης, υπόκειται στις άδειες που έχουν οριστεί για την επέκταση.

permissions & host_permissions

Τα permissions και host_permissions είναι καταχωρήσεις από το manifest.json που υποδεικνύουν ποιες άδειες έχουν οι επεκτάσεις προγραμμάτων περιήγησης (αποθήκευση, τοποθεσία...) και σε ποιες ιστοσελίδες.

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

Ελέγξτε πώς λειτουργούν αυτές οι ρυθμίσεις και πώς θα μπορούσαν να καταχρηστούν στο:

pageBrowExt - permissions & host_permissions

content_security_policy

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

Η προεπιλεγμένη ρύθμιση για τις σελίδες επέκτασης προγραμμάτων περιήγησης είναι αρκετά περιοριστική:

script-src 'self'; object-src 'self';

Για περισσότερες πληροφορίες σχετικά με το CSP και πιθανές παρακάμψεις ελέγξτε:

pageContent Security Policy (CSP) Bypass

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

Στις δημόσιες επεκτάσεις το αναγνωριστικό της επέκτασης είναι προσβάσιμο:

Ωστόσο, εάν χρησιμοποιηθεί το όριο use_dynamic_url στο αρχείο manifest.json, αυτό το αναγνωριστικό μπορεί να είναι δυναμικό.

Η δυνατότητα πρόσβασης σε αυτές τις σελίδες καθιστά αυτές τις σελίδες δυνητικά ευάλωτες στο ClickJacking:

pageBrowExt - ClickJacking

Επιτρέποντας τη φόρτωση αυτών των σελίδων μόνο από την επέκταση και όχι από τυχαίες διευθύνσεις URL μπορεί να αποτρέψει επιθέσεις CLickJacking.

externally_connectable

Σύμφωνα με τα έγγραφα, η ιδιότητα "externally_connectable" στο αρχείο με τις προδιαγραφές δηλώνει ποιες επεκτάσεις και ιστοσελίδες μπορούν να συνδεθούν στην επέκτασή σας μέσω runtime.connect και runtime.sendMessage.

  • Εάν το κλειδί externally_connectable δεν δηλωθεί στο αρχείο με τις προδιαγραφές της επέκτασής σας ή αν δηλωθεί ως "ids": ["*"], όλες οι επεκτάσεις μπορούν να συνδεθούν, αλλά καμία ιστοσελίδα δεν μπορεί να συνδεθεί.

  • Εάν δηλωθούν συγκεκριμένα αναγνωριστικά, όπως σε "ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"], μόνο αυτές οι εφαρμογές μπορούν να συνδεθούν.

  • Εάν δηλωθούν αντιστοιχίσεις, αυτές οι ιστοσελίδες θα μπορούν να συνδεθούν:

"matches": [
"https://*.google.com/*",
"*://*.chromium.org/*",
  • Εάν ορίζεται ως κενό: "externally_connectable": {}, κανένα app ή ιστοσελίδα δεν θα μπορεί να συνδεθεί.

Όσο λιγότερες επεκτάσεις και URLs υποδεικνύονται εδώ, τόσο μικρότερη θα είναι η επιφάνεια επίθεσης.

Εάν μια ιστοσελίδα είναι ευάλωτη σε XSS ή εξανάλωση και αυτό δηλώνεται στο externally_connectable, ένας επιτιθέμενος θα μπορεί να στείλει μηνύματα απευθείας στο φόντο σενάριο, παρακάμπτοντας εντελώς το Content Script και το CSP του.

Επομένως, αυτή είναι μια πολύ ισχυρή παράκαμψη.

Επιπλέον, εάν ο πελάτης εγκαταστήσει ένα ψεύτικο πρόσθετο, ακόμα κι αν δεν του επιτρέπεται να επικοινωνήσει με το ευάλωτο πρόσθετο, θα μπορούσε να ενθέσει δεδομένα XSS σε μια επιτρεπόμενη ιστοσελίδα ή να καταχραστεί τα APIs WebRequest ή DeclarativeNetRequest για να παραπλανήσει αιτήσεις σε έναν στοχευμένο τομέα, τροποποιώντας μια αίτηση σελίδας για ένα αρχείο JavaScript. (Σημειώστε ότι το CSP στη στοχευμένη σελίδα θα μπορούσε να αποτρέψει αυτές τις επιθέσεις). Αυτή η ιδέα προέρχεται από αυτήν την ανάλυση.

Επικοινωνία Web ↔︎ Content Script

Τα περιβάλλοντα όπου λειτουργούν τα content scripts και όπου υπάρχουν οι σελίδες φιλοξενίας είναι χωρισμένα μεταξύ τους, εξασφαλίζοντας απομόνωση. Παρά την απομόνωση αυτή, και τα δύο έχουν τη δυνατότητα να αλληλεπιδρούν με το Document Object Model (DOM) της σελίδας, ένα κοινό πόρο. Για τη σελίδα φιλοξενίας να εμπλακεί στην επικοινωνία με το content script, ή έμμεσα με την επέκταση μέσω του content script, απαιτείται η χρήση του DOM που είναι προσβάσιμο από και τις δύο πλευρές ως κανάλι επικοινωνίας.

Αποστολή Μηνυμάτων

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);
example.js
document.getElementById("theButton").addEventListener("click", () => {
window.postMessage(
{type : "FROM_PAGE", text : "Hello from the webpage!"}, "*");
}, false);

Μια ασφαλής επικοινωνία Post Message θα πρέπει να ελέγχει την αυθεντικότητα του ληφθέντος μηνύματος, αυτό μπορεί να γίνει ελέγχοντας:

  • event.isTrusted: Αυτό είναι True μόνο εάν το συμβάν προκλήθηκε από μια ενέργεια χρήστη

  • Το περιεχόμενο script μπορεί να περιμένει ένα μήνυμα μόνο εάν ο χρήστης εκτελεί κάποια ενέργεια

  • Προέλευση domain: μπορεί να περιμένει ένα μήνυμα μόνο από λίστα επιτρεπόμενων domains.

  • Εάν χρησιμοποιείται ένα regex, να είστε πολύ προσεκτικοί

  • Πηγή: received_message.source !== window μπορεί να χρησιμοποιηθεί για να ελεγχθεί αν το μήνυμα ήταν από το ίδιο παράθυρο όπου το Content Script ακούει.

Οι προηγούμενοι έλεγχοι, ακόμη και αν πραγματοποιηθούν, μπορεί να είναι ευάλωτοι, οπότε ελέγξτε στην ακόλουθη σελίδα τις πιθανές παρακάμψεις Post Message:

pagePostMessage Vulnerabilities

Iframe

Ένας άλλος πιθανός τρόπος επικοινωνίας μπορεί να είναι μέσω Iframe URLs, μπορείτε να βρείτε ένα παράδειγμα στο:

pageBrowExt - XSS Example

DOM

Αυτό δεν είναι "ακριβώς" ένας τρόπος επικοινωνίας, αλλά το web και το περιεχόμενο script θα έχουν πρόσβαση στο web DOM. Έτσι, εάν το περιεχόμενο script διαβάζει κάποιες πληροφορίες από αυτό, εμπιστευόμενο το web DOM, το web θα μπορούσε να τροποποιήσει αυτά τα δεδομένα (επειδή το web δεν πρέπει να εμπιστεύεται, ή επειδή το web είναι ευάλωτο στο XSS) και να θέσει σε κίνδυνο το Content Script.

Μπορείτε επίσης να βρείτε ένα παράδειγμα ενός DOM based XSS για να θέσετε σε κίνδυνο μια επέκταση προγράμματος περιήγησης στο:

pageBrowExt - XSS Example

Ευαίσθητες Πληροφορίες στη Μνήμη/Κώδικα

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

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

Φυσικά, μην τοποθετείτε ευαίσθητες πληροφορίες στον κώδικα, καθώς θα είναι δημόσιες.

Για να διαρρεύσετε τη μνήμη από τον περιηγητή μπορείτε να διαρρεύσετε τη μνήμη της διαδικασίας ή να πηγαίνετε στις ρυθμίσεις της επέκτασης περιήγησης και να κάνετε κλικ στο Επιθεώρηση αναδυόμενου παραθύρου -> Στην ενότητα Μνήμη -> Κάντε μια στιγμιότυπο και CTRL+F για αναζήτηση μέσα στο στιγμιότυπο για ευαίσθητες πληροφορίες.

Επικοινωνία Περιεχομένου Script ↔︎ Σεναρίου Φόντου

Ένα Περιεχόμενο Script μπορεί να χρησιμοποιήσει τις λειτουργίες runtime.sendMessage() ή tabs.sendMessage() για να στείλει ένα μήνυμα μιας φοράς που μπορεί να σειριοποιηθεί σε JSON.

Για να χειριστείτε τη απάντηση, χρησιμοποιήστε την επιστρεφόμενη Promise. Ωστόσο, για συμβατότητα προς τα πίσω, μπορείτε ακόμη να περάσετε ένα κλήση πίσω ως το τελευταίο όρισμα.

Η αποστολή ενός αιτήματος από ένα περιεχόμενο script φαίνεται έτσι:

(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() θα ενεργοποιηθεί από προεπιλογή.

Φόρτωση μιας Επέκτασης στον Περιηγητή

  1. Λήψη της Επέκτασης Περιηγητή & αποσυμπίεση

  2. Πηγαίνετε στο chrome://extensions/ και ενεργοποιήστε την Λειτουργία Προγραμματιστή

  3. Κάντε κλικ στο κουμπί Φόρτωση αποσυμπιεσμένου

Στο Firefox πηγαίνετε στο about:debugging#/runtime/this-firefox και κάνετε κλικ στο κουμπί Φόρτωση Προσωρινής Προσθήκης.

Λήψη του πηγαίου κώδικα από το κατάστημα

Ο πηγαίος κώδικας μιας επέκτασης Chrome μπορεί να ληφθεί μέσω διαφόρων μεθόδων. Παρακάτω παρατίθενται λεπτομερείς εξηγήσεις και οδηγίες για κάθε επιλογή.

Λήψη Επέκτασης ως ZIP μέσω Εντολών Κελύφους

Ο πηγαίος κώδικας μιας επέκτασης Chrome μπορεί να ληφθεί ως αρχείο ZIP χρησιμοποιώντας τη γραμμή εντολών. Αυτό περιλαμβάνει τη χρήση του curl για τη λήψη του αρχείου ZIP από μια συγκεκριμένη διεύθυνση URL και στη συνέχεια την εξαγωγή του περιεχομένου του αρχείου ZIP σε έναν κατάλογο. Ορίστε τα ακόλουθα βήματα:

  1. Αντικαταστήστε το "extension_id" με το πραγματικό ID της επέκτασης.

  2. Εκτελέστε τις παρακάτω εντολές:

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

https://robwu.nl/crxviewer/

Χρησιμοποιήστε την επέκταση CRX Viewer

Μια άλλη βολική μέθοδος είναι η χρήση του Chrome Extension Source Viewer, το οποίο είναι ένα έργο ανοικτού κώδικα. Μπορεί να εγκατασταθεί από το Chrome Web Store. Ο πηγαίος κώδικας του viewer είναι διαθέσιμος στο αποθετήριο του στο GitHub.

Προβολή πηγής της τοπικά εγκατεστημένης επέκτασης

Οι επεκτάσεις Chrome που είναι εγκατεστημένες τοπικά μπορούν επίσης να ελεγχθούν. Ακολουθήστε τα παρακάτω βήματα:

  1. Αποκτήστε πρόσβαση στον τοπικό φάκελο προφίλ του Chrome επισκεπτόμενοι τη διεύθυνση chrome://version/ και εντοπίζοντας το πεδίο "Διαδρομή προφίλ".

  2. Πλοηγηθείτε στον υποφάκελο Extensions/ μέσα στον φάκελο προφίλ.

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

Για να αναγνωρίσετε τις επεκτάσεις, μπορείτε να αντιστοιχίσετε τα IDs τους με τα ονόματά τους:

  • Ενεργοποιήστε τη λειτουργία Προγραμματιστή στη σελίδα about:extensions για να δείτε τα IDs κάθε επέκτασης.

  • Μέσα στον φάκελο κάθε επέκτασης, το αρχείο manifest.json περιέχει ένα ευανάγνωστο πεδίο name, που σας βοηθά να αναγνωρίσετε την επέκταση.

Χρησιμοποιήστε ένα Αρχειοθέτη ή Αποσυμπιεστή

Πηγαίνετε στο Chrome Web Store και κατεβάστε την επέκταση. Το αρχείο θα έχει την κατάληξη .crx. Αλλάξτε την κατάληξη του αρχείου από .crx σε .zip. Χρησιμοποιήστε οποιονδήποτε αρχειοθέτη (όπως WinRAR, 7-Zip, κλπ.) για να εξάγετε τα περιεχόμενα του αρχείου ZIP.

Χρησιμοποιήστε τη λειτουργία Προγραμματιστή στο Chrome

Ανοίξτε το Chrome και μεταβείτε στη διεύθυνση chrome://extensions/. Ενεργοποιήστε το "Λειτουργία προγραμματιστή" στην πάνω δεξιά γωνία. Κάντε κλικ στο "Φόρτωση αποσυμπιεσμένης επέκτασης...". Πλοηγηθείτε στον κατάλογο της επέκτασής σας. Αυτό δεν κατεβάζει τον πηγαίο κώδικα, αλλά είναι χρήσιμο για την προβολή και την τροποποίηση του κώδικα μιας ήδη κατεβασμένης ή αναπτυγμένης επέκτασης.

Λίστα Ελέγχου Ασφάλειας

Ακόμα και αν οι Επεκτάσεις Περιήγησης έχουν μια περιορισμένη επιφάνεια επίθεσης, μερικές από αυτές ενδέχεται να περιέχουν ευπάθειες ή πιθανές βελτιώσεις στην ενίσχυση. Οι πιο συνηθισμένες είναι οι εξής:

Εργαλεία

  • Ανακτά οποιαδήποτε επέκταση Chrome από έναν σύνδεσμο που παρέχεται από το Chrome webstore.

  • Προβολέας manifest.json: απλά εμφανίζει μια JSON-ομορφοποιημένη έκδοση του manifest της επέκτασης.

  • Ανάλυση Αποτυπώματος: Ανίχνευση των web_accessible_resources και αυτόματη δημιουργία JavaScript αποτυπώματος επέκτασης Chrome.

  • Ανάλυση Πιθανού Clickjacking: Ανίχνευση σελίδων HTML επέκτασης με την οδηγία web_accessible_resources. Αυτές είναι ενδεχομένως ευάλωτες στο clickjacking ανάλογα με τον σκοπό των σελίδων.

  • Προβολή Προειδοποιήσεων Δικαιωμάτων: που εμφανίζει μια λίστα με όλες τις προειδοποιήσεις δικαιωμάτων Chrome που θα εμφανιστούν όταν ένας χρήστης προσπαθήσει να εγκαταστήσει την επέκταση.

  • Επικίνδυνες Λειτουργίες: εμφανίζει την τοποθεσία επικίνδυνων λειτουργιών που θα μπορούσαν ενδεχομένως να εκμεταλλευτεί ένας επιτιθέμενος (π.χ. λειτουργίες όπως innerHTML, chrome.tabs.executeScript).

  • Σημεία Εισόδου: δείχνει πού η επέκταση δέχεται εισόδους χρήστη/εξωτερικές. Αυτό είναι χρήσιμο για την κατανόηση της επιφάνειας μιας επέκτασης και την αναζήτηση πιθανών σημείων για να στείλετε κακόβουλα δεδομένα στην επέκταση.

  • Και οι δύο σαρωτές Επικίνδυνων Λειτουργιών και Σημείων Εισόδου έχουν τα ακόλουθα για τις δημιουργημένες τους ειδοποιήσεις:

  • Σχετικό απόσπασμα κώδικα και γραμμή που προκάλεσε την ειδοποίηση.

  • Περιγραφή του προβλήματος.

  • Ένα κουμπί "Προβολή Α

  • Εάν θέλετε να δείτε την εταιρεία σας διαφημισμένη στο HackTricks ή να κατεβάσετε το HackTricks σε μορφή PDF ελέγξτε τα ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ!

  • Ανακαλύψτε Την Οικογένεια PEASS, τη συλλογή μας από αποκλειστικά NFTs

  • Εγγραφείτε στη 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @carlospolopm.

  • Μοιραστείτε τα κόλπα σας στο χάκινγκ υποβάλλοντας PRs στα HackTricks και HackTricks Cloud αποθετήρια του github.

Last updated