Home » Android » Securitatea aplicatiilor mobile (I): Speed Taxi
formats

Securitatea aplicatiilor mobile (I): Speed Taxi

Săptămâna trecută am pus pe Facebook un screenshot privind modul în care a fost scrisă o aplicaţie disponibilă pe Google Market şi venisem cu ideea de a publica săptămânal câte un articol în care să fac o analiză asupra securităţii pentru o aplicaţie românească. Deşi nu a fost susţinută de un număr mare de persoane, am zis să încerc un prim articol pentru a vedea totuşi cum merg lucrurile.

Aşadar, în funcţie de câţi doritori se vor arăta, voi continua seria săptămânală cu aceste articole. Ca pentru un prim articol, am decis să încep cu o aplicaţie care nu ar trebui să aibă un impact aşa mare asupra utilizatorilor. Ce date sensibile poate trimite o aplicaţie care te ajută să comanzi un taxi? Ei bine, după ce am analizat aplicaţia, se pare că există totuşi motive de îngrijorare.

Modul de funcţionare poate fi cel mai bine exprimat prin imagini:

 

   

O aplicaţie pentru smartphone, ce comunică folosind Internetul, diferă de modul de testare a unei aplicaţii web. În primul rând, putem analiza ce fişiere sunt create în timpul înstalării şi al utilizării – cum stochează informaţiile? sunt criptate? Apoi putem testa partea de validare a informaţiilor, logica funcţionării şi, în ultimul rând, dacă schimbul de informaţii dintre aplicaţie şi server se realizează în mod securizat.

Aşadar, despre fişierele create. În timpul utilizării am salvat locaţia unde am biroul virtual şi apoi am plasat o comandă. Câteva fişiere au fost create pe parcursul acestui proces:

/data/data/ro.mobiessence.android.clevertaxi.speedtaxi/files/DATA_Tiles_3
/data/data/ro.mobiessence.android.clevertaxi.speedtaxi/files/DATA_Tiles_4
data/data/ro.mobiessence.android.clevertaxi.speedtaxi/files
/data/data/ro.mobiessence.android.clevertaxi.speedtaxi/shared_prefs
/data/data/ro.mobiessence.android.clevertaxi.speedtaxi/shared_prefs/settings.xml

 

Oare ce o fi în settings.xml?

shell@android:/data/data/ro.mobiessence.android.clevertaxi.speedtaxi/shared_pref
s # cat settings.xml
cat settings.xml
<?xml version=’1.0′ encoding=’utf-8′ standalone=’yes’ ?>
<map>
<string name=”opt5″></string>
<string name=”lastName”>Popescu</string>
<string name=”opt6″></string>
<string name=”phone”>1234567</string>
<string name=”opt3″></string>
<string name=”opt4″></string>
<string name=”opt9″></string>
<string name=”opt7″></string>
<string name=”opt8″></string>
<boolean name=”showMapPositionInfo” value=”false” />
<string name=”email”>ion@popescu.ro</string>
<string name=”firstName”>Ion</string>
<string name=”opt2″></string>
<string name=”myAddresses„>[{&quot;gps_lng&quot;:26.145351,&quot;localityName&qu
ot;:&quot;București&quot;,&quot;building&quot;:&quot;&quot;,&quot;gps_lat&quot;
:44.43555,&quot;street&quot;:&quot;Strada Maior Ion Coravu&quot;,&quot;name&quot
;:&quot;Birou&quot;,&quot;address_details&quot;:&quot;&quot;,&quot;streetNo&quot
;:&quot;5&quot;,&quot;entrance&quot;:&quot;&quot;}]</string>
<string name=”opt1″></string>
</map>

Interesant, deci adresa din comandă e stocată aici, dar şi adresa(le) salvată de mine cu denumirea „Birou”. Totul plain text, bineînţeles.

Acum să trecem la partea de cod – ce se ascunde în spatele aplicaţiei? Pentru început, permisiunile necesare care sunt multe şi cer acces la o groază de lucruri.

Your location
coarse (network-based) location
fine (GPS) location

