WebRTC. Видит ли сервер или другой одноранговый узел мой внутренний IP-адрес?

#webrtc

#webrtc

Вопрос:

Возможно ли получить внутренний 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

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

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

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

Ответ №1:

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

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

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

Вот рабочий фрагмент для текущего Chrome (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)
    }
}
 

Комментарии:

1. Спасибо, это не то, о чем я спрашивал, но эта информация полезна для меня