Tai yra techninė, ne politinė analizė. Nekvestionuosiu, ar tai yra vertinga, ar sukuria nelygybę, ar dar kažką. Mane domino, kas slepiasi po tuo QR kodu ir kaip tai įmanoma nulaužti.

Nors tai techninė analizė, tačiau įrašas skirtas visiems. Minėsiu labai konkrečius techninius terminus, tačiau paaiškinsiu, ką kiekvienas iš jų reiškia. Tikiu, visi supras, net jei nežino nieko apie QR kodus ar skaitmeninius parašus.

Saugumo sprendimų apžvalga

Prieš lendant gilyn į detales paaiškinsiu, kaip viskas veikia bendrai ir kodėl padaryti teisingi techniniai sprendimai. Galimybių paso (QR kodo) sugeneravimas yra gana paprastas:

  1. Einate į GPasas.lt;
  2. Pasirenkate, jog norite Gauti (o ne Tikrinti, apie tai vėliau), patenkate į gp.esveikata.lt;
  3. Prisijungiate – turbūt per banką;
  4. Tuomet el. valdžios vartuose sutinkate, jog bus pasidalinta jūsų e-Sveikatos duomenimis;
  5. Patenkate atgal į gp.esveikata.lt, tik jau į puslapį, kur jums sugeneruotas QR kodas.


Jeigu norite tikrinti:

  1. GPasas.lt spaudžiate, jog norite Tikrinti, patenkate į tikrink.esveikata.lt;
  2. Sutinkate ir leidžiate priėjimą prie kameros;
  3. Galite skenuoti QR kodus ir iš karto gauti atsakymą, ar Pasas galioja, ar ne;
  4. Tikrinant taip pat reikėtų palyginti nuskenuoto kodo duomenis su žmogaus ID.
Galimybių pasas

Šioje grandinėje nesunkiai galima padaryti keletą blogų techninių sprendimų, kurie padarytų sistemą nesunkiai nulaužiamą.

  • QR kodus būtų galima generuoti be jokio skaitmeninio parašo — kriptografinio ir matematinio įrodymo, jog jį tikrai sugeneravo e-Sveikata. Tuomet bet kas su QR kodo generatoriumi galėtų generuoti savo Galimybių Pasus. To išvengta — sugeneruoti kodai savyje turi kriptografinį ir nepadirbamą parašą. Puiku!
  • QR kodai galėtų būti tiesiog nuorodos į patvirtinimą e-Sveikatos puslapyje. Nekalbant apie privatumo problemas (e-Sveikatos atstovai žinotų, kieno ir kaip dažnai yra skenuojami kodai), būtų nesunku sukurti netikrus, bet panašiai atrodančius puslapius, ir tokiu būdu apgauti tikrintojus.
  • QR kodai galėtų būti šifruojami, ne tik „pasirašomi“, ir tuomet juos atšifruoti ir tikrinti galėtų tik aparatai / programėlės, kuriuos išduoda ar patvirtina e-Sveikata. Dabar tikrinti gali bet kas — aš manau tai yra didžiulis privalumas.
  • Galiausiai, duomenų, kurie gyvena QR kode galėjo būti per daug (privatumo problema) arba per mažai (nepakankama įvertinti kodo tikrumą arba sudaromos sąlygos naudoti kito žmogaus kodą). Dabartiniuose duomenyse yra žmogaus pilnas vardas, gimimo metai, ir kodo išrašymo bei galiojimo-iki datos. Nei per daug, nei per mažai.


Vienintelė galima „ataka“ remtųsi QR kodo neskenavimu iš tikrintojo pusės, arba ID kortelės nerodymu. Atakos situacija:

  • Žmogus sukuria netikrą, į GPasas.lt panašų puslapį, ten įrašo savo vardą, gimimo metus ir galiojimo datas.
  • Tikrintojas neskenuoja QR kodo, o tiesiog perskaito vardą padirbtame puslapyje, sulygina su ID kortele, ir praleidžia.


Šios atakos lengva išvengti: tikrintojai tiesiog privalo naudoti Tikrinimo puslapį ir jame esantį QR kodo skanerį, kuris nuskenavus parodo žmogaus duomenis tikrintojo telefone ir patikrina skaitmeninį parašą. To niekaip neapeisi ir nepadirbsi. Gavus duomenis savo telefone, juos reikia sulyginti su ID kortele ir tada galima praleisti.

Detali techninė analizė

Antra dalis šiek tiek labiau techninė, tačiau tikiuosi, vis tiek suprantama visiems. Kokiu procesu yra sugeneruojami šie kodai?

