L'articolo che segue è originariamente apparso su TechNet Wiki in lingua inglese, ed è stato scritto da Pete Laker
La versione originale è consultabile a questo link: Warning to Social Media Users and Service Sellers - Your true location potentially exposed. Triangulation vulnerabilities, with examples, using Bing Maps API
Il presente articolo ne è una semplice traduzione, ed il merito di quanto trattato e dei test eseguiti va pertanto all'autore originale.


Table of Contents



Introduzione


Tramite Bing Maps e i moduli geospaziali provenienti dalle API e dai servizi di supporto, possono essere realizzate funzionalità decisamente potenti.

Questo esercizio vuole rappresentare un avviso a chiunque utilizzi servizi simili a eBay, Craigslist, Gumtree, o perfino siti di incontri/appuntamenti. 

Alcuni siti web non osservano infatti la necessaria cura per nascondere il reale indirizzo fisico degli utenti.


Esistono molte ragioni lecite per cui una persona può desiderare di offire un servizio. Per esempio un'impresa di pulizia, oppure un parrucchiere itinerante. Costoro potrebbero non voler condividere con nessuno, su Internet, il proprio indirizzo personale di residenza. Molti siti si limitano a mostrare la locazione che il venditore dichiara, e tuttavia questi dovranno registrarsi presso i vari portali utilizzando il loro indirizzo reale per le procedura di addebito e fatturazione.

Anche nascondendo i dettagli del proprio indirizzo, come verrà mostrato qui a seguire, alcuni siti calcolano comunque le distanze basandosi sul codice postale degli utenti.

Di conseguenza, si può essere comunque trovati attraverso la vecchia tecnica radar della triangolazione!

Alcuni siti pensano sia sufficiente arrotondare la vostra distanza approssimandola ad un margine più ampio, come "entro 8 chilometri o "20-50 chilometri".

Sembra un'area abbastanza estesa da potercisi perdere dentro, giusto? Sbagliato!!

Su alcuni siti che ho testato, ricerche multiple effettuate da posizioni gradualmente in movimento, riescono a rilevare il punto esatto in cui il valore di "20-50" cambia in "15-30", oppure verso l'alto in "30-60". 

Se la funzione di ricerca è mal redatta, questo è il punto in cui è possibile affermare che l'utente sia esattamente a 20 o 50 chilometri di distanza (ovviamente dipende dalla direzione in cui ci si sta muovendo) fino ad entro 2 chilometri. In effetti, come viene mostrato qui a seguire, si arriva fino al quarto di miglio!

Naturalmente, questo punto è ancora da qualche parte sul percorso della circonferenza di un cerchio con raggio di 30 miglia. Si tratta ovviamente della formula C = 2*π*R. In altre parole, un percorso di circa 3000 chilometri quadrati!

Ed è a questo punto che si necessita di ulteriori punti di ricerca, eseguiti da altre angolazioni.
Con molteplici anelli di ricerca, tali ricerche possono essere combinate per rivelare un'area di intersezione di tutte le ricerche.
Tale intersezione localizzerà l'individuo, o l'oggetto, entro un'area molto piccola. 

Ho eseguito un numero sufficiente di test in questo senso, riscontrando un'accuratezza spesso inquietante
.

Ho ricercato esempi in cui spostando il mio indirizzo su un codice postale adiacente facesse muovere anche i punti di triangolazione.

Alcune volte sono stato in grado di localizzare posizioni remote, o aree di codici postali rappresentanti metà di un lato di una piccola strada. 

Potete provare in autonomia.
Non è necessario alcun server web.
Solo un editor di file, un browser, e alcune conoscenze basilari di Javascript.

Aggiungere una mappa ad una pagina web


Questo può essere un file HTML qualsiasi, anche preso dal vostro desktop.
A seconda di come verranno utilizzati i dati, le API di Bing Maps potrebbero non necessitare di un server web, ma semplicemente di un browser in cui eseguire la pagina.

<div class="map-wrapper">
    <div id='myMap'></div>
</div>
  
<script>
    var map;
    function loadMapScenario() {
        map = new Microsoft.Maps.Map(document.getElementById('myMap'),
            {
                allowHidingLabelsOfRoad: true,
            });
    }
</script>
<script type='text/javascript'
  src='https://www.bing.com/api/maps/mapcontrol?key=YOURKEY&callback=loadMapScenario Jump '
  async defer></script>


I link al termine di questo articolo vi aiuteranno ad iniziare. 
In questa sede salteremo le basi del discorso in quanto non si tratta di un articolo volto all'apprendimento sull'utilizzo di Bing Maps.

