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 các CPU hiện đại mà một quy trình có thể dùng để đọc (tệ nhất) 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 sẽ làm gì để giúp giữ an toàn cho web và nhà phát triển web nên làm gì cho chính trang web của họ?

Tóm tắt

người dùng duyệt web, bạn nên đảm bảo luôn cập nhật hệ điều hành và trình duyệ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à nhà phát triển web, nhóm Chrome khuyên bạn:

  • Nếu có thể, hãy ngăn cookie xâm nhập vào bộ nhớ của quá trình kết xuất bằng cách sử dụng các thuộc tính cookie SameSiteHTTPOnly, cũng như tránh đọc từ document.cookie.
  • Hãy đảm bảo các loại MIME của bạn là chính xác 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 trên nhiều nguồn đối với những người dùng đã bật tính năng Tách biệt trang web.
  • Bật tính năng Cách ly trang webthông báo cho nhóm Chrome biết nếu việc này có gây ra sự cố cho trang web của bạn.

Nếu bạn đang thắc mắc tại sao các bước này lại hữu ích, hãy đọc tiếp!

Rủi ro

Có rất nhiều cách giải thích về các lỗ hổng này, vì vậy, tôi sẽ không giải thích thêm nữa. Nếu bạn quan tâm đến cách khai thác những lỗ hổng này, 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ó khả năng cho phép một quy trình đọc bộ nhớ mà lẽ ra nó không thể thực hiện được. Đôi khi, nhiều tài liệu từ các trang web khác nhau có thể chia sẻ một quy trình trong Chrome. Điều này có thể xảy ra khi bạn mở quảng cáo còn lại bằng window.open, <a href="..." target="_blank"> hoặc iframe. Nếu một trang web chứa dữ liệu cụ thể về người dùng, thì có khả năng một trang web khác có thể 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 Chrome và V8 đang triển khai nhiều nỗ lực để giảm thiểu mối đe doạ này.

Tách biệt trang web

Tác động của việc khai thác thành công Spectre có thể giảm đáng kể 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 đang nghiên cứu một tính năng có tên là "Cách ly trang web" để đạt được tính năng này:

Tính năng Tách biệt 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 có nhiều hoạt động kiểm thử trường nhất có thể. Nếu là nhà phát triển web, bạn nên bật tính năng Cách ly trang web và kiểm tra xem trang web của bạn có hoạt động bình thườ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 tìm thấy một trang web không hoạt động, vui lòng giúp chúng tôi bằng cách báo 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 những quy trình riêng biệt, các trang vẫn có thể yêu cầu hợp pháp một số tài nguyên phụ trên nhiều trang web, chẳng hạn như hình ảnh và JavaScript. Để giúp thông tin nhạy cảm không làm rò rỉ thông tin này, tính năng Cách ly trang web có tính năng "chặn tài liệu trên nhiều trang web" để giới hạn những phản hồi mạng nào đượ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 2 loại dữ liệu từ máy chủ: "tài liệu" và "tài nguyên". Ở đây, tài liệu là HTML, XML, JSON và tệp 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ó các tiêu đề CORS được phép. Tài nguyên bao gồm những nội dung như hình ảnh, JavaScript, CSS và phông chữ. Bạn có thể cung cấp tài nguyên trên bất cứ trang web nà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 khác nếu:

  1. Chúng có loại MIME HTML, XML, JSON hoặc MIME văn bản/đơn giản và
  2. Loại dữ liệu này sẽ có tiêu đề phản hồi HTTP X-Content-Type-Options: nosniff hoặc kết quả phân tích nội dung nhanh ("sn khảo sát") xác nhận rằng loại nội dung này 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ẽ hiển thị trong 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 thẻ <img> chứa tệp JSON chứa dữ liệu nhạy cảm 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 trình kết xuất. Lúc này, trình kết xuất sẽ nhận thấy rằng đây 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, hiện có cách để có thể đọc phần bộ nhớ đó. Việc 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 do tính năng chặn tài liệu trên nhiều trang web.

Theo chỉ số người dùng, có nhiều tệp JavaScript và CSS được phân phối cùng với loại MIME text/html hoặc text/plain. Để tránh chặn các tài nguyên vô tình bị đánh dấu là tài liệu, Chrome sẽ cố gắng nhận biết phản hồi để đảm bảo rằng loại MIME là chính xác. Khả năng đánh giá này chưa hoàn hảo, vì vậy, nếu chắc chắn rằng bạn đang đặt đúng tiêu đề Content-Type trên trang web của mình, thì 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 dùng 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ả bên trên.

SameSite cookie

Hãy quay lại ví dụ ở trên: <img src="https://yourbank.com/balance.json">. Tính năng này chỉ hoạt động nếu yourbank.com đã lưu trữ cookie tự động đăng nhập người dùng. Cookie thường được gửi cho mọi 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 cách sử dụng thẻ <img>. Cookie SameSite là một thuộc tính mới, chỉ định rằng cookie chỉ nên được đính kèm vào một yêu cầu bắt nguồn từ cùng một trang web, do đó, cookie này có tên như vậy. Rất tiếc, tại thời điểm viết bài này, chỉ Chrome và Firefox 58 trở lên 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ủ, không phải bởi JavaScript ứng dụng, thì bạn có thể ngăn dữ liệu của cookie đưa vào quy 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 việc truy cập cookie một cách rõ ràng 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ể đặt HTTPOnly, bạn có thể hạn chế việc tải dữ liệu cookie cho quy trình được kết xuất 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à quy trình không áp dụng cho tính năng Tách biệt trang web sẽ diễn ra giống như trang của bạn. Để bảo vệ trang của bạn tốt hơn, đường liên kết đến các trang bên ngoài mở trong cửa sổ mới phải luôn chỉ định rel="noopener".

Đồng hồ 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 để đọ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ộ tính giờ chính xác và đáng tin cậy.

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

Một cách khác để có bộ tính 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 sẽ đọc bộ đếm này và sử dụng bộ đếm đó làm bộ tính giờ. Hiện tại, các trình duyệt đã quyết định tắt SharedArrayBuffer cho đến khi các biện pháp giảm thiểu khác được áp dụng.

V8

Để khai thác Spectre, cần có một trình tự các lệnh CPU được tạo thủ công cụ thể. 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, đồng thời đang nghiên cứu các thay đổi trong TurboFan, trình biên dịch tối ưu hoá của họ, giúp 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ề cách tạo mã này có thể ảnh hưởng đến hiệu suất.

Giữ an toàn cho web

Có rất nhiều điều không chắc chắn về việc khám phá ra Spectre và Meltdown cũng như ý nghĩa của chúng. Tôi hy vọng bài viết này đã làm sáng tỏ những việc mà nhóm Chrome và V8 đang làm để giữ an toàn cho nền tảng web, cũng như cách nhà phát triển web có thể trợ 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ó bất kỳ câu hỏi nào, vui lòng liên hệ với tôi trên Twitter.