Developpez.com

Le Club des Développeurs et IT Pro

Les clients VPN pourraient divulguer l'adresse IP réelle des utilisateurs

à cause d'un ancien bogue dans WebRTC

Le 2018-04-10 23:26:57, par Blondelle Mélina, Chroniqueuse Actualités
Daniel Roesler a découvert en 2015 une faille dans le protocole WebRTC. WebRTC est un projet gratuit et ouvert qui fournit aux navigateurs et aux applications mobiles des capacités de communications en temps réel (RTC : Real-Time Communications) via de simples API. Il comprend les éléments fondamentaux pour des communications de haute qualité sur le Web, tels que les composants réseau, audio et vidéo utilisés dans les applications de chat vocal et vidéo, ces composants, lorsqu'ils sont implémentés dans un navigateur, sont accessibles via une API JavaScript


Le problème était que les serveurs STUN (Session Traversal Utilities for NAT) divulguaient ces informations aux sites Web qui avaient déjà négocié une connexion WebRTC avec le navigateur d'un utilisateur. Depuis lors, de nombreux annonceurs et organismes d'application de la loi ont utilisé ce bogue lié au WebRTC pour obtenir l'adresse IP d'un visiteur. La plupart des navigateurs sont équipés de WebRTC activé par défaut.

En outre, ces requêtes STUN sont effectuées en dehors de la procédure XMLHttpRequest normale, elles ne sont donc pas visibles dans la console développeur et ne peuvent pas être bloquées par des plug-ins tels que AdBlock Plus ou Ghostery. Cela rend ces types de demandes disponibles pour le suivi en ligne.

Paolo Stagno, un chercheur en sécurité a récemment audité une centaine de fournisseurs VPN et proxy et 19 d'entre eux divulguent les adresses IP réelles des utilisateurs via WebRTC, soit 16 %. À cet effet, il met une démo à la portée des utilisateurs dont le code est ci-dessous. Il suffit de copier et coller le code dans la console de développement Firefox ou Chrome pour lancer le test.

Code javascript :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
//get the IP addresses associated with an account 
function getIPs(callback){ 
    var ip_dups = {}; 
  
    //compatibility for firefox and chrome 
    var RTCPeerConnection = window.RTCPeerConnection 
        || window.mozRTCPeerConnection 
        || window.webkitRTCPeerConnection; 
    var useWebKit = !!window.webkitRTCPeerConnection; 
  
    //bypass naive webrtc blocking using an iframe 
    if(!RTCPeerConnection){ 
        //NOTE: you need to have an iframe in the page right above the script tag 
        // 
        //<iframe id="iframe" sandbox="allow-same-origin" style="display: none"></iframe> 
        //<script>...getIPs called in here... 
        // 
        var win = iframe.contentWindow; 
        RTCPeerConnection = win.RTCPeerConnection 
            || win.mozRTCPeerConnection 
            || win.webkitRTCPeerConnection; 
        useWebKit = !!win.webkitRTCPeerConnection; 
    } 
  
    //minimal requirements for data connection 
    var mediaConstraints = { 
        optional: [{RtpDataChannels: true}] 
    }; 
  
    var servers = {iceServers: [{urls: "stun:stun.services.mozilla.com"}]}; 
  
    //construct a new RTCPeerConnection 
    var pc = new RTCPeerConnection(servers, mediaConstraints); 
  
    function handleCandidate(candidate){ 
        //match just the IP address 
        var ip_regex = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/ 
        var ip_addr = ip_regex.exec(candidate)[1]; 
  
        //remove duplicates 
        if(ip_dups[ip_addr] === undefined) 
            callback(ip_addr); 
  
        ip_dups[ip_addr] = true; 
    } 
  
    //listen for candidate events 
    pc.onicecandidate = function(ice){ 
  
        //skip non-candidate events 
        if(ice.candidate) 
            handleCandidate(ice.candidate.candidate); 
    }; 
  
    //create a bogus data channel 
    pc.createDataChannel(""); 
  
    //create an offer sdp 
    pc.createOffer(function(result){ 
  
        //trigger the stun server request 
        pc.setLocalDescription(result, function(){}, function(){}); 
  
    }, function(){}); 
  
    //wait for a while to let everything done 
    setTimeout(function(){ 
        //read candidate info from local description 
        var lines = pc.localDescription.sdp.split('\n'); 
  
        lines.forEach(function(line){ 
            if(line.indexOf('a=candidate:') === 0) 
                handleCandidate(line); 
        }); 
    }, 1000); 
} 
  
//Test: Print the IP addresses into the console 
getIPs(function(ip){console.log(ip);});

Si vous êtes connecté à un VPN et que vous voyez l'adresse IP de votre FAI dans la première section de la capture ci-dessous, vous êtes protégés. Si des adresses IP correspondent à l'une de vos adresses IP privées, vous aurez une fuite partielle.


Source : VoidSec

Et vous ?

Qu'en pensez-vous ?
  Discussion forum
3 commentaires
  • Micheline69
    Candidat au Club
    Merci pour cet article j'avais eu vent du Webrtc,
    Pour info, pas de fuite non plus de mon côté avec mon VPN Proxiane
  • FakeCake
    Nouveau Candidat au Club
    Pour information.

    J'ai testé ProtonVPN sur iOS, avec Safari et Firefox.

    Pas de fuite d'IP.
  • Blondelle Mélina
    Chroniqueuse Actualités