Concilio dei topini

Rip Facebook

Topino 106

Sabato è stato rilasciato pubblicamente un pacco di dati con dentro 500 milioni di numeri di telefono hackerati da Facebook.

Quando ho contattato un mio amico per dirgli che c’era dentro anche il suo numero di telefono, ha risposto:

Ah beh ma io il mio numero l’ho sempre tenuto non visibile su Facebook quindi non ce l’hanno

Evidentemente non gli era chiaro cosa vuol dire “hackerare”. Per chiarire: hanno il tuo numero e basta.

I dati li ho ricevuti attraverso amici smanettoni. Sono organizzati in uno zip
per ogni prefisso telefonico internazionale. I paesi sono questi:

Afghanistan
Africa
angola
Albania
Algeria
Argentina
Austriaia
Azerbaijan
Bahrain
Bangladesh
Belguim
Bolivia
Bostwana
brazil
Brunei
Bulgaria
Burkina Faso
Burundi
Cambodia
Cameroon
Canada
Chile
China
Colombia
Costa Rica
Croatia
Cyprus
Czech Republic
Denmark
Dibouti
Ecuador
Egypt
El Salvador
Estonia
Ethopia
Fiji
Finland
France
Georgia
Germany
Ghana
Greece
Guatemala
Haiti
Honduras
Hong Kong
Hungary
Iceland
India
Indonesia
iran
Iraq
Ireland
Israel
Italy
Jamaica
Japan A
Jordan
Kazakhstan
Kuwait
Lebanon Text
Libya
Lithunia
Luxemburj
Macao
Malaysia
Maldives
Malta
Mauritus
Mexico
Moldova
Morocco
Namibia
Netherland
Nigeria
Norway
Oman
Palestine
Panama
Peru
Philpine
Poland
Portugal
Puerto Rico
Qatar
Russia
Saudi Arabia
Serbia
Singapore1
Slovenia
South Africa
South Korea
spain
sudan
Sweden
Switzerland
Syria
Taiwan
Tunisia
Turkey
Turkmenistan
UAE
uk
Uruguay
USA
Yemen

Mi hanno fatto notare che la Romania manca. Però invece ad esempio c’è la Palestina che non sono nemmeno tutti d’accordo sia uno stato, non sapevo avesse un prefisso telefonico. Controllando su https://en.wikipedia.org/wiki/List_of_mobile_telephone_prefixes_by_country mi dice che il prefisso è +970 ma alcuni stati usano il prefisso di Israele +972.

Mi diverte sempre notare queste cose concrete sugli stati in guerra o incasinati politicamente. Come quando ho letto delle scuole nella zona controllata dai Curdi a cui arrivavano gli stipendi dal regime Siriano. È che dopo la guerra mondiale e tutta la propaganda connessala terza guerra Punica uno si immagina sempre le guerre come delle guerre totali di annientamento, invece la gente normale ha anche altro da fare nel frattempo.

Mi sono scaricato lo zip per l’Italia, che è da 1.09 GB. Per vedere quanto
siamo fessi, ho preparato questa tabellina:

Paese       Dimensione zip  Abitanti        Byte per abitante
 Italia      1.09 GB         60.6 milioni    18.0
 Germania    203 MB          83.5 milioni    2.43
 USA         995 MB          329 milioni     3.02
 Israele     111 MB          8.52 milioni    13.0
 Palestina   178 MB          4.98 milioni    35.7

Quindi in questo campione di nazioni che ho estratto lanciando 5 volte un dado a 107 facce e poi scegliendo i paesi che mi stanno più simpatici solo i Palestinesi si sono fatti fregare più numeri di telefono di noi. In realtà i byte dello zip non corrispondono proprio ai numeri di telefono contenuti, magari gli zip degli Israeliani A o degli Israeliani B tengono di più perché sono pieni di caratteri strani, però tra Italia e Germania no. O magari i Tedeschi occupano meno byte perché scrivono solo Iniziale. Cognome. Sposato. mentre gli Italiani mettono status lunghissimi tipo “Ciao sono Antonio sono un fringuello Abruzzese mi piacciono le donne serie <3<3”?

