Bài viết được sự cho phép của tác giả Tống Xuân Hoài
Vấn đề
Có thể bạn đã biết, song song với việc bảo mật website ở máy chủ để đảm bảo không ai có thể truy cập được để thực hiện hành vi trái phép, thì bảo mật phía máy khách (client) cũng không hề được xem nhẹ. Mỗi năm, các trình duyệt web phổ biến luôn được cập nhật thêm các bản vá lỗ hổng bảo mật kèm với việc bổ sung các đặc tả kĩ thuật nhằm tăng tính bảo mật hơn cho trình duyệt của họ. Một trình duyệt có thể bảo vệ người dùng tối đa thì ai mà chẳng muốn sử dụng.
MIME types là một trong những đặc tả cho biết bản chất và định dạng của tài liệu, tệp hoặc phân loại byte. Lấy một ví dụ đơn giản cho dễ hình dung là một endpoint API nếu trong headers trả về có chứa thuộc tính Content-Type: application/json
thì ngay lập tức client sẽ biết dữ liệu trả về là ở định dạng JSON, từ đó có phương án xử lý phù hợp thay vì phải cố “đoán” xem dữ liệu trả về là text, image hay video…
Nếu không có Content-Type
hoặc ở một số trình duyệt không “thích” kiểm tra Content-Type
thì nó sẽ tiến hành một cuộc “dò tìm” xem dữ liệu trả về ở dạng nào. Điều này vô tình tạo ra một cuộc tấn công gọi là “MIME Sniffing”.
MIME Sniffing là gì?
MIME Sniffing đã và đang là một kỹ thuật được một số trình duyệt web (chủ yếu là Internet Explorer) sử dụng để kiểm tra nội dung của một nội dung cụ thể. Việc này được thực hiện nhằm mục đích xác định định dạng tệp của nội dung phản hồi. Kỹ thuật này hữu ích trong trường hợp không có đủ thông tin như
Content-Type
cho một nội dung cụ thể, do đó có khả năng trình duyệt diễn giải nội dung không chính xác.
Mặc dù việc dò tìm MIME có thể hữu ích để xác định định dạng tệp chính xác của nội dung nhưng nó cũng có thể gây ra lỗ hổng bảo mật. Lỗ hổng này có thể khá nguy hiểm cho cả chủ sở hữu cũng như khách truy cập trang web. Điều này là do kẻ tấn công có thể tận dụng khả năng “dò tìm” MIME để thực hiện một cuộc tấn công XSS (Cross Site Scripting).
Mô tả quá trình MIME Sniffing khá đơn giản. Bao gồm các bước chính sau:
- Trình duyệt web yêu cầu một nội dung cụ thể phản hồi không có loại nội dung hoặc loại nội dung được đặt trước đó tại máy chủ gốc.
- Trình duyệt web “dò tìm” nội dung để phân tích nội dung cụ thể đó là định dạng tệp nào.
- Khi trình duyệt đã hoàn thành phân tích, nó sẽ so sánh những gì nó tìm thấy với những gì máy chủ web cung cấp trong Content-Type tiêu đề (nếu có). Nếu có sự không khớp, trình duyệt sẽ sử dụng loại MIME mà nó xác định là được liên kết với nội dung.
Giả sử trang web của bạn cho phép người dùng upload tệp tin lên máy chủ. Bạn chỉ chấp nhận định dạng ảnh cụ thể là JPG. Kẻ tấn công nhanh trí đổi đuôi một tệp HTML thành .jpg rồi tải tệp lên. Khi đó nếu trình duyệt thực hiện “dò tìm” MIME khi cố gắng hiển thị hình ảnh, khả năng cao đoạn mã HTML sẽ được thực thi ở trình duyệt.
Tham khảo việc làm HTML & CSS hấp dẫn trên TopDev
Cách thiết lập ngăn trình duyệt dò tìm MIME
Hầu hết các trình duyệt hiện nay đều tôn trọng tiêu đề này, bao gồm Chrome/Chromium, Edge, IE >= 8.0, Firefox >= 50 và Safari >= 11.
Để thiết lập, bạn chỉ cần đặt X-Content-Type-Options: nosniff
trong phản hồi của headers HTTP của máy chủ.
Ví dụ, nếu bạn đang dùng nginx làm máy chủ.
server {
listen 443 ssl;
...
add_header X-Content-Type-Options nosniff;
...
Tổng kết
Mặc dù ngày nay cơ chế bảo mật này có thể là thiết lập mặc định hoặc là cấu hình “không thể thiếu” của máy chủ web. Tuy nhiên tôi hy vọng qua bài viết này cung cấp cho bạn đọc thêm một góc nhìn về tầm quan trọng của các đặc tả kỹ thuật, cũng như các hành vi có thể bị khai thác để sử dụng trong mục đích xấu bất kì lúc nào.
Bài viết gốc được đăng tải tại 2coffee.dev