Open Source · · 549 days

art-template sold to a shell company, then shipped the Coruna iOS exploit kit

The author sold art-template on 2024-11-17 to KILLER WHAL AI SDN BHD. The new owners shipped 4.13.3, 4.13.5, and 4.13.6 with a browser-bundle loader that fed the Coruna iOS exploit kit through utaq.cfww.shop to steal cryptocurrency wallets on Safari iOS 13.0-17.2.1.

On May 19, 2026, Socket published an account of an unusual npm supply-chain attack: the malicious code in three releases of the JavaScript template engine art-template had been shipped not by an account takeover but by the package's lawful new owner, eighteen months after a quiet sale to a Malaysian shell company. The kit at the end of the chain was Coruna, a well-documented iOS exploit framework, and the buyer's paperwork had been convincing enough to survive months of due diligence by the original maintainer.

art-template is a Chinese-origin JavaScript template engine with about 26,000 weekly npm downloads. The last clean release was 4.13.2 on 2018-11-13. On 2024-11-17 the original maintainer, GitHub user aui, accepted an acquisition offer from KILLER WHAL AI SDN BHD, a Malaysian company at 35A Jalan SG3/1, Taman Sri Gombak, registration 202001036306. The pitch was cash plus continued maintenance. He ran the checks a careful maintainer would: the SSM company register, the acquiring law firm, a contract, payment. Then he transferred npm and GitHub, and aui was renamed to goofychris. Publishing rights for art-template, express-art-template, art-template-loader, and koa-art-template moved to daughtrymom, npmpacketmaintainmember7, and v4v5qc. The receiving bank account was later flagged by Chinese law enforcement and bank risk controls, and the buyer cooperated for months on paperwork until the freezes cleared, which is exactly what kept the transfer looking legitimate.

The first injection followed on 2025-03-12 in 4.13.3, published by v4v5qc, and it lived only in the browser bundle lib/template-web.js: a String.fromCharCode-obfuscated loader that fetched https://git.youzzjizz.com/git.js, which in turn loaded Baidu Analytics. The original author posted a GitHub warning that "v4.13.3 contains a virus" and reported the package to npm. npm did not act. The next day goofychris published 4.13.4 with the injection removed, explaining in an issue that "we wanted to make simple statistics," then deleted both the warning thread and the explanation. The second wave shipped on 2026-05-19 as 4.13.5 and 2026-05-20 as 4.13.6, again in lib/template-web.js and again leaving the Node entry point untouched. This loader pulled v3.jiathis.com/code/jia.js from a compromised Chinese social-sharing CDN, pinged Baidu Analytics, and gated on User-Agent for iPhone. Matching devices got a zero-pixel iframe hidden behind a closed Shadow DOM pointing at utaq.cfww.shop/gooll/gooll.html, which served a 50 KB fingerprinting loader that beaconed every ten seconds and content-addressed each follow-on module against a session key.

The final stage was Coruna itself: fourteen remote modules, about 606 KB, chaining twenty-three Safari and WebKit vulnerabilities. The kit stopped at iOS 17.3, matching the CVE-2024-23222 patch for a JavaScriptCore type-confusion bug, dispatched between ARM64 and ARM64_32 builds, and ran a WebAssembly proof-of-work to confirm it was talking to a real JIT rather than a sandbox. The terminal payload was a 31 KB native shellcode dropper for the PLASMAGRID cryptocurrency-wallet implant; anything outside Safari on iOS 13.0 through 17.2.1 got only the Baidu tracker. Socket attributed the deployment to UNC6691 on Coruna fingerprints previously documented by Google TAG, and SafeDep reached the same attribution independently. Both advised pinning art-template and its siblings to 4.13.2 and auditing caches and bundles for the four attacker domains. The harder problem sits upstream of the package manager: a clean legal acquisition leaves none of the forensic seams an account takeover does. The original author has filed npm tickets 3286247 and 4401568, and says the accounts remain active and the malicious versions still cannot be unpublished.

