Cải thiện tính bảo mật và quyền riêng tư bằng cách cập nhật Bộ nhớ đệm HTTP

Việc quên hoặc sử dụng tiêu đề Kiểm soát bộ nhớ đệm sai mục đích có thể ảnh hưởng tiêu cực đến tính bảo mật của trang web và quyền riêng tư của người dùng.

Arthur Sonzogni
Arthur Sonzogni

Theo mặc định, các tài nguyên luôn được phép lưu vào bộ nhớ đệm bằng mọi loại bộ nhớ đệm. Việc không sử dụng hoặc sử dụng tiêu đề Cache-Control sai mục đích có thể ảnh hưởng tiêu cực đến tính bảo mật của trang web và quyền riêng tư của người dùng.

Đối với những câu trả lời được cá nhân hoá mà bạn muốn giữ ở chế độ riêng tư, bạn nên:

  • Ngăn bên trung gian lưu tài nguyên vào bộ nhớ đệm. Đặt Cache-Control: private.
  • Đặt khoá bộ nhớ đệm phụ thích hợp. Nếu phản hồi thay đổi do cookie (có thể xảy ra khi cookie lưu trữ thông tin đăng nhập), hãy đặt Vary: Cookie.

Hãy đọc tiếp để tìm hiểu lý do tại sao điều này lại quan trọng và khám phá:

  1. Các vấn đề về bảo mật và quyền riêng tư mà bạn có thể không biết
  2. Các loại bộ nhớ đệm HTTP và những quan niệm sai lầm phổ biến
  3. Hành động được đề xuất cho các trang web có giá trị cao

Tài nguyên bị rò rỉ từ các lỗ hổng bảo mật Spectre

Lỗ hổng Spectre cho phép một trang đọc bộ nhớ của quy trình hệ điều hành. Điều này có nghĩa là kẻ tấn công có thể có được quyền truy cập trái phép vào dữ liệu nhiều nguồn gốc. Do đó, các trình duyệt web hiện đại đã hạn chế việc sử dụng một số tính năng (chẳng hạn như SharedArrayBuffer hoặc bộ tính giờ độ phân giải cao) cho các trang có tính năng tách biệt nhiều nguồn gốc.

Các trình duyệt web hiện đại thực thi Chính sách về trình nhúng trên nhiều nguồn gốc (COEP). Điều này đảm bảo các tài nguyên nhiều nguồn gốc sẽ là:

  • Tài nguyên công khai, được yêu cầu không có cookie
  • Các tài nguyên được cho phép chia sẻ trên nhiều nguồn gốc một cách rõ ràng, thông qua CORS hoặc tiêu đề CORP

Việc thiết lập COEP không ngăn chặn kẻ tấn công khai thác Spectre. Tuy nhiên, điều này đảm bảo rằng các tài nguyên nhiều nguồn gốc không có giá trị đối với kẻ tấn công (khi được trình duyệt tải dưới dạng tài nguyên công khai) hoặc được phép chia sẻ với kẻ tấn công (khi được chia sẻ với CORP: cross-origin).

Việc lưu vào bộ nhớ đệm của HTTP ảnh hưởng như thế nào đến Spectre?

Nếu tiêu đề Cache-Control không được đặt đúng cách, kẻ tấn công có thể thực hiện một cuộc tấn công. Ví dụ:

  1. Tài nguyên đã xác thực sẽ được lưu vào bộ nhớ đệm.
  2. Kẻ tấn công tải một trang được tách biệt trên nhiều nguồn gốc.
  3. Kẻ tấn công yêu cầu lại tài nguyên.
  4. COEP:credentialless do trình duyệt thiết lập, do đó, tài nguyên được tìm nạp mà không cần cookie. Tuy nhiên, bộ nhớ đệm có thể trả về phản hồi đã được xác thực.
  5. Sau đó, kẻ tấn công có thể đọc tài nguyên được cá nhân hoá bằng cuộc tấn công Spectre.

Mặc dù bộ nhớ đệm HTTP của trình duyệt web không cho phép kiểu tấn công này xảy ra trong thực tế, nhưng có thêm các bộ nhớ đệm bổ sung nằm ngoài tầm kiểm soát trực tiếp của trình duyệt. Điều này có thể giúp cuộc tấn công này thành công.

Quan niệm sai lầm thường gặp về bộ nhớ đệm HTTP

1. Các tài nguyên chỉ được trình duyệt lưu vào bộ nhớ đệm

