Cảm biến chuyển động để lộ dấu vân tay thiết bị ổn định qua nhiễu hiệu chuẩn. iOS đã chặn bằng lời nhắc xin quyền, còn Chrome trên Android thì vẫn chưa.
Lấy dấu vân tay bằng canvas và WebGL đọc cách thiết bị kết xuất hình ảnh. Lấy dấu vân tay cảm biến đọc một thứ hoàn toàn khác: phần cứng vật lý của thiết bị chuyển động như thế nào — hay chính xác hơn, nó báo cáo một chuyển động chưa từng thực sự xảy ra ra sao. Mỗi con chip gia tốc kế, con quay hồi chuyển và từ kế đều xuất xưởng với những sai lệch sản xuất nhỏ, vĩnh viễn, và dữ liệu thô mà các chip này để lộ cho một trang web mang theo sai lệch đó như một loại chữ ký. Bài viết này xem xét cách các API DeviceMotion, DeviceOrientation và Generic Sensor để lộ tín hiệu đó, vì sao đây gần như hoàn toàn là hiện tượng của điện thoại và máy tính bảng, và vì sao lời nhắc xin quyền vốn đã chặn được kỹ thuật này trên iOS lại chưa bao giờ xuất hiện trên Android.
Tóm tắt nhanh
- Các API
DeviceMotionEventvàDeviceOrientationEventđể lộ số liệu thời gian thực từ phần cứng chuyển động của thiết bị. Các lớp mới hơn thuộc Generic Sensor API (Accelerometer,Gyroscope) đọc cùng phần cứng đó nhưng chỉ có trên Chromium — cả Safari lẫn Firefox đều không triển khai. - Dung sai sản xuất khiến mỗi chip gia tốc kế và con quay hồi chuyển mang một độ lệch và kiểu nhiễu nhỏ nhưng ổn định — một dấu vân tay hiệu chuẩn vẫn giữ nguyên qua các phiên, các trình duyệt, thậm chí sau khi khôi phục cài đặt gốc, bởi nó được khắc vào chính con chip vật lý chứ không phải trạng thái phần mềm nào cả.
- Đây là một vector chủ yếu trên di động: laptop và máy tính để bàn thường không hề có gia tốc kế hay con quay hồi chuyển, nên tín hiệu này gần như chỉ tồn tại trên điện thoại và máy tính bảng.
- Việc kiểm soát quyền bị chia đôi, chứ không phổ quát. Kể từ iOS 13, Apple yêu cầu một lời nhắc xin quyền rõ ràng, và điều đó thực sự đã đóng lại phiên bản âm thầm trên iOS. Nhưng Chromium không bao giờ hỏi: chính tài liệu thiết kế của họ quy định gia tốc kế và con quay hồi chuyển là tự động cấp quyền. Trên Android, một trang HTTPS ở cấp cao nhất đến nay vẫn có thể đọc nhiễu hiệu chuẩn mà không có bất kỳ lời nhắc nào.
- Công cụ kiểm tra dấu vân tay của BrowserInsight hiển thị các tín hiệu mà thiết bị của bạn để lộ, còn hướng dẫn lấy dấu vân tay di động giải thích tín hiệu này khớp vào bức tranh theo dõi di động rộng hơn ra sao.
Các API DeviceMotion, DeviceOrientation và Generic Sensor
Có hai thế hệ API chồng lấn nhau để lộ dữ liệu chuyển động cho một trang web. Cặp cũ hơn — DeviceMotionEvent và DeviceOrientationEvent — kích hoạt liên tục ngay khi có trình lắng nghe được gắn vào, cung cấp gia tốc, tốc độ xoay và góc định hướng dưới dạng thuộc tính sự kiện thông thường:
window.addEventListener('devicemotion', (event) => {
const { x, y, z } = event.accelerationIncludingGravity;
// x, y, z vẫn trôi nhẹ dù thiết bị nằm yên trên bàn
});
Nhóm Generic Sensor API mới hơn — Accelerometer, Gyroscope và Magnetometer — thay thế mô hình dựa trên sự kiện bằng các đối tượng cảm biến chuyên dụng mà script có thể trực tiếp khởi tạo, cấu hình và truy vấn. (Tài liệu giải thích về cảm biến chuyển động của W3C là một ghi chú nhóm làm việc mang tính phi quy chuẩn, hữu ích để hiểu mối liên hệ giữa chúng; bản thân các giao diện này được định nghĩa trong những đặc tả riêng cho từng cảm biến.)
const sensor = new Accelerometer({ frequency: 60 });
sensor.addEventListener('reading', () => {
console.log(sensor.x, sensor.y, sensor.z);
});
sensor.start();
Có hai lưu ý về phạm vi hỗ trợ. Các lớp Generic Sensor là một tính năng riêng của Chromium: Chrome, Edge và Opera có triển khai, còn Safari và Firefox không triển khai cả Accelerometer lẫn Gyroscope, nên cặp API sự kiện cũ vẫn là con đường duy nhất hoạt động trên mọi engine. Ngoài ra, ngay trong Chromium, Magnetometer nằm sau cờ thử nghiệm #enable-generic-sensor-extra-classes chứ không bật sẵn — một trang thông thường không đọc được dữ liệu từ kế theo cách nó đọc được gia tốc kế và con quay hồi chuyển.
Cả hai cách cuối cùng đều đọc từ cùng một phần cứng bên dưới. Với mục đích lấy dấu vân tay, điều quan trọng không phải là API nào cung cấp những con số đó — mà là những con số ấy chứa gì ngay cả khi không có gì chuyển động.
Nhiễu hiệu chuẩn như một ID ổn định theo từng thiết bị
Đặt điện thoại nằm phẳng trên bàn rồi truy vấn gia tốc kế của nó. Về lý thuyết nó phải báo cáo (0, 0, 9.8) — chỉ có trọng lực, không gì khác. Trên thực tế nó sẽ báo cáo một giá trị như (0.013, -0.007, 9.79): những số khác không nhỏ trên mọi trục. Độ lệch đó không phải sai số đo lường theo nghĩa thông thường — đó là hiệu chuẩn xuất xưởng của gia tốc kế, và nó nhất quán đến mức đáng kinh ngạc. Gia tốc kế và con quay hồi chuyển MEMS được sản xuất hàng loạt, và mỗi con chip riêng lẻ mang một độ lệch và sai số hệ số tỷ lệ hơi khác nhau do quá trình sản xuất. Nghiên cứu học thuật về lấy dấu vân tay dựa trên cảm biến đã nhiều lần cho thấy vector độ lệch này mang lượng entropy đáng kể — đủ để giúp phân biệt từng chiếc máy riêng lẻ trong cùng một model, nhất là khi kết hợp số liệu từ nhiều trục và nhiều cảm biến.
Đó chính là điều khiến nhiễu hiệu chuẩn trở thành một loại tín hiệu thực sự khác biệt so với đầu ra canvas hay WebGL. Hash canvas thay đổi nếu bạn chuyển trình duyệt hoặc driver GPU thay đổi cách rasterize; danh sách phông chữ thay đổi nếu bạn cài một phông mới. Nhiễu hiệu chuẩn không đổi vì bất kỳ điều nào trong số đó — nó sống sót qua một lần cập nhật trình duyệt, một lần khôi phục cài đặt gốc, một lần cài lại hệ điều hành, thậm chí chuyển từ Chrome sang Firefox trên cùng một điện thoại, bởi vì đó là thuộc tính của chính con chip cảm biến vật lý, không phải trạng thái phần mềm nào mà một script có thể xóa được. Một script chỉ cần thu thập vài giây dữ liệu "khi nghỉ" và trích xuất độ lệch trung bình theo từng trục để có được một giá trị ổn định suốt vòng đời hoạt động của thiết bị.
Kiểm soát quyền — và nơi nó không áp dụng
Trong nhiều năm, cả DeviceMotionEvent và DeviceOrientationEvent đều kích hoạt mà không cần bất kỳ lời nhắc xin quyền nào — bất kỳ trang nào cũng có thể gắn trình lắng nghe và bắt đầu đọc nhiễu hiệu chuẩn một cách âm thầm, trong nền, mà người dùng không hề hay biết. Điều đó thay đổi từ iOS 13, khi Apple bắt đầu yêu cầu gọi rõ ràng DeviceOrientationEvent.requestPermission() — lệnh gọi này phải xuất phát từ một cử chỉ người dùng như một cú chạm — trước khi Safari phát bất kỳ sự kiện chuyển động hoặc định hướng nào. Một trang không còn có thể đọc gia tốc kế chỉ bằng cách tải trang; nó phải hỏi trước, và người dùng phải thấy rồi chấp nhận một hộp thoại hệ thống trước.
Rất dễ cho rằng các engine khác cũng làm theo. Chromium thì không — và đây là chi tiết đáng nói cho đúng, bởi nó liên quan đến phần lớn điện thoại trên thế giới.
Chromium đúng là có giới hạn ai được chạm tới cảm biến. Quyền truy cập được quản lý qua cơ chế Permissions Policy, với danh sách cho phép mặc định của accelerometer và gyroscope là 'self' — nên một iframe bên thứ ba khác nguồn gốc không đọc được chúng — đồng thời việc đọc còn đòi hỏi ngữ cảnh bảo mật (HTTPS) và một ngữ cảnh duyệt ở cấp cao nhất, đang được focus. Nhưng điều Chromium không làm, là hỏi người dùng. Chính tài liệu thiết kế Generic Sensor của họ nói thẳng ra mô hình này: gia tốc kế và con quay hồi chuyển là "auto-grant + opt-out" — tự động cấp quyền, kèm tùy chọn từ chối. Quyền được cấp mà không có bất kỳ lời nhắc nào xuất hiện.
Đây cũng là lý do accelerometer, gyroscope và magnetometer xuất hiện như những cái tên có thể truy vấn trong vector dấu vân tay Permissions API rộng hơn — nhưng một cái tên có thể truy vấn không đồng nghĩa với việc người dùng được hỏi.
Vậy nên tóm tắt trung thực là một sự chia đôi, chứ không phải một chiến thắng trọn vẹn: tín hiệu hiệu chuẩn thô vẫn còn nguyên trong phần cứng ở mọi nền tảng. Trên iOS, script thực sự không thể thu thập nó trước khi người dùng bấm "Cho phép". Còn trên Chrome cho Android, một trang HTTPS cấp cao nhất thông thường vẫn có thể gắn trình lắng nghe devicemotion và đọc nhiễu hiệu chuẩn mà không có lời nhắc nào, không có dấu hiệu nào hiển thị — gần như y hệt mười năm trước. iOS đã đóng lại phiên bản âm thầm của kỹ thuật này; Chromium chỉ thu hẹp lối vào mà chưa bao giờ đặt quyết định đó trước mặt người dùng.
Vì sao đây là vector chủ yếu trên di động
Gia tốc kế và con quay hồi chuyển tồn tại trong laptop hay máy tính để bàn chỉ vì đúng một lý do phổ biến — tính năng phát hiện gập nắp hoặc phát hiện lắc trên một số máy — nhưng đại đa số phần cứng máy tính để bàn không hề đi kèm bộ cảm biến này, và cả DeviceMotionEvent lẫn các lớp Generic Sensor đều không có gì để đọc trên một trình duyệt desktop thông thường. Điện thoại và máy tính bảng thì ngược lại: cảm biến chuyển động và định hướng gần như phổ biến tuyệt đối, bởi chính hệ điều hành phụ thuộc vào chúng cho các tính năng xoay màn hình, đếm bước chân và thực tế tăng cường, nên phần cứng — và bề mặt API để lộ nó — hiện diện trên gần như mọi thiết bị thuộc nhóm đó.
Đó cũng là lý do kỹ thuật này bổ sung cho, thay vì lặp lại, bức tranh lấy dấu vân tay di động rộng hơn: hình học màn hình và tỷ lệ pixel thiết bị thu hẹp phạm vi xuống model thiết bị bạn có khả năng đang cầm, còn nhiễu hiệu chuẩn cảm biến — ở nơi vẫn còn đọc được — có thể thu hẹp xuống tận chiếc máy cụ thể đó. Chính vì trên nền tảng di động, entropy của GPU và phông chữ vốn đã bị sản xuất hàng loạt san phẳng, nên khả năng "chỉ đích danh từng máy" này mới trở nên đặc biệt giá trị. Đây chỉ là một phần nhỏ trong bức tranh lấy dấu vân tay trình duyệt tổng thể, nhưng riêng với lưu lượng di động, đây là một trong số ít tín hiệu sống sót ngay cả khi người dùng đã đặt lại mọi thứ khác trên thiết bị của họ.
Cách giảm thiểu
- Luôn cập nhật hệ điều hành và trình duyệt. Cổng xin quyền trên iOS được phát hành dưới dạng cập nhật trình duyệt, không phải một cài đặt tùy chọn — một trình duyệt di động lỗi thời có thể vẫn để lộ dữ liệu chuyển động mà không hề nhắc xin quyền.
- Từ chối các lời nhắc xin quyền chuyển động/định hướng mà bạn không thấy lý do rõ ràng — và biết khi nào sẽ chẳng có lời nhắc nào. Trên iOS, một trang yêu cầu quyền truy cập gia tốc kế mà không có lý do rõ ràng (nó không phải một game, tính năng AR, hay ứng dụng đếm bước) hiếm khi có mục đích chính đáng, và việc từ chối thực sự có tác dụng. Nhưng trên Chrome cho Android thường chẳng có lời nhắc nào để mà từ chối, nên ở đó đây không phải một cơ chế kiểm soát bạn có thể trông cậy.
- Trên Android, đòn bẩy thực sự là bạn chọn trình duyệt nào. Vì Chromium tự động cấp quyền, biện pháp giảm thiểu có ý nghĩa không phải là lời nhắc, mà là dùng một trình duyệt hạn chế hoặc ngẫu nhiên hóa quyền truy cập cảm biến ngay ở tầng chính sách — cùng nhóm phòng vệ mà chúng tôi bàn trong bài so sánh công cụ bảo vệ quyền riêng tư.
- Xem đây là một tín hiệu trong số nhiều tín hiệu khác. Ngay cả khi đọc được, nhiễu hiệu chuẩn cũng chỉ đóng góp một trục vào một dấu vân tay lớn hơn, cùng với thông số màn hình, chuỗi GPU và trạng thái quyền — không tín hiệu đơn lẻ nào là viên đạn bạc cho bên theo dõi, và không biện pháp đơn lẻ nào loại bỏ hoàn toàn rủi ro bị lấy dấu vân tay.
- Kiểm tra chính thiết bị của bạn đang để lộ những gì. Chạy công cụ kiểm tra dấu vân tay của BrowserInsight ngay trên chiếc điện thoại bạn muốn đánh giá.
Câu hỏi thường gặp
Một trang web có thể đọc gia tốc kế của điện thoại tôi mà không cần hỏi không?
Còn tùy vào điện thoại. Trên iOS thì không — kể từ iOS 13, Safari yêu cầu một lời nhắc xin quyền rõ ràng qua DeviceOrientationEvent.requestPermission(), và sẽ không có sự kiện nào được gửi tới cho đến khi bạn đồng ý. Trên Chrome cho Android thì thường là có: Chromium xem gia tốc kế và con quay hồi chuyển là tự động cấp quyền và không hiển thị lời nhắc nào. Nó có đòi hỏi HTTPS, trang ở cấp cao nhất (không phải iframe khác nguồn gốc) và tab đang được focus — nhưng trong phạm vi đó, một trang hoàn toàn có thể đọc dữ liệu chuyển động một cách âm thầm.
Đặt lại điện thoại có thay đổi dấu vân tay cảm biến của nó không?
Không. Nhiễu hiệu chuẩn đến từ dung sai sản xuất của các chip gia tốc kế và con quay hồi chuyển vật lý, không phải từ bất kỳ trạng thái phần mềm nào. Khôi phục cài đặt gốc, cài lại hệ điều hành, hay đổi trình duyệt đều không làm thay đổi độ lệch của phần cứng bên dưới.
Trình duyệt desktop và laptop có để lộ tín hiệu này không?
Hiếm khi. Phần lớn phần cứng desktop và laptop đơn giản là không có gia tốc kế hay con quay hồi chuyển, nên DeviceMotionEvent và các lớp Generic Sensor API không có gì để báo cáo. Đây gần như hoàn toàn là tín hiệu của điện thoại và máy tính bảng.
Lấy dấu vân tay cảm biến có định danh mạnh hơn lấy dấu vân tay canvas hay WebGL không?
Tự bản thân nó thì không — đây là một tín hiệu hẹp hơn, chỉ một trục. Giá trị của nó với bên theo dõi nằm ở sự ổn định bất thường (sống sót qua reset và đổi trình duyệt) và khả năng có sẵn trên thiết bị di động, nơi các tín hiệu desktop entropy cao khác như phông chữ và kết xuất canvas tương đối bị san phẳng.
Từ chối lời nhắc xin quyền chuyển động có bảo vệ tôi hoàn toàn không?
Ở nơi bạn thực sự nhận được lời nhắc — tức iOS — thì việc từ chối có hiệu lực với nguồn gốc đó: một trang không bao giờ nhận được quyền sẽ không nhận được bất kỳ sự kiện chuyển động hay định hướng nào. Còn trên Chromium thường chẳng có lời nhắc nào để từ chối, nên đây không phải cơ chế kiểm soát bạn có thể dựa vào ở đó. Dù thế nào, điều đó cũng không ảnh hưởng đến các tín hiệu thụ động khác như kích thước màn hình, chuỗi renderer GPU, hay trạng thái quyền, những thứ trang vẫn có thể đọc mà không cần bất kỳ lời nhắc nào.
Kết luận
Lấy dấu vân tay cảm biến là một tín hiệu hẹp nhưng bất thường bền vững: trong khi hash canvas hay danh sách phông chữ có thể thay đổi theo một bản cập nhật phần mềm, độ lệch hiệu chuẩn khắc sâu trong chip gia tốc kế hay con quay hồi chuyển vẫn giữ nguyên suốt vòng đời hoạt động của thiết bị. Đây cũng là ví dụ rõ ràng cho thấy lấy dấu vân tay di động và desktop thực sự phân kỳ ra sao — một tín hiệu gần như vắng mặt trên laptop lại gần như phổ biến trên điện thoại, chính vì bản thân phần cứng đó phổ biến ở đó.
Phần về quyền truy cập mới là chỗ hầu hết các bản tóm tắt nói sai. iOS quả thực đã đóng lại phiên bản âm thầm của kỹ thuật này vào năm 2019, và từ đó rất dễ khái quát thành "các trình duyệt đã sửa xong chuyện này". Nhưng Chromium chưa bao giờ áp dụng lời nhắc — mô hình được ghi trong tài liệu của họ là tự động cấp quyền kèm tùy chọn từ chối — nên trên Android, nơi chiếm phần lớn lưu lượng di động, một trang HTTPS cấp cao nhất hôm nay vẫn đọc nhiễu hiệu chuẩn thoải mái gần như trước iOS 13. Dù ở phía nào thì vật lý nền tảng cũng không đổi — đó chính là lý do vector này đáng được hiểu riêng, thay vì gộp chung vào cẩm nang lấy dấu vân tay vốn thiên về desktop.
Đọc thêm:


