libssh2 versijās līdz 1.11.1 ieskaitot ir kaudzes atmiņas pārpilde, kas ļauj palaist kodu uz datora, kurš pieslēdzas SSH serverim. Uzbrukuma virziens ir apgriezts pret ierasto. Šoreiz cieš klients: ļaunprātīgs vai pārņemts serveris bojā atmiņu tam, kas pieslēdzas. Tas notiek pirms autentifikācijas, bez lietotāja darbības un bez derīgiem pieteikšanās datiem. NVD caurumam CVE-2026-55200 piešķīra CVSS 9.2.
Labojums ir versijā 1.11.2. Ja kāda programma libssh2 iesaista statiski, atsevišķa bibliotēkas atjaunināšana neko nedod — tur jāatjaunina pati programma. Tieši tas šo gadījumu padara nepatīkamu, jo libssh2 sēž curl, Git klientos un vairākos aparatūras rīkos.
Kas tieši noiet greizi
Kļūda ir funkcijā ssh2_transport_read() failā transport.c. Tā ir SSH transporta slāņa pakešu lasītāja funkcija, kas strādā jau savienojuma izveides laikā. Funkcija nolasa uzbrucēja kontrolētu lauku packet_length un noraida tikai vērtības, kas mazākas par 1. Augšējās robežas nav.
Izmēra aprēķins pieskaita packet_length pāris mazām vērtībām, izmantojot 32 bitu aritmētiku. Vērtība 0xffffffff pārsniedz robežu un aptinas atpakaļ līdz mazam skaitlim. libssh2 iedala buferi maza skaitļa lielumam, bet vēlāk tajā ieraksta pilno, pārmērīgi lielo paketi. Rezultāts ir ieraksts ārpus kaudzes bufera robežām, ko GitHub Advisory datubāze klasificē kā CWE-680 (veselā skaitļa pārpilde, kas noved pie bufera pārpildes).
Vērtējumi dažādos avotos nedaudz atšķiras. Daļa reģistru piešķir 9.8, GitHub Advisory un NVD tur 9.2. Atšķirība rodas no tā, cik lielu svaru katrs metrikā liek nepieciešamībai, ka klients pats iniciē savienojumu. Uzbrukumam nav vajadzīga autentifikācija, bet ir vajadzīgs, lai klients pieslēgtos uzbrucēja kontrolētam serverim.
Labojums versijā 1.11.2 pievieno robežpārbaudi pirms atmiņas iedalīšanas — tas nogriež aptīšanos. Izmaiņas ienāca ar apvienošanas pieprasījumu #2052 un commit 97acf3df. Tajā pašā laidienā tika aizvērta arī saistīta kļūda CVE-2026-55199 (commit 1762685).
Kāpēc tas ir klienta puses caurums
Lielākā daļa SSH brīdinājumu attiecas uz serveriem: kāds mēģina ielauzties tavā mašīnā. Šeit ir otrādi. libssh2 ir klienta bibliotēka — to lieto programmas, kas izveido SSH savienojumus. Bojātā paketes lauka apstrāde notiek uz tās puses, kas savienojas. Tāpēc pietiek, ka klients pieslēdzas serverim, kuru vada uzbrucējs vai kurš jau ir pārņemts.
Praktiski tas nozīmē, ka nedrošs mērķa serveris vairs nav tikai autentifikācijas jautājums. Jau rokasspiediena laikā serveris var mēģināt bojāt klienta atmiņu.
Scenārijs nav teorētisks. Automātiskie skripti, kas savāc failus no daudziem SSH mērķiem, CI konveijeri, kas klonē no Git serveriem, un rīki, kas paši meklē jaunus resursdatorus — visi tie pieslēdzas adresēm, kuras ne vienmēr kontrolē to īpašnieks.
Kur libssh2 slēpjas
Bibliotēka reti parādās kā atsevišķa pakotne, ko lietotājs apzināti instalē. Biežāk tā ir iebūvēta citā programmā. The Hacker News uzskaita curl, Git, PHP, dublēšanas aģentus, aparātprogrammatūras atjauninātājus un dažādas iekārtas.
Statiskā iesaiste padara uzskaiti grūtu. Kad programma libssh2 iekompilē savā binārajā failā, sistēmas pakotņu pārvaldnieks to neredz kā atsevišķu atkarību. Tu vari atjaunināt sistēmas libssh2 uz 1.11.2 un joprojām palaist duci binču ar iesaistītu veco kodu. Tāpēc atjaunināšana šeit sākas ar inventarizāciju, nevis ar vienu apt vai dnf komandu.
Cik reāls ir risks šodien
Publisks koncepta pierādījums jau eksistē. Tas ir ievietots GitHub arhīvā ar nosaukumu exploitarium, un satur vietēji pārbaudītu kodu palaišanas ietvaru kontrolētā vidē. Tas nav gatavs attālinātas ekspluatācijas rīks, ko var vienkārši pavērst pret svešu mērķi. CISA ekspluatācijas vērtējums pagaidām ir “none”, un publiski apstiprinātu uzbrukumu savvaļā nav.
Distribūcijas jau reaģē. Debian labotās versijas ir ievietotas testēšanas atzarā, ko var izsekot Debian drošības izsekotājā. Sākotnējais labojums augšpusē ienāca laikā no 17. līdz 29. jūnijam, un formālais laidiens sekoja pēc tam.
Ko darīt tagad
Pirmais solis ir atrast visas libssh2 kopijas, arī statiski iesaistītās. Meklē pakotni pēc nosaukuma un arī binārajos failos iekompilētas versijas. Dinamiski saistītajām programmām palīdz ldd, statiskajām — strings izvadē meklēta versijas rinda vai simbols libssh2_. Pēc tam pārej uz būvēm, kas satur commit 97acf3df vai versiju 1.11.2 un jaunāku.
Ja atjaunināt nevar uzreiz, ierobežo izejošos SSH savienojumus uz uzticamiem serveriem un seko līdzi neparasti lielu pakešu anomālijām rokasspiediena posmā. Uzņēmuma vidē noder skaidrs saraksts ar to, kuri procesi vispār drīkst iniciēt SSH — bieži tas ir mazāks loks, nekā šķiet no sākuma.
Vissvarīgākais ir nepieņemt, ka viena sistēmas pakotnes atjaunināšana aizver visu. Konteineru attēli šeit ir atsevišķs stūris: bāzes attēls var nest veco libssh2 vēl ilgi pēc tam, kad resursdatora sistēma jau ir atjaunināta. Katrs rīks, kas SSH runā pats no sevis, jāpārbauda atsevišķi.
Komentāri
Šim rakstam vēl nav komentāru. Esi pirmais, kurš dalās ar savu viedokli.