Sekant duomenis nuo pat apsilankymo GPasas.lt iki kodo gavimo, matosi toks procesas:

  1. Paprašius Gauti kodą ir patvirtinus priėjimą prie duomenų el. valdžios vartuose, gp.esveikata.lt gauna bilietėlį (kode ticket), kuris leidžia jiems serveryje pasiimti informaciją apie žmogų. Saugi sutikimo gavimo sistema.
  2. Serveris paima duomenis ir suformuoja duomenų paketą su pilnu vardu, gimimo metais, išdavimo data ir galiojimo data. Tai gali priklausyti nuo vakcinacijos ar testo statuso.
  3. Šis duomenų paketas yra pasirašomas skaitmeniniu būdu. Pasirašymui būtina turėti „privatų raktą“, todėl tai privalo įvykti serverio pusėje. Viskas čia gerai. Kol tas raktas bus laikomas saugiai, tol niekas negalės padirbinėti Galimybių Pasų.
  4. Serveris taip pat sugeneruoja ir QR kodą (patį paveiksliuką). Tai nebūtina, nes QR kodus galima nesunkiai generuoti tiesiai naršyklėje, bet čia smulkmena.
  5. Šie du objektai (pasirašytas duomenų paketas ir QR kodo paveiksliukas) yra įterpiami į serverio sugeneruotą puslapio kodą. Paprasta ir standartiška.
  6. Žmogus gali pasidaryti kodo screenshotą, laikyti puslapį atidarytą, arba parsisiųsti kaip PDF. Svarbus faktas: sugeneruoti kodo duomenis nėra saugomi naršyklėje: nei tarp sausainėlių (cookies), nei kaip kitaip (localStorage, etc.). Tai reiškia, jog uždarius ir vėl atsidarius puslapį, kodo neberasi, reikės susigeneruoti iš naujo. Pasidaryk screenshotą!
  7. Jei nori pamatyti, kokie duomenys yra QR kode, tai galima peržiūrėti paspaudus mygtuką „Informacija“. Minėjau, jog pagrindinė ataka remiasi šitos informacijos, o ne QR kodo rodymu. Tikrintojai, skenuokite kodus!
  8. Taip pat galima susigeneruoti PDF. PDF yra generuojamas serveryje, nusiunčiant kodo duomenis. To būtų galima išvengti, nes pačios naršyklės gali generuoti PDFus, bet čia dar viena smulkmena.
Gpasas.lt

Nuo čia, pereikime prie Tikrintojo proceso.

  1. Pirmiausia, apie patį Tikrinimo puslapį: jis yra sukurtas su ServiceWorkers, tokia Web technologija, kuri leidžia padaryti, jog puslapis veiktų be interneto. Ir iš tiesų, visam tikrinimo procesui internetas nebūtinas. Tai užtikrina, jog Galimybių Pasai negali būti naudojami piliečių sekimui. Nei e-Sveikata, nei Galimybių paso kūrėjai nežino, kur QR kodai yra tikrinami. Valio, bravo, plojimai!
  2. Kitas malonus dalykas: yra pridėtos ikonėlės jei pasirenkti išsisaugoti puslapį kaip appsą per „Add to Home Screen“. Labai gražu.
  3. Pradinis etapas standartinis: kameros vaizdas yra perduodamas QR kodų aptikimo bibliotekai, jai aptikus QR kodą, jis nuskaitomas ir perduodamas parašų tikrinimui.
  4. Čia įsijungia tikroji tikrinimo logika. QR kodą sudaro 3 dalys: skaičius, kiek simbolių ilgio yra duomenų paketas, '$' simboliu atskirtas antras segmentas yra pats duomenų paketas, o po jo prasideda kriptografinis parašas.
  5. Visas QR kodas naudoja base45 kodavimą. Tai leidžia skaitmeninį parašą, kuris yra netekstinis duomenų blokas (o gryna dvejetainė informacija), užkoduoti į raides, kurios gali būti QR kodo dalimi. Puikus pasirinkimas.
  6. Duomenų paketas yra tiesiog JSON objektas. Atrodo taip: {"fn":"JONAS","ln":"LEKEVIČIUS","by":1990,"vt":1622365724811,"iss":1621760924811,"t":"g"}
  7. Skaitmeninio parašo algoritmas yra RSASSA-PKCS1-v1_5, ne pats moderniausias, bet dar niekaip nenulaužtas.
  8. Skaitmeniniam parašui patvirtinti reikia „viešosios“ rakto dalies: ji yra Tikrinimo puslapyje, fiksuota ir nesikeičianti. Būtent tai ir leidžia tikrinti parašus be interneto. Pats tikrinimas vyksta tiesiai naršyklėje, nedarant jokių užklausų per internetą. Skaitmeninių parašų biblioteka pažiūri, ar parašas kuriuo baigiasi QR kodo informacija atitinka duomenų paketą, ir jei taip, duoda žalią šviesą.


Analizuodamas, kaip veikia sistema, ištraukiau svarbiausias dalis iš Tikrinimo puslapio kodo, ir sudėjau čia: https://gist.github.com/lekevicius/13c21b72e1d9c1bdf03234c7d9bcfd84 Jei turite Node.js, galite net įsidėti savo QR kodo tekstą ir pamatyti, kaip vyksta parašo tikrinimas.
Apibendrinant: viskas tikrai puikiai sukurta. Plojimai platformą sukūrusiai komandai iš Wix!

Daugiau apie autorių skaitykite: https://www.facebook.com/lekevicius

Šaltinis
Temos
Griežtai draudžiama Delfi paskelbtą informaciją panaudoti kitose interneto svetainėse, žiniasklaidos priemonėse ar kitur arba platinti mūsų medžiagą kuriuo nors pavidalu be sutikimo, o jei sutikimas gautas, būtina nurodyti Delfi kaip šaltinį.
www.DELFI.lt
Prisijungti prie diskusijos Rodyti diskusiją (186)