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ể dùng để đọc (tệ nhất là) bộ nhớ tuỳ ý — bao gồm cả bộ nhớ không thuộc về quy trình đó. Các lỗ hổng bảo mật này được đặt tên là SpectreMeltdown. Chrome đang làm gì để giúp bảo mật web và các 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 phải đảm bảo luôn cập nhật hệ điều hành và trình duyệt của mình. Ngoài ra, người dùng Chrome có thể cân nhắc việ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 sẽ tư vấn cho bạn:

  • Khi có thể, hãy ngăn cookie đi 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.
  • Hãy đảm bảo 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 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 Cô lập 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 đang thắc mắc tại sao những 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ề những 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, tôi khuyên 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à đáng lẽ ra nó không thể làm được. Đôi khi, nhiều tài liệu từ các trang web khác nhau có thể chia sẻ một quá trình trong Chrome. Điều này có thể xảy ra khi một người mở thư mục 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ể của người dùng, có khả năng một trang web khác có thể sử dụng các lỗ hổng bảo mật 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

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 bằng 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à "Tách biệt trang web":

Tính năng cách ly 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 kiểm thử thực tế nhiều 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 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 gửi lỗi và cho biết bạn đã bật tính năng Tách biệt 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 thông tin nhạy cảm làm rò rỉ thông tin này, tính năng Tách biệt trang web sẽ bao gồm tính năng "chặn tài liệu trên nhiều trang web" nhằm giới hạn các phản hồi trên mạng được gửi đến quy trình kết xuấ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à tệp HTML, XML, JSON và văn bản. Trang web có thể nhận tài liệu từ miền của trang web đó hoặc từ các miền khác có tiêu đề CORS được phép. Tài nguyên bao gồm những thứ như hình ảnh, JavaScript, CSS và phông chữ. Bạn có thể lấy tài nguyên từ bất kỳ trang web nào.

Chính sách chặn tài liệu trên nhiều trang web ngăn chặn một quá 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. Chúng có tiêu đề phản hồi HTTP X-Content-Type-Options: nosniff hoặc tính năng phân tích nội dung nhanh (“nắm bắt”) nhằm xác nhận rằng loại thông tin 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ặn theo chính sách này 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, chẳng hạn như <img src="https://yourbank.com/balance.json">. Nếu không có tính năng Tách biệt 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 định dạng hình ảnh này không hợp lệ và không kết xuất hình ảnh. Tuy nhiên, với Spectre, hiện có một cách để có thể đọc phần 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 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ó 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 phân tích phản hồi để đảm bảo loại MIME là chính xác. Kỹ thuật phân tích này không hoàn hảo, vì vậy, nếu bạn chắc chắn rằng bạn đang đặt tiêu đề Content-Type chính xác trên trang web của mình, 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 của bạn.

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 Tách biệt 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">. Phương thức này chỉ hiệu quả nếu yourbank.com đã lưu trữ cookie tự động đăng nhập cho 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 sử dụng thẻ <img> đưa ra. Cookie SameSite là một thuộc tính mới chỉ định rằng chỉ nên đính kèm cookie 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. Rất tiếc, tại thời điểm viết, 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ủ chứ không phải bởi JavaScript ứng dụng, bạn có thể ngăn dữ liệu của cookie tham gia vào quy trình kết xuất đồ hoạ. Bạn có thể đặt thuộc tính cookie HTTPOnly để ngăn không cho truy cập cookie này 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ể giúp hạn chế mức độ lộ dữ liệu cookie cho quy trình 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ở sẽ có quyền truy cập vào đối tượng window của bạn, có thể chuyển trang đến một URL khác và tính năng Cách ly trang web sẽ hoạt động tương tự 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, 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(), 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ó thực hiện 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 trình thực thi 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ộ tính giờ. Hiện tại, các trình duyệt quyết định tắt SharedArrayBuffer cho đến khi có các biện pháp giảm thiểu khác.

V8

Để khai thác Spectre, bạn cần có một chuỗi lệnh được tạo thủ công dành riêng cho CPU. Nhóm V8 đã triển khai các biện pháp giảm thiểu cho các bằng chứng tấn công đã biết về khái niệm và đang nghiên cứu các thay đổi trong TurboFan (trình biên dịch tối ưu hoá của họ) nhằm đảm bảo an toàn cho mã đã tạo 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 này về việc tạo mã có thể khiến hiệu suất bị phạ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 hưởng của chúng. Tôi hy vọng bài viết này làm sáng tỏ những gì 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ó câu hỏi nào, vui lòng liên hệ với tôi trên Twitter.