Η αρχιτεκτονική αστοχία: Από το cookie στο RCE
Η ευπάθεια εντοπίστηκε κατά την ανάλυση της ροής OAuth στην πλατφόρμα DevSite της Google. Το Flask session cookie περιείχε σειριοποιημένα αντικείμενα μέσω της βιβλιοθήκης pickle, η οποία είναι εγγενώς μη ασφαλής όταν επεξεργάζεται δεδομένα από μη έμπιστες πηγές. Το κρίσιμο σφάλμα ήταν ότι το κλειδί που χρησιμοποιούνταν για την υπογραφή των cookies (SECRET_KEY) ήταν το ίδιο το OAuth client secret, το οποίο ήταν αποθηκευμένο σε plaintext μέσα στο ίδιο το cookie.
Εκμετάλλευση και απόδειξη (PoC)
Μόλις αποκτήθηκε το κλειδί υπογραφής, η ακεραιότητα του session κατέρρευσε. Ο ερευνητής μπόρεσε να δημιουργήσει δικά του cookies, παρακάμπτοντας τον έλεγχο υπογραφής του itsdangerous. Αντικαθιστώντας το νόμιμο αντικείμενο με ένα κακόβουλο payload που χρησιμοποιούσε το pickle opcode REDUCE, κατέστη δυνατή η εκτέλεση αυθαίρετων εντολών. Η απόδειξη της ευπάθειας έγινε μέσω time-based side-channel attack, χρησιμοποιώντας την εντολή time.sleep() για να επιβεβαιωθεί η εκτέλεση κώδικα στο server-side.
Στρατηγικές θωράκισης και διορθωτικά μέτρα
Η Google προχώρησε σε μια σειρά από απαραίτητες αλλαγές για την εξάλειψη του κινδύνου:
- Ανάκληση κλειδιών: Περιστροφή (rotation) όλων των εκτεθειμένων OAuth secrets.
- Διαχωρισμός ευθυνών: Χρήση ανεξάρτητων, υψηλής εντροπίας κλειδιών για το session signing, αποσυνδεδεμένων από διαπιστευτήρια υπηρεσιών.
- Server-side state: Μεταφορά της κατάστασης (state) του OAuth στον server, με το cookie να περιέχει μόνο ένα αδιαφανές αναγνωριστικό (opaque reference).
- Απομάκρυνση του pickle: Αντικατάσταση του
pickleμε ασφαλή, data-only formats (όπως JSON) που δεν επιτρέπουν την εκτέλεση κώδικα κατά την αποσειριοποίηση.