(C’è lo status su Facebook? O qualcosa del genere? Io non lo uso.)

Sì potrei contare quanti numeri di telefono ci sono effettivamente per dirimere questa importante questione ma vi lascerò nel dubbio perché ho guardato solo i dati Italiani. Che se apro quelli Israeliani poi arriva il Mossad.

Aperto lo zip “Italy.zip” ci trovo dentro quattro txt “0.txt”, “1.txt”, “2.txt”, “4.txt”. Ipotizzo che il “3.txt” manchi perché i primi tre li hanno preparati hacker che usano C mentre il quarto un hacker anziano che usa FORTRAN o PASCAL (d’ora in poi scriverò tutto maiuscolo i linguaggi in cui si conta a partire da 1 perché sì).

I txt contengono delle tabelle in formato CSV dove però hanno deciso che C sta per “colon” anziché “comma”. L’estensione è txt perché vuol dire “Tua mamma x Tutti” visto che adesso tutti hanno il numero di telefono di tua mamma, sia quello normale che quello per gli appuntamenti che sta sull’account con il nome falso “Diana Hotlegs”.

In totale ci sono 35.7 milioni di righe nei txt. Ogni riga ha 12 celle. Le celle contengono: numero di telefono, profile_id dell’account Facebook, nome, cognome, sesso, residenza, luogo di nascita, sposato/solo amici/it’s complicated, impiego, una data con l’orario PERCHÈ CRISTO AVETE MESSO L’ORARIO CON I : TRA I NUMERI CHE È LO STESSO CARATTERE CHE DIVIDE LE CELLEEEEE che ipotizzo sia la data a cui sono state hackerate le informazioni, indirizzo email, data di nascita.

Non ci sono tutte le informazioni per tutti. Solo 56 mila righe (0.15 %) hanno tutte le celle riempite, 495 mila (1.4 %) hanno l’indirizzo email.

Le righe sono per numero di telefono. Quindi lo stesso account può comparire più volte se ha cambiato numero di telefono, e mancano gli account che non hanno il numero di telefono.

Il profile_id significa che anche se avete cambiato nome e numero comunque si possono collegare univocamente i vostri nuovi dati ai vecchi.

36 milioni di numeri è la metà della popolazione Italiana, però ci saranno un po’ di numeri ridondanti. Mi sono chiesto su quante persone in pratica è possibile ficcanasare. Nella mia rubrica ci sono 386 contatti per un totale di 387 numeri di telefono Italiani. Di questi, 138 sono nel database. Quindi supponendo che la mia rubrica sia un campione rappresentativo (invece no, ma pazienza) ci si può aspettare che la probabilità di trovare una data persona richiesta sia $138/386 = (36 \pm 3)\,\%$, dove l’errore statistico si calcola con la formula $$\sqrt{\frac{\epsilon (1 – \epsilon)}{\mu}},$$ dove $\epsilon$ è la frazione e $\mu$ è il denominatore. La formula è ricavata assumendo conteggi poissoniani cioè che la mia rubrica contenga persone estratte a caso, che non è vero quindi è una stima al ribasso dell’errore.

La maggior parte dei 138 corrispondono effettivamente alle persone che conosco e bon. Però 16 numeri sono riportati con un nome diverso. Ho indagato un po’ e diviso questi numeri in 8 categorie:

2   nomi falsi/soprannomi confermati
3   probabili nomi falsi/soprannomi
1   errore di battitura del numero
3   plausibili cambi di proprietario del numero
2   cambio di proprietario impossibile
2   la persona che ha il numero di un'altra la conosce personalmente
2   probabili numeri falsi a caso
1   boh

