Mēneša arhīvi: novembris 2013

Nederīgo dokumentu reģistra nepilnība

ndr

Iekšlietu ministrijas Informācijas centrs nodrošina pakalpojumu, kas ļauj noskaidrot, vai konkrēts dokuments ir anulēts, pazaudēts utml. (iekļauts Nederīgo dokumentu reģistrā). Lai ierobežotu automatizētu informācijas ieguvi no reģistra, lietotnes izstrādātājs tai ir pievienojis drošības kodu (CAPTCHA), kas obligāti jāievada, lai pieprasītu datus. Šī drošības koda realizācijā ir atklāta būtiska nepilnība. Pašu nepilnību gan raksturojam kā zemas prioritātes, ņemot vērā, ka drošības koda esamība kā tāda nav vitāli nepieciešama konkrētā pakalpojuma nodrošināšanai.

Tehniskais apraksts

Drošības kods ir PHP skripts, kas atgriež JPEG attēlu un uzstāda sīkdatni ar nosaukumu “lriem_secure”. Nepilnības atklāšanas brīdī sīkdatnē ASCII formā atradās tas pats skaitlis, kas attēlā. Turklāt analīze liecināja, ka koda pārbaude tika realizēta šādi.

$_COOKIE['lriem_secure']==$_POST['seccode']

Kodu bija iespējams nolasīt no sīkdatnes vai tik pat labi nosūtīt patvaļīga satura sīkdatni kopā ar to pašu informāciju POST masīvā.

Rekomendācijas un komentāri

Nepilnības novēršanai ieteicām lietot PHP sesijas, kas ļautu sīkdatnē glabāt nesaistītu jaucējskaitli, bet pašu drošības kodu jau glabāt sesijā, pret ko tad arī varētu veikt salīdzināšanu. Vienlaikus ilgtermiņā ieteicām attiekties no drošības koda lietošanas, ierobežojot pieprasījumu skaitu laika vienībā.

6. novembrī aplikācijas kodā tika veiktas izmaiņas — ieviesta funkcija, kas visdrīzāk realizēta kā f($a):=md5($key1.$a.$key2); tagad lriem_secure tiek uzstādīts uz f($kods) un salīdzināšana tiek veikta attiecīgi

$_COOKIE['lriem_secure']==f($_POST['seccode'])

Šis, protams, joprojām nekādā veidā nepasargā no atkārtošanas uzbrukumiem (replay attacks) — atliek vien ievadā padod datu pāri, kas apmierina augšminēto sakarību.

Aplikācijas kodā norādīts, ka tās autors ir “Maris Melnikovs”, savukārt publiskās datu bāzes liecina, ka cilvēks ar ļoti līdzīgu vārdu Iekšlietu ministrijā ir nostrādājis aptuveni pus gadu, par to saņemot diezgan pieklājīgu atalgojumu, taču šobrīd vairs valsts iestādēs nestrādā. Aplikācijas autora nepieejamība varētu izskaidrot to, kāpēc netika ņemtas vērā mūsu rekomendācijas nepilnības labošanai.

Atkāpe par vizuālajiem drošības kodiem (CAPTCHA)

captcha

Nav nekāds pārsteigums, ka vizuālie drošības kodi ne tikai nav efektīvs līdzeklis, lai ierobežotu automatizētu rīku darbību, jo tos vienmēr iespējams atpazīt ar vairāk vai mazāk speciālu programmatūru, bet arī stipri apgrūtina leģitīmu lietotāju darbu. Eksistē vairākas alternatīvas kā panākt, ka automatizēti rīki nenoslogo servera resursus. Viena no tām aprakstīta zemāk.

Datoram nav svarīgi, kas sēž pie klaviatūras. Tas redz tikai mūsu darbības, bet nevērtē, kas mēs esam. Programmētājiem no tā vajadzētu iemācīties vienu svarīgi lietu — nav svarīgi, kas veic darbību; svarīgi ir, kāda darbība tiek veikta. Tāpēc mēs no sirds rekomendējam CAPTCHA vietā izvēlēties veikt lietotāja uzvedības (statistisko) analīzi, kā tas, piemēram, realizēts 02.lv īsziņu sūtīšanas pakalpojumā.

