Open Source · · 2 days
react-native-country-select npm account takeover
The astroonauta npm account takeover also compromised react-native-country-select, a direct dependency of react-native-international-phone-number.
Part of Glassworm hid credential theft in Unicode campaign
On the morning of March 16, 2026, an attacker who had taken over an npm account belonging to the maintainer AstrOOnauta published a malicious version of react-native-country-select, a React Native picker library used by tens of thousands of mobile apps each month. The release, 0.3.91, went live at 10:54 UTC, five minutes after the attacker had pushed a matching backdoor into the companion package react-native-international-phone-number.
Researchers at Aikido, who reported the incident under the campaign name Glassworm, said the change at the package boundary was small: one new install.js loader file and a single preinstall lifecycle hook that ran it before npm finished the install. The adjacent 0.3.9 release was clean, which made the diff easy to read.
The loader itself was the interesting part. It queried Solana RPC with getSignaturesForAddress to look up a transaction memo, decoded a URL out of the memo, and fetched a second stage. From there the chain ran through AES-decrypted JavaScript and a Google Calendar share URL used as a further indirection point before reaching attacker infrastructure at 45.32.150.251 and 217.69.3.152. The same loader hash appeared in both React Native packages compromised that morning.
The recovered payload was a Windows-focused stealer. Aikido said it established persistence through a scheduled task and an HKCU Run key, wrote an init.json guard to avoid re-execution, downloaded Node.js runtimes into AppData, killed browser processes before walking profile and wallet storage, and posted the harvested archive to the same C2. StepSecurity tracked the attacker returning over the following two days with additional releases (0.4.1 and 0.4.2) that pushed delivery deeper into transitive dependencies through @agnoliaarisian7180/string-argv and @usebioerhold8733/s-format. The combined react-native-country-select and react-native-international-phone-number packages drew roughly 130,000 monthly downloads at the time of compromise.
Appendix · Affected releases
- Aikido reported react-native-country-select@0.3.91 was published on March 16, 2026 at 10:54:18 UTC and had 9,072 weekly downloads and 42,589 monthly downloads when checked that day.
- StepSecurity later tracked additional malicious releases, including transitive delivery through @agnoliaarisian7180/string-argv and @usebioerhold8733/s-format.
- The first SHA-256/SHA-1/SHA-512 group identifies the complete react-native-country-select-0.4.1.tgz npm archive. The second group identifies the complete 0.4.2 archive. npm's version metadata supplies the SHA-1 and SHA-512 values; both stored archives match those authoritative digests byte-for-byte, and the SHA-256 values were measured from those verified bytes. The separately annotated payload hash is not an archive checksum. A whole-archive checksum for 0.3.91 remains unavailable.
References
- Malicious npm Releases Found in Popular React Native Packages - 130K Monthly Downloads Compromisedstepsecurity.io
- Malicious release report for react-native-country-selectgithub.com
- Glassworm Strikes Popular React Native Phone Number Packagesaikido.dev
- npm version metadata for react-native-country-select 0.4.0registry.npmjs.org
- npm version metadata for react-native-country-select 0.4.1registry.npmjs.org
- npm version metadata for react-native-country-select 0.4.2registry.npmjs.org
Source record: oss/attacks/react-native-country-select/meta.yaml