Alcune di queste informazioni le ho potute dedurre dal database. Per altre è stato un po’ imbarazzante perché ho contattato personalmente la gente: “ehi tizio c’è questo account facebook con un nome femminile e il tuo numero di telefono, ne sai qualcosa?” “CHI IO???”, io speravo di sgamare qualcuno con l’account finto da stalker ma alla fine c’era sempre una spiegazione plausibile, e in effetti immagino che se vuoi stalkerare forte non metti il tuo numero di telefono usuale.

(Cari amici e/o contatti vari: non vi preoccupate non ho detto a nessuno i dettagli. Ahahahah ma che cazzo dico questi dati sono in rete ce li ha un sacco di gente mica solo io.)

Per i casi in cui il numero è associato alla persona sbagliata e non è possibile che ci sia stato un reale passaggio di numero, potrebbe comunque darsi che sia un errore o un numero messo falso a caso da chi l’ha inserito. Avendo 36 milioni di numeri, c’è una probabilità ragionevole che se spari un numero a caso viene un numero che esiste davvero. O no?

Facciamo una stima: un numero di cellulare ha un prefisso di tre cifre seguito da 7 cifre. I prefissi cominciano tutti per 3 quindi in realtà contano solo due cifre, quindi in totale ci sono 9 cifre cioè $10^9$ ovvero 1 miliardo di combinazioni. Quindi sparando un numero a caso la probabilità che sia nei 36 milioni è $36/1000 = 3.6\,\%$.

Ho 4 numeri inspiegati o già probabilmente falsi a caso nei miei 138, quindi la probabilità di trovare un numero sparato a caso quando cerco un vero numero è $4/138 = 2.9\,\%$. Questo 2.9 % è simile al 3.6 %, quindi i numeri falsi sono… circa tanti quanti quelli veri? Però se fosse così non sarebbe più valida l’assunzione iniziale che i 36 milioni di numeri fossero per lo più veri che mi serviva per calcolare la probabilità che sparando a caso un numero ne trovassi uno vero.

Rifacciamo i conti per bene. Sia $n$ il numero totale di numeri di telefono nel database, $f$ la frazione di numeri sparati a caso, $v = 1 – f$ la frazione di numeri reali inseriti. Sia $M$ il numero di combinazioni possibili (1 miliardo) e $N$ il numero totale di numeri di telefono esistenti (ma non necessariamente contenuti negli $n$ del database), che non conosco ma che stimo sia 100 milioni. Quindi la probabilità che un numero sparato a caso esista davvero è $p_0 = N/M = 10\,\%$.

Allora la frazione di numeri del database che sono sparati a caso ma che corrispondono a numeri reali è $f_v = p_0f$. Quindi in totale la frazione di numeri reali nel database è $r = v + f_v = (1 – f) + p_0f = 1 – (1 – p_0)f$.

(In verità mancherebbero due dettagli: non ho tenuto in conto che alcuni numeri sparati a caso saranno uguali tra loro, e che alcuni numeri sparati a caso saranno uguali a un numero legittimo nel database, ma queste correzioni sono piccole e l’errore è dominato dall’errore statistico dovuto alla modesta dimensione della mia rubrica.)

Io dalla mia rubrica prendo un campione di $n_c$ numeri che sono presenti nel database, e di questi penso che $n_f$ siano sparati a caso anziché inseriti legittimamente. Assumendo sia un campione rappresentativo, ho che $n_c$ corrisponde a $r$ e $n_f$ corrisponde a $f_v$. Quindi ho l’equazione $$\begin{align}\frac{n_f}{n_c} &= \frac{f_v}{r} = \frac{p_0f}{1 – (1 – p_0)f} \\ \rightarrow \frac{n_f}{n_c} (1 – (1 – p_0)f) &= p_0 f \\ \rightarrow \frac{n_f}{n_c} &= f\left(p_0 + (1 – p_0)\frac{n_f}{n_c}\right) \\ \rightarrow f &= \frac{1}{1 + p_0 \left(\frac{n_c}{n_f} – 1\right)}.\end{align}$$

Lo scrivo in Python per fare il conto con le incertezze:

import uncertainties
import math
n_c = 138
n_f = 4
ratio = n_f / n_c
error = math.sqrt(ratio * (1 - ratio) / n_c)
ratio = uncertainties.ufloat(ratio, error)
M = 10 ** 9
N = 100e6
p0 = N / M
f = 1 / (1 + p0 * (1/ratio - 1))
print(f)

Risultato: $f = (23 \pm 9)\,\%$. A naso mi sembrano tanti, però l’incertezza è grande, quindi niente di conclusivo.

Per farmi un’idea più chiara controllo quale sia la distribuzione dei profile_id. Cioè: quanti sono effettivamente gli account nel database? Quanti numeri di telefono ha ogni account?

Nell’estrarre i profile_id ho notato queste simpatiche righe senza senso che mi incasinano il codice:

4.txt
 6140899:Studying IN 12th FINAL:1/14/2019 12:00:00 AM::10/05/1990
 6389410:(জানা অজানা অনুভূতি):2/6/2017 12:00:00 AM::
1.txt
 2796506:(H.A.B.V):2/10/2019 12:00:00 AM::
2.txt
 2147152:bEaCuSe tErE aTtItUdE kI kA:::
 3343527:Naten pa gjume,:2/2/2019 12:00:00 AM::
 3528579:haTe mE ? I doNt caRe !!!
 3528580:gOt a prOblEm wiTh mE ? thAn soLve iT !!! juDge mE ?
 3528581:itZs hoWs thAt I aM beTteR 
 3528582:doN't shOw yoUr atTituDe I haVe mY oWn ~:::08/30
 4682706:(জানা অজানা অনুভূতি):::
 7796710:(H.A.B.V):::
0.txt
 1898061:(জানা অজানা অনুভূতি):10/7/2018 12:00:00 AM::
 1977694:(জানা অজানা অনুভূতি):::
 6557249:(জানা অজানা অনুভূতি):2/6/2017 12:00:00 AM::

Grazie HaCkErZ yes ho risolto il my problem.

Il risultato è questo:

Quindi per 35.7 milioni di numeri di telefono, gli account in realtà sono solo 26.7 milioni. Dal primo grafico: circa 20 milioni hanno un solo numero, 5 milioni ne hanno due, 1 milioni e qualcosa ne hanno tre, e giù a calare. Un account ne ha 24.

Dal secondo grafico: 20 milioni di numeri di telefono sono di chi ne ha uno, 10 milioni di chi ne ha due, 4 milioni di chi ne ha tre, etc, e 24 di quello che ne ha ventiquattro.

A me sembra inverosimile che la gente cambi numero di telefono così tante volte. Da quello che si legge in rete il database è stato creato in un periodo di pochi anni, quindi già aver cambiato numero due volte (cioè avere tre numeri), considerando anche che forse il programma che hackerava i numeri non stava sempre lì a ricontrollare tutti gli account, è improbabile.

Insieme i tizi con uno o due numeri fanno 30 milioni di numeri, quelli con tre numeri o più i restanti 5 e mezzo. Il $(23 \pm 9)\,\%$ di 35.7 milioni è $8 \pm 3$ milioni. Quindi, ipotesi: i numeri falsi sono perlopiù generati da account che cambiano spesso numero. Dei 4 che ho considerato, il numero di numeri associati all’account sono 1, 1, 2, 3. Con così poca statistica non si può confermare o escludere nulla, però se non altro c’è un account da 3 che produce 3/7 numeri.

I casi in cui la persona A che compare nel database con il numero della persona B è un conoscente di B sono quelli che mi preoccupano. I numeri di telefono hanno troppe cifre, non può essere una coincidenza che una persona che conosci abbia inserito proprio il tuo numero di telefono sparandolo a caso. Solo che parlando con le persone interessate non sono ancora riuscito a capire il motivo. Quando lo scoprirò (e se sarà qualcosa di non privato) aggiornerò i miei cari lettori.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

© 2024 Concilio dei topini Torna sù