Tan chảy/Bóng ma

Tổng quan

Vào ngày 3 tháng 1, Project Zero đã tiết lộ các lỗ hổng trong CPU hiện đại mà một quy trình có thể sử dụng để đọc (tối thiểu) bộ nhớ tuỳ ý — bao gồm cả bộ nhớ không thuộc quy trình đó. Các lỗ hổng này được đặt tên là SpectreMeltdown. Chrome đang làm gì để giúp bảo mật web và nhà phát triển web nên làm gì cho trang web của riêng họ?

Tóm tắt

người dùng duyệt web, bạn nên đảm bảo rằng hệ điều hành và trình duyệt của mình luôn được cập nhật. Ngoài ra, người dùng Chrome có thể cân nhắc bật tính năng Tách biệt trang web.

Nếu bạn là một nhà phát triển web, nhóm Chrome khuyên bạn:

  • Khi có thể, hãy ngăn cookie xâm nhập vào bộ nhớ của quy trình kết xuất bằng cách sử dụng các thuộc tính cookie SameSiteHTTPOnly, đồng thời tránh đọc từ document.cookie.
  • Đảm bảo rằng bạn đã sử dụng đúng loại MIME và chỉ định tiêu đề X-Content-Type-Options: nosniff cho mọi URL có nội dung nhạy cảm hoặc dành riêng cho người dùng để khai thác tối đa tính năng Chặn đọc giữa các nguồn gốc cho những người dùng đã bật tính năng Cách ly trang web.
  • Bật tính năng Tách biệt trang webcho nhóm Chrome biết nếu tính năng này gây ra sự cố cho trang web của bạn.

Nếu bạn thắc mắc vì sao các bước này có thể giúp ích, hãy đọc tiếp!

Rủi ro

Đã có nhiều nội dung giải thích về các lỗ hổng này, vì vậy, tôi sẽ không thêm một nội dung giải thích nào khác. Nếu bạn quan tâm đến cách các lỗ hổng này có thể bị khai thác, bạn nên xem bài đăng trên blog của các đồng nghiệp trong nhóm Google Cloud.

Cả Meltdown và Spectre đều có thể cho phép một quy trình đọc bộ nhớ mà quy trình đó không được phép. Đôi khi, nhiều tài liệu từ các trang web khác nhau có thể kết thúc bằng cách chia sẻ một quy trình trong Chrome. Điều này có thể xảy ra khi một thành phần đã mở thành phần khác bằng window.open, <a href="..." target="_blank"> hoặc iframe. Nếu một trang web chứa dữ liệu dành riêng cho người dùng, thì có khả năng một trang web khác có thể sử dụng các lỗ hổng mới này để đọc dữ liệu người dùng đó.

Giải pháp giảm thiểu

Nhóm kỹ thuật của Chrome và V8 đang triển khai nhiều biện pháp để giảm thiểu mối đe doạ này.

Cách ly trang web

Bạn có thể giảm đáng kể tác động của việc khai thác thành công Spectre bằng cách ngăn dữ liệu nhạy cảm chia sẻ quy trình với mã do kẻ tấn công kiểm soát. Nhóm Chrome đã và đang nỗ lực phát triển một tính năng có tên là "Tách biệt trang web" để đạt được mục tiêu này:

Tính năng Tách trang web chưa được bật theo mặc định vì có một số vấn đề đã biết và nhóm Chrome muốn thử nghiệm nhiều trường hợp thực tế nhất có thể. Nếu là nhà phát triển web, bạn nên bật tính năng Tách biệt trang web và kiểm tra xem trang web của mình có còn hoạt động hay không. Nếu bạn muốn chọn sử dụng ngay, hãy bật chrome://flags#enable-site-per-process. Nếu bạn thấy một trang web không hoạt động, vui lòng giúp chúng tôi bằng cách gửi lỗi và đề cập rằng bạn đã bật tính năng Cách ly trang web.

