NASA Reaktīvās kustības laboratorijas atvērtā koda rīkkopas AIT tīmekļa pults 12. augustā saņēma laidienu 2.5.2. Tas aizver trīs caurumus, kuru kopvērtējums pēc CVSS ir 9,4. Paroli laidiens nepievieno. Ja serveris ir sasniedzams tīklā, komandas nosūtīšanai joprojām pietiek ar diviem HTTP pieprasījumiem.
AIT-GUI ir AMMOS Instrument Toolkit tīmekļa saskarne. Operatori ar to no zemes stacijas raida komandas kosmosa aparātam un tā instrumentiem, skatās telemetriju un palaiž skriptu sekvences. Kodu glabā NASA-AMMOS krātuve GitHub, kurai ir 28 zvaigznes un 14 atzarojumi. Drošības uzņēmuma Cycode pētnieki 19. augustā publicēja kļūdu ķēdi ar apzīmējumu GHSA-p9r8-2q67-fp86. CVE numura tai nav. Globālajā GitHub ievainojamību datubāzē šis apzīmējums neatveras, jo brīdinājums ir publicēts tikai pašas krātuves drošības sadaļā.
Serveris klausījās visās saskarnēs
Vecajā kodā konfigurācijas parametrs host tika nolasīts, bet servera startā neizmantots. Tā vietā bija iekodēts ("0.0.0.0", port). Pults API tāpēc bija pieejams visās tīkla saskarnēs neatkarīgi no tā, ko operators ierakstīja konfigurācijā.
Uz šī servera karājās trīs stāvokli mainoši galapunkti bez pārbaudēm. POST /cmd paņēma formas parametru command, sadalīja to pa atstarpēm un padeva tālāk uz komandu kopni. Starp šiem soļiem nebija nekādas attīrīšanas. POST /script/run un POST /seq lietotāja ceļu salika ar os.path.join() bez pārbaudes, tāpēc pieņēma arī ../../../../ tipa slodzes. Pieteikšanās, CSRF žetona vai CORS ierobežojuma nebija nevienā maršrutā.
Ceļu pārbaudes trūkums ietekmē abus izpildes galapunktus. /seq palaiž komandu sekvenci, /script/run palaiž Python skriptu. Abos gadījumos serveris līdz šim ļāva norādīt faila ceļu ārpus tam paredzētās mapes. Trešais līdzīgais maršruts /scripts/load ierobežojumu jau saturēja, tāpēc 2.5.2 to vienkārši pārnesa arī uz pārējiem diviem.
Ko maina 2.5.2
Laidiena izmaiņu sarakstā ir trīs punkti. Serveris tagad piesaistās konfigurētajam host ar noklusējumu localhost, tāpēc attāla piekļuve prasa, lai operators šo parametru uzstāda pats. Metodes POST, PUT, DELETE un PATCH iet caur pārbaudi, kas salīdzina pieprasījuma Origin galveni ar servera Host. Ja Origin nav, tiek skatīts Referer. Ceļi galapunktos /script/run un /seq tagad tiek kanonizēti un pārbaudīti ar is_relative_to pret ScriptRoot un SEQRoot. Klāt nāca fails tests/test_gui_security.py ar regresijas testiem visiem trim labojumiem.
Pati pārbaude laiž cauri pieprasījumiem, kuriem nav ne Origin, ne Referer. Izmaiņu sarakstā tas ir uzrakstīts atklāti.
Non-browser clients that send neither header are unaffected.
Komentārs kodā to paskaidro sīkāk. Pārbaude ir vērsta pret CSRF, lai kāda operatora apmeklēta lapa nevarētu klusi vadīt API. Komandrindas rīki turpina strādāt tāpat kā agrāk.
Sesijas identifikatoru izsniedz katram apmeklētājam
Trūkstošā pieteikšanās palika arī pēc ielāpa. Galapunkts /cmd prasa derīgu sesiju un citādi atgriež kļūdu 401. Sesiju tomēr izsniedz bez maksas. Maršruts GET / izsauc Sessions.create(), kas uzģenerē jaunu identifikatoru un ieliek to sīkdatnē sid. Paroles pārbaudes starp šiem soļiem nav.
Uzbrucējam, kurš serveri sasniedz, tāpēc vajag divus pieprasījumus. Vispirms curl -c jar http://merkis:8080/, pēc tam curl -b jar -X POST http://merkis:8080/cmd --data-urlencode 'command=NO_OP 1 2 3'. Neviens no tiem nesūta Origin galveni, tāpēc jaunā pārbaude tos izlaiž. Pēc 2.5.2 to aptur tikai noklusējuma piesaiste pie localhost.
CVE norāda uz laidienu, kas šo caurumu neaizvēra
Tā pati trūkstošā autentifikācija jau bija reģistrēta atsevišķi. Ieraksts CVE-2026-60112 publicēts 29. jūlijā ar vērtējumu 9,3 pēc CVSS 4.0 un 9,8 pēc CVSS 3.1. Aprakstā ir nosaukti tie paši divi izsaukumi: Sessions.create() bez akreditācijas pārbaudes un handle_cmd(), kas komandas padod kopnei.
Atsauces tomēr nesakrīt ar aprakstu. Par ievainojamām ierakstā atzītas versijas pirms 2.5.1. Norādes ved uz 2.5.1 laidienu un komitu beb8fc0, kuras apraksts skan “Restrict script execution paths and avoid static temp files”. Šī komita ierobežo skriptu ceļus. Paroli tā nepievieno. Cycode analīzē ievainojamas ir versijas 2.5.1 un vecākas. Labotais laidiens tur ir 2.5.2, kas iznāca piecas nedēļas pēc CVE publikācijas.
PyPI joprojām izsniedz 2023. gada versiju
Kas pulti instalē no Python pakotņu krātuves, saņem pavisam citu kodu. Pakotnes ait-gui jaunākā versija PyPI ir 2.4.1, augšupielādēta 2023. gada 27. jūlijā. Tajā nav neviena no 2.5.x labojumiem. Bibliotēka AIT-Core, uz kuras pults balstās, tajā pašā PyPI ir versijā 3.1.1 no šā gada 28. maija.
Laidienu vēsture GitHub izskaidro daļu no atstarpes. Pēc 2.4.1 2023. gada jūlijā nākamais laidiens bija 2.5.0 šā gada 18. maijā, tātad gandrīz trīs gadu pārtraukums. Tam sekoja 2.5.1 10. jūlijā un 2.5.2 12. augustā. Krātuvē 24. augustā parādījās vēl pirmslaidiens 2.5.2b1 ar piezīmi, ka tas nes drošības izmaiņas lietotājiem, kuri vēl paliek uz AIT-Core 2.x bāzes.
Cycode raksta, ka ķēdi atrada ar AI palīdzību veiktā koda lasīšanā, bez izpildlaika ekspluatācijas. Publiskas informācijas par to, vai kāda aktīva misija bija atvērta, nav. Pētnieki iesaka pēc atjaunināšanas pārskatīt komandu un sekvenču vēsturi.
Komentāri
Šim rakstam vēl nav komentāru. Esi pirmais, kurš dalās ar savu viedokli.