navigator.hardwareConcurrency và deviceMemory báo gì, thô đến mức nào, và vì sao trang web dùng chúng để phát hiện thiết bị khai báo vô lý.
Hai dòng JavaScript đủ để một trang web biết đại khái thiết bị của bạn mạnh cỡ nào: có bao nhiêu bộ xử lý logic và khoảng bao nhiêu RAM. Riêng từng con số thì không hiếm. Nhưng gộp lại, chúng xếp khách truy cập vào một hạng thiết bị: điện thoại phổ thông, laptop văn phòng, máy trạm. Bài này giải thích ý nghĩa từng giá trị, cách trình duyệt cố ý làm mờ chúng, và vì sao công dụng chính của chúng là kiểm tra xem thiết bị khai báo có đáng tin hay không.
Điểm chính
navigator.hardwareConcurrencybáo số bộ xử lý logic có thể chạy luồng, và trình duyệt có thể báo số nhỏ hơn số máy thật sự có.navigator.deviceMemorybáo dung lượng RAM xấp xỉ theo GiB, làm tròn về lũy thừa của 2 và bị kẹp trong các cận do bên triển khai tự quyết định. Đây là API phía Chromium; đừng mong trình duyệt nào cũng có.- Cả hai giá trị đều có entropy thấp theo thiết kế. Sức nặng của chúng đến từ việc kết hợp với kích thước màn hình, GPU và nền tảng; phép tính nằm trong bài entropy dấu vân tay và tập ẩn danh.
- Chúng hữu ích nhất làm phép kiểm tra nhất quán: thiết bị khai một hạng trong user agent nhưng báo hạng khác ở đây là tự mâu thuẫn.
- BrowserInsight hiển thị hai giá trị đúng như trình duyệt của bạn báo; phần kiểm tra bot chỉ áp một phép kiểm tra khoảng giá trị đơn giản, không đối chiếu chúng với user agent của bạn.
Vì sao có hai API này
Không API nào được tạo ra để theo dõi. Cả hai cho phép trang thích ứng với thiết bị đang chạy nó.
hardwareConcurrency dùng để chọn kích thước nhóm Web Worker. Trang MDN hardwareConcurrency đưa đúng ví dụ đó: mỗi bộ xử lý logic được báo tương ứng một Worker. Đặc tả W3C Device Memory mô tả một "tín hiệu hạng thiết bị" dùng để phục vụ phiên bản nhẹ hơn của trang cho thiết bị cấu hình thấp và chuẩn hóa chỉ số hiệu năng, để một tác vụ dài trên máy yếu được đánh giá khác với trên máy mạnh.
hardwareConcurrency: bộ xử lý logic, không phải nhân
MDN định nghĩa giá trị này là số bộ xử lý logic có thể chạy luồng trên máy tính của người dùng, từ 1 đến số mà trình duyệt có thể dùng. Có hai điểm cần lưu ý:
- Logic, không phải vật lý. CPU bốn nhân chạy hai luồng mỗi nhân có thể báo 8. Con số bạn thấy không phải số nhân.
- Có thể bị giảm. MDN nêu rằng trình duyệt có thể báo số thấp hơn để phản ánh chính xác hơn số Worker chạy được đồng thời, nên đó không phải phép đo tuyệt đối phần cứng. Chúng tôi không liệt kê quy tắc giảm của từng trình duyệt vì MDN không ấn định và chúng thay đổi; hãy xem bảng tương thích trên trang đó.
Giá trị thường gặp trên máy thật là những số như 4, 8, 12 hay 16, nên riêng con số này thu hẹp được rất ít. Mức 2 và mức 24 tất nhiên vẫn tách được khách, nhưng chỉ thành các nhóm rất rộng.
deviceMemory: cố tình thô
Device Memory API được thiết kế để không chính xác. Theo đặc tả và trang MDN deviceMemory:
- Giá trị là bộ nhớ vật lý được làm tròn về lũy thừa của 2, tính bằng GiB, nên bạn nhận 2, 4 hoặc 8 chứ không phải "7,6".
- Sau đó nó bị kẹp giữa cận dưới và cận trên do bên triển khai định nghĩa, để không lộ các dung lượng rất thấp hoặc rất cao hiếm gặp. Đặc tả cho biết bên triển khai có thể điều chỉnh các cận theo thời gian và chúng có thể khác nhau tùy loại thiết bị. Ví dụ của MDN dùng trình duyệt không báo dưới 2 hay trên 32, cho ra 2, 4, 8, 16 hoặc 32. Đó là minh họa, không phải quy tắc chung.
- Nó chỉ có trong ngữ cảnh bảo mật (HTTPS).
Máy chủ cũng nhận được cùng con số mà không cần chạy script nào, qua gợi ý máy khách Sec-CH-Device-Memory. Cơ chế này cần chủ động bật: máy chủ phải gửi trước Accept-CH: Sec-CH-Device-Memory, và MDN đánh dấu header này là thử nghiệm. Về cách đường header này nằm cạnh các gợi ý khác, xem User-Agent Client Hints.
Mức hỗ trợ không đồng đều. Safari và Firefox không cung cấp deviceMemory, nên thiếu giá trị ở đó là bình thường và được hiển thị là "không rõ", không bao giờ coi là dấu hiệu đáng ngờ. Tuy vậy, chính việc thiếu thuộc tính này vẫn cho trang biết đôi điều về engine.
Vì sao hai con số nhỏ vẫn quan trọng
Lấy một tổ hợp giá trị điển hình rồi hỏi có bao nhiêu khách trùng với bạn. Rất nhiều, và đó chính là lý do không giá trị nào đứng riêng là định danh tốt. Rủi ro xuất hiện khi chúng cộng với hàng chục tín hiệu khác như hình học màn hình, bộ kết xuất GPU và nền tảng; mỗi tín hiệu lại thu nhỏ đám đông thêm. Phép tính tập ẩn danh cho thấy vài bit entropy thấp cộng dồn ra sao, còn hướng dẫn vân tay trình duyệt liệt kê vị trí của hai giá trị này giữa các tín hiệu còn lại.
Nơi chúng quan trọng hơn: tính nhất quán
Một định danh yếu vẫn có thể là công cụ vạch trần lời nói dối rất hiệu quả. Các giá trị phải khớp với thiết bị mà trình duyệt tự nhận:
- User agent Windows máy tính để bàn mà báo 2 bộ xử lý logic và mức bộ nhớ thấp nhất thì bất thường với máy hiện đại, dù không phải không thể.
- User agent di động báo hàng chục bộ xử lý logic, hoặc dung lượng bộ nhớ vượt xa mọi điện thoại, gợi ý môi trường giả lập hoặc ảo hóa.
- User agent iPhone mà lại cung cấp giá trị
deviceMemorythì lạ, vì WebKit không có API này. - Hàng trăm khách "khác nhau" có cùng số nhân, mức bộ nhớ và kích thước màn hình trông như cùng một bản image hệ thống được nhân bản nhiều lần. Đó là mẫu hình tổng hợp đứng sau phát hiện điện thoại đám mây.
Không điều nào trong số này tự nó là bằng chứng. Chúng được cân nhắc cùng các mâu thuẫn khác, như các cặp GPU và hệ điều hành bất khả thi trong lệch phần cứng của dấu vân tay, dấu hiệu tự động hóa trong phát hiện trình duyệt headless, và nguyên tắc chung về tính nhất quán của dấu vân tay.
Công cụ riêng tư xử lý thế nào
Các chế độ tăng cường thay giá trị phần cứng chính xác bằng giá trị chung để mọi người trong nhóm trông giống nhau. Chẳng hạn chế độ resist-fingerprinting của Firefox giả navigator.hardwareConcurrency thành một giá trị cố định; giải thích resist fingerprinting bàn về các đánh đổi, kể cả việc thỉnh thoảng có trang hỏng vì giá trị bất ngờ. Mục tiêu là mở rộng tập ẩn danh, không phải tạo ra một con số giả nghe hợp lý: một số bịa ngẫu nhiên có thể dễ nhận ra như số thật. Ở phía header, trình duyệt chỉ gửi Sec-CH-Device-Memory sau khi máy chủ chủ động bật, và giá trị vốn đã thô.
BrowserInsight thực sự làm gì
Nói rõ, BrowserInsight làm hai việc. Kiểm tra dấu vân tay hiển thị hardwareConcurrency và deviceMemory đúng như trình duyệt của bạn báo, và hiển thị "không rõ" khi API không có. Trang phát hiện bot chạy phép kiểm tra hợp lý hardware_limit, chỉ xét xem các giá trị hiện có có nằm trong khoảng hợp lý hay không (số nhân từ 1 đến 64, bộ nhớ tối đa 64 GiB). Nó không đối chiếu chúng với user agent hay GPU của bạn. Mọi thao tác thu thập chạy trong trình duyệt của bạn và không gửi gì lên máy chủ.
Câu hỏi thường gặp
hardwareConcurrency có phải là số nhân CPU không? Không. Nó đếm bộ xử lý logic, có thể gấp đôi số nhân vật lý, và trình duyệt được phép báo số thấp hơn.
Vì sao deviceMemory của tôi không bao giờ là 6 hay 12? Giá trị được làm tròn về lũy thừa của 2 trước khi báo, nên dung lượng nằm giữa hai mức sẽ rơi vào mức lân cận.
Trang web có đọc được RAM của tôi mà không cần JavaScript không?
Chỉ qua gợi ý máy khách Sec-CH-Device-Memory, và chỉ khi máy chủ đã yêu cầu bằng Accept-CH và trình duyệt của bạn hỗ trợ.
Chừng này có đủ để theo dõi tôi không? Riêng nó thì không. Nó chỉ có ích cho bên theo dõi khi kết hợp với nhiều tín hiệu khác.
Kết luận
hardwareConcurrency và deviceMemory là những tín hiệu cố tình khiêm tốn: một số bộ xử lý thô và một mức bộ nhớ đã làm tròn. Giá trị thực tế của chúng nằm ở việc kiểm tra thiết bị khai báo có hợp lý không, và thêm vài bit vào một dấu vân tay lớn hơn. Hãy xem trình duyệt của bạn báo gì ở kiểm tra dấu vân tay, rồi xem phần còn lại của thiết lập có kể cùng một câu chuyện không.