Chặn tài liệu trên nhiều trang web

Ngay cả khi tất cả các trang trên nhiều trang web được đưa vào các quy trình riêng biệt, các trang vẫn có thể yêu cầu một số tài nguyên phụ trên nhiều trang web một cách hợp pháp, chẳng hạn như hình ảnh và JavaScript. Để giúp ngăn chặn thông tin nhạy cảm bị rò rỉ, tính năng Cách ly trang web bao gồm tính năng "chặn tài liệu trên nhiều trang web". Tính năng này giới hạn những phản hồi mạng được phân phối đến quy trình trình kết xuất.

Một trang web có thể yêu cầu hai loại dữ liệu từ máy chủ: "tài liệu" và "tài nguyên". Ở đây, tài liệu là các tệp HTML, XML, JSON và văn bản. Một trang web có thể nhận tài liệu từ miền của chính trang web đó hoặc từ các miền khác có tiêu đề CORS cho phép. Tài nguyên bao gồm các thành phần như hình ảnh, JavaScript, CSS và phông chữ. Bạn có thể đưa tài nguyên từ bất kỳ trang web nào vào.

Chính sách chặn tài liệu trên nhiều trang web ngăn một quy trình nhận "tài liệu" từ các nguồn gốc khác nếu:

  1. Chúng có loại MIME là HTML, XML, JSON hoặc văn bản/văn bản thuần tuý và
  2. Các URL này có tiêu đề phản hồi HTTP X-Content-Type-Options: nosniff hoặc một bản phân tích nội dung nhanh (“quét”) xác nhận rằng loại URL là chính xác
  3. CORS không cho phép truy cập vào tài liệu một cách rõ ràng

Các tài liệu bị chính sách này chặn sẽ được trình bày cho quy trình dưới dạng trống, mặc dù yêu cầu vẫn diễn ra trong nền.

Ví dụ: Hãy tưởng tượng một kẻ tấn công tạo một thẻ <img> có chứa một tệp JSON chứa dữ liệu nhạy cảm, chẳng hạn như <img src="https://yourbank.com/balance.json">. Nếu không có tính năng Cách ly trang web, nội dung của tệp JSON sẽ được đưa vào bộ nhớ của quy trình kết xuất, tại thời điểm đó, trình kết xuất sẽ nhận thấy rằng đó không phải là định dạng hình ảnh hợp lệ và không hiển thị hình ảnh. Tuy nhiên, với Spectre, giờ đây, có một cách để có thể đọc khối bộ nhớ đó. Tính năng chặn tài liệu trên nhiều trang web sẽ ngăn nội dung của tệp này xâm nhập vào bộ nhớ của quy trình mà trình kết xuất đang chạy vì loại MIME bị chặn bởi tính năng chặn tài liệu trên nhiều trang web.

Theo chỉ số người dùng, có rất nhiều tệp JavaScript và CSS được phân phối bằng loại MIME text/html hoặc text/plain. Để tránh chặn các tài nguyên vô tình được đánh dấu là tài liệu, Chrome sẽ cố gắng đánh hơi phản hồi để đảm bảo loại MIME là chính xác. Tính năng này không hoàn hảo, vì vậy, nếu bạn chắc chắn rằng mình đang đặt đúng tiêu đề Content-Type trên trang web, nhóm Chrome khuyên bạn nên thêm tiêu đề X-Content-Type-Options: nosniff vào tất cả các phản hồi.

Nếu bạn muốn thử tính năng chặn tài liệu trên nhiều trang web, hãy chọn sử dụng tính năng Cách ly trang web như mô tả ở trên.

SameSite cookie

