Shai-Hulud Descendant Surfaces in Malicious Ruby Gem That Steals Credentials and Poisons AI Tools Socket's Threat Research Team found that the RubyGems package strutil-core version 1.0.1 runs a 5.48 MB credential-stealing worm at install time, and Socket's AI Scanner flagged the package 70 seconds after it was published. The RubyGems account jamnajiea published a clean 1.0.0 on November 1, 2026, and pushed the malicious 1.0.1 less than two hours later; RubyGems removed both versions about five hours after the malicious release. The payload is a new build of the testmetest worm from the Miasma family, which grew out of the publicly released Shai-Hulud toolkit; it steals cloud, CI, package registry, SSH, AI coding tool and wallet credentials, exfiltrates them to paleasbest[.]top, writes MCP servers, session hooks and agent instruction files into local configuration, and deletes the user's home directory if a stolen GitHub token returns HTTP 401 or 403. Shai-Hulud Descendant Surfaces in Malicious Ruby Gem That Steals Credentials and Poisons AI Tools A malicious Ruby gem runs a credential-stealing worm during installation, poisons AI coding tools, and can wipe files when a stolen GitHub token is revoked. - Kush Pandya Socket’s Threat Research Team analyzed strutil-core https://socket.dev/rubygems/package/strutil-core version 1.0.1 , a malicious RubyGems package that runs a 5.48 MB credential-stealing worm when it is installed. The RubyGems account jamnajiea published a clean 1.0.0 on November 1, 2026, and pushed the malicious 1.0.1 less than two hours later. Socket’s AI Scanner flagged it 70 seconds after publication, and RubyGems removed both versions about five hours after the malicious release. strutil-core was a standalone gem, not a compromised existing package. We found no public projects that depended on it, and we have not confirmed any victims or any packages the worm infected from it. The payload is what makes it worth a closer look. It is a new build of the testmetest worm, a member of the Miasma family that grew out of the publicly released Shai-Hulud toolkit, and strutil-core is the only RubyGems package we have tied to it. Bitbison’s sandbox run confirms that the gem runs the payload at install time and reads credential files. The rest of this post comes from static analysis of the code, not from activity seen on victim systems. - Install-time execution: a native extension script, ext/strutil-core/extconf.rb https://socket.dev/rubygems/package/strutil-core/files/1.0.1/ext/strutil-core/extconf.rb?platform=ruby , downloads the Bun JavaScript runtime and runs the bundled ext/strutil-core/index.js https://socket.dev/rubygems/package/strutil-core/files/1.0.1/ext/strutil-core/index.js?platform=ruby during gem install . - Credential theft: the payload collects cloud, CI, package registry, SSH, AI coding tool and wallet credentials, then exfiltrates them to paleasbest . top with GitHub and GitLab fallbacks. - Self-propagation: it contains republishing routines for RubyGems, npm and PyPI, plus JFrog Artifactory, GitHub, GitLab and SSH spreading code. - Persistence and AI tool poisoning: it installs a Python backdoor that downloads and runs any script the threat actor announces in a signed GitHub commit message, and writes MCP servers, session hooks and agent instruction files into local configuration and repositories. - Conditional wiper: if a stolen GitHub token starts returning HTTP 401 or 403, a background monitor deletes the user’s home directory. - Packaged with the worm’s own tooling: the gem’s installer is identical to the output of the worm’s RubyGems injection module. A String Helper With a JavaScript Worm Attached A-String-Helper-With-a-JavaScript-Worm-Attached The gemspec describes strutil-core as “Lightweight string manipulation helpers: slug, truncate, normalize.” The Ruby library, strutil core.rb https://socket.dev/rubygems/package/strutil-core/files/1.0.1/strutil core.rb , implements only one of those helpers: module StrUtilCore VERSION = '1.0.0' def self.slugify str str.downcase.gsub / ^a-z0-9 +/, '-' .gsub /^-|-$/, '' end end The gem also declares a native extension. RubyGems runs extconf.rb for native extensions during installation so that the extension can generate a Makefile. In strutil-core , ext/strutil-core/extconf.rb https://socket.dev/rubygems/package/strutil-core/files/1.0.1/ext/strutil-core/extconf.rb?platform=ruby contains no build logic. On Linux and macOS, x86-64 or ARM64, it creates /tmp/.b