Come posso assicurarmi che i miei file JavaScript consegnati su un CDN non vengano alterati?


88

Sto lavorando a uno scenario in cui alcuni file JavaScript devono essere ospitati su una CDN. Voglio avere un meccanismo in modo che quando questi file vengono scaricati sul lato utente, posso assicurarmi che i file non siano stati manomessi e provengano effettivamente dal CDN specificato.

Comprendo che l'attività è molto semplice se utilizzo SSL, ma voglio comunque assicurarmi che i file giusti vengano serviti anche su HTTP senza SSL.

Per quanto ho potuto cercare, non esiste un meccanismo esistente come la firma digitale per i file JavaScript che è supportato su tutte le piattaforme. Forse non è necessario?

Esiste un metodo integrato nei browser per verificare l'autore dei file JavaScript? C'è qualcosa che posso fare per farlo in modo sicuro?


13
Anche se trovo interessante questa domanda, non è fuori tema?
evolutionxbox

20
perché dovresti servire file su http?
njzk2

12
"Ma perché non esiste un meccanismo del genere?" Perché è davvero difficile . Una volta che i tuoi dati hanno lasciato il tuo server, sono toast. HTTPS aiuta, ma se si tratta di una semplice connessione HTTP qualsiasi convalida può fallire (o meglio - passare). Un attacco MITM può semplicemente modificare la tua firma prevista e / o la firma di ciò che ti viene fornito prima che il browser riesca a soddisfare le aspettative. Quindi, quando l'utente riceve un carico utile, sarebbe considerato completamente sicuro ... quando non è necessariamente quello.
VLAZ

4
"Ma perché non esiste un meccanismo del genere?" Perché in HTTPS esiste già una soluzione economica, efficace e ampiamente applicabile.
Kevin Krumwiede

9
Questo dovrebbe probabilmente essere su ServerFault o Security, poiché si tratta in realtà di servire i file in modo sicuro, e qualsiasi relazione con la programmazione è solo tangenziale in quanto tali file rappresentano il codice sorgente.
underscore_d

Risposte:


140

In effetti, una funzionalità come questa è attualmente in fase di elaborazione con il nome di Subresource Integrity . Esamina l' integrityattributo del <script>tag. Sebbene non sia ancora completamente adottato su tutta la linea , soddisfa proprio questo scopo.

integrity

Contiene metadati in linea che un programma utente può utilizzare per verificare che una risorsa recuperata sia stata consegnata senza manipolazioni impreviste. Vedere Integrità delle sottorisorse.

fonte

Subresource Integrity (SRI) è una funzionalità di sicurezza che consente ai browser di verificare che i file recuperati (ad esempio, da una CDN) vengano consegnati senza manipolazioni impreviste. Funziona consentendo di fornire un hash crittografico che deve corrispondere a un file recuperato.

fonte


Esempio:

<script src="https://example.com/example-framework.js"
    integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC"
    crossorigin="anonymous"></script>

Nota tuttavia che questo non ti proteggerà dagli attacchi Man in the Middle se stai trasferendo le tue risorse tramite HTTP semplice. In questo caso, il codice hash può essere falsificato dall'aggressore, rendendo inutile la difesa contro i file di script manipolati.

Per questo motivo, è necessario utilizzare sempre connessioni HTTPS protette invece del semplice HTTP in aggiunta alle misure di sicurezza descritte sopra.


9
Penso che valga la pena ricordare che il controllo dell'integrità può essere facilmente falsificato supponendo che OP pianifichi di inviare il proprio HTML in HTTP così come i propri file di risorse. Se il loro sito è HTTPS e vogliono servire le risorse tramite HTTP, la maggior parte dei browser non apprezzerà questo e ignorerà silenziosamente le risorse HTTP.
MonkeyZeus

3
@MonkeyZeus Questo sarebbe vero solo in caso di un attacco MITM o se il nostro server è compromesso, giusto? La mia comprensione è che la domanda chiede esplicitamente come difendersi da una CDN compromessa.
Timo

10
@TimoSta Esattamente! Senza questi controlli, se includi uno script da, ad esempio, https://code.jquery.com/chiunque comprometta il code.jquery.comtuo sito può XSS, indipendentemente dal fatto che code.jquery.comsi acceda o meno tramite HTTPS. Con questi controlli in atto, l'attaccante può solo impedire il caricamento degli script, non sostituirli con altri dannosi.
Ajedi32

1
@MonkeyZeus ho aggiunto una nota alla mia risposta, affermando le tue preoccupazioni. Sei d'accordo con la formulazione?
Timo

1
@TimoSta Molto bella, mi piace! btw, ho fatto +1 anche prima di pubblicare il mio primo commento :-)
MonkeyZeus

36

Stai cercando controlli di integrità delle sottorisorse .

Ad esempio, ecco lo snippet CDN di jQuery:

<script src="https://code.jquery.com/jquery-3.1.0.js"
        integrity="sha256-slogkvB1K3VOkzAI8QITxV3VzpOnkeNVsKvtkYLMjfk="
        crossorigin="anonymous"></script>