Network communication
full Internet access

Your personal information
read contact data

Phone calls
read phone state and identity

System tools
prevent tablet from sleeping prevent phone from sleeping
modify global system settings

Your accounts
discover known accounts

Hardware controls
control vibrator

Network communication
view network state

Pentru ce naiba sunt necesare atâtea permisiuni pentru o simplă aplicaţie de comandă a unui taxi nu pot înţelege. Cele de mai sus se găsesc şi în fişierul manifest, aşa cum e normal:

La partea de cod recunosc că nu am destule cunoştinţe pentru a spune dacă este bun sau nu, însă în mare mi-am format o idee. Parcurgând clasele, mi-a sărit în ochi următoarea parte de cod:

Cum adică IMEI? De ce ai tu, ca şi companie, nevoie de IMEI-ul telefonului? Dar să vedem mai departe…

Pe partea de comunicaţie încep prin a spune că aceasta se face total necriptat şi nesecurizat. Aşa cum menţionam anterior, se pare că aplicaţia ia şi codul IMEI al telefonului, însă nu înseamnă neapărat că îl şi transmite. Pentru a verifica acest lucru, aplicaţia am pus-o într-un emulator cu drepturi de root, deci nu are un dispozitiv GPS de care se poate folosi pentru a transmite locaţia.

Dacă se doreşte setarea unei anumite locaţii, aceasta se poate face făcând telnet pe host-ul şi portul emulatorului, după care se dă comanda

geo fix 44.445818 26.097261
OK

Astfel am putut ajunge la ecranul de iniţiere al comenzii pentru un taxi. Am selectat o stradă oarecare din Bucureşti (Vasile Alecsandri în cazul meu) şi am plasat comanda. Alte detalii cerute au fost numele, prenumele, numărul de telefon, adresa de email (opţional, dar detectată automat dacă e pus un cont Google), nr străzii. După un timp de aşteptare a venit şi răspunsul prin care eram anunţat că o maşină va sosi. Din păcate aplicaţia crapă la primirea răspunsului, însa acest lucru se datorează faptului că rulează pe emulator.

Ce s-a văzut pe partea de comunicaţii e şi mai interesant. În primul rând, traficul făcut către Google maps pentru alegerea locaţiei:

POST /glm/mmap/a HTTP/1.1
Connection: close
Content-Type: application/binary
Content-Length: 246
Host: www.google.com
User-Agent: GMM/3.0 (generic FRF91); gzip

l>oen_USandroid:generic-generic-sdk1.6 gmm-unknown>
484*2ro.mobiessence.android.clevertaxi.core.MapPosition’0ZZHmFlvayvSoFQMRT9YYJSmpU2MCZTefLJ8A7w 3c89da0d4bcf25309dd0cb0592b07628db7d646fd19395a%I

GET /maps/geo?q=44.450539,26.093816&output=json&sensor=false HTTP/1.1
Host: maps.google.com
Connection: Keep-Alive
User-Agent: Apache-HttpClient/UNAVAILABLE (java 1.4)

HTTP/1.1 200 OK
Content-Type: text/javascript; charset=UTF-8
Vary: Accept-Language
Date: Sun, 20 May 2012 11:32:50 GMT
Server: mafe
Cache-Control: private
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
Transfer-Encoding: chunked

34e
{
„name”: „44.44982,26.09424”,
„Status”: {
„code”: 200,
„request”: „geocode”
},
„Placemark”: [ {
„id”: „p1″,
„address”: „Strada Vasile Alecsandri, Bucharest, Romania”,
„AddressDetails”: {
„Accuracy” : 6,
„Country” : {
„CountryName” : „Romania”,
„CountryNameCode” : „RO”,
„Locality” : {
„DependentLocality” : {
„DependentLocalityName” : „Sector 1″,
„Thoroughfare” : {
„ThoroughfareName” : „Strada Vasile Alecsandri”
}
},
„LocalityName” : „Bucharest”
}
}
},
„ExtendedData”: {
„LatLonBox”: {
„north”: 44.4516889,
„south”: 44.4489910,
„east”: 26.0956247,
„west”: 26.0929267
}
},
„Point”: {
„coordinates”: [ 26.0942727, 44.4503400, 0 ]
}
} ]
}

