Defaults.Exposed

Defaults.ExposedΔιορθώσεις › Προστασία MIME-sniffing (X-Content-Type-Options)

Πώς να διορθώσετε Προστασία MIME-sniffing (X-Content-Type-Options)

Μια header μιας γραμμής που σταματά τα προγράμματα περιήγησης από το να μαντεύουν τι είναι πραγματικά ένα αρχείο. Χωρίς αυτή, ένα αρχείο που κάποιος ανεβάζει στον ιστότοπό σας — ή ένα αρχείο στις δικές σας σελίδες — μπορεί να διαβαστεί λανθασμένα από το πρόγραμμα περιήγησης και να εκτελεστεί ως κώδικας, που είναι ακριβώς πώς κάποιες επιθέσεις μετατρέπουν ένα αθώα φαινόμενο αρχείο ανεβάσματος σε τρόπο κλοπής sessions των πελατών σας.

Ουσία για την επιχείρησή σας: Η απουσία αυτής της 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 μου σου λέει.» Αυτή είναι η πλήρης διόρθωση. Είναι δωρεάν, χρειάζεται περίπου πέντε λεπτά.

Τι μπορεί να σας κοστίσει

Τι είναι στην πραγματικότητα

Όταν ένα πρόγραμμα περιήγησης λαμβάνει ένα αρχείο, ο 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 και αρχεία δεδομένων που σερβίρονται από τον ίδιο σας τον ιστότοπο. Δεν κοστίζει τίποτα και δεν σπάει ποτέ έναν σωστά ρυθμισμένο ιστότοπο.

Θα σπάσει κάτι στον ιστότοπό μας αν προσθέσουμε αυτό;

Σχεδόν ποτέ. Το 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 είναι πολύ πιο απλό και γρήγορο να προστεθεί.