La presente è più un'analisi di vulnerabilità, utilizzando forme e triangolazione, resa veramente semplice tramite l'utilizzo delle API di Bing Maps, la mappa stessa e i suoi straordinari moduli.



Tracciare cerchi e ciambelle


Generare cerchi sulle mappe è sempre stata un'operazione complessa, in quanto il namespace System.Drawing non è stato pensato specificamente per latitudini e longitudini
Vi è la necessità di creare un oggetto di disegno sufficientemente grande, quindi moltiplicare la propria posizione in un numero intero, e quindi effettuare ancora divisioni.

Con la libreria Javascript Microsoft.Maps.SpatialMath, invece, tutto diventa estremamente semplice.

Qui a seguire viene riportato il codice per aggiungere un poligono regolare di 36 lati, che si presenta come una forma circolare sufficientemente approssimata:

Microsoft.Maps.loadModule("Microsoft.Maps.SpatialMath", function () {
    var path = Microsoft.Maps.SpatialMath.getRegularPolygon(_loc, RadiusMeters, 36, Microsoft.Maps.SpatialMath.Meters);
    var outerPoly = new Microsoft.Maps.Polygon(path,
        {
            fillColor: 'rgba(0, 0, 0, 0.5)',
            strokeColor: 'black',
            strokeThickness: 0.5
        });
    map.entities.push(outerPoly);
}


Se i nostri risultati di ricerca hanno due estremi di minima e massima, per esempio i valori visti sopra, allora sarà necessario applicare un buco nel poligono ottenuto.
Questo può essere realizzato richiamato la funzione Microsoft.Maps.SpatialMath.Geometry.difference, che ritorna la porzione della prima forma che non si trova nella seconda.

if (_search.MinDistance == 0 || (_search.MinDistance - margin <= 0)) {
    // Push as solid circle
    sysCirclesLayer.add(outerPoly);
    triCanvasArray.push(outerPoly);
}
else {
    // Push as donut
    var holeRad = _search.MinDistance - margin;
    path = Microsoft.Maps.SpatialMath.getRegularPolygon(_loc, ((holeRad) * 1609.34), 36, Microsoft.Maps.SpatialMath.Meters);
    var innerPoly = new Microsoft.Maps.Polygon(path);
    var donut = Microsoft.Maps.SpatialMath.Geometry.difference(outerPoly, innerPoly);
    sysCirclesLayer.add(donut);
    triCanvasArray.push(donut);
}


Intersecare forme per trovare l'area comune


Una volta che si è creata una collezione di cerchi e/o ciambelle, si possono processare singolarmente tramite un rettangolo verde di base, lasciando quindi solo le aree condivise:

Microsoft.Maps.loadModule("Microsoft.Maps.SpatialMath", function () {
    var bnds = Microsoft.Maps.SpatialMath.Geometry.bounds(triCanvasArray);
    var cent = Microsoft.Maps.SpatialMath.Geometry.centroid(triCanvasArray);
    var halfWidth = bnds.width / 2;
    var halfHeight = bnds.height / 2;
    var bndAry = [
        new Microsoft.Maps.Location(cent.latitude - halfHeight, cent.longitude - halfWidth),
        new Microsoft.Maps.Location(cent.latitude - halfHeight, cent.longitude + halfWidth),
        new Microsoft.Maps.Location(cent.latitude + halfHeight, cent.longitude + halfWidth),
        new Microsoft.Maps.Location(cent.latitude + halfHeight, cent.longitude - halfWidth),
        new Microsoft.Maps.Location(cent.latitude - halfHeight, cent.longitude - halfWidth),
    ];
    var rect = new Microsoft.Maps.Polygon(bndAry,
        {
            fillColor: 'rgba(0, 255, 0, 0.5)'
        });
 
    for (var a = 0; a < triCanvasArray.length; a++) {
        var newRect = Microsoft.Maps.SpatialMath.Geometry.intersection(rect, triCanvasArray[a]);
        rect = newRect;
    }
    spatMathTriLayer.add(rect);
 
    var tLoc = new Microsoft.Maps.Location(cent.latitude, cent.longitude)
    var tPin = new Microsoft.Maps.Pushpin(tLoc, { 'draggable': false, 'color': 'green', 'text': 'O' });
    spatMathTriLayer.add(tPin);
});


Esempio di triangolazione su Gumtree Seller


Per questa operazione, esistono comunque molti potenziali utilizzi positivi.

Per esempio, il tracking di oggetti rubati su siti di vendita all'asta.

Non consiglio comunque di visitare casa o posto di lavoro del venditore per reclamare una vostra proprietà, dato che questi avrebbero potuto a loro volta acquistarle da una terza parte, ed esserne quindi ignari!

Ad ogni modo, ciò potrebbe rappresentare una prova sufficientemente valida da presentare alle forze di polizia, le quali potrebbero effettuare tale visita e recuperare ulteriori indizi, o addirittura la vostra proprietà indebitamente sottratta! 

Ho scelto come esempio un annuncio di Gumtree per mostrarvi quanto sopra.  Ho scelto questo semplicemente perché mostra la locazione dei codici postali, e di conseguenza potremo confermare i risultati della triangolazione.


Qui sopra viene mostrata una posizione approssimata di circa 2 miglia dal codice postale di ricerca.

Questa inserzione [ora obsoleta] è stata creata dalla compagnia "Ford Wimbledon", il cui indirizzo è mostrato nella mappa seguente.





Lo strumento di ricerca permette l'indicazione di uno specifico codice postale da cui effettuare l'interrogazione.



I risultati sono ora all'interno del quarto di miglio.






Ulteriori ricerche restringono la posizione ad una piccola area, che può essere visitata anche tramite in modalità Street View.



Zoommando maggiormente, si nota quanto tale area sia minuscola, con accuratezza di un quarto di miglio:




Andando in modalità satellite, può essere confermata la stessa struttura dell'edificio ed il codice postale della compagnia inserzionista.



Ho quindi effettuato altri test nello stesso modo per ulteriori siti popolari che possiedono funzionalità di ricerca basate sulla distanza. 

Nell'esempio a seguire, è stato inserito l'indirizzo di profilo nella zona di London Est. 
Ad ogni modo, i risultati di ricerca mostrano comunque l'apparentemente privato indirizzo postale nelle query di ricerca.


Ho impostato l'indirizzo di profilo su London Est (blu), ma i risultati di ricerca mostrano la locaIizzazione in "TN2X 1SL", che è l'indirizzo privato registrato.

Ho quindi modificato il codice postale all'indirizzo adiacente di circa un miglio, ed anche la triangolazione è stata modificata. 

Ciò mostra come la ricerca effettui l'interrogazione sull'esatta posizione del codice postale, anziché la dichiarata accuratezza dichiarata di cinque miglia.


L'area verde è l'intersezione di tutte e tre le ricerche, utilizzando i moduli Spatial.Math delle API di Bing Maps.
Il punto verde è il "centroide" della forma, se le tre ricerche fossero combinate in un'unica forma.
Il cerchio rosso è il cerchio di accuratezza attorno ad un punto calcolato tramite il vecchio metodo di intersecazione delle forme - utilizzando il namespace System.Drawing ed un oggetto grafico.

Si possono quindi notare sia l'area verde che il punto risultante rosso.

La soluzione - Binning


La soluzione alla triangolazione, vecchia come lo stesso problema matematico, è chiamata binning, ed è una forma di quantizzazione statistica.

Le locazioni sono raggruppate in un "quadrato" condiviso, e sono interrogate come un insieme unico, dalla posizione centrale di tale quadrato. Questa è una tecnica che possiamo adottare anche tramite i tool visuali sulla nostra mappa Bing, con Bing Map API Data Binning.

Il binning ci permette di raggruppare tutti i codici postali da un'area e ricalcolare un centro consistente e comune (centroide) per tutte loro. Come mostrato nell'ultima immagine, il punto verde rappresenta il centroide dei confini della forma, che a sua volta rappresenta tutte le altre forme combinate assieme.

Ciò è stato chiaramente fatto da circa la metà dei siti che ho testato e da molti tra quelli che ho successivamente contattato. 

Siete quindi invitati a testare i vostri servizi preferiti, avvisandoli in caso doveste riscontrare questa "vulnerabilità".


Sommario


In conclusione, alcuni servizi testati si sono dimostrati non sufficienti nel proteggere i propri utenti dalle forme più basilari di localizzazione. 

Molto prima di postare questo articolo, ho contattato i casi più eclatanti.
Per essere onesti, la maggior parte si sono rivelati rapidi nel prendere provvedimenti risolutivi.

Il caso peggiore riscontrato è stato il widget "Chi è online adesso" di un servizio di supporto alla salute mentale, che mi ha permesso di triangolare il "più vicino operatore nella tua area" riscontrando l'indirizzo di una fattoria. Quando ho chiamato per avvisarli, hanno confermato la loro effettiva registrazione al portale - che ovviamente sarebbe dovuta essere privata.

Non c'è dubbio che un grande numero di siti minori siano altrettanto esposti, e spero vi unirete a me nell'avere un particolare occhio di riguardo per tali situazioni.

Questo evidenzia come, anche al giorno d'oggi, un'implementazione superficiale delle funzionalità di un semplice sito web possa esporre utenti vulnerabili a rischi.


Vedere anche