Làm cách nào để đảm bảo rằng các tệp JavaScript của tôi được phân phối qua CDN không bị thay đổi?


88

Tôi đang làm việc trên một kịch bản trong đó một số tệp JavaScript sẽ được lưu trữ trên CDN. Tôi muốn có một số cơ chế để khi các tệp này được tải xuống từ phía người dùng, tôi có thể đảm bảo rằng các tệp không bị giả mạo và thực sự đến từ CDN được chỉ định.

Tôi hiểu rằng nhiệm vụ rất dễ dàng nếu tôi đang sử dụng SSL, nhưng tôi vẫn muốn đảm bảo rằng các tệp phù hợp được phân phối ngay cả trên HTTP không có SSL.

Theo như tôi có thể tìm kiếm, không có cơ chế hiện có nào giống như chữ ký số cho các tệp JavaScript được hỗ trợ trên các nền tảng. Có lẽ nó không cần thiết?

Có một số phương pháp được tích hợp sẵn trong trình duyệt để xác minh tác giả của các tệp JavaScript không? Tôi có thể làm gì để thực hiện việc này một cách an toàn không?


13
Trong khi tôi thấy câu hỏi này thú vị, nó không lạc đề?
Evolutionxbox

20
tại sao bạn phân phát tệp trên http?
njzk2

12
"Nhưng tại sao không có cơ chế đó?" Vì nó thực sự khó . Khi dữ liệu của bạn đã rời khỏi máy chủ của bạn, đó là lời chúc mừng. HTTPS hữu ích nhưng nếu đó là một kết nối HTTP thuần túy thì bất kỳ quá trình xác thực nào cũng có thể không thành công (hay đúng hơn là vượt qua). Một cuộc tấn công MITM chỉ có thể sửa đổi chữ ký dự kiến ​​của bạn và / hoặc chữ ký của những gì bạn được cung cấp trước khi trình duyệt nắm được các kỳ vọng. Vì vậy, khi người dùng nhận được một số trọng tải, nó sẽ được coi là hoàn toàn an toàn ... khi nó không nhất thiết phải như vậy.
VLAZ

4
"Nhưng tại sao không có cơ chế đó?" Bởi vì đã có một giải pháp rẻ, hiệu quả và có thể áp dụng rộng rãi trong HTTPS.
Kevin Krumwiede

9
Điều này có lẽ nên nằm trên ServerFault hoặc Security, vì nó thực sự là về việc cung cấp tệp theo cách an toàn và bất kỳ mối quan hệ nào với lập trình chỉ mang tính chất tiếp tuyến như các tệp đã nói đại diện cho mã nguồn.
underscore_d

Câu trả lời:


140

Trên thực tế, một tính năng như thế này hiện đang được soạn thảo dưới tên Toàn vẹn nguồn phụ . Xem xét integritythuộc tính của <script>thẻ. Mặc dù vẫn chưa được áp dụng đầy đủ trên diện rộng , nhưng nó chỉ đáp ứng mục đích này.

integrity

Chứa siêu dữ liệu nội tuyến mà tác nhân người dùng có thể sử dụng để xác minh rằng tài nguyên được tìm nạp đã được phân phối mà không có thao tác bất ngờ. Xem Tính toàn vẹn của nguồn phụ.

Nguồn

Tính toàn vẹn của nguồn phụ (SRI) là một tính năng bảo mật cho phép trình duyệt xác minh rằng các tệp mà họ tìm nạp (ví dụ: từ CDN) được phân phối mà không cần thao tác bất ngờ. Nó hoạt động bằng cách cho phép bạn cung cấp hàm băm mật mã mà tệp được tìm nạp phải khớp.

Nguồn


Thí dụ:

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

Tuy nhiên, lưu ý rằng điều này sẽ không bảo vệ bạn khỏi các cuộc tấn công Man in the Middle nếu bạn đang chuyển tài nguyên của mình qua HTTP thuần túy. Trong trường hợp này, mã băm có thể bị kẻ tấn công giả mạo, khiến việc bảo vệ chống lại các tệp kịch bản bị thao túng trở nên vô dụng.

