Jak mogę się upewnić, że moje pliki JavaScript dostarczane przez CDN nie zostaną zmienione?

88

Pracuję nad scenariuszem, w którym niektóre pliki JavaScript mają być hostowane w sieci CDN. Chcę mieć pewien mechanizm, dzięki któremu po pobraniu tych plików po stronie użytkownika mogę zapewnić, że pliki nie zostały zmodyfikowane i rzeczywiście pochodzą z określonego CDN.

Rozumiem, że zadanie jest bardzo łatwe, jeśli używam SSL, ale nadal chcę mieć pewność, że odpowiednie pliki są obsługiwane nawet na HTTP bez SSL.

O ile mogłem wyszukiwać, nie ma istniejącego mechanizmu, takiego jak podpis cyfrowy dla plików JavaScript, który jest obsługiwany na różnych platformach. Może nie jest to potrzebne?

Czy jest jakaś metoda wbudowana w przeglądarki, aby zweryfikować autora plików JavaScript? Czy jest coś, co mogę zrobić, aby to zrobić w bezpieczny sposób?

baba26
źródło
13
Chociaż uważam to pytanie za interesujące, czy nie jest ono niezwiązane z tematem?
evolutionxbox
20
dlaczego miałbyś udostępniać pliki na http?
njzk2
12
"Ale dlaczego nie ma takiego mechanizmu?" Ponieważ to naprawdę trudne . Gdy dane opuściły serwer, są wznoszone. HTTPS pomaga, ale jeśli jest to zwykłe połączenie HTTP, każda weryfikacja może się nie powieść (a raczej - przejść). Atak MITM może po prostu zmodyfikować oczekiwaną sygnaturę i / lub sygnaturę tego, co otrzymujesz, zanim przeglądarka dotrzyma oczekiwań. Tak więc, gdy użytkownik otrzyma jakiś ładunek, zostanie to uznane za całkowicie bezpieczne ... jeśli nie jest to konieczne.
VLAZ
4
"Ale dlaczego nie ma takiego mechanizmu?" Ponieważ istnieje już tanie, skuteczne i szeroko stosowane rozwiązanie w HTTPS.
Kevin Krumwiede
9
Powinno to prawdopodobnie dotyczyć ServerFault lub Security, ponieważ tak naprawdę chodzi o serwowanie plików w bezpieczny sposób, a każdy związek z programowaniem jest tylko styczny, ponieważ wspomniane pliki reprezentują kod źródłowy.
underscore_d

Odpowiedzi:

140

W rzeczywistości taka funkcja jest obecnie opracowywana pod nazwą Integralność Subresource . Zajrzyj do integrityatrybutu <script>tagu. Chociaż nie jest jeszcze w pełni przyjęty we wszystkich dziedzinach , spełnia właśnie ten cel.

integrity

Zawiera wbudowane metadane, których agent użytkownika może użyć do sprawdzenia, czy pobrany zasób został dostarczony bez nieoczekiwanej manipulacji. Zobacz Integralność zasobów podrzędnych.

Źródło

Integralność zasobów podrzędnych (SRI) to funkcja zabezpieczeń, która umożliwia przeglądarkom weryfikację, czy pobierane przez nie pliki (na przykład z sieci CDN) są dostarczane bez nieoczekiwanej manipulacji. Działa, umożliwiając podanie kryptograficznego skrótu, który musi być zgodny z pobieranym plikiem.

Źródło


Przykład:

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

Pamiętaj jednak, że nie ochroni to Cię przed atakami Man in the Middle, jeśli przesyłasz swoje zasoby przez zwykły HTTP. W takim przypadku kod skrótu może zostać sfałszowany przez atakującego, co sprawi, że ochrona przed zmanipulowanymi plikami skryptów będzie bezużyteczna.

Z tego powodu, oprócz opisanych powyżej środków bezpieczeństwa, należy zawsze używać bezpiecznych połączeń HTTPS zamiast zwykłego HTTP.

