Dấu vân tay trình duyệt: vì sao xóa cookie vẫn bị theo dõi
Mở đầu: một thí nghiệm nhỏ
Dấu vân tay trình duyệt: vì sao xóa cookie vẫn bị theo dõi Bạn xóa toàn bộ cookie. Bạn mở chế độ ẩn danh. Bạn bật VPN đổi IP sang nước khác. Reload lại trang. Vẫn là nickname cũ. Đây không phải lỗi, mà là cách fingerprint hoạt động. Nó không đọc dữ liệu bạn lưu trong máy; nó đọc chính cái máy bạn đang dùng. Bài này đi từ nguyên lý kỹ thuật đến giải pháp. Phần cuối nói về BitBrowser như một ví dụ cụ thể về cách tiếp cận kernel-level, kèm tài liệu kỹ thuật công khai của họ.
1. Dấu vân tay trình duyệt được tạo từ những gì?
Fingerprint là tập hợp các đặc điểm phần cứng và phần mềm mà website đọc được qua JavaScript và các API của trình duyệt. Khi tập hợp đủ lớn, nó cho ra một định danh gần như duy nhất cho mỗi máy.
1.1. Nhóm cơ bản
Những thứ website đọc được ngay, không cần script phức tạp:
- Loại và phiên bản hệ điều hành
- Độ phân giải màn hình và độ sâu màu
- Loại và phiên bản trình duyệt
- Ngôn ngữ hệ thống và múi giờ
1.2. Nhóm nâng cao
Đây là phần quyết định độ chính xác. Bốn API chính: Canvas. Website vẽ một đoạn text hoặc hình lên canvas ẩn, đọc lại pixel, rồi hash kết quả. Mỗi GPU, driver đồ họa và hệ điều hành cho ra kết quả render hơi khác nhau. Sai số rất nhỏ, nhưng đủ để phân biệt hai máy. WebGL. Tương tự Canvas nhưng qua pipeline 3D. Website yêu cầu GPU render một hình đơn giản, rồi đọc lại vendor, renderer và kết quả pixel. Đây là fingerprint gắn chặt với phần cứng nhất trong bốn loại. AudioContext. Website tạo một tín hiệu âm thanh (thường là sóng tam giác), chạy qua FFT, rồi tính SHA. Kết quả phụ thuộc vào driver âm thanh và phần cứng. Nguyên lý gần giống Canvas: sinh ra output từ phần cứng, rồi hash nó. Fonts. Website đo kích thước hiển thị của các đoạn text với font khác nhau. Tập font cài trên máy tạo ra một pattern riêng. Kỹ thuật này gọi là font enumeration, và sau khi hash cũng thành một fingerprint. Cả bốn đều dựa trên đặc tính phần cứng và phần mềm mà người dùng không kiểm soát được. Xóa cookie không thay đổi chúng. Ẩn danh không thay đổi chúng. VPN chỉ đổi IP, không đổi GPU.
2. Website theo dõi bạn qua fingerprint như thế nào?
Quy trình đơn giản:
- Trang tải một đoạn JavaScript ẩn.
- Script gọi Canvas, WebGL, AudioContext và các API khác.
- Kết quả được hash thành một chuỗi duy nhất.
- Chuỗi đó được gửi về server và lưu lại.
Lần sau bạn quay lại, dù cookie đã xóa, fingerprint vẫn khớp.
Theo nghiên cứu tại VUT (Đại học Kỹ thuật Brno), các API bị khai thác nhiều nhất là Canvas, WebGL, AudioContext và Navigator API. Mỗi script fingerprinting dùng một tổ hợp API khác nhau, và độ nhạy với thay đổi cấu hình cũng khác nhau.
Độ chính xác của phương pháp này rất cao. Theo tài liệu của chính BitBrowser, tỷ lệ nhận diện đúng có thể lên tới 94%, ngay cả trong chế độ ẩn danh. Đây là số liệu từ phía nhà cung cấp, và nó phụ thuộc vào tập fingerprint cụ thể, nhưng xu hướng thì rõ: fingerprint ổn định hơn cookie rất nhiều.
3. Vì sao VPN và ẩn danh không đủ?
Một nghiên cứu IEEE năm 2025 đã thử bốn phương pháp ẩn danh phổ biến trên 30 thiết bị: chế độ ẩn danh của Chrome, proxy, VPN và TOR. Kết quả:
- Chrome ẩn danh: 28/30 thiết bị vẫn bị nhận diện fingerprint
- KPROXY: 16/30
- SecurityKISS VPN: 15/30
- TOR: 5/30
VPN thay đổi IP. Ẩn danh không lưu cookie cục bộ. Nhưng cả hai đều không chạm đến Canvas, WebGL, AudioContext hay danh sách font. Những thứ đó nằm ở tầng phần cứng và hệ điều hành, không phải tầng mạng hay tầng lưu trữ.
Nói cách khác: VPN giải quyết bài toán "bạn đang ở đâu". Fingerprint giải quyết bài toán "bạn là ai". Hai bài toán khác nhau.
4. Hai cách tiếp cận để thay đổi fingerprint
4.1. JS injection (tầng JavaScript)
Cách đơn giản nhất là inject JavaScript để ghi đè kết quả trả về của các API fingerprinting. Ví dụ: bọc HTMLCanvasElement.prototype.toDataURL để thêm noise vào pixel data trước khi trả về. Ưu điểm: dễ triển khai, không cần build lại trình duyệt.
Nhược điểm: website có thể phát hiện hàm đã bị bọc. Nhiều thư viện fingerprinting hiện đại kiểm tra Function.prototype.toString của các API gốc. Nếu hàm đã bị sửa, nó trả về string khác native code, và đó là một dấu hiệu bất thường.
Cũng có bẫy ngược: nghiên cứu về AudioContext fingerprinting cho thấy việc thêm noise đôi khi phản tác dụng. Thay vì che giấu, nó làm session dễ bị nhận diện hơn, vì noise pattern tự nó trở thành đặc điểm nhận dạng mới.
4.2. Kernel-level modification (tầng C++)
Cách thứ hai là sửa trực tiếp mã nguồn trình duyệt, tại tầng C++, trước khi build. Khi website gọi Canvas API, hàm được thực thi là hàm đã sửa trong binary, không phải hàm native bị bọc bởi JS. Không có Function.prototype.toString nào để kiểm tra, vì từ góc nhìn của JavaScript engine, hàm vẫn là native.
BitBrowser mô tả cách tiếp cận của họ là "deeply customizes and modifies the browser kernel to simulate the behavioral characteristics of real users, including browser fingerprints, operating system fingerprints, hardware fingerprints, network fingerprints."
Tài liệu kỹ thuật của họ còn liệt kê cụ thể các điểm sửa đổi trong Chromium source. Ví dụ với Canvas: sửa third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.cc, ghi đè strokeText() và fillText(), inject noise vào pixel data. Một chi tiết quan trọng: noise phải random mỗi lần render. Offset cố định không được, vì bản thân offset đó lại thành fingerprint mới. Với WebGL, AudioContext và WebRTC, BitBrowser cho biết các điểm sửa đổi này đã được đóng gói sẵn, tức là người dùng không cần tự build kernel.
5. BitBrowser: một ví dụ cụ thể về kernel-level approach
BitBrowser không chỉ sửa kernel. Nó còn quản lý nhiều profile độc lập trên cùng một máy.
5.1. Kiến trúc profile
Mỗi profile là một môi trường trình duyệt tách biệt hoàn toàn: cookie, cache, localStorage riêng; fingerprint riêng (Canvas, WebGL, AudioContext, Fonts); proxy riêng (HTTP/HTTPS/Socks4/Socks5); User-Agent, timezone, language riêng.
Điều này giải quyết một vấn đề dễ bị bỏ qua: nếu bạn chỉ sửa fingerprint nhưng vẫn dùng chung một profile trình duyệt, các fingerprint vẫn có thể bị liên kết qua shared storage hoặc timing side-channel.
5.2. Những gì BitBrowser sửa trong kernel
Theo tài liệu kỹ thuật của BitBrowser:
- **Canvas. **Ghi đè strokeText() và fillText(), inject noise random mỗi lần render. BitBrowser lưu ý đây là điểm dễ gây bug nhất nếu tự build, và họ đã tối ưu thuật toán noise để tránh tạo ra pattern có thể bị phát hiện.
- WebGL. Virtualize GPU vendor và renderer, mô phỏng các model card đồ họa phổ biến.
- **AudioContext. **Thêm offset nhỏ vào tần số oscillator. Theo tài liệu của họ, offset nằm trong khoảng 0,00001–0,0001 Hz.
- Fonts. Cấu hình danh sách font hiển thị, mô phỏng font fingerprint phù hợp với hệ điều hành được chọn.
5.3. Số lượng tham số và mức độ kiểm soát
BitBrowser hỗ trợ cấu hình hơn 50 tham số fingerprint, cả basic và advanced. Người dùng chọn preset hoặc tùy chỉnh từng tham số.
Số lượng không quan trọng bằng tính nhất quán logic. Nếu bạn chọn Windows 11 nhưng font list trông như Linux, hoặc timezone Việt Nam nhưng language là tiếng Anh Mỹ, sự mâu thuẫn đó tự nó trở thành tín hiệu bất thường. BitBrowser xử lý việc này bằng cách ràng buộc các tham số liên quan với nhau: chọn OS thì font list, screen resolution và User-Agent tự động được set theo.
5.4. Giới hạn cần biết
Sửa kernel không khiến bạn bất khả phát hiện. Nếu website dùng behavioral fingerprinting (mouse movement, typing rhythm, scroll pattern), BitBrowser có mô phỏng các yếu tố này nhưng không hoàn hảo. Tài liệu của họ thừa nhận rằng "adaptive response to detection mechanism" là một phần cần thiết, và mô phỏng hành vi người dùng dựa trên thống kê từ dữ liệu thật, không phải từ hành vi cụ thể của một người.
Ngoài ra, free tier của BitBrowser giới hạn 10 profile và không hỗ trợ chạy trên máy ảo hoặc server. Đủ để thử nghiệm cá nhân, không đủ cho vận hành quy mô lớn.
6. Kết luận
Fingerprint là bài toán kernel, không phải bài toán cookie. Xóa cookie, mở ẩn danh, bật VPN đều không đụng đến Canvas, WebGL hay AudioContext.
JS injection thì dễ làm nhưng dễ bị phát hiện. Kernel modification khó hơn, nhưng fingerprint ổn định hơn, vì hàm vẫn là native từ góc nhìn của JavaScript engine.
Nếu bạn cần nhiều profile độc lập trên cùng một máy, cho test, cho nghiên cứu hay cho vận hành, thì kernel-level là hướng đúng. BitBrowser là một công cụ đi theo hướng này, và điểm cộng lớn nhất của họ là tài liệu kỹ thuật công khai về các điểm sửa đổi trong Chromium source. Đọc tài liệu đó trước khi quyết định, đừng chỉ nghe marketing.
Nguồn tham khảo
- Nghiên cứu về fingerprinting APIs tại VUT (Đại học Kỹ thuật Brno)
- Nghiên cứu IEEE 2025 so sánh ẩn danh/proxy/VPN/TOR trên 30 thiết bị
- Nghiên cứu về AudioContext fingerprinting và tác dụng phản của noise injection
- Tài liệu kỹ thuật công khai của BitBrowser (mô tả các điểm sửa đổi trong Chromium source)
All rights reserved