Hãy quay lại ví dụ trên: <img src="https://yourbank.com/balance.json">. Điều này chỉ hoạt động nếu yourbank.com đã lưu trữ một cookie tự động đăng nhập người dùng. Cookie thường được gửi cho tất cả các yêu cầu đến trang web đặt cookie, ngay cả khi yêu cầu đó do bên thứ ba thực hiện bằng thẻ <img>. Cookie SameSite là một thuộc tính mới chỉ định rằng cookie chỉ được đính kèm vào một yêu cầu bắt nguồn từ cùng một trang web, do đó có tên như vậy. Đáng tiếc là tại thời điểm viết bài này, chỉ Chrome và Firefox 58 trở lên mới hỗ trợ thuộc tính này.

HTTPOnlydocument.cookie

Nếu cookie của trang web chỉ được sử dụng phía máy chủ chứ không phải JavaScript của máy khách, thì bạn có thể ngăn dữ liệu của cookie đi vào quy trình trình kết xuất. Bạn có thể đặt thuộc tính cookie HTTPOnly. Thuộc tính này ngăn chặn rõ ràng việc truy cập vào cookie thông qua tập lệnh phía máy khách trên các trình duyệt được hỗ trợ, chẳng hạn như Chrome. Nếu không thể thiết lập HTTPOnly, bạn có thể giúp giới hạn việc hiển thị dữ liệu cookie tải cho quy trình hiển thị bằng cách không đọc document.cookie trừ phi thực sự cần thiết.

Khi bạn liên kết đến một trang khác bằng target="_blank", trang đã mở có quyền truy cập vào đối tượng window, có thể chuyển trang của bạn đến một URL khác và nếu không có tính năng Cách ly trang web, trang đó sẽ có cùng quy trình với trang của bạn. Để bảo vệ trang của bạn tốt hơn, các đường liên kết đến trang bên ngoài mở trong một cửa sổ mới phải luôn chỉ định rel="noopener".

Bộ hẹn giờ có độ phân giải cao

Để khai thác Meltdown hoặc Spectre, kẻ tấn công cần đo lường thời gian cần thiết để đọc một giá trị nhất định từ bộ nhớ. Để làm được điều này, bạn cần có một bộ hẹn giờ đáng tin cậy và chính xác.

Một API mà nền tảng web cung cấp là performance.now(), có độ chính xác đến 5 micro giây. Để giảm thiểu vấn đề này, tất cả các trình duyệt lớn đều giảm độ phân giải của performance.now() để khó thực hiện các cuộc tấn công hơn.

Một cách khác để có bộ hẹn giờ có độ phân giải cao là sử dụng SharedArrayBuffer. Vùng đệm được một worker chuyên dụng sử dụng để tăng bộ đếm. Luồng chính đọc bộ đếm này và sử dụng bộ đếm đó làm bộ hẹn giờ. Hiện tại, các trình duyệt đã quyết định tắt SharedArrayBuffer cho đến khi có biện pháp giảm thiểu khác.

V8

Để khai thác Spectre, bạn cần có một trình tự hướng dẫn CPU được tạo một cách đặc biệt. Nhóm V8 đã triển khai các biện pháp giảm thiểu cho các bằng chứng về khái niệm tấn công đã biết và đang nỗ lực thay đổi TurboFan, trình biên dịch tối ưu hoá của họ, để đảm bảo mã được tạo an toàn ngay cả khi các cuộc tấn công này được kích hoạt. Tuy nhiên, những thay đổi về việc tạo mã này có thể gây ra một mức phạt về hiệu suất.

Giữ an toàn cho web

Có rất nhiều điều không chắc chắn xung quanh việc phát hiện ra Spectre và Meltdown cũng như những tác động của các lỗ hổng này. Tôi hy vọng bài viết này giúp làm sáng tỏ những việc mà nhóm Chrome và V8 đang làm để đảm bảo an toàn cho nền tảng web, cũng như cách nhà phát triển web có thể giúp đỡ bằng cách sử dụng các tính năng bảo mật hiện có. Nếu bạn có câu hỏi, hãy liên hệ với tôi trên Twitter.