Vì lý do này, bạn nên luôn sử dụng kết nối HTTPS an toàn thay vì HTTP đơn thuần ngoài các biện pháp bảo mật được mô tả ở trên.


9
Tôi nghĩ điều đáng nói là kiểm tra tính toàn vẹn có thể dễ dàng bị giả mạo giả sử rằng OP có kế hoạch gửi HTML của họ trong HTTP cũng như các tệp nội dung của họ. Nếu trang web của họ là HTTPS và họ muốn phân phối nội dung qua HTTP thì hầu hết các trình duyệt sẽ không thích điều này và im lặng bỏ qua nội dung HTTP.
MonkeyZeus

3
@MonkeyZeus Điều này chỉ đúng trong trường hợp tấn công MITM hoặc nếu máy chủ của chúng tôi bị xâm phạm, đúng không? Tôi hiểu rằng câu hỏi yêu cầu rõ ràng làm thế nào để bảo vệ chống lại một CDN bị xâm phạm.
Timo

10
@TimoSta Chính xác! Nếu không có các bước kiểm tra này, ví dụ: nếu bạn bao gồm một tập lệnh từ, https://code.jquery.com/thì bất kỳ ai xâm phạm code.jquery.comđều có thể XSS trang web của bạn, bất kể có code.jquery.comđược truy cập qua HTTPS hay không . Với những kiểm tra này, kẻ tấn công chỉ có thể ngăn không cho tải các tập lệnh chứ không thể thay thế chúng bằng các tập lệnh độc hại.
Ajedi32

1
@MonkeyZeus Tôi đã thêm ghi chú vào câu trả lời của mình, nêu rõ mối quan tâm của bạn. Bạn có đồng ý với cách diễn đạt không?
Timo

1
@TimoSta Rất hay, tôi thích nó! btw, tôi đã +1 ngay cả trước khi tôi đăng nhận xét đầu tiên của mình :-)
MonkeyZeus

36

Bạn đang tìm kiếm sự toàn vẹn của nguồn phụ kiểm tra .

Ví dụ: đây là đoạn mã CDN jQuery:

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

2
Hoàn toàn vô dụng vì kẻ tấn công có thể sửa đổi trường toàn vẹn cùng lúc với họ sửa đổi tập lệnh bạn đang tải xuống.
Các cuộc đua ánh sáng trong quỹ đạo

15
@LightnessRacesinOrbit: Không phải nếu bạn kiểm soát miền của riêng mình được truy cập qua HTTPS nhưng không kiểm soát code.jquery.com. Điều này có thể bảo vệ bạn khỏi bị xâm phạm code.jquery.com.
SilverlightFox

2
@SilverlightFox: Được rồi, các cuộc tấn công chống lại MITM hoàn toàn vô dụng *
Lightness Races ở Orbit

@LightnessRacesinOrbit Có. Vẫn rất hữu ích và sẽ ngăn chặn cuộc tấn công này, ví dụ: bleepingcomputer.com/news/security/…
Adrian Mouat

6

Tuyên bố từ chối trách nhiệm: Như mọi khi, bạn chỉ nên coi các cơ chế này có ích khi sử dụng https, vì chúng có thể dễ dàng bị vô hiệu hóa qua MitM với http

Ngoài cơ chế trong các câu trả lời trên, bạn cũng có thể sử dụng tiêu đề phản hồi http chính sách bảo mật nội dung trên trang chính.

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

Nội dung-Bảo mật-Chính sách: script-src 'sha256-qznLcsROx4GACP2dm0UCKCzCG-HiZ1guq6ZZDob_Tng ='

Có một số điều cần lưu ý ở đây. Tiền tố sha * - chỉ định thuật toán được sử dụng để tạo hàm băm. Trong ví dụ trên, sha256- được sử dụng. CSP cũng hỗ trợ sha384- và sha512-. Khi tạo mã băm, không bao gồm các thẻ. Ngoài ra vấn đề viết hoa và khoảng trắng, bao gồm cả khoảng trắng đầu hoặc cuối.