Thường có nhiều lớp bộ nhớ đệm. Một số bộ nhớ đệm dành riêng cho một người dùng, một số dành riêng cho nhiều người dùng. Một số phần tử do máy chủ kiểm soát, một số phần tử do người dùng kiểm soát và một số phần tử do bên trung gian kiểm soát.

  • Bộ nhớ đệm của trình duyệt. Các bộ nhớ đệm này do một người dùng sở hữu và dành riêng, được triển khai trong trình duyệt web của họ. Các thuộc tính này giúp cải thiện hiệu suất bằng cách tránh tìm nạp cùng một phản hồi nhiều lần.
  • Proxy cục bộ. Tệp này có thể do người dùng cài đặt nhưng cũng có thể do các bên trung gian quản lý: công ty, tổ chức hoặc nhà cung cấp dịch vụ Internet của họ. Proxy cục bộ thường lưu một phản hồi vào bộ nhớ đệm duy nhất cho nhiều người dùng, tạo thành bộ nhớ đệm "công khai". Proxy cục bộ có nhiều vai trò.
  • Bộ nhớ đệm của máy chủ gốc / CDN. Việc này do máy chủ kiểm soát. Mục tiêu của bộ nhớ đệm máy chủ gốc là giảm tải trên máy chủ gốc bằng cách lưu cùng một phản hồi vào bộ nhớ đệm cho nhiều người dùng. Mục tiêu của CDN cũng tương tự nhau, nhưng trải rộng trên toàn cầu và được chỉ định cho nhóm người dùng gần nhất để giảm độ trễ.
Thường có nhiều lớp bộ nhớ đệm giữa trình duyệt và máy chủ.
Có thể có nhiều lớp bộ nhớ đệm giữa trình duyệt và máy chủ. Ví dụ: bạn có thể gặp bộ nhớ đệm của máy chủ, theo sau là CDN và bộ nhớ đệm của trình duyệt. Bạn cũng có thể thiết lập proxy cục bộ giữa CDN và bộ nhớ đệm của trình duyệt.

2. SSL ngăn các bên trung gian lưu tài nguyên HTTPS vào bộ nhớ đệm

Nhiều người dùng thường xuyên sử dụng các proxy được định cấu hình cục bộ cho mục đích truy cập (chẳng hạn như chia sẻ kết nối có đo lượng dữ liệu), kiểm tra virus hay ngăn chặn mất dữ liệu (DLP). Bộ nhớ đệm trung gian đang tiến hành chặn TLS.

Bộ nhớ đệm trung gian thường được cài đặt trên các máy trạm của nhân viên của công ty. Các trình duyệt web được định cấu hình để tin cậy chứng chỉ của proxy cục bộ.

Cuối cùng, một số tài nguyên HTTPS có thể được các proxy cục bộ này lưu vào bộ nhớ đệm.

Cách hoạt động của bộ nhớ đệm HTTP

  • Theo mặc định, các tài nguyên được phép ngầm ẩn lưu vào bộ nhớ đệm.
  • Khoá bộ nhớ đệm chính bao gồm URL và phương thức. (URL, phương thức)
  • Khoá bộ nhớ đệm phụ là các tiêu đề có trong tiêu đề Vary. Vary: Cookie cho biết phản hồi phụ thuộc vào Cookie.
  • Tiêu đề Cache-Control cung cấp khả năng kiểm soát chi tiết hơn.

Nhà phát triển các trang web có giá trị cao, bao gồm các trang web có lưu lượng truy cập cao và các trang web tương tác với thông tin nhận dạng cá nhân, nên hành động ngay bây giờ để cải thiện khả năng bảo mật.

Rủi ro lớn nhất xảy ra khi quyền truy cập vào một tài nguyên thay đổi tuỳ thuộc vào cookie. Bộ nhớ đệm trung gian có thể trả về phản hồi đã được yêu cầu bằng cookie cho một yêu cầu không được yêu cầu nếu không có hành động ngăn chặn nào được thực hiện.

Bạn nên thực hiện một trong các bước sau:

  • Ngăn bên trung gian lưu tài nguyên vào bộ nhớ đệm. Đặt Cache-Control: private.
  • Đặt khoá bộ nhớ đệm phụ thích hợp. Nếu phản hồi thay đổi do cookie (có thể xảy ra khi cookie lưu trữ thông tin đăng nhập), hãy đặt Vary: Cookie.

Cụ thể, hãy thay đổi hành vi mặc định: luôn xác định Cache-Control hoặc Vary.

Các yếu tố cần cân nhắc khác

Có nhiều hình thức tấn công tương tự khác sử dụng bộ nhớ đệm HTTP, nhưng những hình thức tấn công đó dựa vào một cơ chế khác với cơ chế tách biệt nhiều nguồn gốc. Ví dụ: Jake Archibald mô tả một số cuộc tấn công trong bài viết Cách giành chiến thắng tại CORS.

Một số trình duyệt web giảm thiểu các cuộc tấn công này. Chúng phân tách bộ nhớ đệm HTTP tuỳ thuộc vào việc phản hồi tài nguyên có được yêu cầu bằng thông tin xác thực hay không. Kể từ năm 2022, Firefox sẽ chia bộ nhớ đệm, còn Chrome và Safari thì không. Chrome có thể chia tách bộ nhớ đệm trong tương lai. Xin lưu ý rằng các cuộc tấn công này khác nhau và bổ sung cho việc chia tách cuộc tấn công theo nguồn gốc cấp cao nhất.

Ngay cả khi vấn đề này có thể được giảm thiểu cho trình duyệt web, vấn đề vẫn sẽ vẫn còn trong bộ nhớ đệm proxy cục bộ. Do đó, bạn vẫn nên làm theo các đề xuất ở trên.


Ảnh tiêu đề của Ben Pattinson trên Unsplash.