protobuf.js neaprobežojas ar shēmas nolasīšanu — tā no shēmas metadatiem uzģenerē JavaScript kodu un palaiž to caur Function() konstruktoru. Tieši šī robeža, kur dati kļūst par kodu, ir seši jauni caurumi, ko drošības uzņēmuma Cyera pētnieki apkopoja ar nosaukumu Proto6. Divi no tiem ved uz koda izpildi svešā procesā, četri — uz pakalpojuma nogāšanu.
Bibliotēka ir viena no visvairāk lejupielādētajām npm ekosistēmā: aptuveni 48 miljoni lejupielāžu nedēļā. To izmanto Google Cloud klientu bibliotēkas, ziņapmaiņas rīki un neskaitāmi Node.js servisi, kas pieņem protobuf ziņojumus. Labotās versijas ir protobufjs 7.5.6 un 8.0.2, kā arī komandrindas rīks protobufjs-cli 1.2.1 un 2.0.2.
Kā shēma kļūst par kodu
Kad protobuf.js ielādē shēmu, tā katram lauka tipam sagatavo kodētāja un dekodētāja funkciju kā teksta virkni un pēc tam kompilē to ar Function() — būtībā eval ar dažiem soļiem pa vidu. Ja uzbrucējs var mainīt shēmu, mainās arī uzģenerētais kods.
protobuf.js neizlasa shēmu vien — tā no shēmas ģenerē pielāgotu JavaScript kodu. Ja kāds spēj sabojāt shēmu, mainās uzģenerētais kods un līdz ar to arī tas, kas darbojas tavā procesā.
Tipu meklēšanai bibliotēka izmanto parastus objektus, kas veidoti ar {}. Kad tā pārbauda types.basic[field.type], nederīgs tips normāli atgriež undefined. Bet, ja lietojumā vai kādā tā atkarībā ir prototype pollution caurums, uzbrucējs var iestādīt viltus ierakstu uz Object.prototype. Meklēšana tad atgriež uzbrucēja vērtību, protobuf.js pārbauda tikai to, vai rezultāts pastāv, nevis vai tas ir īsts, un virkne nonāk ģenerētajā kodā caur neaizsargātu %s vietturi.
Divi ceļi uz RCE
CVE-2026-44291 (CVSS 8.1) ir tieši šī ķēde: prototype pollution plus protobuf.js nedrošā tipu meklēšana. Uzbrucēja kontrolēta virkne izlaužas caur tipu pārbaudi un izpildās, kad Function() kompilē kodu.
Otrs, nopietnākais, CVE-2026-44295 (CVSS 8.7), prototype pollution neprasa. Tas skar pbjs statisko izvadi: rīka funkcija escapeName() neaizsargā sintaktiski nozīmīgas rakstzīmes, tāpēc shēmas nosaukumā ieliktas jaunas rindas un semikoli tiek pārkopēti tieši uzģenerētajā .js failā. Kad tas fails tiek importēts, injicētais kods palaižas.
DoS un reālie uzbrukumi
Divi caurumi ar CVSS 7.5 nogāž procesu. CVE-2026-44289 izmanto neierobežotu rekursiju: dziļi ligzdots ziņojums liek protobuf.js rekursēt, līdz V8 izsmeļ steku. CVE-2026-44290 ļauj sabojāt iebūvētas funkcijas, piemēram, Object.keys, un apturēt visu procesu.
Cyera pētnieki demonstrēja to ar Baileys — populārāko WhatsApp botu bibliotēku, kurai ir vairāk nekā 2 miljoni lejupielāžu nedēļā. Aptuveni 34 kilobaitu liels ziņojums ar ~10 000 ligzdotiem slāņiem nogāž botu. Ziņojums paliek čata vēsturē, tāpēc bots avarē atkal pie katras palaišanas, līdz kāds to manuāli izdzēš — bezizejas cikls. Tā pati krava nogāž arī Google Cloud Functions, kas seko Firestore trigeru dokumentācijai: Pub/Sub atkārtoti piegādā neapstiprināto notikumu, un funkcija avarē no jauna, līdz ziņojums beidzot nonāk atteikumu rindā.
CI/CD saindēšana
Daudzi atvērtā koda projekti CI vidē palaiž pbjs --target static-module, lai .proto failus pārveidotu par JavaScript. Uzbrucējs var iesniegt izmaiņu pieprasījumu ar nosaukumu, kurā ir jaunas rindas un semikoli. Nepilnīgā escapeName() tos izlaiž cauri, un ģenerētajā failā parādās svešas komandas, kas izpildās, tiklīdz CI to importē. Rezultāts — pieeja būvēšanas noslēpumiem, parakstīšanas atslēgām un mākoņa tokeniem. Tieši šo scenāriju apraksta arī The Hacker News pārskatā par Proto6.
Ko darīt
Atjaunini protobuf.js uz 7.5.6 vai 8.0.2 un protobufjs-cli uz 1.2.1 vai 2.0.2. Labojumi tipu meklēšanas tabulas veido ar Object.create(null), sanitizē visus refleksijas nosaukumus statiskajā ģenerēšanā, bloķē constructor un __proto__ ceļus opciju apstaigāšanā un ievieš maksimālo ligzdošanas dziļumu dekodēšanā.
Zemākais risks ir lietojumiem, kas kompilē uzticamas shēmas būvēšanas laikā un dekodē plakanus ziņojumus no autentificētiem avotiem. Augstākais — tiem, kas ielādē shēmas no ārējiem avotiem (spraudņi, nomnieki, koplietoti reģistri), dekodē neuzticamus protobuf datus vai palaiž pbjs uz svešu izmaiņu pieprasījumu saturu. Pilns tehniskais apraksts un labojumu detaļas ir Cyera pētījumā.
Avoti
- Cyera Research — Proto6: The Schema Was Not Supposed to Run
- The Hacker News — Six Proto6 Vulnerabilities in protobuf.js
- eSecurity Planet — Six protobuf.js Vulnerabilities Expose RCE and DoS Risks
- Singapūras CSA — Critical Vulnerability in protobuf.js
- Endor Labs — Critical Code Execution in protobuf.js
Komentāri
Šim rakstam vēl nav komentāru. Esi pirmais, kurš dalās ar savu viedokli.