2
Totalmente inutile perché un utente malintenzionato può modificare il campo di integrità nello stesso momento in cui modifica lo script che stai scaricando.
Gare di leggerezza in orbita il

15
@LightnessRacesinOrbit: no se controlli il tuo dominio a cui si accede tramite HTTPS ma non controlli code.jquery.com. Questo può proteggerti da un file compromesso code.jquery.com.
SilverlightFox

2
@SilverlightFox: Ok, totalmente inutile contro gli attacchi MITM *
Lightness Races in Orbit

@LightnessRacesinOrbit Sì. Ancora molto utile e avrebbe impedito questo attacco ad esempio: bleepingcomputer.com/news/security/…
Adrian Mouat

6

Disclaimer: come sempre, dovresti considerare questi meccanismi di qualsiasi utilità quando usi https, poiché possono essere facilmente disabilitati tramite MitM con http

Oltre al meccanismo nelle risposte precedenti, è anche possibile utilizzare le intestazioni di risposta http della politica di sicurezza del contenuto nella pagina principale.

http://www.html5rocks.com/en/tutorials/security/content-security-policy/

Content-Security-Policy: script-src 'sha256-qznLcsROx4GACP2dm0UCKCzCG-HiZ1guq6ZZDob_Tng ='

Ci sono alcune cose da notare qui. Il prefisso sha * - specifica l'algoritmo utilizzato per generare l'hash. Nell'esempio sopra, viene utilizzato sha256-. CSP supporta anche sha384- e sha512-. Quando si genera l'hash non includere i tag. Anche le maiuscole e gli spazi sono importanti, inclusi gli spazi bianchi iniziali o finali.

Utilizzando Chrome 40 o versioni successive puoi aprire DevTools e ricaricare la tua pagina. La scheda Console conterrà messaggi di errore con l'hash sha256 corretto per ciascuno dei tuoi script inline.

Questo meccanismo esiste da un po 'di tempo, quindi il supporto del browser è probabilmente abbastanza buono, assicurati di controllare.

Inoltre, se si desidera garantire che i browser meno recenti non conformi non siano insicuri, è possibile includere uno script di reindirizzamento sincrono nella parte superiore della pagina non consentito dal criterio.


esiste da un po 'di tempo, ma il supporto del browser non è abbastanza buono. caniuse.com/subresource-integrity
Sp0T

@ Sp0t - L'integrità delle sotto-risorse (di cosa tratta il tuo collegamento) è il meccanismo nelle altre risposte. La mia risposta riguarda la politica di sicurezza dei contenuti, che ha un supporto molto migliore
Fabio Beltramini

3

C'è un punto importante su ciò che questo tipo di firma può e non può fare. E ' in grado di proteggere l'utente da ipotetiche attacchi in cui qualcuno modifica il vostro codice. Non può garantire al tuo sito che il tuo codice sia il codice in esecuzione. In altre parole, non puoi ancora fidarti di tutto ciò che arriva sul tuo sito dal client.


2

Se il tuo modello avversario consente a un utente malintenzionato di modificare i file JavaScript così come vengono forniti da un CDN, il tuo modello avversario consente a un utente malintenzionato di modificare la fonte di riferimento così come viene consegnata per rimuovere qualsiasi tentativo di verifica, per alterare l'indirizzo di origine a un altro CDN e / o rimuovere completamente il riferimento a JavaScript.

E non lasciamo spazio ai worm su come la tua applicazione può determinare se il resolver dell'utente sta o non sta risolvendo correttamente alla CDN tramite richieste HTTP (o qualsiasi altro meccanismo che non abbia una catena di fiducia verificata).

/ etc / hosts:

#  ...
1.2.3.4    vile-pirates.org    trustworthy.cdn
#  ...

2
La prima frase è chiaramente falsa. Cosa succede se la pagina di riferimento viene caricata su HTTPS e il file JavaScript viene caricato su HTTP-non-S?
user253751

O cosa succede se la stessa CDN è compromessa, ma non il tuo server?
Ajedi32

@immibis: scelgo di presumere che OP non sia così irrazionale da proporre uno scenario del genere.
Eric Towers

1
@immibis Non è per questo che i browser generalmente non consentono alle pagine HTTPS di caricare JS su HTTP?
Barmar

1
@immibis stavo dicendo che migliora una situazione che non è nemmeno possibile, perché i browser non lo consentono.
Barmar

1

Puoi assicurarlo con Subresource Integrity. Molti CDN pubblici includono hash SRI nel codice incorporabile offerto sui siti Web CDN. Ad esempio, su PageCDN, quando fai clic sul file jquery nella pagina CDN di jQuery , hai la possibilità di copiare l'URL o utilizzare il tag script che contiene l'hash SRI come di seguito:

<script src="https://pagecdn.io/lib/jquery/3.4.1/jquery.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>

Al caricamento della pagina, il browser emetterà una richiesta per questa risorsa e al completamento della richiesta farà corrispondere l'hash del file ricevuto con quello fornito come valore di integrità nel tag script. Se entrambi gli hash non corrispondono, il browser eliminerà il file jquery.

Al momento, questa funzione è supportata dal 91% dei browser in tutto il mondo. Maggiori dettagli su caniuse .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.