Timo
źródło
9
Myślę, że warto wspomnieć, że sprawdzenie integralności można łatwo sfałszować, zakładając, że OP planuje wysłać swój kod HTML w HTTP, a także pliki zasobów. Jeśli ich witryna korzysta z protokołu HTTPS i chcą udostępniać zasoby za pośrednictwem protokołu HTTP, większości przeglądarek nie spodoba się to i po cichu zignoruje zasoby HTTP.
MonkeyZeus
3
@MonkeyZeus Byłoby to prawdą tylko w przypadku ataku MITM lub w przypadku naruszenia bezpieczeństwa naszego własnego serwera, prawda? Rozumiem, że pytanie to wyraźnie dotyczy tego, jak bronić się przed zainfekowanym CDN.
Timo
10
@TimoSta Exactly! Bez tych sprawdzeń, jeśli dołączysz skrypt, na przykład, https://code.jquery.com/każdy, kto włamie się, code.jquery.commoże XSS na twoją witrynę, niezależnie od tego, czy code.jquery.comjest dostępny przez HTTPS, czy nie . Dzięki tym kontrolom osoba atakująca może tylko uniemożliwić ładowanie skryptów, a nie zastąpić ich złośliwymi.
Ajedi32
1
@MonkeyZeus Dodałem notatkę do mojej odpowiedzi, w której wyrażasz swoje obawy. Czy zgadzasz się ze sformułowaniem?
Timo
1
@TimoSta Bardzo fajnie, podoba mi się! btw, zrobiłem +1 jeszcze zanim opublikowałem swój pierwszy komentarz :-)
MonkeyZeus
36

Szukasz sprawdzania integralności zasobów podrzędnych .

Na przykład, oto fragment kodu jQuery CDN:

<script src="https://code.jquery.com/jquery-3.1.0.js"
        integrity="sha256-slogkvB1K3VOkzAI8QITxV3VzpOnkeNVsKvtkYLMjfk="
        crossorigin="anonymous"></script>
Brian
źródło
2
Całkowicie bezużyteczne, ponieważ osoba atakująca może modyfikować pole integralności w tym samym czasie, gdy modyfikuje pobierany skrypt.
Wyścigi lekkości na orbicie
15
@LightnessRacesinOrbit: Nie, jeśli kontrolujesz własną domenę, do której można uzyskać dostęp przez HTTPS, ale nie kontrolujesz code.jquery.com. Może to uchronić Cię przed zagrożeniem code.jquery.com.
SilverlightFox
2
@SilverlightFox: Okay, całkowicie bezużyteczne przeciwko atakom MITM *
Lightness Races in Orbit
@LightnessRacesinOrbit Yes. Nadal bardzo przydatne i zapobiegłoby temu atakowi, na przykład: bleepingcomputer.com/news/security/ ...
Adrian Mouat
6

Zastrzeżenie: Jak zawsze, powinieneś traktować te mechanizmy jako użyteczne tylko podczas korzystania z https, ponieważ można je łatwo wyłączyć za pomocą MitM z http

Oprócz mechanizmu przedstawionego w powyższych odpowiedziach można również użyć nagłówków odpowiedzi http dotyczących zasad bezpieczeństwa treści na stronie nadrzędnej.

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

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

Należy tu zwrócić uwagę na kilka rzeczy. Przedrostek sha * - określa algorytm używany do generowania skrótu. W powyższym przykładzie użyto sha256-. CSP obsługuje również sha384- i sha512-. Podczas generowania skrótu nie dołączaj tagów. Również wielkość liter i spacje są ważne, w tym spacje początkowe lub końcowe.

Korzystając z Chrome 40 lub nowszego, możesz otworzyć DevTools, a następnie ponownie załadować stronę. Karta Konsola będzie zawierać komunikaty o błędach z poprawnym hashem sha256 dla każdego z wbudowanych skryptów.

