Feature Policy è un "nuovo" security headers che permette di limitare l'accesso a feature/Web API del browser. Ad esempio, possiamo impedire l'accesso alla webcam o al microfono durante la navigazione sul nostro sito o applicazione web. Nel corso di questo capitolo, implementerò Feature Policy sul blog rev3rse (blog.rev3rse.it) e controllerò il punteggio su securityheaders.com. Se non sai di cosa si tratta, ti consiglio di leggere i precedenti articoli su questo blog o di guardare il primo video di questa serie sul nostro canale YouTube.

Voto di partenza su securityheaders.com:

Feature Policy

Si tratta di un nuovo security headers che permette di stabilire una policy (molto simile a quella che abbiamo visto nel primo capitolo parlando di Content Security Policy) definendo quali risorse possono utilizzare feature e API del browser degli utenti. Questo permette, a fronte di una compromissione, di aggiungere un elemento in più per proteggere la privacy e i dati degli utenti del nostro sito.

La sintassi è molto semplice e prevede una sequenza di "policy, spazio, lista sorgenti" separata da punto e virgola ;.

Le funzionalità che possiamo limitare o disabilitare sono molte, e non farò una descrizione di ognuna ma mi soffermerò solo su alcune:

  • ambient-light-sensor
  • autoplay
  • accelerometer
  • battery
  • camera
  • display-capture
  • document-domain
  • encrypted-media
  • execution-while-not-rendered
  • execution-while-out-of-viewport
  • fullscreen
  • geolocation
  • gyroscope
  • magnetometer
  • microphone
  • midi
  • payment
  • picture-in-picture
  • speaker
  • sync-xhr
  • usb
  • wake-lock
  • webauthn
  • vr
  • xr-spatial-tracking

Per esempio, se volessi impedire al browser di  accedere al microfono e alla webcam durante la navigazione sul mio sito, potrei impostare una policy come questa:

Feature-Policy: microphone 'none'; camera 'none'

Alcuni dei nomi delle direttive sopra elencate sono autoesplicativi, tra i più interessanti troviamo anche:

  • vibrate che definisce se e quale sorgente può accedere alle API Vibration del device (telefono, tablet, ecc...).
  • geolocation che definisce se e quale sorgente può accedere all'interfaccia Geolocation del browser. Quando viene abilitata questa policy, quando vengono chiamate le funzioni getCurrentPosition() e watchPosition() il browser sostituisce la callback con PositionError: PERMISSION_DENIED.
  • sync-xhr definisce se e da dove il browser può effettuare richieste HTTP sincrone via XMLHTTPRequest che potrebbe contribuire a mitigare l'attività malevola di script iniettati via stored o reflected XSS.

Test

Nel video che riporto qui sotto, faccio un test utilizzando WebcamJS per accedere alla webcam tramite browser e renderizzare l'immagine via JavaScript. Con poche righe di JavaScript ho ottenuto questo:

facendo in modo che la pagina invii al mio browser il response header Feature-Policy: camera 'none', il mio browser ha impedito al WebcamJS di accedere alla webcam e mi ha restituito il seguente errore:

Implementiamo Feature Policy

Inserisco sulla configurazione di nginx che abbiamo iniziato a definire nel capitolo 1, la seguente stringa:

Feature-Policy: microphone: ‘none’; geolocation ‘none’; camera ‘none’;

una volta fatto il reload della configurazione e avviata la scansione su securityheaders.com ho ottenuto questo punteggio:

Video