Mastodon
Connect with us

Hacking

Διαρροή σε Cal.com: κατάληψη λογαριασμών και έκθεση δεδομένων

Έλεγχος στο Cal.com αποκάλυψε αλυσιδωτές ευπάθειες που επέτρεψαν κατάληψη λογαριασμών και έκθεση ευαίσθητων δεδομένων κράτησης.

Published

on

Διαρροή σε Cal.com: κατάληψη λογαριασμών και έκθεση δεδομένων

Τι συνέβη συνοπτικά

Η ανοικτού κώδικα πλατφόρμα προγραμματισμού ραντεβού Cal.com, που συχνά προτιμάται ως developer-friendly εναλλακτική του Calendly, αντιμετώπισε πρόσφατα κρίσιμες ευπάθειες που επέτρεψαν πλήρη κατάληψη λογαριασμών και αδιάκριτη πρόσβαση σε ευαίσθητα δεδομένα κρατήσεων. Η ανακάλυψη έγινε από την ομάδα ασφαλείας της Gecko, η οποία χρησιμοποίησε ένα εργαλείο στατικού ελέγχου κώδικα ενισχυμένο με AI για να χαρτογραφήσει και να αναλύσει την βάση κώδικα του Cal.com. Τα ελαττώματα ήταν σύνθετα και αφομοίωναν πολλαπλά βήματα λογικής — ένα κλασικό παράδειγμα όπου μικρά σφάλματα σε διαφορετικά σημεία συνδυάζονται σε μεγάλη παραβίαση.

Πώς εξελίχθηκε η επίθεση μέσω οργάνωσης