Ten mechanizm istnieje już od jakiegoś czasu, więc obsługa przeglądarki jest prawdopodobnie całkiem dobra, po prostu sprawdź.

Ponadto, jeśli chcesz mieć pewność, że starsze niezgodne przeglądarki nie są niezabezpieczone, możesz dołączyć synchroniczny skrypt przekierowania u góry strony, na co nie zezwalają zasady.

Fabio Beltramini
źródło
istnieje już od jakiegoś czasu, ale obsługa przeglądarek nie jest zbyt dobra. caniuse.com/subresource-integrity
Sp0T
@ Sp0t - Integralność zasobów podrzędnych (o czym jest łącze) to mechanizm w innych odpowiedziach. Moja odpowiedź dotyczy polityki bezpieczeństwa treści, która ma znacznie lepsze wsparcie
Fabio Beltramini
3

Jest ważna kwestia dotycząca tego, co ten rodzaj podpisywania może, a czego nie może zrobić. To może chronić użytkownika przed atakami hipotetycznych, w których ktoś modyfikuje kod. Nie może zapewnić Twojej witryny, że kod jest wykonywanym kodem. Innymi słowy, nadal nie możesz ufać niczemu, co przychodzi do Twojej witryny od klienta.

ddyer
źródło
2

Jeśli Twój model przeciwnika pozwala atakującemu na modyfikowanie plików JavaScript w momencie, gdy są one dostarczane z CDN, wówczas Twój model przeciwnika pozwala atakującemu na modyfikację źródła odsyłającego w momencie, gdy jest ono dostarczane, w celu usunięcia wszelkich prób weryfikacji, zmiany adresu źródłowego na inny niż CDN i / lub całkowicie usunąć odniesienie do JavaScript.

I nie otwierajmy puszki z robakami, w której aplikacja może określić, czy program rozpoznawania nazw użytkownika poprawnie rozwiązuje problem w sieci CDN za pośrednictwem żądań HTTP (lub innego mechanizmu, który nie ma zweryfikowanego łańcucha zaufania).

/ etc / hosts:

#  ...
1.2.3.4    vile-pirates.org    trustworthy.cdn
#  ...
Eric Towers
źródło
2
Pierwsze zdanie jest ewidentnie nieprawdziwe. Co się stanie, jeśli strona odsyłająca jest ładowana przez HTTPS, a plik JavaScript jest ładowany przez HTTP-nie-S?
user253751
A co, jeśli zagrożona jest sama sieć CDN, ale nie Twój własny serwer?
Ajedi, 32
@immibis: Zakładam, że OP nie jest tak irracjonalny, aby proponować taki scenariusz.
Eric Towers
1
@immibis Czy nie dlatego przeglądarki generalnie nie pozwalają stronom HTTPS na ładowanie JS przez HTTP?
Barmar
1
@immibis Mówiłem, że to poprawia sytuację, która nie jest nawet możliwa, ponieważ przeglądarki tego nie pozwalają.
Barmar
1

Możesz to zapewnić dzięki Integralności Subresource. Wiele publicznych sieci CDN zawiera skróty SRI w osadzanym kodzie oferowanym na stronach internetowych CDN. Na przykład na PageCDN, po kliknięciu pliku jquery na stronie jQuery CDN , możesz skopiować adres URL lub użyć tagu script zawierającego hash SRI, jak poniżej:

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

Po załadowaniu strony przeglądarka wyśle ​​żądanie dotyczące tego zasobu, a po zakończeniu żądania dopasuje hash otrzymanego pliku z wartością podaną jako wartość integralności w tagu skryptu. Jeśli oba skróty nie pasują, przeglądarka odrzuci plik jquery.

W tej chwili ta funkcja jest obsługiwana przez 91% przeglądarek na całym świecie. Więcej szczegółów na temat caniuse .

5377037
źródło