Η αρχιτεκτονική αστοχία: Από το 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 προχώρησε σε μια σειρά από απαραίτητες αλλαγές για την εξάλειψη του κινδύνου:

  1. Ανάκληση κλειδιών: Περιστροφή (rotation) όλων των εκτεθειμένων OAuth secrets.
  2. Διαχωρισμός ευθυνών: Χρήση ανεξάρτητων, υψηλής εντροπίας κλειδιών για το session signing, αποσυνδεδεμένων από διαπιστευτήρια υπηρεσιών.
  3. Server-side state: Μεταφορά της κατάστασης (state) του OAuth στον server, με το cookie να περιέχει μόνο ένα αδιαφανές αναγνωριστικό (opaque reference).
  4. Απομάκρυνση του pickle: Αντικατάσταση του pickle με ασφαλή, data-only formats (όπως JSON) που δεν επιτρέπουν την εκτέλεση κώδικα κατά την αποσειριοποίηση.