Η πιο σοβαρή ευπάθεια σχετιζόταν με τη ροή εγγραφής σε οργανώσεις. Ο επιτιθέμενος μπορούσε να δημιουργήσει ένα link πρόσκλησης (π.χ. https://app.cal.com/signup?token=…) και, με το email του θύματος, να υποβάλει τη φόρμα εγγραφής με νέο κωδικό. Αυτό οδηγούσε σε «επανα-εγγραφή» ενός ήδη υπαρκτού λογαριασμού, κλειδώνοντας τον αρχικό χρήστη και δίνοντας πλήρη έλεγχο στον επιτιθέμενο — πρόσβαση σε ημερολόγια, OAuth tokens, API keys και ιστορικό κρατήσεων.

Τεχνικά, η επίθεση βασίστηκε σε αλυσιδωτά σφάλματα λογικής: μια συνάρτηση ελέγχου χρηστών προεπιλεγόταν ως διαθέσιμη, παρακάμπτοντας κρίσιμους ελέγχους για ήδη εγγεγραμμένους χρήστες· ένας δεύτερος έλεγχος περιοριζόταν στο πλαίσιο της οργάνωσης του επιτιθέμενου αντί για παγκόσμιο έλεγχο· και τελικά η χρήση του prisma.user.upsert() με where: { email } επέτρεπε την ενημέρωση της υπάρχουσας εγγραφής του θύματος αντί για απόρριψη. Το αποτέλεσμα ήταν η αντικατάσταση του hash του κωδικού, η σήμανση του email ως επιβεβαιωμένου και η ανακατεύθυνση του χρήστη στην οργάνωση του επιτιθέμενου.

Γιατί το upsert έγινε καταστροφικό

Το upsert (update or insert) σε βάσεις δεδομένων είναι χρήσιμο όταν θέλεις είτε να δημιουργήσεις μια εγγραφή αν δεν υπάρχει είτε να την ενημερώσεις αν υπάρχει. Ωστόσο, όταν οι ελέγχοι ύπαρξης είναι ελαττωματικοί και βασίζονται σε λανθασμένο εύρος (π.χ. μέσα σε μια οργάνωση), το upsert μετατρέπεται σε εργαλείο κατάληψης λογαριασμών. Η ορθή πρακτική είναι να γίνεται αυστηρός παγκόσμιος έλεγχος ύπαρξης χρήστη προτού εκτελεστεί οποιοδήποτε upsert, ή να χρησιμοποιούνται ξεχωριστές λογικές για create και update, σε συνδυασμό με transactions και constraints στη βάση δεδομένων.

Εσωτερικά API και παρακάμπτοντας middleware

Παράλληλα, εντοπίστηκε δεύτερο σύνολο ευπαθειών σε API endpoints που χειρίζονται κρατήσεις και ημερολόγια. Στα πλαίσια της έκδοσης API v1, ο κώδικας χρησιμοποιούσε αρχεία με υπογράμμιση (_get.ts, _post.ts, _patch.ts, _delete.ts, _auth-middleware) ως εσωτερικούς χειριστές. Ο κύριος router (index.ts) εφαρμοζόταν σωστά, όμως λόγω του τρόπου που η Next.js χειρίζεται τη δρομολόγηση, αυτά τα αρχεία έγιναν άμεσα προσβάσιμα ως routes. Έτσι, καλώντας απευθείας αυτά τα εσωτερικά endpoints, ένας αυθεντικοποιημένος χρήστης με έγκυρο κλειδί v1 μπορούσε να παρακάμψει πλήρως το authorization middleware και να διαβάσει ή διαγράψει κρατήσεις σε όλη την πλατφόρμα.

Ακόμα και αν το σενάριο δεν ήταν «αποκλειστικό root», το αποτέλεσμα ήταν ευαίσθητο: ονόματα συμμετεχόντων, emails, προσωπικά στοιχεία, μεταδεδομένα συναντήσεων και ιστορικά κρατήσεων έγιναν προσβάσιμα και ευάλωτα σε κατάχρηση. Αντίστοιχα, endpoints που χειρίζονταν destination calendars μπορούσαν να δεχτούν διαγραφές κατά ID, διακόπτοντας ροές εργασίας επιχειρήσεων χωρίς προειδοποίηση.

Πώς επιδιορθώθηκε και τι άλλαξε

Η ομάδα του Cal.com κυκλοφόρησε την επιδιόρθωση στην έκδοση 6.0.8. Βασικές αλλαγές περιλάμβαναν αυστηρή παγκόσμια επαλήθευση ύπαρξης χρήστη πριν την επεξεργασία εγγραφών μέσω invite tokens και ενημέρωση του middleware του Next.js ώστε να αποκλείει ρητά τις άμεσες κλήσεις στα εσωτερικά route handlers (επιστροφή HTTP 403 για /_get, /_post, /_patch, /_delete, /_auth-middleware). Αυτά τα βήματα περιόρισαν άμεσα την πιο επιθετική εκμετάλλευση, αλλά δεν αναιρούν την ανάγκη ευρύτερης ανασκόπησης κώδικα και διεργασιών ασφάλειας σε όλη την πλατφόρμα.

Ο ρόλος του AI SAST — πλεονεκτήματα και προφυλάξεις

Η εύρεση αυτών των αλυσιδωτών σφαλμάτων έγινε με τη βοήθεια ενός στατικού εργαλείου ανάλυσης κώδικα ενισχυμένου με AI, της Gecko. Τα εργαλεία αυτά χτίζουν ένα σημασιολογικό ευρετήριο του κώδικα και αναλύουν ροές δεδομένων και επιχειρησιακή λογική αυτόματα, αναδεικνύοντας σύνθετες αλληλουχίες που συχνά ξεφεύγουν από κλασικά scanners ή χειροκίνητες δοκιμές. Στο πραγματικό σενάριο, η ανάλυση κράτησε λίγες ώρες για να εντοπίσει πολύπλοκους συνδυασμούς ελέγχων και upsert συμπεριφορών.

Ωστόσο, η εξάρτηση από AI δεν είναι πανάκεια. Τα μοντέλα μπορεί να παράγουν false positives, να χρειάζονται ανθρώπινη επαλήθευση και να μην κατανοούν πάντοτε το πλήρες επιχειρησιακό πλαίσιο. Το ιδανικό είναι τα εργαλεία αυτά να ενσωματώνονται ως προτεινόμενα επίπεδα στο pipeline ανάπτυξης (CI/CD), με αναλυτές ασφαλείας να αξιολογούν και να προτεραιοποιούν τις σαφώς επιβεβαιωμένες ευπάθειες.

Κανονιστικό και νομικό πλαίσιο στην Ευρώπη

Σε ευρωπαϊκό επίπεδο, περιστατικά που εκθέτουν προσωπικά δεδομένα εμπίπτουν στο πεδίο του GDPR. Η έκθεση emails, ονομάτων και προσωπικών πληροφοριών συμμετεχόντων σε ιδιωτικές συναντήσεις μπορεί να απαιτεί ειδοποίηση των εποπτικών αρχών και των θυμάτων μέσα σε συγκεκριμένα χρονικά πλαίσια. Επιπλέον, εταιρείες που εξυπηρετούν ευρωπαϊκούς πελάτες πρέπει να διασφαλίσουν ότι οι υπηρεσίες τους συμμορφώνονται με κανόνες ασφάλειας από σχεδιασμό (privacy by design) και κατά προεπιλογή (privacy by default). Στην ελληνική πραγματικότητα, οι επιπτώσεις περιλαμβάνουν και νομικές, αλλά και reputational συνέπειες — εταιρείες μικρότερες ή νεοφυείς θα μπορούσαν να βιώσουν σοβαρή εμπιστοσύνη πελατών αν αποκαλυφθούν ευπάθειες αυτού του τύπου.

Πρακτικά μέτρα άμυνας — τι πρέπει να ξέρουν οι ομάδες ανάπτυξης

Η υπόθεση Cal.com λειτουργεί ως case study για κοινές αλλά κρίσιμες πρακτικές ασφάλειας. Κάποια βασικά συμπεράσματα που πρέπει να εφαρμόσουν οι ομάδες:

– Εξασφαλίστε παγκόσμιους ελέγχους ταυτότητας (unique email checks) προτού εκτελέσετε upsert ή άλλες εγγραφές που τροποποιούν υπάρχοντα accounts.
– Τοποθετήστε authorization middleware σε κάθε public entrypoint και μην βασίζεστε σε ένα κεντρικό index που μπορεί να παρακαμφθεί από framework quirks.
– Απομονώστε εσωτερικά handlers και μην τα εκθέτετε ως routes. Σε frameworks όπως τη Next.js, επαληθεύστε τη συμπεριφορά δρομολόγησης για αρχεία που μπορούν να γίνουν προσβάσιμα.
– Ενεργοποιήστε ειδοποιήσεις για κρίσιμες αλλαγές λογαριασμών (αλλαγή password, αλλαγή οργάνωσης, νέα OAuth tokens) και υποχρεώστε MFA όπου είναι δυνατό.
– Λογικά δικαιώματα (least privilege) για API keys και περιορισμός scope/expiration για tokens.
– Ενσωματώστε security testing στο CI: SAST, DAST, και human-in-the-loop penetration testing.
– Καταγράφετε και παρακολουθείτε logs με δυνατότητα audit trails και άμεσης ανίχνευσης ανωμαλιών.

Σύντομο παράδειγμα για το πώς θα μπορούσε να γίνει διαφορετικά

Φανταστείτε μια ροή εγγραφής όπου αντί για upsert, ο server κάνει: 1) global SELECT για email με FOR UPDATE, 2) αν υπάρχει επιστρέφει σφάλμα “email already registered” και ειδοποιεί τον υπάρχοντα χρήστη μέσω email· 3) αν δεν υπάρχει, δημιουργεί νέο χρήστη μέσα σε transaction. Με αυτόν τον τρόπο αποφεύγεται η ανεπιθύμητη αντικατάσταση password hash και η ανεπιτήδευτη επαλήθευση email. Επιπλέον, κάθε invite token θα πρέπει να ελέγχει ρητά ότι δεν συνδέεται με υπάρχοντα λογαριασμό εκτός της περίπτωσης πρόσκλησης σε συγκεκριμένη λειτουργία.