0

După setarea poziţiei pe hartă şi completarea celorlalte date, am iniţiat comanda. În acest moment se face o cerere plaintext către un server general, pe portul 5454, în care se transmit mai multe informaţii:

– nume, prenume
– număr telefon
codul IMEI al telefonului (!!!)
– acurateţea poziţionării, latitudine, longitudine, localitate, stradă
– adresa email
– compania de taxi pentur care s-a făcut cererea
ID-ul unic al dispozitivului
– data,ora comenzii

În format brut, aşa arată informaţia cerută

{„data”:{„order”:{„lname”:”Popescu”,”no_cars”:1,”tel”:”12345678″,”imei„:”000000000000000″,”versioncode”:”4″,”networklocation”:{„accuracy„:”0.0″,”lng”:”44.445816″,”lat”:”26.09726″},”timestamp”:1337512997867,”source”:”android”,”details”:””,”email”:””,”token”:”3007e861b1823e13fbd2c6afc3539c7f”,”address”:”Strada Vasile Alecsandri 3, Bucharest”,”company”:{„id”:”3″,”name„:”Speed Taxi”},”gps”:{„lng”:”26.09424″,”lat”:”44.44982″},”fname”:”Ionel”,”deviceId„:”9774d56d682e549c”}},”status”:”success”}

De ce este nevoie să transmită codul IMEI şi deviceID nu înţeleg. O posibilă explicaţie ar fi pentru a preveni comenzile făcute abuziv de la un anumit dispozitiv, dar chiar şi aşa sunt prea multe date transmise, mai ales că se trimit nesecurizat. Apple a început să refuze aplicaţiile care cer acest identificator unic – vezi aici.

Faptul că se specifică şi numele companiei de taxi în pachetul transmis mă face să cred că de fapt datele ajung mai întâi la un terţ, abia apoi fiind transmise către compania ce va onora comanda. Am găsit această aplicaţie, desigur cu datele de identificare schimbate şi pentru alte companii de taxi din Bucureşti iar aplicaţia e făcută de aceeaşi firmă în toate cazurile.

Observaţi număr pus de mine – 12345678 – aşa că nu aveam aşteptări prea mari să şi primesc comanda. În plus, dacă vă uitaţi atent vedeţi şi faptul că acurateţea e zero, deci e aproape sigur faptul că poziţionarea pe hartă am făcut-o manual. Dar asta deja ţine de logic flaw. Cu toate acestea, după un timp de aşteptare de aprox 1 minut, a venit şi răspunsul de la server:

Comanda a fost onorată cu succes şi urmează să ajungă în 3 minute maşina cu indicativul 139. Îmi cer scuze pentru comanda falsă – promit să mai fac :)

Singura protecţie întâlnită a fost cea prin care se verifică localitatea, răspunsul primit fiind „You are out of accepted area”.

 

Concluzii

Eu unul nu voi mai folosi această aplicaţie, atât din cauza informaţiilor transmise, dar şi pentru că am vrut să fac o comandă la un moment dat şi mi-a cerut numărul străzii – păi dacă îl ştiam mai apelam la o astfel de aplicaţie?

Aştept feedback pentru a vedea dacă sunteţi interesaţi să testez şi alte aplicaţii româneşti.

Ah şi încă ceva: dacă cineva e dispus să doneze un iPhone (preferabil ultima versiune) voi testa şi aplicaţiile pentru iOS :)

 