Notes

  • Ownership of the GitHub repo and npm publisher list was transferred by the original maintainer on 2024-11-17 to KILLER WHAL AI SDN BHD under contract, after the maintainer ran SSM and law-firm due diligence. This is a deliberate transfer, not an account takeover; the seller documented the buyer's chain in https://github.com/aui/blog/issues/3.
  • The 2025-03-12 4.13.3 injection used a different loader chain — git.youzzjizz.com front-loading Baidu Analytics via hm.baidu.com/hm.js?1351a72534dcecfcf4500eda9c5add00. The 2026-05 wave moved to v3.jiathis.com and the Coruna kit at utaq.cfww.shop.
  • 4.13.4 (2025-03-14) was published from the new owners' account but contains no injection — released the day after the original maintainer's public warning, with a "we made some mistakes" explanation on goofychris/art-template issue 661 that the new maintainers later deleted along with the warning thread.
  • 4.13.3 (2025-03-12), 4.13.5 (2026-05-19), and 4.13.6 (2026-05-20) are the malicious releases. 4.13.2 (2018-11-13) is the last release shipped by the original aui maintainer.
  • Injection lives in the browser bundle (lib/template-web.js) only; Node consumers using the CommonJS entry point are unaffected. Anything pulling the browser bundle via <script> tag or client-side bundler ships the loader into every page.
  • Coruna kit gates on Safari/WebKit and iOS 13.0-17.2.1; iOS 17.3 and later, Chrome, Firefox, Edge, and Android receive only the Baidu Analytics tracker. Final payload is the PLASMAGRID cryptocurrency-wallet implant.
  • UNC6691 attribution is Socket's, based on Coruna kit fingerprints documented by Google TAG. SafeDep notes the same actor and kit independently.
  • Sibling packages express-art-template, art-template-loader, and koa-art-template saw the same npm publisher turnover and should be treated as potentially affected; public reporting focused on art-template itself.

Appendix · Affected releases

art-template npm fixed 4.13.2
4.13.3 sha256 273206e2…c694868d download unavailable
4.13.5 sha256 68686c53…4733fc4b download unavailable
4.13.6 sha256 101afde8…cf5afb77 download unavailable
  • 4.13.4 was published from the same compromised account on 2025-03-14 but contains no injection.
  • SHA-256 273206e2973df6ba7474aa66693797c98dcf26b794da4c3e863ab8d8c694868d is the measured 4.13.3 npm archive; SHA-256 101afde88ff8b5c02fd341eda55022a39203088c2ff11dcb73214911cf5afb77 is the measured 4.13.6 archive recovered through an original Wayback replay. Version 4.13.5 remains without a recovered whole-archive checksum.

Indicators

  • filelib/template-web.js
  • file_sha256loader 49554fde7424c31c.js: f31bdd069fe7966ae11be1f78ee5dd44445938856dd1df12379e0e84a6851f5c
  • file_sha1loader 49554fde7424c31c.js: 8064d4e0322f069b3dba13e7957ff0ca7dab7984
  • file_md5loader 49554fde7424c31c.js: 6e79ae622b7ef30f31fdbcc2dc65339e
  • domainv3.jiathis.com
  • domaingit.youzzjizz.com
  • domainutaq.cfww.shop
  • domainl1ewsu3yjkqeroy.xyz
  • domainhm.baidu.com
  • urlhttps://utaq.cfww.shop/gooll/gooll.html
  • urlhttps://l1ewsu3yjkqeroy.xyz/api/ip-sync/sync
  • ipv4180.178.50.158
  • ipv4172.67.141.14
  • ipv4104.21.40.254
  • cveCVE-2024-23222
  • accountdaughtrymom (npm)
  • accountnpmpacketmaintainmember7 (npm)
  • accountv4v5qc (npm)
  • accountgoofychris (GitHub, renamed from aui)
  • organizationKILLER WHAL AI SDN BHD (Malaysia, registration 202001036306)
  • campaign_codeCHMK6IG08F42496C22
  • session_keycecd08aa6ff548c2

References

  1. The Takeover and Suspect Supply Chain Attack of art-template: A Detailed Account - auigithub.com
  2. Coruna Respawned: Compromised art-template npm Package - Socketsocket.dev
  3. art-template npm Supply Chain Compromise - SafeDepsafedep.io

Source record: oss/attacks/art-template-npm/meta.yaml