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 = !!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 ?