Sécurité

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

A cause d'un ancien bogue dans WebRTC

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 :

//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.

Autres aticles de la rubrique

Vidéo du jour

Duel de la semaine

Newsletter

Je souhaite rester informé et recevoir toutes les informations sur TechDeGeek dans ma boite mail