WebRTC. Сервер или другой узел видит мой внутренний IP-адрес? - PullRequest
0 голосов
/ 14 апреля 2019

Можно ли получить внутренний IP-адрес пользователя с помощью WebRTC в браузере.Здесь browserleaks webrtc Я вижу свой локальный IP-адрес, но этот адрес был извлечен на стороне клиента с помощью сценария JS.Вот минимальный пример JS, как этого добиться

window.RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;   //compatibility for firefox and chrome
    var pc = new RTCPeerConnection({iceServers:[]}), noop = function(){};      
    pc.createDataChannel("");    //create a bogus data channel
    pc.createOffer(pc.setLocalDescription.bind(pc), noop);    // create offer and set local description
    pc.onicecandidate = function(ice){  //listen for candidate events
        if(!ice || !ice.candidate || !ice.candidate.candidate)  return;
        var myIP = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/.exec(ice.candidate.candidate)[1];
        document.querySelector('#output').innerHTML=myIP
        //console.log('my IP: ', myIP);   
        pc.onicecandidate = noop;
    };
    
<div id="output">

</div>

Как мы видим из кода, мы извлекаем ip из события onicecandidate.

Если мы посмотрим на поток соединения WebRTC, то увидим, что ICEобмен кандидатами между партнерами по сигналу Канал

WebRTC flow

Так возможно ли серверу STUN / TURN получить информацию о внутреннем IP-адресе?(Я сомневаюсь, что это возможно, но просто для проверки)

Может ли специально созданный одноранговый клиент получить внутренний IP-адрес другого однорангового узла во время фазы соединения или когда он обменивается кандидатами ICE с другим одноранговым узлом?

Вопрос в основном о проблемах безопасности

1 Ответ

0 голосов
/ 18 апреля 2019

Ваш поток выглядит правильным и безопасным при определенных допущениях:

  1. Браузер поддерживает механизм Trickle ICE (все современные браузеры поддерживают)
  2. Вы не ждете, пока сбор льда составит complete, прежде чем отправлять SDP
  3. Вы отправляете SDP методом createOffer / createAnswer вместо RTCPeerConnection.localDescription.

Если браузер не поддерживает ручеек ICE, он отключается кодом или если вы ожидаете завершения сбора льда. Кандидаты также будут добавлены в локальный SDP, который все еще может раскрыть ваш внутренний IP.

Вот рабочий фрагмент текущего хрома (v73):

const canvas = document.createElement('canvas');
const track = canvas.captureStream(1).getTracks()[0];
const pc = new RTCPeerConnection();
pc.addTrack(track);
pc.createOffer().then(offer => pc.setLocalDescription(offer))

pc.onicecandidate = () => {};

pc.onicegatheringstatechange = () => {
    if(pc.iceGatheringState === 'complete') {
        const sdp = pc.localDescription.sdp;
        const sdpRows = sdp.split('\n')
        const candidates = sdpRows.filter(row => row.indexOf('a=candidate') === 0);
        console.log(candidates)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...