CloudNativePG komanda 6. jūlijā izlaida versiju 1.30.0. Laidiens aizver trīs drošības caurumus PostgreSQL klasteros, kas darbojas uz Kubernetes. Diviem caurumiem ir piešķirti CVE numuri, trešo projekts izsekoja kā GitHub drošības brīdinājumu. Neviens no tiem nav publiski izmantots uzbrukumos, taču visi trīs atrodas pašā operatorā, kas pārvalda datubāzes ar produkcijas datiem.
CloudNativePG ir Kubernetes operators PostgreSQL datubāzēm. Administrators apraksta klasteru YAML failā. Operators pats palaiž pamatmezglu, replikas, dublējumus un automātisko pārslēgšanos. Operatora modelis ir kļuvis par standarta veidu, kā Kubernetes darbina datubāzes un citas stāvokli glabājošas sistēmas. Projektu produkcijā lieto daudzi uzņēmumi. Tāpēc kļūda, kas ļauj iegūt svešas tiesības operatorā, sniedzas tieši līdz datiem.
Datubāzes īpašnieks varēja pārtvert operatora vaicājumus
Pirmā kļūda saņēma numuru CVE-2026-55769 un klasifikāciju CWE-426, proti, neuzticama meklēšanas ceļa izmantošana. Operators pieslēdzas datubāzei caur savienojumu pūlu un tur izpilda uzturēšanas vaicājumus. Pūlu tas uztur tāpēc, lai neatvērtu jaunu pieslēgumu katram solim. Tieši šajā koplietotajā pūlā trūka fiksēta meklēšanas ceļa.
Datubāzes īpašnieks varēja public shēmā izveidot pārslogotus operatorus un funkcijas ar tādiem pašiem nosaukumiem kā iebūvētie. Kad operators palaida savu vaicājumu, PostgreSQL pēc search_path secības atrada īpašnieka versiju un izpildīja to ar augstākām tiesībām. search_path nosaka, kādā secībā PostgreSQL meklē tabulas un funkcijas pa shēmām. Ja lietotāja shēma stāv pirms sistēmas shēmas, lietotāja objekts aizsedz iebūvēto. Praksē tas nozīmē, ka lietotājs ar tiesībām tikai uz vienu datubāzi varēja panākt koda izpildi ar operatora tiesībām. No turienes ceļš ved uz citām tās pašas instances datubāzēm. Labojums fiksē šo ceļu. Uz pūla savienojumiem operators tagad uzstāda search_path = pg_catalog, public, pg_temp. Sistēmas shēmu PostgreSQL pārbauda vispirms. Īpašnieka funkcijas vairs neaizsedz iebūvētās.
Paroles nonāca žurnālos atklātā tekstā
Otrā kļūda ir CVE-2026-55765. Kad operators izveidoja vai mainīja lomu, tas nodeva paroli atklātā tekstā komandā CREATE ROLE vai ALTER ROLE. Šī parole varēja nonākt PostgreSQL žurnālā, kur to redz ikviens ar piekļuvi log failiem. Atklāta teksta parole žurnālā ir bīstama tāpēc, ka log failus bieži savāc uzraudzības rīki. Tie failus glabā ilgāk par pašu datubāzi.
Versijā 1.30.0 operators pirms komandas nosūtīšanas paroli kodē ar SCRAM-SHA-256. Tā ir tā pati shēma, ko PostgreSQL lieto parolēm pēc noklusējuma. Žurnālā nokļūst jaucējkods, nevis pati parole.
Operatora un instances sakari bija bez autentifikācijas
Trešais labojums attiecas uz saziņu starp operatoru un instances pārvaldnieku, kas darbojas katrā podā. Līdz šim šis kanāls strādāja bez pušu autentifikācijas, tāpēc uzbrucējs klastera iekšpusē varēja mēģināt uzdoties par operatoru. Versija 1.30.0 kanālu paraksta ar ECDSA sertifikātiem. Operators un instance tagad pārbauda viens otra identitāti. Uzbrukums prasa piekļuvi klastera iekšējam tīklam, tāpēc tas nav izmantojams tieši no interneta. Tomēr Kubernetes vidē blakus podi bieži dala vienu tīklu, tāpēc iekšēja piekļuve nav reta.
ECDSA sertifikātu autentifikācija ir tikai versijā 1.30.0. Projekts to nav pārnesis uz 1.28 un 1.29 sērijām, tāpēc vecākajās sērijās šis kanāls paliek neautentificēts.
Jaunas iespējas un API izmaiņa
Papildus drošības labojumiem 1.30.0 pievieno jaunu objektu DatabaseRole. Tas ļauj lomas aprakstīt deklaratīvi un GitOps veidā, ar savu dzīves ciklu un RBAC. Operators pats izveido un atjauno TLS klienta sertifikātu, tāpēc lomai var iestatīt PostgreSQL cert autentifikāciju bez paroles. Sertifikāti nonāk atsevišķā Kubernetes noslēpumā, ko operators atjauno automātiski.
Otra iespēja ir Primary Lease. Operators izmanto Kubernetes Lease objektu kā slēdzeni paaugstināšanai par pamatmezglu. Instances pārvaldnieks drīkst kļūt par pamatu tikai tad, kad tur šo nomu. Iepriekš aizsardzība balstījās uz nomas beigu laiku, kas nozīmēja gaidīšanu pat pēc tīras apstādināšanas. Tas mazina risku, ka klasteris nonāk split-brain stāvoklī ar diviem pamatiem, kuri abi pieņem rakstīšanu.
Sarakstā ir vēl vairākas iespējas. Lielās versijas tagad var jaunināt uz vietas ar Image Volume paplašinājumiem. PgBouncer attēlus var pārvaldīt caur Image Catalogs, izmantojot lauku spec.pgbouncer.imageCatalogRef. Pooler metriku galapunkts saņem TLS ar karstu sertifikātu pārlādi. Klāt arī Kubernetes 1.36 atbalsts un jaunā noklusējuma PostgreSQL versija 18.4.
Viena API izmaiņa var pārsteigt. Atsauce cluster tagad ir nemaināma objektiem Database, Pooler, Publication, Subscription un ScheduledBackup. CEL validācija noraida mēģinājumu pārvirzīt resursu uz citu klasteru.
Kam jāatjaunina
Sērija 1.28.x sasniedza dzīves cikla beigas 30. jūnijā. Tās pēdējais plānotais laidiens ir 1.28.4. Sērija 1.29.x darbosies līdz 29. septembrim. Kas paliek uz 1.29, tam drošības labojumi ir versijā 1.29.2. Šis uzturēšanas laidiens pārnes arī VPA un HPA atbalstu, kā arī pamatmezgla statusa redzamību. Sērijai 1.28 tādu pārnesumu vairs nebūs. ECDSA sertifikāti operatora sakariem ir tikai versijā 1.30.0, tāpēc tur ir tā vieta, kur iegūst pilnu triju labojumu komplektu.
Komentāri
Šim rakstam vēl nav komentāru. Esi pirmais, kurš dalās ar savu viedokli.