Sử dụng Chrome 40 trở lên, bạn có thể mở DevTools, sau đó tải lại trang của mình. Tab Bảng điều khiển sẽ chứa các thông báo lỗi với mã băm sha256 chính xác cho mỗi tập lệnh nội tuyến của bạn.

Cơ chế này đã xuất hiện khá lâu, vì vậy hỗ trợ trình duyệt có thể khá tốt, hãy nhớ kiểm tra.

Ngoài ra, nếu bạn muốn đảm bảo rằng các trình duyệt cũ hơn không tuân thủ không an toàn, bạn có thể bao gồm một tập lệnh chuyển hướng đồng bộ ở đầu trang không được chính sách cho phép.


đã xuất hiện được một thời gian, nhưng hỗ trợ trình duyệt không tốt. caniuse.com/subresource-integrity
Sp0T

@ Sp0t - Tính toàn vẹn của nguồn phụ (liên kết của bạn nói về điều gì) là cơ chế trong các câu trả lời khác. Câu trả lời của tôi là về chính sách bảo mật nội dung, trong đó có nhiều hỗ trợ tốt hơn
Fabio Beltramini

3

Có một điểm quan trọng về những gì loại ký kết này có thể và không thể làm. Nó có thể bảo vệ người dùng khỏi các cuộc tấn công giả định trong đó ai đó sửa đổi mã của bạn. Nó không thể đảm bảo với trang web của bạn rằng mã của bạn là mã đang được thực thi. Nói cách khác, bạn vẫn không thể tin tưởng bất cứ thứ gì đến trang web của bạn từ khách hàng.


2

Nếu mô hình đối thủ của bạn cho phép kẻ tấn công sửa đổi các tệp JavaScript khi chúng được gửi từ CDN, thì mô hình đối thủ của bạn cho phép kẻ tấn công sửa đổi nguồn giới thiệu khi nó được phân phối để loại bỏ bất kỳ nỗ lực xác minh nào, nhằm thay đổi địa chỉ nguồn thành khác CDN và / hoặc để xóa toàn bộ tham chiếu đến JavaScript.

Và không cho phép mở hộp sâu về cách ứng dụng của bạn có thể xác định xem trình phân giải của người dùng có đang phân giải chính xác CDN thông qua yêu cầu HTTP hay không (hoặc bất kỳ cơ chế nào khác không có chuỗi tin cậy được xác minh).

/ etc / hosts:

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

2
Câu đầu tiên rõ ràng là không đúng sự thật. Điều gì sẽ xảy ra nếu trang giới thiệu được tải qua HTTPS và tệp JavaScript được tải qua HTTP-not-S?
user253751

Hoặc điều gì sẽ xảy ra nếu bản thân CDN bị xâm phạm, nhưng không phải máy chủ của riêng bạn?
Ajedi32

@immibis: Tôi chọn giả sử OP không quá phi lý khi đề xuất một kịch bản như vậy.
Eric Towers

1
@immibis Đó không phải là lý do tại sao các trình duyệt thường không cho phép các trang HTTPS tải JS qua HTTP?
Barmar

1
@immibis Tôi đã nói rằng nó cải thiện một tình huống thậm chí không thể xảy ra, vì trình duyệt không cho phép nó.
Barmar

1

Bạn có thể đảm bảo điều này với Tính toàn vẹn của nguồn phụ. Nhiều CDN công khai bao gồm các băm SRI trong mã nhúng được cung cấp trên các trang web CDN. Ví dụ: trên PageCDN, khi bạn nhấp vào tệp jquery trên trang jQuery CDN , bạn sẽ có tùy chọn sao chép URL hoặc sử dụng thẻ script có chứa hàm băm SRI như bên dưới:

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

Khi tải trang, trình duyệt sẽ đưa ra một yêu cầu cho tài nguyên này và khi hoàn thành yêu cầu, nó sẽ khớp băm của tệp đã nhận với một được cung cấp dưới dạng giá trị toàn vẹn trong thẻ tập lệnh. Nếu cả hai hàm băm không khớp, trình duyệt sẽ loại bỏ tệp jquery.

Hiện tại, tính năng này được hỗ trợ bởi 91% trình duyệt trên toàn thế giới. Thêm chi tiết về caniuse .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.