Γιατί έχει σημασία

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

Τι σημαίνει για τους χρήστες και τις επιχειρήσεις

Για τους χρήστες, η κύρια ανησυχία είναι ότι ιδιωτικές συναντήσεις και προσωπικά στοιχεία μπορεί να αποκαλυφθούν. Για επιχειρήσεις που χρησιμοποιούν τέτοιες πλατφόρμες, οι κίνδυνοι περιλαμβάνουν διαρροή πελατειακών δεδομένων, έκθεση εσωτερικών ροών εργασίας και κατάχρηση API keys για περαιτέρω διεισδύσεις. Επιχειρήσεις και διαχειριστές θα πρέπει να επιθεωρήσουν δικαιώματα πρόσβασης, να αναγκάσουν αλλαγή κωδικών όπου χρειάζεται, να ενεργοποιήσουν MFA και να ελέγξουν OAuth tokens και ενσωματώσεις ημερολογίου για μη εξουσιοδοτημένη πρόσβαση.

Μια τελευταία σκέψη για την κοινότητα του λογισμικού

Το γεγονός ότι ένα ενεργό, open-source project με μεγάλο αριθμό συνεισφερόντων παρουσίασε τέτοια θέματα δείχνει πόσο δύσκολο είναι να διατηρήσει κάποιος ασφάλεια σε όλη την επιφάνεια επίθεσης. Η επένδυση σε αυτοματοποιημένα και ανθρώπινα εργαλεία ανάλυσης, η εφαρμογή best practices στην ανάπτυξη και η τακτική αξιολόγηση third-party εξαρτήσεων είναι απαραίτητα βήματα. Τα AI εργαλεία είναι ισχυρά σύμπληρα, αλλά όχι υποκατάστατα της ανθρώπινης κρίσης και της οργανωμένης διαδικασίας ασφάλειας.

Advertisement