Electron contextIsolation RCE via preload code
Παράδειγμα 1
Παράδειγμα από https://speakerdeck.com/masatokinugawa/electron-abusing-the-lack-of-context-isolation-curecon-en?slide=30
Αυτός ο κώδικας ανοίγει http(s) συνδέσμους με τον προεπιλεγμένο περιηγητή:
Κάτι σαν file:///C:/Windows/systemd32/calc.exe
θα μπορούσε να χρησιμοποιηθεί για να εκτελέσει μια αριθμομηχανή, το SAFE_PROTOCOLS.indexOf
το αποτρέπει.
Επομένως, ένας επιτιθέμενος θα μπορούσε να εισάγει αυτόν τον κώδικα JS μέσω XSS ή αυθαίρετης πλοήγησης σε σελίδα:
Καθώς η κλήση στο SAFE_PROTOCOLS.indexOf
θα επιστρέφει πάντα 1337, ο επιτιθέμενος μπορεί να παρακάμψει την προστασία και να εκτελέσει το calc. Τελική εκμετάλλευση:
Check the original slides for other ways to execute programs without having a prompt asking for permissions.
Apparently another way to load and execute code is to access something like file://127.0.0.1/electron/rce.jar
Example 2: Discord App RCE
Example from https://mksben.l0.cm/2020/10/discord-desktop-rce.html?m=1
When checking the preload scripts, I found that Discord exposes the function, which allows some allowed modules to be called via DiscordNative.nativeModules.requireModule('MODULE-NAME')
, into the web page.
Here, I couldn't use modules that can be used for RCE directly, such as child_process module, but I found a code where RCE can be achieved by overriding the JavaScript built-in methods and interfering with the execution of the exposed module.
The following is the PoC. I was able to confirm that the calc application is popped up when I call the getGPUDriverVersions
function which is defined in the module called "discord_utils" from devTools, while overriding the RegExp.prototype.test
and Array.prototype.join
.
Η συνάρτηση getGPUDriverVersions
προσπαθεί να εκτελέσει το πρόγραμμα χρησιμοποιώντας τη βιβλιοθήκη "execa", όπως το εξής:
Συνήθως, το execa προσπαθεί να εκτελέσει το "nvidia-smi.exe", το οποίο καθορίζεται στη μεταβλητή nvidiaSmiPath
, ωστόσο, λόγω της υπερφόρτωσης του RegExp.prototype.test
και του Array.prototype.join
, το επιχείρημα αντικαθίσταται με "calc" στην εσωτερική επεξεργασία του _execa_**.
Συγκεκριμένα, το επιχείρημα αντικαθίσταται αλλάζοντας τα παρακάτω δύο μέρη.
Last updated