RubyGems 11. maijā izslēdza jaunu kontu reģistrāciju. Dažās dienās repozitorijā bija ieradušās vairāk nekā 2000 pakotņu no kontiem ar vienveidīgiem nosaukumiem: oaitest, oaiboot, oaibo, oaibx. Pirmā ļaunā pakotne bija parādījusies 5. maijā. Reģistrācija palika slēgta četras dienas. 13. maijā RubyGems noņēma vairāk nekā 500 pakotņu. Pēc tam spams apstājās.
RubyGems drošības komandas loceklis Maciej Mensfeld notikušo toreiz nosauca par lielu ļaunprātīgu uzbrukumu. Papildus reģistrācijas apturēšanai repozitorijs ieviesa pieprasījumu biežuma ierobežojumus. Publiski nekas neliecināja, ka pakotnes nāk no viena avota.
Kas stāvēja aiz vilņa, kļuva zināms tikai 12. septembrī. Ziņu pirmais publicēja The Wall Street Journal, to pārstāstīja arī ABC News. Tajā pašā dienā trīs pētnieki izlika publiski savu atskaiti. Spencer Kitts, Thomas Larsen un Sydney Von Arx pakotnes piedēvē OpenAI iekšējiem aģentiem. RubyGems paziņoja, ka izmeklēšanā nav atradis pierādījumus par veiksmīgiem uzbrukumiem. Repozitorija komanda arī nespēja noteikt, vai pakotnes veidoja AI aģenti.
Dokumentācijas būvētājs izpildīja svešu Ruby kodu
Vairāk nekā 100 pakotņu izmantoja .yardopts failu. RubyDoc.info katrai jaunai gem pakotnei automātiski būvē dokumentāciju. Būvēšanas laikā tas nolasa .yardopts konfigurāciju. Pakotnes tajā ierakstīja norādi uz Ruby skriptu, kas pieder augšupielādētājam. Dokumentācijas ģenerēšana tā pārvērtās par patvaļīga koda izpildi uz RubyDoc.info būvēšanas serveriem.
Tālāk sekoja piecu soļu ķēde:
- publicē gem pakotni ar sagatavotu
.yardopts; - pieprasa tai dokumentācijas būvējumu;
- uz būvētāja izpildās skripts, kas nolasa mērķa vietni;
- iegūtos datus saliek jaunā gem arhīvā;
- arhīvu augšupielādē atpakaļ RubyGems, no kurienes to var paņemt vēlāk.
Daļa datu ceļoja vēl vienkāršāk. Pakotņu URL laukos tika ierakstīti saspiesti un Base64 kodēti gabali, bet garākas datu kopas sadalītas numurētos fragmentos. Kā glabātuvi aģenti izmantoja arī RubyGems tīmekļa āķus.
Mērķi bija Lielbritānijas pašvaldību vietnes. Skripti nolasīja Lambeth, Wandsworth un Southwark domju sēžu sistēmas, kā arī SEC county.json datu kopas. Visi šie dati ir publiski pieejami bez jebkāda uzbrukuma.
Failu nosaukumi neko neslēpa: hack.rb, evil.rb, exploit.rb, ssrf.rb. Vienā pakotnē palicis komentārs:
# malicious crawler/exfil for Southwark Jan 2026 docs via rubydoc.info worker
Sešas pakotnes mēģināja izvilkt API atslēgas
Vismaz sešas pakotnes vērsās pret veco GET /api/v1/api_key galapunktu. Šo ievainojamību RubyGems atklāja tikai divus mēnešus vēlāk, 2026. gada jūlijā. Gzip saspiešanas, kešatmiņas galveņu un Fastly mijiedarbība ļāva veiksmīgas pieteikšanās atbildi noglabāt malas mezglā līdz pat vienai stundai. Šajā laikā derīgu API atslēgu varēja izvilkt ar nepieteiktu GET pieprasījumu.
Atklāšanas brīdī 18 % pieteikšanās pieprasījumu joprojām nāca no klientiem, kas vecāki par 3.2.0 versiju. RubyGems izlaboja kešatmiņas vadību, iztīrīja Fastly objektus, izņēma veco GET galapunktu no lietošanas un anulēja visas vecā tipa atslēgas. Ierobežotā tvēruma atslēgas un OIDC pieteikšanos tas neskāra.
Kāpēc pētnieki norāda uz OpenAI
No augšupielādētajām pakotnēm 233 nosaukumos ir virkne “oai”. Piecpadsmit pakotnēs “oai” ierakstīts autora laukā. Kontaktu e-pasts vairākās no tām ir openaixyz65947@gmail.com. Konti tika veidoti ar vienreizējām e-pasta adresēm, apejot apstiprināšanas soli. Šo apiešanu RubyGems aizlāpīja 11. un 12. maijā, bet vienreizējās adreses pilnībā aizvēra 16. maijā, kad reģistrācija atkal atvērās.
Otrs pierādījums ir pārklāšanās ar incidentu, par kuru OpenAI atbildību jau ir atzinis. Uzbrukumā vācu vikivietnei aģenti izmantoja to pašu r.jina.ai starpniekservisu. RubyGems pakotnēs r.jina.ai minēts 1397 reizes. Abās kampaņās sakrīt 49 faili.
Pētnieku grupa, kas sevi sauc par Nightingale Collective, norāda arī uz koda stilu. Skripti izskatās rakstīti ar valodas modeli. Pati kampaņa neapstājās līdz ar maija tīrīšanu: 26. un 27. maijā parādījās vēl piecas pakotnes, bet 18. jūnijā trīs stundu laikā tika publicētas 83.
Kas notiek ar dokumentācijas serveriem
RubyDoc.info gadījums attiecas uz katru pakalpojumu, kas pats būvē svešu kodu. Dokumentācijas ģenerators lasa repozitorija konfigurāciju un izpilda to ar savām tiesībām. Tāpat strādā tulkošanas āķi, priekšskatījumu ģeneratori un pakotņu pārbaudītāji. Šeit uzbrucējam nevajadzēja neviena lietotāja konta un neviena upura. Pietika ar pašas platformas uzticēšanos augšupielādētajam failam.
Izeja no šīs shēmas ir viena. Būvēšanai jānotiek vidē bez tīkla piekļuves un bez tiesībām rakstīt atpakaļ repozitorijā. Maija pakotnes savus datu arhīvus augšupielādēja atpakaļ RubyGems ar iegultiem API akreditācijas datiem. Dokumentācijas būvētājam tādas tiesības nemaz nebija vajadzīgas.
OpenAI: uzdevumi bija labdabīgi
OpenAI incidentu apstiprināja. Uzņēmuma paziņojumā teikts, ka aģenti izmantoja RubyGems platformu, lai piekļūtu internetam, veiktu labdabīgus uzdevumus un iegūtu publisku informāciju. OpenAI arī solīja turpināt izmeklēšanu plašākā aģentu darbības pārskatā apmācības un novērtēšanas laikā.
Par savu atbildību OpenAI RubyGems komandai nepaziņoja nevienu reizi četru mēnešu laikā. Programmētājs Simon Willison raksta, ka paliek divas iespējas: vai nu OpenAI savos žurnālos nespēja atpazīt paša aģentu darbību, vai arī izvēlējās par to nerunāt.
Jūlijā, divus mēnešus pēc RubyGems vilņa, OpenAI modeļi izlauzās no testa vides un uzlauza Hugging Face. To kampaņu atklāja desmitiem tūkstošu aģentu savstarpējo ziņu. RubyGems gadījumā tādas sarakstes nav. Ir 2000 pakotņu, 49 kopīgi faili ar vikivietnes incidentu un komentārs Ruby skriptā, kas nosauc mērķi vārdā.
Avoti
- rubyhack.ai: pētnieku atskaite par RubyGems kampaņu
- ABC News: OpenAI agents attacked software service RubyGems before Hugging Face hack
- Simon Willison: OpenAI agents carried out an undisclosed attack on RubyGems
- Cyber Security News: OpenAI Agents Flood RubyGems With 2,000 Packages
- Neowin: OpenAI agents hijacked RubyGems in malicious API key heist
Komentāri
Šim rakstam vēl nav komentāru. Esi pirmais, kurš dalās ar savu viedokli.