- Published on
Sửa đổi mã nguồn Chromium để tạo ngẫu nhiên: webRTC IP ngẫu nhiên
- Authors
- Name
- Hoàng Hữu Mạnh
- Biên dịch trình duyệt dấu vân tay ngẫu nhiên: webRTC IP ngẫu nhiên ========================
1. WebRTC là gì?
WebRTC (Web Real-Time Communication) là một công nghệ hỗ trợ trình duyệt web thực hiện các cuộc gọi âm thanh, video trực tuyến và chia sẻ file giữa các điểm theo thời gian thực. Công nghệ này được phát triển bởi các kỹ sư và nhà nghiên cứu trên toàn thế giới, và được sử dụng rộng rãi trong các ứng dụng hội nghị video, giáo dục trực tuyến.
2. Nguyên lý của dấu vân tay WebRTC
Dấu vân tay WebRTC (WebRTC Fingerprinting) là quá trình thu thập thông tin từ trình duyệt của người dùng thông qua WebRTC để tạo ra một dấu hiệu nhận diện duy nhất của người dùng đó. Tuy nhiên, WebRTC có hạn chế về lượng thông tin thu thập được. Thông tin quan trọng nhất mà WebRTC có thể thu thập chính là IP thực của người dùng. Ngay cả khi người dùng sử dụng VPN hoặc proxy để ẩn địa chỉ IP công cộng của mình, WebRTC vẫn có thể phát hiện được.
3. Cách lấy IP cục bộ của bạn thông qua WebRTC
Bạn có thể dùng đoạn mã sau trong bảng điều khiển (F12) để kiểm tra xem trang web có thể lấy được IP thật của bạn hay không, kể cả khi bạn đang sử dụng proxy.
function getLocalIPAddress(callback) {
let rtc = new RTCPeerConnection({
iceServers: [
{urls: "stun:stun.miwifi.com"},
{urls: 'stun:stun.l.google.com:19302'},
{urls: 'stun:stun1.l.google.com:19302'},
{urls: 'stun:stun2.l.google.com:19302'},
{urls: 'stun:stun3.l.google.com:19302'},
{urls: 'stun:stun4.l.google.com:19302'},
]
});
rtc.addEventListener('icecandidate', function handleCandidate(evt) {
if (evt.candidate) {
let ipRegex = /([0-9]{1,3}(\.[0-9]{1,3}){3})/;
let match = ipRegex.exec(evt.candidate.candidate);
if (match) {
let ipAddress = match[1];
callback(ipAddress);
}
}
});
rtc.createDataChannel('');
rtc.createOffer().then(offer => rtc.setLocalDescription(offer)).catch(console.error);
}
getLocalIPAddress(ip => console.log('your real IP is:', ip));
- Kết quả:
your real IP is: 192.168.xxx.xxx
Bạn cũng có thể sử dụng các trang web trực tuyến như browserleaks.com để kiểm tra xem IP của bạn có bị lộ không.
4. Biên dịch mã nguồn Chromium để ngẫu nhiên hóa giá trị IP trả về của WebRTC
Bạn đã biên dịch Chromium thành công? Nếu có, hãy tiếp tục các bước sau:
Mở tệp
third_party/blink/renderer/modules/peerconnection/rtc_ice_candidate.cc
.Thêm các dòng sau vào phần đầu tệp (ở dưới một dòng
#include
nào đó):
#include <iostream>
#include <cstdlib>
#include <ctime>
- Tìm đoạn mã sau:
String RTCIceCandidate::candidate() const {
return platform_candidate_->Candidate();
}
- Thay thế bằng đoạn mã mới sau:
std::string generateRandomIP() {
srand(static_cast<unsigned int>(time(0)));
int ip_part = rand() % 256;
std::string ip = "192.168.1.";
ip += std::to_string(ip_part);
return ip;
}
String RTCIceCandidate::candidate() const {
return String(generateRandomIP());
}
- Biên dịch lại:
ninja -C out/Default chrome
Sau khi biên dịch thành công, bạn có thể kiểm tra lại trang browserleaks.com và thấy rằng IP thật của bạn đã bị thay đổi ngẫu nhiên.
5. Các trang web khác cũng có thể lấy IP thật?
Có một số trang web khác như browserscan.net có thể lấy IP thật của bạn, nhưng bằng cách biên dịch và thay đổi mã như trên, khả năng lộ IP của bạn qua WebRTC sẽ được giảm thiểu.
Nếu có ai quan tâm, mình sẽ chia sẻ thêm về cách bảo mật WebRTC.