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, ο επιτιθέμενος μπορεί να παρακάμψει την προστασία και να εκτελέσει τον υπολογιστή. Τελική εκμετάλλευση:
Ελέγξτε τις αρχικές διαφάνειες για άλλους τρόπους εκτέλεσης προγραμμάτων χωρίς να ζητείται άδεια.
Φαίνεται ότι ένας άλλος τρόπος φόρτωσης και εκτέλεσης κώδικα είναι να αποκτηθεί πρόσβαση σε κάτι σαν file://127.0.0.1/electron/rce.jar
Παράδειγμα 2: RCE στην εφαρμογή Discord
Παράδειγμα από https://mksben.l0.cm/2020/10/discord-desktop-rce.html?m=1
Κατά τον έλεγχο των προφορτωτών σεναρίων, ανακάλυψα ότι η Discord αποκαλύπτει τη συνάρτηση, η οποία επιτρέπει την κλήση ορισμένων επιτρεπόμενων ενοτήτων μέσω DiscordNative.nativeModules.requireModule('MODULE-NAME')
, στην ιστοσελίδα.
Εδώ, δεν μπορούσα να χρησιμοποιήσω ενότητες που μπορούν να χρησιμοποιηθούν για RCE απευθείας, όπως η ενότητα child_process, αλλά βρήκα έναν κώδικα όπου μπορεί να επιτευχθεί RCE με την αντικατάσταση των ενσωματωμένων μεθόδων της JavaScript και την παρεμβολή στην εκτέλεση της αποκαλυπτόμενης ενότητας.
Το παρακάτω είναι το PoC. Μπόρεσα να επιβεβαιώσω ότι η εφαρμογή calc εμφανίζεται όταν καλώ την συνάρτηση getGPUDriverVersions
, η οποία έχει οριστεί στην ενότητα με το όνομα "discord_utils", από το devTools, ενώ αντικαθιστώντας τις μεθόδους RegExp.prototype.test
και Array.prototype.join
.
Η συνάρτηση getGPUDriverVersions
προσπαθεί να εκτελέσει το πρόγραμμα χρησιμοποιώντας τη βιβλιοθήκη "execa", όπως φαίνεται παρακάτω:
Συνήθως το execa προσπαθεί να εκτελέσει το "nvidia-smi.exe", το οποίο καθορίζεται στη μεταβλητή nvidiaSmiPath
, ωστόσο, λόγω της αντικατάστασης των RegExp.prototype.test
και Array.prototype.join
, το όρισμα αντικαθίσταται με τον όρο "calc" στην εσωτερική επεξεργασία του _execa_**.
Συγκεκριμένα, το όρισμα αντικαθίσταται αλλάζοντας τα παρακάτω δύο μέρη.
Last updated