WebRTC。服务器或其他对等方是否看到我的内部IP地址?

时间:2019-04-13 21:48:12

标签: webrtc

是否可以通过在浏览器中使用WebRTC获取用户内部IP地址。 在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>

正如我们在代码中看到的那样,我们从onicecandidate事件中提取了ip。

如果我们看一下WebRTC的连接流程,我们可以看到ICE候选对象之间通过信号Channel进行交换

WebRTC flow

那么STUN / TURN服务器能否获得内部IP地址信息? (我怀疑这是可能的,但是只是检查一下)

经特殊设计的对等客户端能否在连接阶段或与其他对等交换ICE候选者时获取另一个对等的内部IP地址?

问题主要是关于安全问题

1 个答案:

答案 0 :(得分:0)

在某些假设下,您的流程看起来正确且安全:

  1. 该浏览器支持Trickle ICE机制(所有现代浏览器均支持)
  2. 在发送SDP之前,您不必等待complete结冰
  3. 您通过createOffer / createAnswer方法而不是RTCPeerConnection.localDescription发送SDP。

如果浏览器不支持ICE细流,则该代码将被禁用,或者您等待冰收集完成。候选者也将添加到本地SDP,该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)
    }
}