Ο υποτομέας διαχείρισης δεν σταματά το CSRF: τέσσερις έλεγχοι πριν την κυκλοφορία
Ένα νέο όνομα κεντρικού υπολογιστή είναι νέα προέλευση, συχνά ο ίδιος ιστότοπος, γι’ αυτό τα same-site cookies και οι απλές φόρμες το διαπερνούν. Ελέγξτε τα tokens, την πύλη και την εξουσιοδότηση.
Η μεταφορά της διεπαφής διαχείρισης στο admin.example.com είναι πραγματική βελτίωση: κρατά τα cookies διαχείρισης μακριά από τις δημόσιες σελίδες, δίνει στις δύο εφαρμογές ξεχωριστές μνήμες cache και επιτρέπει να κατευθύνετε μια αυστηρότερη πολιτική δικτύου σε ένα όνομα κεντρικού υπολογιστή. Δεν είναι όμως έλεγχος κατά CSRF και δεν κάνει τον κώδικα του δημόσιου ιστότοπου ασφαλή για να μένει ανοιχτός σε συνδεδεμένο διαχειριστή. Ο διαχωρισμός αλλάζει το τι θεωρεί ο φυλλομετρητής σύνορο, όχι το τι ελέγχει ο διακομιστής, γι’ αυτό κάντε αυτούς τους τέσσερις ελέγχους πριν το θεωρήσετε ολοκληρωμένο.
Διαβάστε προέλευση και ιστότοπο ως δύο διαφορετικές λέξεις
Προέλευση είναι σχήμα, κεντρικός υπολογιστής και θύρα, άρα το https://www.example.com και το https://admin.example.com είναι διαφορετικές προελεύσεις. Ιστότοπος, με την έννοια του SameSite, είναι σχήμα συν καταχωρίσιμο domain, άρα αυτά τα δύο ονόματα είναι συνήθως ο ίδιος ιστότοπος. Αυτή η διαφορά είναι όλη η παγίδα: η ιδιότητα SameSite δεν θα σας βοηθήσει ανάμεσα σε αδελφικούς υποτομείς, γιατί ο φυλλομετρητής δεν θεωρεί καθόλου το αίτημα cross-site. Στρέψτε τη διεπαφή διαχείρισης σε ένα πραγματικά διαφορετικό καταχωρίσιμο domain, όπως admin-example.net, και το αίτημα γίνεται όντως cross-site, και εκεί το SameSite=Lax ή Strict αρχίζει να κάνει δουλειά στην οποία μπορείτε να βασιστείτε.
Δοκιμάστε το στον φυλλομετρητή αντί να συλλογίζεστε.
Φορτώστε τον δημόσιο ιστότοπο, ανοίξτε τα εργαλεία ανάπτυξης και δείτε ποια cookies προσαρτά ο φυλλομετρητής σε αίτημα προς τον κεντρικό υπολογιστή διαχείρισης. Αν το cookie δεν έχει ιδιότητα Domain, είναι μόνο για τον host και μένει στο δικό του όνομα; αν φέρει Domain=example.com, ταξιδεύει σε κάθε αδελφό, και ο νέος υποτομέας δεν σας πρόσφερε τίποτα για αυτό το cookie.
Χωρίστε το μπορεί να διαβάσει την απάντηση από το μπορεί να στείλει το αίτημα
Η πολιτική ίδιας προέλευσης περιορίζει την ανάγνωση απαντήσεων μεταξύ προελεύσεων. Δεν σταματά την αποστολή αιτήματος και δεν εμποδίζει μια φόρμα να μεταφέρει διαπιστευτήρια που έχει ήδη ο φυλλομετρητής. Ένα απλό αίτημα, με τύπο περιεχομένου φόρμας ή απλό GET, παραδίδεται χωρίς προκαταρκτικό έλεγχο; μετά το CORS αποφασίζει αν το σενάριο που καλεί μπορεί να διαβάσει την απάντηση. Το CSRF ζει εξ ολοκλήρου στην πλευρά της αποστολής.
Γι’ αυτό ο διακομιστής χρειάζεται ρητό έλεγχο για πράξεις που αλλάζουν κατάσταση. Ένα token συγχρονισμού δεμένο στη συνεδρία, ή ένα cookie διπλής αποστολής που συγκρίνεται στον διακομιστή, καλύπτει την περίπτωση; η σύγκριση Origin ή Referer αξίζει να προστεθεί ως δεύτερη πύλη αλλά όχι ως η μόνη, γιατί δεν φέρει κάθε αίτημα την κεφαλίδα και δεν τη διατηρεί κάθε διαμεσολαβητής. Οι οδηγίες του OWASP για την πρόληψη CSRF θεωρούν το SameSite ένα στρώμα ανάμεσα σε πολλά ακριβώς γι’ αυτόν τον λόγο.
Αποφασίστε τι αποδεικνύει πραγματικά η πύλη δικτύου
Μια λίστα επιτρεπόμενων εξόδων VPN μπροστά από τον host διαχείρισης είναι καλός έλεγχος και αδύναμος ισχυρισμός ταυτότητας. Αποδεικνύει ότι το αίτημα ήρθε από διεύθυνση που δίνει το VPN, την οποία μπορούν να μοιράζονται όλοι σε αυτή την έξοδο, και δεν λέει τίποτα για το ποιο πρόσωπο ή ποια συσκευή βρίσκεται πίσω του. Αντιμετωπίστε την ως φίλτρο εισόδου, όχι ως ταυτοποίηση.
Κρατήστε την ανεξάρτητη από τους ελέγχους στο επίπεδο του αιτήματος. Αν η λίστα είναι το μόνο πράγμα ανάμεσα σε έναν επιτιθέμενο και ένα τελικό σημείο που αλλάζει κατάσταση, μία λανθασμένη διαδρομή, ένας πελάτης split-tunnel ή ένα δανεικό φορητό υπολογιστή αφαιρεί τον έλεγχο εντελώς.
Καταγράψτε και τις απορρίψεις εκτός των αναμενόμενων περιοχών. Ένα κύμα τους είναι το πιο χρήσιμο σήμα ότι κάποιος εξετάζει το σύνορο που μόλις χτίσατε, και η σιωπή είναι το σήμα ότι το φίλτρο δεν προσεγγίζεται καθόλου.
Κρατήστε cookies, σύνδεση και εξουσιοδότηση ρητά
Το εύρος του cookie αποφασίζει το μεγαλύτερο μέρος του αποτελέσματος. Ένα cookie γονικού domain στέλνεται στον host διαχείρισης, άρα μια έγχυση σεναρίου στον δημόσιο ιστότοπο μπορεί να δράσει με τη συνεδρία ενός διαχειριστή; ένα cookie μόνο για τον host δεν μπορεί. Προτιμήστε τη μορφή μόνο για τον host, προσθέστε την ιδιότητα Secure και χρησιμοποιήστε το πρόθεμα __Host- όπου το υποστηρίζει η πλατφόρμα, γιατί το πρόθεμα απαιτεί Secure, Path=/ και καμία ιδιότητα Domain. Διαβάστε την κεφαλίδα απάντησης και όχι το βάζο των cookies: Set-Cookie: __Host-admin_session=...; Secure; Path=/; HttpOnly; SameSite=Lax, χωρίς ιδιότητα Domain. Ο φυλλομετρητής πετά ένα __Host- cookie που φέρει Domain, άρα ένα cookie που εμφανίζεται ακόμη σε αδελφούς hosts αποδεικνύει ότι το πρόθεμα δεν εφαρμόστηκε ποτέ.
Μετά κρατήστε την εξουσιοδότηση στον διακομιστή, ανά αίτημα, σε κάθε τελικό σημείο διαχείρισης, όχι μόνο στη σύνδεση. Ένα αίτημα από επιτρεπόμενο δίκτυο πρέπει ακόμη να ταυτοποιηθεί και να εξουσιοδοτηθεί για την πράξη που ζητά; το όνομα του host δεν είναι δράστης. Αν η δημόσια και η διαχειριστική εφαρμογή μοιράζονται ροή σύνδεσης ή αποθήκη συνεδριών, γράψτε αυτή τη σχέση, γιατί είναι η συντομότερη διαδρομή από ένα σφάλμα στον δημόσιο ιστότοπο σε μια διαχειριστική ενέργεια.
Ελέγξτε ξανά το σύνορο μετά τον διαχωρισμό
Τρέξτε τις αρνητικές δοκιμές, όχι μόνο το ευτυχές μονοπάτι: μια cross-site φόρμα χωρίς token πρέπει να απορρίπτεται, ένα token από άλλη συνεδρία πρέπει να απορρίπτεται και κανένα GET δεν πρέπει να αλλάζει κατάσταση. Ελέγξτε τις ιδιότητες των cookies στα εργαλεία ανάπτυξης, επιβεβαιώστε ότι ο έλεγχος Origin ενεργοποιείται σε μη ταιριαστό αίτημα, και δοκιμάστε τον host διαχείρισης από έξω από την περιοχή VPN για να δείτε το φίλτρο να δουλεύει.
Τίποτα από αυτά δεν αφαιρεί ένα σφάλμα XSS μέσα στην ίδια τη διαχειριστική εφαρμογή. Ένα ξεχωριστό όνομα host είναι σύνορο απομόνωσης από την πλευρά του φυλλομετρητή με πραγματική αξία, και δεν υποκαθιστά την πρόληψη μη ασφαλούς εκτέλεσης κώδικα ούτε την προστασία αιτημάτων στην πλευρά του διακομιστή. Μετά τον διαχωρισμό η λίστα είναι συντομότερη απ’ ό,τι φαίνεται: ξεχωριστή προέλευση, cookies μόνο για τον host, token σε κάθε αλλαγή, φίλτρο εισόδου στο οποίο δεν πιστεύετε ως ταυτότητα, και εξουσιοδότηση που αποφασίζεται ανά αίτημα.