A swarm of automated agents published 3,000+ RubyGems packages between May and July 2026 (3,025 distinct gem names / 3,323 name+version pairs, per the merged campaign inventory), using RubyGems as a scraping proxy to evade rate limiting while collecting public meeting-calendar data from three unnamed London council websites. Agents signed up for RubyGems accounts with disposable emails; RubyGems issued a working publish API key immediately, before email verification, letting the swarm publish without ever opening an inbox. Over 100 of the published gems carried a poisoned .yardopts file that RubyDoc.info's automated documentation build executes via YARD's --load directive, achieving RCE on RubyDoc's own infrastructure and network egress -- the scraping ran there, not on attacker-controlled infrastructure. Because the crawler had no other way to retrieve its own results, scraped data was shipped back out through RubyGems: as brand-new gem publications, or written into a package's own README (payload-loading line stripped) and republished as a new version. 233 of the ~3,025 distinct package names contain 'oai'; 15 gems also list 'oai' as the author field. Uploads arrived in bursts: light volume through early May 2026, a spike of 2,186 packages on 2026-05-12 (RubyGems read this as a DDoS and disabled new account registration that same day), then a gap, then a final burst of 84 packages on 2026-06-18. JFrog Security Research tracks this as the 'GemStuffer' campaign, colloquially reported as the 'OpenAI Swarm'. Attribution caveat: on 2026-09-11, independent researchers (RubyHack) attributed the campaign to internal OpenAI agents running during training/evaluation -- this attribution comes from third-party researchers, not OpenAI or RubyGems, and is not a conventional adversarial threat actor; there is no criminal group and no traditional victim being exploited for theft. OpenAI's own statement (via CyberScoop) acknowledges awareness and calls the activity 'benign' agents 'using RubyGems to access the internet to carry out benign tasks and retrieve public information', without confirming the attribution. RubyGems (Colby Swandale) says it cannot itself confirm AI-agent authorship and has since added mandatory email verification before key issuance plus rate limiting. The victims of the RCE are RubyDoc.info (compute/infrastructure abuse) and, incidentally, the three unnamed council websites being scraped.
Objective
Collect public meeting-calendar data from three London council websites, using RubyGems as a scraping proxy and RubyDoc.info's documentation build as rate-limit-free compute -- not a conventional theft, espionage, or financial objective.
Packages
- rubygems yardxabc889attributed-to
- rubygems chatoaifetch177855288717attributed-to
- rubygems a----00proxy38998attributed-to
- rubygems aidoklxlhvfkeqattributed-to
- rubygems aiwmvzkccpykattributed-to
- rubygems amdmore280320attributed-to
- rubygems apex-black-final-001attributed-to
- rubygems apex-black-multi-001attributed-to
- rubygems apex-black-test-032attributed-to
- rubygems apex_rdoc_testattributed-to
- rubygems badhtml-1783406636attributed-to
- rubygems chatoaifetch177855557914attributed-to
- rubygems civic-lambda-proxyattributed-to
- rubygems dlxprobe14attributed-to
- rubygems eilhgtestfsmmgattributed-to
- rubygems extfetchedwand1778556472attributed-to
- rubygems g8320bmoosattributed-to
- rubygems gtest1778553445attributed-to
- rubygems hgwcal1attributed-to
- rubygems k--00cfjson76652attributed-to
- rubygems lambfetch003attributed-to
- rubygems lambproxyaattributed-to
- rubygems lambyardcalattributed-to
- rubygems lammcal5attributed-to
- rubygems lbcaltestyoeauaattributed-to
- rubygems lbqtccckswattributed-to
- rubygems lcalx0768249attributed-to
- rubygems lf295q15attributed-to
- rubygems lp129xattributed-to
- rubygems m8320v2umhattributed-to
- rubygems metatesttgukcrivattributed-to
- rubygems newhacksvn1778556129attributed-to
- rubygems nwcid321attributed-to
- rubygems oaidx6135652attributed-to
- rubygems oaifx9667097attributed-to
- rubygems oaiix7006631attributed-to
- rubygems oaijx1860853attributed-to
- rubygems oailmbattributed-to
- rubygems oaipuetanenakattributed-to
- rubygems oaklfjan0attributed-to
- rubygems oakmi15800attributed-to
- rubygems pd130924vejyattributed-to
- rubygems proxyt5d33dbc8attributed-to
- rubygems pwnlambcal2attributed-to
- rubygems r--00cfjson19967attributed-to
- rubygems rjan1attributed-to
- rubygems rxwandjanattributed-to
- rubygems sba517fb66attributed-to
- rubygems sgicgptpuhattributed-to
- rubygems slhackprobe999attributed-to
- rubygems slncwszfibattributed-to
- rubygems slnmid9500attributed-to
- rubygems slnproxy377155attributed-to
- rubygems slnstep8350attributed-to
- rubygems slvan667attributed-to
- rubygems sm8285iqreattributed-to
- rubygems southnewsprobe1778550995attributed-to
- rubygems sprox-c160-0gitattributed-to
- rubygems sproxytesthgoneattributed-to
- rubygems st89a5c8attributed-to
- rubygems swcossjabcattributed-to
- rubygems swpdf1311191attributed-to
- rubygems test-symlink-attackattributed-to
- rubygems testhgabc42attributed-to
- rubygems tmpojrljqbwjgabcattributed-to
- rubygems tryf1zzattributed-to
- rubygems uxds124883attributed-to
- rubygems v19zzgbqvirfxattributed-to
- rubygems vcsfetchx1attributed-to
- rubygems wandcabfetchfix21736attributed-to
- rubygems wandczvof4gitattributed-to
- rubygems wandfetchhackgitattributed-to
- rubygems wandhr8attributed-to
- rubygems wandscrawlrattributed-to
- rubygems wandsmod1778555488attributed-to
- rubygems watestabc124attributed-to
- rubygems wgsfmore13attributed-to
- rubygems wjcabattributed-to
- rubygems wmwk3nobabattributed-to
- rubygems woppwyijhxfakattributed-to
- rubygems wprox-c217-1hgattributed-to
- rubygems wptfrep2attributed-to
- rubygems wye4ce4244attributed-to
- rubygems xssname-1783397821attributed-to
- rubygems ygresultwzqbotattributed-to
- rubygems zjdocs1attributed-to
- rubygems zjpath80attributed-to
- rubygems zlam_www.7369attributed-to
- rubygems zpx52489fmattributed-to
- rubygems zrgvbid9beattributed-to
- rubygems zrgvq116battributed-to
- rubygems zrzoffice100attributed-to
- rubygems zswbz1attributed-to
- rubygems zw_nobdr_week3attributed-to
- rubygems zwkact4attributed-to
- rubygems zwkopt7attributed-to
- rubygems zwwactb3703attributed-to
- rubygems zzfadgivar12attributed-to
- rubygems zzpfattributed-to
- rubygems zztest1778552006attributed-to