19 Responses

  1. Da sper sa mai continui. 😀 foarte interesat articolul

  2. wow … da chiar ai muncit ceva ca sa descalcesti toate dedesupturile aplicatiei.

    Felicitari !

    Eu chiar mai astept astfel de analize.

  3. Alex Zamfir

    Foarte interesant articolul.
    Iar feedback-ul la o astfel de initiativa ( de a testa in fiecare saptamana o aplicatie romaneasca ) nu poate fi decat unul pozitiv ( promit sa revin cu sugestii ).
    Ca gluma, codul IMEI cu siguranta e necesar in caz ca iti pierzi telefonul in taxi sa stii in ce amanet a ajuns ( firma de software presupun ca va lansa in curand o baza de date cu IMEI-ul tuturor telefoanelor aflate in amaneturi ) :)

  4. A

    Interesant dar, citi romani au smartphone? Iar cei care au, nu au nevoie de taxi, au masina la scara.
    Ideea unei serii cu astfel de articole e buna, insa ar trebui sa fie cu ceva mai accesibil romanilor de rind. Daca ne linitam doar la clasa bogata, nu se mai dezvolta stiinta.

    • Bogdan Alecu

      Multumesc pentru feedback. Din pacate nu am acum la dispozitie un studiu privind numarul de smartphone-uri de pe piata, dar ne putem uita cate precomenzi sunt deja pentru noile telefoane ce se tot lanseaza.
      Probabil ca, raportat la numarul intregii populatii, numarul celor cu smartphone nu este mare – ramine sa ma interesez.

      • Numarul celor cu smartphon este foarte mare … raportat la veniturile din Romania pentru ca la noi fudulia e cat casa poporului. Stiu o multime de indivizi care au tot felul de smartphoane dar n-au abonament de date :)

  5. Catalin

    Articolul este foarte interesant. Ai sapat adanc …
    Am apreciat si poza cu aplicatiea de mBanking de la Raiffeisen.

    @A: ai fi uimit cat de multi romani au smartphone-uri. Cati tineri primesc de la parintii lor cadou de terminare a anului scolar, de ziua lor, pentru ca au fost cuminti, etc … Sunt care nu au in buzunar bani de un suc, dar au smartphone.

    Legat de chestia cu Apple, ar fi interesant un site in care sa fie raportate pentru aplicatiile pe Android ceea ce „iese” din telefon. Exact cum ai gasit tu:
    „- nume, prenume
    – număr telefon
    – codul IMEI al telefonului (!!!)
    – acurateţea poziţionării, latitudine, longitudine, localitate, stradă
    – adresa email
    – compania de taxi pentur care s-a făcut cererea
    – ID-ul unic al dispozitivului
    – data,ora comenzii”

    Sunt intersat de articolele urmatoare.

  6. alezz

    Salut….nu vad ce date importante iti citeste tie alpicatia speed?? Asa..imei asa si? Ce fac eu cu el???? Si daca faci10 glume pe zii si pui niste oameni pe drum sa vina la comanda facuta de tine…si nu o onorezi cum vrei sa fii blocat de sistem?? Stiu…sunt multi taximetristi care poate merita…dar gandeste.te te rog ca poate sunt si studenti sau oameni seriosi…care platesc din buz lor un ab la net si tel cu android sa.ti onoreze tie comanda! Aplicatia soferilor nu difera cu mult de cea pt public! Mai bine te.ai bucura ca.ti chemi masina in 3 sec,fara sa mai aatepti sau sa vb la tel! Este o ideie buna si se dezvolta foarte tare! Nu.ti ia nimeni contul din banca si pinul,soferii nu pot vedea datele tale poate doar dispecera firmei! Asa ca…..mai bine apreciaza si nu te lega de kkturi! Daca iti lua agenda tel sau sms mai ziceam sa fii crispat asa! Bafta p viit! Alex speedtaxi!

    • Bogdan Alecu

      Alex, in primul rind, conform aceleiasi logici, de ce nu ti-ai da CNP-ul ca doar nu ai ce face cu el, nu-i asa?
      Eu nu am de unde sti unde mai ajung acele date transmise (pe linga compania ce a facut softul si compania de taximetrie) si nu ma pot baza nici macar pe un raspuns oficial (sau pe ceva ce am auzit la tv). Sunt si alte date transmise pe linga IMEI si in plus alte date stocate. Gindeste-te ca cineva chiar utilizeaza aplicatia intens si isi pierde telefonul. Oricine ar recupera acel telefon poate vedea adresa de la serviciu, de acasa sau alte adrese importante (asta pentru a vorbi doar de ceea ce se stocheaza).
      Apoi nu-i asa ca ar fi interesant sa ai o baza de date cu nume, prenume, adresa email, nr telefon, IMEI, versiune Android? Daca pentru tine nu, pentru ca nu stii ce poti face cu aceste date, pentru altii se pot face multe. Odata ce stii IMEI-ul stii si ce telefon are. Avind la dispozitie si versiunea de Android, deja poti initia atacuri catre respectivul numar. Si cum ar fi ca prin aceasta lista sa se afle fosti premieri / senatori sau directori de companii? Plus ca, avind IMEI-ul si persoana, deja il pot folosi in a programa alt telefon cu acelasi IMEI.

      Un alt lucru pe care l-ai inteles gresit. Nu fac glume cu comenzie (ceea ce am facut a fost doar de test). La faza cu 3 secunde hai las-o ca mi s-a intimplat de mai multe ori sa vreau sa fac comanda si sa imi ceara si nr strazii. Daca il stiam mai foloseam aplicatia?

      Mai bine apreciaza tu aceste „kkturi” de aplicatii si lasa oamenii care se pricep sa isi dea cu parerea.

  7. xxx

    vezi ca te certi cu dir de la speed si treb musai sa vb de bine

  8. Foarte bun articolul si bine documentat.

    Dar vreau sa comentez un aspect: clar aplicatia nu are de ce si la ce sa foloseasca codul IMEI.
    In schimb nu inteleg de ce ai remarcat negativ folosirea deviceId-ului. Dupa mine, este absolut necesar. Si in plus, nu cred ca poate fi folosit la ceva distructiv, precum IMEI-ul.

    Oricum, unul din ele era necesar, pentru identificarea unica a unui utilizator. Din cate stiu, in versiunile Android mai vechi de 2.2, acest DeviceID se putea rescrie sau regenera. „Poate” la asta a folosit utilizarea suplimentara a IMEI-ului. Dar sa le foloseasca pe amandoua, oare de ce?

    Un ID unic de device este necesar pentru comunicarea intre telefon si server-ul lor. Blocarea unui telefon cred ca vine pe locul 2. El este cu siguranta in principal folosit pentru comanda. De la trimis request-ul pana la primirea raspunsului. Nu cred ca se asteapta un raspuns imediat, ci probabil verifica la un interval scurt de timp daca pe server a aparut un taxi pentru comanda DeviceID-ului X.

    • Bogdan Alecu

      Cristian, de acord cu tine ca e necesar un ID unic pentru a identifica in parte fiecare dispozitiv, insa de ce folosesti ID-ul dispozitivului si nu ceva random? Asta nu o inteleg eu.

      • Pai daca utilizatorul nu ar fi de buna credinta si ar chema taxi-uri aiurea el ar trebui blocat.

        Numai ca prin folosirea unui random, prin reinstalarea aplicatiei acest identificator ar fi altul, nu? Nu prea ai cum controlezi asta, decat daca ai un sir de caractere unic pe device, indiferent de o aplicatie anume.

        • Bogdan Alecu

          Si totusi cei de la Apple au interzis folosirea UDID – acolo vad ca s-a putut.
          In plus chiar daca dezinstalezi aplicatia, ea tot ramine in lista ta de aplicatii pe care le-ai avut, ceea ce ma face sa cred ca se poate controla cumva totusi ca acelasi ID sa fie si in cazul unei reinstalari.

  9. Bogdan

    Aceasta aplicatie are si drepturi de citire asupra agendei telefonice. Am in agenda peste 500 de numere de telefon. Unele sunt cat se poate de secrete.
    De ce ar vrea aceasta aplicatie sa le acceseze?

Dă-i un răspuns lui Bogdan Alecu Anulează răspuns

Adresa ta de email nu va fi publicată. Câmpurile necesare sunt marcate *

Poți folosi aceste etichete și atribute HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

© m-sec.net
credit