Lấy dấu vân tay WebRTC đọc danh sách codec và lời chào SDP của bạn, không phải IP. Tìm hiểu cách nó hoạt động, khác gì với rò rỉ WebRTC, và cách giảm thiểu.
Lấy dấu vân tay WebRTC nhận diện trình duyệt của bạn bằng cách đọc danh sách các codec âm thanh/video mà nó hỗ trợ, cùng cấu trúc chính xác của văn bản SDP (Session Description Protocol) mà nó tạo ra để đàm phán một cuộc gọi — hoàn toàn không đụng đến địa chỉ IP của bạn. Một script chỉ cần gọi một phương thức tĩnh duy nhất là nhận lại một danh sách có cấu trúc gồm các codec và tiện ích mở rộng header, rồi dùng hình dạng của danh sách đó để giúp phân biệt trình duyệt, engine và nền tảng. Đây là một cơ chế hoàn toàn khác so với rò rỉ IP qua WebRTC đã được biết đến rộng rãi, và việc nhầm lẫn hai thứ này tạo ra một cảm giác an toàn giả tạo: khắc phục cái này không giúp ích gì cho cái kia.
Những điểm chính
- Lấy dấu vân tay WebRTC đọc mức độ hỗ trợ codec và cấu trúc SDP — nó không bao giờ đụng đến địa chỉ IP công cộng hay cục bộ của bạn, nên không liên quan gì đến rò rỉ WebRTC kinh điển.
- Tín hiệu cốt lõi đến từ
RTCRtpSender.getCapabilities(), một phương thức tĩnh trả về danh sách codec được hỗ trợ mà không có bất kỳ hộp thoại xin quyền nào và không tạo ra lưu lượng mạng nào. - Văn bản SDP do
createOffer()tạo ra bổ sung thêm một lớp tín hiệu nữa: cách đánh số loại tải trọng (payload type), thứ tự codec, và các tham số riêng cho từng codec nhưprofile-level-idhaypacketization-mode. - Tự thân tín hiệu này khá thô — nó chủ yếu phân biệt engine trình duyệt, phiên bản và nền tảng chứ không nhận diện duy nhất một cá nhân — nhưng nó bổ sung thêm một lớp chồng lên các dấu vân tay canvas, WebGL và âm thanh.
- Vô hiệu hóa hoàn toàn WebRTC sẽ loại bỏ bề mặt này; theo thời gian, thứ khiến giá trị thay đổi chủ yếu là các bản cập nhật trình duyệt và khả năng hỗ trợ codec phần cứng ở cấp hệ điều hành.
Lấy dấu vân tay WebRTC là gì?
Mỗi trình duyệt triển khai WebRTC đều mang theo một tập hợp codec âm thanh và video cụ thể, theo một thứ tự cụ thể, với các tham số cụ thể. Các trình duyệt nền Chromium, Firefox và Safari đều được xây dựng trên các stack media nền tảng khác nhau, nên danh sách codec chính xác — và codec nào được tăng tốc phần cứng trên một hệ điều hành nhất định — sẽ khác nhau giữa chúng. Một script có thể đọc trực tiếp danh sách đó, hoặc khiến trình duyệt tạo ra một lời chào SDP, và dùng một trong hai làm tín hiệu về thiết bị/trình duyệt.
Điều quan trọng là, đây không cùng loại rủi ro với rò rỉ IP qua WebRTC, nơi quá trình ICE/STUN có thể để lộ địa chỉ IP công cộng thật của bạn ngay cả khi đứng sau VPN. Lấy dấu vân tay qua codec và SDP tiết lộ trình duyệt của bạn là gì, chứ không phải bạn đang ở đâu. Bạn hoàn toàn có thể có mức rò rỉ WebRTC bằng không (một VPN được cấu hình tốt, proxy toàn bộ) mà vẫn để lộ một dấu vân tay codec hoàn toàn bình thường, và ngược lại.
Đọc khả năng codec mà không cần tạo kết nối
Kỹ thuật đơn giản và âm thầm nhất thậm chí không cần tạo một peer connection. RTCRtpSender.getCapabilities(kind) là một phương thức tĩnh — nó trả về ngay lập tức các codec và tiện ích mở rộng header mà trình duyệt hỗ trợ, không có hộp thoại xin quyền, không có tín hiệu (signaling), và không có bất kỳ hoạt động mạng nào:
function getWebRTCCodecFingerprint() {
if (!window.RTCRtpSender || !RTCRtpSender.getCapabilities) {
return { supported: false };
}
const audio = RTCRtpSender.getCapabilities('audio');
const video = RTCRtpSender.getCapabilities('video');
return {
supported: true,
audioCodecs: audio.codecs.map((c) => c.mimeType),
videoCodecs: video.codecs.map(
(c) => `${c.mimeType}${c.sdpFmtpLine ? ' ' + c.sdpFmtpLine : ''}`
),
headerExtensions: video.headerExtensions.map((h) => h.uri),
};
}
Mảng codecs được trả về bao gồm MIME type, tần số clock, số kênh của mỗi codec, và một sdpFmtpLine tùy chọn mang theo các tham số riêng của codec đó. Mảng headerExtensions liệt kê các tiện ích mở rộng header RTP được hỗ trợ (dùng cho những việc như mức âm lượng và kiểm soát tắc nghẽn trên toàn bộ đường truyền), và sự hiện diện cũng như thứ tự của chúng cũng thay đổi tùy theo engine và phiên bản.
Những gì nằm trong lời chào SDP
Nếu một script đi xa hơn một bước và thực sự gọi createOffer(), văn bản SDP thu được sẽ tiết lộ cùng loại thông tin đó ở dạng chi tiết hơn: các số hiệu loại tải trọng, thứ tự codec, và các dòng thuộc tính riêng cho từng codec. Dưới đây là một đoạn video đã được rút gọn, chỉ mang tính minh họa:
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 102 127
a=rtpmap:96 VP8/90000
a=rtpmap:98 VP9/90000
a=rtpmap:102 H264/90000
a=fmtp:102 profile-level-id=42e01f;level-asymmetry-allowed=1;packetization-mode=1
a=rtpmap:127 AV1/90000
Bản thân định dạng SDP là một giao thức văn bản chuẩn hóa của IETF — tín hiệu lấy dấu vân tay thú vị không nằm ở cú pháp, mà ở tổ hợp cụ thể của các số hiệu loại tải trọng, thứ tự codec và tham số fmtp mà trình duyệt/hệ điều hành/phiên bản cụ thể của bạn chọn để phát ra. Hai trình duyệt trên hai nền tảng khác nhau hiếm khi tái tạo lại chính xác cùng một tổ hợp.
Điều này khác gì với rò rỉ IP qua WebRTC
Đáng để nói rõ ranh giới này, vì hai kỹ thuật này dùng chung một codebase (WebRTC) nhưng không có điểm chung nào khác:
| Rò rỉ IP qua WebRTC | Lấy dấu vân tay codec/SDP của WebRTC | |
|---|---|---|
| Tiết lộ điều gì | Địa chỉ IP công cộng/cục bộ thật của bạn | Engine, phiên bản và nền tảng trình duyệt của bạn |
| Cơ chế | Thu thập ứng viên ICE qua STUN/TURN | Nội dung của getCapabilities() và/hoặc lời chào SDP |
| Có cần trao đổi qua mạng không? | Có — cần liên lạc với máy chủ STUN | Không — getCapabilities() hoàn toàn cục bộ |
| Có vượt qua được VPN không? | Có thể, nếu định tuyến rò rỉ ra ngoài đường hầm | Không áp dụng — không liên quan đến dữ liệu vị trí |
| Cách khắc phục | Hạn chế/vô hiệu hóa WebRTC, hoặc dùng VPN không rò rỉ | Vô hiệu hóa WebRTC, hoặc thu hẹp bề mặt codec |
Nếu bạn đã khóa chặt rò rỉ WebRTC, điều đó bảo vệ vị trí của bạn — nhưng không làm gì với tín hiệu codec/SDP, vì getCapabilities() ngay từ đầu đã không yêu cầu quyền truy cập mạng.
Tín hiệu này đặc trưng đến mức nào?
Lấy dấu vân tay qua codec và SDP là một tín hiệu tương đối thô. Vì Chrome, Edge, Opera và Brave đều dựa trên cùng một nền tảng Chromium/libwebrtc, chúng có xu hướng báo cáo danh sách codec rất giống nhau — tín hiệu này chủ yếu phân tách họ engine (Chromium so với Gecko so với WebKit) và nền tảng (hệ điều hành cho trình duyệt thấy những bộ giải mã phần cứng nào), chứ không tách riêng ra một người cụ thể.
| Yếu tố | Tiết lộ điều gì |
|---|---|
| Danh sách và thứ tự codec | Họ engine kết xuất và phiên bản |
Tham số sdpFmtpLine (ví dụ profile-level-id của H.264) | Media stack của nền tảng và khả năng hỗ trợ bộ giải mã phần cứng |
| Danh sách tiện ích mở rộng header | Phiên bản engine, đôi khi cả các tính năng thử nghiệm đã bật |
| Có hỗ trợ AV1/HEVC hay không | Khả năng của hệ điều hành và tăng tốc phần cứng |
Điều đó khiến nó chỉ là một yếu tố đóng góp khiêm tốn khi đứng riêng — giống tinh thần của lấy dấu vân tay âm thanh: không đủ để nhận diện một mình bạn, nhưng là thêm một nguồn bit độc lập, cộng dồn với các tín hiệu canvas và WebGL để thu hẹp đám đông hơn nữa.
Khả năng phương tiện ngoài phạm vi codec
Một API liên quan nhưng tách biệt đáng biết đến là Media Capabilities API, cụ thể là navigator.mediaCapabilities.decodingInfo(). Nó không thuộc về WebRTC, nhưng thường được dò xét cùng với WebRTC vì nó trả lời một câu hỏi tương tự — pipeline media của thiết bị này thực sự làm được gì — bằng cách báo cáo liệu việc giải mã một tổ hợp codec/độ phân giải/khung hình cụ thể có smooth (mượt) và powerEfficient (tiết kiệm năng lượng, tức được tăng tốc phần cứng) hay không. Vì khả năng tăng tốc phần cứng gắn liền với GPU cụ thể và framework media của hệ điều hành, điều này bổ sung thêm một tín hiệu mang màu sắc phần cứng, chồng lên trên danh sách codec phần mềm mà WebRTC để lộ.
Các biện pháp phòng vệ và sự đánh đổi
| Cách tiếp cận | Hiệu quả | Đánh đổi |
|---|---|---|
Vô hiệu hóa WebRTC (media.peerconnection.enabled của Firefox) | Loại bỏ cả tín hiệu codec/SDP lẫn bề mặt rò rỉ IP | Làm hỏng hoàn toàn các cuộc gọi video/thoại trong trình duyệt |
| Tor Browser | WebRTC bị vô hiệu hóa theo mặc định | Mất chức năng tương tự, nhưng đồng nhất giữa mọi người dùng Tor |
| Hạn chế xuống một bộ codec duy nhất qua tiện ích mở rộng | Có thể giảm số codec được báo cáo | Ít tiện ích mở rộng phổ biến nhắm cụ thể vào tín hiệu này; hầu hết tập trung vào rò rỉ IP |
| Chấp nhận tín hiệu này, tập trung vào chỗ khác | Không mất chức năng nào | Với hầu hết mô hình đe dọa, lấy dấu vân tay codec là mục tiêu có giá trị thấp so với canvas/WebGL |
Hiện chưa có một công tắc phổ biến chuyên dụng để "ngẫu nhiên hóa danh sách codec của tôi" như cách canvas hay âm thanh có "farbling", chủ yếu vì tín hiệu này thô hơn và có giá trị thấp hơn những tín hiệu đó. Với hầu hết mọi người, kết luận thực tế là hãy xem nó như một đầu vào nữa chồng lên các tín hiệu entropy cao hơn, chứ không phải một trận chiến đáng để đấu tranh riêng.
Cách kiểm tra tín hiệu của chính bạn
Bạn có thể xem trình duyệt của mình để lộ những gì mà không cần viết bất kỳ đoạn mã nào:
- Chạy kiểm tra dấu vân tay của BrowserInsight để xem hồ sơ dấu vân tay tổng hợp của bạn, bao gồm mức độ mà các tín hiệu entropy thấp như thế này đóng góp vào tính độc nhất tổng thể của bạn.
- Mở console dành cho nhà phát triển trong trình duyệt và chạy đoạn mã
getWebRTCCodecFingerprint()ở trên để xem danh sách codec thô của bạn. - So sánh cùng một bài kiểm tra trên Chrome, Firefox và Safari trên cùng một máy — thứ tự codec và tham số
fmtpthường khác nhau giữa các engine ngay cả trên phần cứng giống hệt nhau. Dự án Cover Your Tracks của EFF là một bài kiểm tra bổ sung tốt để xem cấu hình tổng thể của bạn so với người khác ra sao.
Câu hỏi thường gặp
Lấy dấu vân tay WebRTC có để lộ địa chỉ IP của tôi không?
Không. Lấy dấu vân tay qua codec và SDP đọc những gì trình duyệt của bạn hỗ trợ, thông qua RTCRtpSender.getCapabilities() hoặc nội dung của lời chào SDP — cả hai đều không đụng đến địa chỉ mạng của bạn. Việc để lộ IP là một cơ chế riêng biệt (rò rỉ WebRTC), được trình bày trong hướng dẫn Bảo vệ chống rò rỉ WebRTC của chúng tôi.
Vô hiệu hóa WebRTC có khắc phục được cả rò rỉ lẫn dấu vân tay không?
Có — vô hiệu hóa hoàn toàn WebRTC (hoặc dùng một trình duyệt như Tor vốn vô hiệu hóa nó theo mặc định) sẽ loại bỏ cả hai bề mặt cùng lúc, vì cả getCapabilities() lẫn đàm phán SDP đều không thể chạy khi WebRTC không được bật. Đánh đổi là tính năng gọi video/thoại trong trình duyệt sẽ ngừng hoạt động.
Lấy dấu vân tay codec có mang tính nhận diện cao như lấy dấu vân tay canvas hay WebGL không?
Không, nó thường yếu hơn. Vì các trình duyệt nền Chromium chính đều dùng chung stack libwebrtc bên dưới, danh sách codec của chúng trông giống nhau, nên tín hiệu này chủ yếu tiết lộ họ engine và nền tảng, chứ không xác định chính xác một cá nhân. Nó vẫn góp phần vào tổng entropy, chỉ là ít hơn so với các tín hiệu dựa trên kết xuất.
Một website có thể đọc danh sách codec của tôi mà không cần xin phép không?
Có. RTCRtpSender.getCapabilities() là một phương thức tĩnh, chạy mà không có hộp thoại xin quyền camera/micro và không có yêu cầu mạng nào — nó chỉ đơn giản báo cáo những gì triển khai WebRTC của trình duyệt hỗ trợ.
Kết luận
Lấy dấu vân tay WebRTC và rò rỉ IP qua WebRTC cùng tồn tại bên trong một API, nhưng chúng tiết lộ những thứ hoàn toàn khác nhau: một cái tiết lộ địa chỉ mạng thật của bạn, cái kia tiết lộ engine, phiên bản và nền tảng trình duyệt của bạn thông qua khả năng hỗ trợ codec và cấu trúc SDP. Cái này không thay thế được cái kia. Tự thân nó, lấy dấu vân tay qua codec/SDP là một tín hiệu khiêm tốn, thô — nhưng hiểu được nó nghĩa là bạn sẽ không nhầm lẫn một cấu hình VPN không rò rỉ với một cấu hình miễn nhiễm với lấy dấu vân tay.
Đọc thêm:


