All your GSM numbers are belong to us!

Zaczęło się od wpisu Montera o skopanej wysyłce MMS do wielu osób. Long story short: jeśli wiadomość MMS jest wysyłana do kilku osób, to odbiorcy widzą wszystkie numery, na które została wysłana. Analogicznie jak przy wielu odbiorcach w polu To lub Cc w przypadku email (zamiast Bcc).

Telefon komórkowy

Źródło: http://www.publicdomainpictures.net/view-image.php?image=692

Moja teza jest jednak taka, że zjawisko, choć złe, nie jest aż tak tragiczne, na jakie wygląda. Odbiorca dostaje co prawda listę numerów z książki adresowej, ale nie wie do kogo należą i czy w ogóle działają. Może jedynie porównać tę listę ze znanymi sobie numerami i ustalić, jakich mają wspólnych znajomych. Albo zrobić brute force i dzwonić wszędzie (hell yeah, automaty tak robią podobno…).

Całe zdarzenie jest dla mnie porównywalne z listą PINów wszystkich ludzi na świecie (tak, wasz też tam jest, mój zresztą też), jeśli chodzi o naruszenie prywatności czy bezpieczeństwa. Postanowiłem więc zrobić listę wszystkich polskich numerów komórkowych. W trakcie tworzenia, już po pierwszym prefiksie zwątpiłem – plik miał około 100 MB surowych danych, do tego tagi HTML…

Zatem zamiast ryby – wędka i zestaw DIY do stworzenia listy wszystkich polskich numerów GSM. Na podstawie listy polskich prefiksów GSM przypisanych operatorom i odrobiny magii w Perlu, każdy może sobie wygenerować taką listę.

Blox nie lubi nawiasów ostrych, więc wklejka na zewnętrznym serwisie:

Całość działa tak długo, dopóki Wikipedia nie zmieni formatu publikowania artykułów. Klepnięte na kolanie, nieoptymalizowane w żaden sposób. U mnie wygenerowanie wszystkich numerów ww. skryptem trwa od dwóch do czterech minut. Have fun!

PS Wygląda, że w Polsce może być 110300000 numerów telefonów komórkowych. Nie odliczam niewykorzystanych prefiksów itp.

Testowanie szybkości kluczy Zabbix agenta

Było tak, że jeden z kluczy w Zabbiksie działał wolno. Nawet: bardzo wolno. Ile czasu może się wykonywać proste sprawdzenie wersji programu typu chef-client -v, nawet na umiarkowanie dobitym systemie? Zainteresowani znajdą odpowiedź na końcu wpisu[1], dość powiedzieć, że czasami załączał się timeout po stronie zabbix agent. Problem został rozwiązany w sposób najdoskonalszy, czyli poprzez zrzucanie wartości z crona do pliku, i czytanie jej z pliku, ale niesmak pozostał. Poza niesmakiem, pozostało pytanie które jeszcze klucze są nieoptymalne?

Ponieważ na ten moment Zabbix nie daje możliwości sprawdzenia statystyk czasu zapytań dla poszczególnych kluczy, wykonałem małą protezę w postaci skryptu w Perlu, który odpyta danego hosta o wszystkie klucze kilka(naście) razy i policzy dla nich statystyki. Wklejka poniżej.

 

Skrypt przyjmuje dokładnie jeden parametr – hosta na którym będzie przeprowadzać test. Poza tym, wymaga wszystkich kluczy dla danego hosta, które ma testować, w pliku określonym w zmiennej $file. Na końcu wyświetli łączny czas wykonania zdefiniowanej ilości zapytań dla każdego klucza wyrażony w sekundach oraz sam klucz. Czytaj: pewnie chcesz przepuścić wynik przez sort -n. 😉

Parę rzeczy, które wyszły w trakcie pisania tego skryptu lub których się nauczyłem (w sumie gdyby nie one, to nie powstałby ten wpis):

Pętla sprawdzające N razy wszystkie klucze po kolei jest dokładniejsza od pętli, która sprawdza kolejno wszystkie klucze N razy każdy. Chodzi o rozkład obciążanie na maszynie, w tym drugim przypadku jest większa szansa, że któryś klucz trafi w nietypowe obciążenie maszyny.

Dokumentacja do modułu Time::HiRes jest… taka sobie. Można to zrobić prościej, jak wyżej. Początkowo kombinowałem ze sprintf oraz clock_gettime(CLOCK_REALTIME);

Może zastanawiać, skąd mnożenie przez 1000000. Otóż chodzi o bug z zapisem liczb zmiennoprzecinkowych (kojarzyłem to raczej z ośmiobitowców i dzielenia, nie wiem czy słusznie…):

perl -e '$a=1415907504.646884; $b=1415907504.603042; $d=$a-$b; print $d,$/'

vs.

perl -e '$a=1415907504.646884*1000000; $b=1415907504.603042*1000000; $d=($a-$b)/1000000; print $d,$/'

Że tak zacytuję real programmers use integer. 😉

Na koniec niezła wiadomość: jest szansa, że w przyszłości Zabbix będzie miał coś w stylu MySQLowego slowloga, czyli nie będzie trzeba robić testów na poszczególnych hostach, tylko będzie wbudowane narzędzie do wykrywania wolnych zapytań. Można głosować na ten feature. 😉

Specjalne podziękowania za uwagi i wyjaśnienia dla Tona z #perl @ IRCnet (thanks Ton!).

I wracając do pytania o nieoptymalne klucze z początku wpisu – tylko nieszczęsny chef-client okazał się być czarną owcą. Pozostałe klucze, choć czasem wymagają uruchomienia Perla lub kilku poleceń w Bashu, wykonywały się w zdecydowanie przyzwoitym czasie, grubo poniżej sekundy.

[1] Wykonuje się nawet cbanq cvęganśpvr frxhaq (rot13)! Bo na tyle ustawiony był timeout…

Smssender 0.9

Odezwał się użytkownik (ha! ktoś jednak tego używa! ;-)), że Mobitex przestał działać i zwraca status 104. Z racji niezbyt wczesnej pory lub po prostu zmęczenia[1], poszukałem pomocy nie u tego dostawcy, co trzeba. Ale albo statusy są zbieżne, albo dobry człowiek sprawdził we właściwej dokumentacji. Status 104, czyli brak zdefiniowanego From. Faktycznie, nie obsługiwałem tego. Tzn. była sobie zmienna w skrypcie, którą można było w skrypcie wyedytować. Niezbyt to piękne, więc w wersji 0.9 dodałem obsługę From w pliku konfiguracyjnym.

[1] Ślady zmęczenia widoczne w githubie, tak to jest jak się siada wieczorem do skryptu nietykanego od ponad roku.