Defaults.Exposed › Διορθώσεις › Προστασία MIME-sniffing (X-Content-Type-Options)
Πώς να διορθώσετε Προστασία MIME-sniffing (X-Content-Type-Options)
Μια header μιας γραμμής που σταματά τα προγράμματα περιήγησης από το να μαντεύουν τι είναι πραγματικά ένα αρχείο. Χωρίς αυτή, ένα αρχείο που κάποιος ανεβάζει στον ιστότοπό σας — ή ένα αρχείο στις δικές σας σελίδες — μπορεί να διαβαστεί λανθασμένα από το πρόγραμμα περιήγησης και να εκτελεστεί ως κώδικας, που είναι ακριβώς πώς κάποιες επιθέσεις μετατρέπουν ένα αθώα φαινόμενο αρχείο ανεβάσματος σε τρόπο κλοπής sessions των πελατών σας.
Ουσία για την επιχείρησή σας: Η απουσία αυτής της header είναι σαφές, σαρώσιμο σήμα ότι τα βασικά δεν είναι εφαρμοσμένα. Από μόνη της σπάνια ρίχνει ιστότοπο, αλλά σε συνδυασμό με φόρμα ανεβάσματος αρχείων ή περιεχόμενο από χρήστες ανοίγει μονοπάτι για εισβολέα να εκτελεί κακόβουλο κώδικα στα προγράμματα περιήγησης επισκεπτών. Είναι μια από τις φτηνότερες διορθώσεις στην ασφάλεια: μία γραμμή, δωρεάν, περίπου πέντε λεπτά.
Τι μπορεί να σας κοστίσει αυτό
- Οποιαδήποτε σελίδα όπου πελάτες ή προσωπικό μπορούν να ανεβάσουν αρχεία (avatars, έγγραφα, φωτογραφίες) γίνεται πιθανή εκκίνηση επιθέσεων browser-side.
- Ένας εισβολέας μπορεί να μεταμφιέσει κακόβουλο κώδικα ως εικόνα ή αρχείο κειμένου και να κάνει το πρόγραμμα περιήγησης του επισκέπτη να το εκτελεί — κλέβοντας το συνδεδεμένο session τους.
- Ερωτηματολόγια ασφαλείας, έλεγχοι ασφάλισης στον κυβερνοχώρο και εταιρικοί αγοραστές σαρώνουν αυτή τη header· η απουσία της διαβάζεται ως 'δεν κάνουν τα βασικά'.
- Παλαιότερα προγράμματα περιήγησης και ορισμένες ενσωματώσεις 'μυρίζουν' τύπους περιεχομένου και μπορούν να χειρίζονται λάθος αρχεία με τρόπους που διαρρέουν δεδομένα.
Γιατί έχει σημασία. Τα προγράμματα περιήγησης, όταν ένας server είναι ασαφής για το τι είναι ένα αρχείο, θα προσπαθήσουν να μαντέψουν ("sniff") τον τύπο περιεχομένου. Οι εισβολείς εκμεταλλεύονται αυτή την εκτίμηση: ανεβάζουν αρχείο που ο server εντίμως πιστεύει ότι είναι αβλαβής εικόνα, αλλά που το πρόγραμμα περιήγησης, αν αφεθεί να μαντέψει, αποφασίζει ότι είναι JavaScript — και το εκτελεί. Η header `X-Content-Type-Options: nosniff` λέει σε κάθε πρόγραμμα περιήγησης να σταματήσει να μαντεύει.
Η σύντομη έκδοση
Υπάρχει μια αθόρυβη υπόθεση ενσωματωμένη σε κάθε web browser: όταν κατεβάζει ένα αρχείο από τον ιστότοπό σας, προσπαθεί να καταλάβει τι είδους αρχείο είναι. Συνήθως εμπιστεύεται τον server σας. Αλλά αν ο server σας είναι ασαφής, το πρόγραμμα περιήγησης θα μαντέψει — και αυτή η εκτίμηση ονομάζεται MIME-sniffing.
Το πρόβλημα είναι ότι οι εισβολείς μπορούν να εκμεταλλευτούν αυτή την εκτίμηση. Μπορούν να δημιουργήσουν αρχείο που ο server εντίμως πιστεύει ότι είναι αβλαβής εικόνα, αλλά που το πρόγραμμα περιήγησης, αφεθεί να μαντέψει, αποφασίζει ότι είναι κώδικας προγράμματος — και μετά το εκτελεί, μέσα στο πρόγραμμα περιήγησης του πελάτη σας, στο domain σας.
Υπάρχει μια οδηγία μιας γραμμής που απενεργοποιεί την εκτίμηση: X-Content-Type-Options: nosniff. Λέει σε κάθε πρόγραμμα περιήγησης: «μην μαντεύεις — εμπιστεύσου ακριβώς αυτό που ο server μου σου λέει.» Αυτή είναι η πλήρης διόρθωση. Είναι δωρεάν, χρειάζεται περίπου πέντε λεπτά.
Τι μπορεί να σας κοστίσει
-
Το «αβλαβές συνημμένο» που δεν ήταν. Εκτελείτε πύλη υποστήριξης ή marketplace όπου πελάτες ανεβάζουν αρχεία. Ένας εισβολέας ανεβάζει αρχείο που το σύστημά σας αποθηκεύει και σερβίρει ως εικόνα. Χωρίς nosniff, το πρόγραμμα περιήγησης ενός θύματος μαντεύει ότι το αρχείο είναι script και το εκτελεί — κλέβοντας αθόρυβα το συνδεδεμένο session εκείνου του επισκέπτη.
-
Η συμφωνία που σταματά σε ερωτηματολόγιο ασφαλείας. Η ομάδα προμηθειών μεγαλύτερου πελάτη εκτελεί αυτοματοποιημένη σάρωση πριν υπογράψει. Ελλείπουσες headers ασφαλείας εμφανίζονται αμέσως.
-
Η ασφάλιση στον κυβερνοχώρο που γίνεται πιο δύσκολη. Περισσότεροι ασφαλιστές εκτελούν εξωτερικές σαρώσεις πριν κάνουν προσφορά ή ανανεώσουν. Ένα καθαρό προφίλ header είναι φτηνή απόδειξη υγιεινής.
Τι είναι στην πραγματικότητα
Όταν ένα πρόγραμμα περιήγησης λαμβάνει ένα αρχείο, ο server υποτίθεται ότι το επισημαίνει με content type (για παράδειγμα, image/png ή text/html). Ιστορικά, τα προγράμματα περιήγησης δεν εμπιστεύονταν πλήρως αυτή την ετικέτα — οπότε ρίχνουν μια ματιά στα πραγματικά bytes του αρχείου και αποφασίζουν μόνα τους. Αυτό το ρίξιμο ματιάς είναι το MIME-sniffing.
X-Content-Type-Options: nosniff αφαιρεί εντελώς την εκτίμηση. Με αυτό ορισμένο, το πρόγραμμα περιήγησης λέγεται: χρησιμοποίησε τον τύπο που δήλωσε ο server και τίποτα άλλο.
Πώς μοιάζει το «καλό»: κάθε απόκριση από τον ιστότοπό σας φέρει ακριβώς αυτή τη header:
X-Content-Type-Options: nosniff
Πώς να το διορθώσετε (δωρεάν, ~5 λεπτά)
Δώστε αυτή την ενότητα σε όποιον εκτελεί τον ιστότοπό σας. Η διόρθωση είναι δωρεάν και γρήγορη.
Cloudflare: Rules → Transform Rules → Modify Response Header → Ορισμός X-Content-Type-Options σε nosniff για όλα τα αιτήματα.
Nginx:
add_header X-Content-Type-Options "nosniff" always;
Apache:
Header always set X-Content-Type-Options "nosniff"
IIS / Windows hosting — σε web.config:
<httpProtocol>
<customHeaders>
<add name="X-Content-Type-Options" value="nosniff" />
</customHeaders>
</httpProtocol>
Node / Express:
app.use((req, res, next) => {
res.setHeader('X-Content-Type-Options', 'nosniff');
next();
});
(Ή χρησιμοποιήστε το πακέτο helmet, που ορίζει αυτό και αρκετές άλλες headers ασφαλείας από προεπιλογή.)
Συνηθισμένα λάθη
- Ορισμός μόνο στην αρχική σελίδα. Η header πρέπει να είναι σε κάθε απόκριση — συμπεριλαμβανομένων εικόνων, scripts, stylesheets και ανεβασμένων αρχείων. Εφαρμόστε σε επίπεδο server ή CDN.
- Τυπογραφικό λάθος στην τιμή. Η μόνη έγκυρη τιμή είναι
nosniff. Οτιδήποτε άλλο αποτυγχάνει τον έλεγχο. - Υπόθεση ότι αντικαθιστά Content Security Policy. Το nosniff είναι ένα επίπεδο. Δεν ελέγχει ποια scripts επιτρέπεται να εκτελούνται — αυτή είναι δουλειά της CSP.
- Αφαίρεση του «διπλότυπου». Αν τόσο το CDN σας όσο και η αρχή το ορίζουν, θα το δείτε δύο φορές. Αυτό είναι αβλαβές.
Συχνές Ερωτήσεις
Δεν αφήνουμε κανέναν να ανεβάζει αρχεία. Χρειαζόμαστε ακόμα αυτό;
Ναι, και αξίζει ακόμα τον κόπο. Η header είναι άμυνα σε βάθος: σταματά επίσης το πρόγραμμα περιήγησης από το να διαβάζει λανθασμένα scripts, stylesheets και αρχεία δεδομένων που σερβίρονται από τον ίδιο σας τον ιστότοπο. Δεν κοστίζει τίποτα και δεν σπάει ποτέ έναν σωστά ρυθμισμένο ιστότοπο.
Θα σπάσει κάτι στον ιστότοπό μας αν προσθέσουμε αυτό;
Σχεδόν ποτέ. Το nosniff απλώς κάνει τα προγράμματα περιήγησης να τιμούν τον τύπο περιεχομένου που ο server σας ήδη στέλνει. Ο μόνος τρόπος να προκαλέσει πρόβλημα είναι αν ο server σας επισημαίνει λανθασμένα αρχεία. Αν κάτι σπάει, αυτό είναι πραγματικό bug που το nosniff αποκάλυψε — αξίζει τον κόπο να το διορθώσετε ούτως ή άλλως.
Πώς μοιάζει το 'καλό' στην πράξη;
Μια μόνη header απόκρισης σε κάθε σελίδα και resource: X-Content-Type-Options: nosniff. Αυτή είναι η σωστή ρύθμιση — δεν υπάρχουν άλλες έγκυρες τιμές και καμία ρύθμιση.
Το CDN μας (Cloudflare ή παρόμοιο) και ο server μας το προσθέτουν και οι δύο — είναι πρόβλημα;
Όχι. Το να βλέπετε την τιμή δύο φορές ('nosniff, nosniff') είναι εντελώς εντάξει και εξακολουθεί να περνά.
Κοστίζει χρήματα η διόρθωση αυτού;
Όχι. Η διόρθωση είναι μία γραμμή δωρεάν διαμόρφωσης στον web server ή CDN σας.
Πώς διαφέρει αυτό από μια Content Security Policy (CSP);
Συμπληρώνονται. Η CSP ελέγχει ποια scripts και resources επιτρέπεται να φορτώνονται καθόλου· το nosniff σταματά το πρόγραμμα περιήγησης από το να κατατάσσει λανθασμένα ένα αρχείο που φορτώνεται. Θέλετε και τα δύο. Το nosniff είναι πολύ πιο απλό και γρήγορο να προστεθεί.