Les clients VPN pourraient divulguer l'adresse IP réelle des utilisateurs
à cause d'un ancien bogue dans WebRTC

Le , par Blondelle Mélina, Expert confirmé
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 : Sélectionner tout
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 =&nbsp;!!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 ?


Vous avez aimé cette actualité ? Alors partagez-la avec vos amis en cliquant sur les boutons ci-dessous :


 Poster une réponse Signaler un problème

Avatar de FakeCake FakeCake - Nouveau Candidat au Club https://www.developpez.com
le 11/04/2018 à 8:53
Pour information.

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

Pas de fuite d'IP.
Avatar de Micheline69 Micheline69 - Candidat au Club https://www.developpez.com
le 11/04/2018 à 19:55
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
Avatar de Blondelle Mélina Blondelle Mélina - Expert confirmé https://www.developpez.com
le 11/04/2018 à 22:14

 
Contacter le responsable de la rubrique Accueil