Ja jums nepieciešama palīdzība, lai CAPTCHA vietā ieviestu saprātīgāku drošības risinājumu, tad būsim priecīgi palīdzēt.

Interesanta “funkcija” Swedbank mobilajā aplikācijā

Pārbaudot Swedbank mobilās aplikācijas drošību, tika atklāta interesanta kļūme, kas ļauj iegūt klienta vārdu un uzvārdu, ja zināms lietotāja numurs un pastāvīgā parole. Lai gan personas datu iegūšanai nepietiek ar lietotāja numuru vien, tomēr standarta autorizācijas gadījumos (bankas mājaslapa, banklink utml.) klienta dati netiek izpausti, kamēr netiek ievadīts kods no kalkulatora vai kodu kartes.

Kombinējot šo informāciju ar klienta kontu sarakstu un atlikumiem, kas iegūstami izmantojot banklink, tiek plaši pavērtas durvis sociālās inženierijas uzbrukumiem.

Tehniskais apraksts

Mobilās aplikācijas izsaukumi tiek nosūtīti kā GET pieprasījumi uz adresi https://ib.swedbank.lv/touch/, turklāt svarīgi, ka User-Agent ir jāsatur, piemēram, vārds “Android”.

Pirmais pieprasījums ir https://ib.swedbank.lv/touch/auth?authenticate=true&language=ENG&mobileIdLogin=false&authPwd=pp&userId=nn, kur aa ir lietotāja numurs, bet pp ir lietotāja pastāvīgā parole. Korektu datu ievades gadījumā atbildē tiks saņemta json virkne

{"challenge":"cc","sessionId":"ss","securityId":"dd","loginType":3,"securityLevel":1}

Tajā cc ir drošības koda numurs, kas lietotājam nākamajā solī būtu jāievada no kodu kartes, ss ir sesijas identifikators, bet dd ir drošības identifikators. Ja klients lieto kodu kalkulatoru, nevis kodu karti, tad “challenge” netiek uzstādīts un “loginType” vērtība ir cita.

Uzmanības vērts ir fakts, ka, lai gan internetbankas mājaslapā klientam pieprasītais drošības koda numurs tiek parādīts kā attēls (drošības apsvērumi?), tomēr veicot pieprasījumu caur https://ib.swedbank.lv/touch/ šis pats koda numurs tiek nosūtīts kā ASCII teksts. Tāpat interesanti, ka parole tiek nosūtīta GET pieprasījumā, kas nozīmē, ka atkarībā no aplikācijas servera konfigurācijas, iespējams, žurnālfailos glabājas visu mobilās aplikācijas lietotāju paroles.

Lai iegūtu klienta vārdu un uzvārdu, ir jānovirzās no standarta komunikācijas plūsmas, nekavējoties veicot pieprasījumu https://ib.swedbank.lv/touch/overview;jsessionid=ss?securityId=dd, ko aplikācijas serveris šajā brīdī negaida. Šim pieprasījumam svarīgi, lai klientā būtu uzstādīta sīkdatne Swedbank-Embedded=android-app-3.2. Kā atbilde tiek nosūtīts kļūdas paziņojums HTML lapas veidā, kurā iekļauts JavaScript koda gabaliņš. Šis kods satur masīvu sessionInfo.

     var sessionInfo = {
        jsessionId: 'ss',
        securityId: 'dd',
        securityLevel: 1,
        customerName: 'Alberts Kviesis',
        allowSingleSessionDefined: true,
        allowSingleSession: false,
        hasPrivateAccounts: false,
        hasBusinessAccounts: false,
        disclaimerAccepted: false,
        passwordChangeRequired: false
      }

Indekss “customerName” satur klienta vārdu un uzvārdu, tam sekojošie indeksi droši vien neatspoguļo patieso situāciju.

Reakcija

Par problēmu 23. oktobrī ziņojām bankai un CERT.LV. Informācija pirmo reizi paziņota publiski 12 dienas vēlāk — 4. novembrī. Saskaņā ar atbildīgo darbinieku komentāriem, šāda mobilās aplikācijas servera uzvedība atbilst specifikācijai un netikšot mainīta. Mēs centīsimies turpināt aplikācijas drošības pārbaudi un, atklājot nepilnības, ziņosim par tām iesaistītajām pusēm.