Open Source · · 2 days

react-native-international-phone-number npm account takeover

An attacker controlling the astroonauta npm account published malicious react-native-international-phone-number releases without matching GitHub releases, tags, or workflow runs.

Part of Glassworm hid credential theft in Unicode campaign

The first malicious release of react-native-international-phone-number, version 0.11.8, hit npm at 10:49 UTC on March 16, 2026, five minutes ahead of a matching backdoor in the companion package react-native-country-select. Both belonged to the same maintainer, AstrOOnauta, whose npm account had been taken over. Together the two packages drew roughly 130,000 monthly downloads and shipped in a long tail of React Native phone-input screens.

Researchers at Aikido, reporting the incident under the campaign name Glassworm, said 0.11.8 added a preinstall hook that ran a new install.js loader before npm finished installing. The prior 0.11.7 release carried no such hook. Aikido also noted that 0.11.8 still depended on the clean react-native-country-select 0.3.9, which meant this package had been directly backdoored rather than merely poisoned through its dependency.

The loader walked the same staged path as the companion package. It queried Solana RPC for a transaction memo, decoded a link out of it, fetched a second stage, and decrypted a third stage. The third stage pulled a Google Calendar share URL as a further indirection point before reaching attacker infrastructure at 45.32.150.251.

The recovered payload targeted Windows developer machines. It established persistence through a scheduled task and an HKCU Run key, wrote an init.json state file, downloaded Node.js runtimes into AppData, walked browser profile and crypto-wallet storage, collected npm and GitHub credentials, and posted the archive to the same C2. StepSecurity later tracked the same attacker republishing through 0.12.1, 0.12.2, and 0.12.3, moving delivery into a transitive dependency chain via @agnoliaarisian7180/string-argv and @usebioerhold8733/s-format to keep the loader out of the top-level package after the first round of deprecations.

Appendix · Affected releases

0.11.8 sha256 132126a8…6bf54725 download unavailable
0.12.1 sha256 f4079590…b7db69ef download unavailable
0.12.2 sha256 302cd2db…22e88be6 download unavailable
0.12.3 sha256 d39e18bd…e2fecf73 download unavailable
  • Aikido reported 0.11.8 was published on 2026-03-16 at 10:49:29 UTC with 20,691 weekly and 92,298 monthly downloads when checked that day.
  • Aikido noted 0.11.8 depended on [email protected], the clean adjacent version, so the first-wave compromise was direct rather than inherited.
  • StepSecurity later tracked additional malicious releases, including transitive delivery through @agnoliaarisian7180/string-argv and @usebioerhold8733/s-format.
  • The three hash groups identify the complete 0.12.1, 0.12.2 and 0.12.3 npm archives, matched byte-for-byte against npm's SHA-1 and SHA-512. No whole-archive checksum survives for the removed 0.11.8.

References

  1. Malicious npm Releases Found in Popular React Native Packages - 130K Monthly Downloads Compromisedstepsecurity.io
  2. Malicious release report for react-native-international-phone-numbergithub.com
  3. Follow-up malicious release report for react-native-international-phone-numbergithub.com
  4. Glassworm Strikes Popular React Native Phone Number Packagesaikido.dev
  5. npm version metadata for react-native-international-phone-number 0.11.7registry.npmjs.org
  6. npm version metadata lookup for removed react-native-international-phone-number 0.11.8registry.npmjs.org
  7. npm version metadata for react-native-international-phone-number 0.12.0registry.npmjs.org
  8. npm version metadata for react-native-international-phone-number 0.12.1registry.npmjs.org
  9. npm version metadata for react-native-international-phone-number 0.12.2registry.npmjs.org
  10. npm version metadata for react-native-international-phone-number 0.12.3registry.npmjs.org

Source record: oss/attacks/react-native-international-phone-number/meta.yaml