P.K. SHARMA

Cyber security intelligence, AI governance, practitioner analysis

Threat Intel

Packagist removed thirteen malicious Composer themes. A fourteenth from the same operator is still listed.

The takedown is real and it is narrower than it sounds. The loader is still in the GitHub repository, and Composer does not need the registry.

By Parminder Kumar Sharma · · 9 min read

A small sealed brown cardboard shipping carton on a dark matte surface, its shipping label torn away leaving a pale rectangle of adhesive residue, lit by a cold indigo rim light.

Thirteen Composer packages were pulled from Packagist over the weekend, after Socket's threat research team published an account of what they were doing: shipping trojanised front-end assets that, on an unpatched iPhone, led to a full WebKit-to-kernel exploit chain and a payload that reads cryptocurrency wallet seeds out of the iOS keychain. Every package the researchers named now returns a 404.

That is the story as it has been told. It is accurate, and it is a much smaller fact than it sounds, because a fourteenth package from the same operator is still listed, still installable, and was named in the research as a sleeper.

Every line below was checked by hand on 1 September 2026, against a control package so that a registry outage could not be mistaken for a takedown.

What the takedown removed, and what it did not

WHAT THE TAKEDOWN REMOVED, AND WHAT IT DID NOTEvery line here was checked by hand on 1 September 2026, against a control package.GONE, AND THAT IS WORTH SOMETHINGAll 13 flagged packages return 404on Packagist, checked one by one.Four of the five vendor names holdnothing at all: vsmov, vsphim,haiau009, chilltvcms. The fifth,ophimcms, keeps 20 unflagged themes.AND THE CONTROL, SO IT IS A TAKEDOWN AND NOT AN OUTAGEmonolog/monolog200 OKophimcms/theme-dy404vsmov/theme-motchill404vsmov1/theme-themphim200 OKThe last line is the one that matters.STILL STANDINGA fourteenth package, still installablevsmov1/theme-themphim, version 1.0.1, published 27 August. Socket named it as sleeper risk.The loader, still in the GitHub repositoryophimcms/theme-dy, master branch, appended to the shipped jQuery. Composer installs from a repo.Two PHP files nobody can readThe sleeper’s ServiceProvider and its 88 KB controller ship as ionCube bytecode, not source.A field that writes script into every pageThe sleeper’s own layout renders two stored settings unescaped. No new release is needed to arm it.Removing a package from a registry removes the listing. It does not remove the code.
A registry takedown is a useful control and it is not a remediation. It stops new installs through the default route, and it does nothing about the repository the package points at, the copies already on disk, or a sibling package published under a vendor name one character different from the one that was pulled.
Every row checked by hand against Packagist and GitHub on 1 September 2026, with a control package so that a registry fault could not be read as a takedown.

The fourteenth package

vsmov1/theme-themphim resolves on Packagist right now. Version 1.0.1, published on 27 August 2026, maintained by the account vsmov, author email vsphim@vsphim.com, zero downloads. It points at github.com/vsmov/theme-themphim, a repository created on the same day. The vendor name differs from the pulled vsmov namespace by a single character.

Socket named this package. Under the heading of sleeper risk, the report says theme-themphim was "published alongside the malicious theme-thempho" and "ships the same ionCube-encrypted account system as opaque bytecode from the same operator that ships confirmed spyware delivery", and it recommends treating any package from vsmov, vsphim, haiau009, chilltvcms or ophimcms accordingly. Four of those five namespaces are now empty. The one holding the sleeper is not one of them, because it is spelled differently.

Two things about that package are worth stating precisely, because they are the difference between a suspicion and a finding.

Its JavaScript is currently clean. All three shipped script files, including the bundled jQuery, contain no reference to navigator.platform, no reference to document.referrer and no call to atob. Those are the three signatures of the loader in the packages that were removed. On the evidence of the assets it ships today, this package does not deliver the exploit chain.

Its PHP is unreadable. ThemeThemPhimServiceProvider.php and Controllers/ThemeThemphimController.php both begin <?php //ICB0, the ionCube loader header, and between them run to just over 100 kilobytes of bytecode. Nobody outside the operator knows what that code does. It is the account system: registration, login, OAuth, password change. Credentials post into a handler that cannot be read.

And the theme's own layout.blade.php renders two stored settings into every page with Laravel's unescaped output syntax, {!! !!}: a footer field and a scripts field. Socket makes the general point about this theme family, and it holds here specifically. An operator, or anyone who reaches the administration panel, can put arbitrary JavaScript on every page of the site without publishing a new release and without touching the repository. There is nothing for a lockfile, an audit or a composition scanner to notice, because nothing in the package changes.

Removal from a registry is not removal of the code

The loader is still on GitHub. ophimcms/theme-dy was one of the thirteen. Its Packagist listing is gone. Its repository is not: the master branch still carries a 94,436 byte resources/assets/templets/js/jquery.js with the malicious block appended after the library's closing function. The obfuscated entry point is there. The platform and referrer gate is there. A base64 blob is there, and decoding it gives https://union.macoms.la/jquery.min-3.6.8.js, the first stage.

Composer does not require Packagist. A repositories entry of type vcs pointing at a Git URL installs the package directly, and a good deal of the CMS theme market moves that way already, through vendor-supplied instructions rather than the public registry. A takedown closes the default route. It does not close that one, it does not affect any site that installed the theme before the takedown, and it does not remove anything from the machine the code is already on.

This is the part of the story a site operator has to act on, and it is the part the coverage has been quietest about.

How a PHP package reaches an iPhone

The chain is easy to state wrongly, so here it is plainly. The PHP never touches the phone, nothing is injected at build time, and the server is not the target.

OphimCMS and KKPhim are Laravel-based content management systems used to run Vietnamese-language streaming sites. An operator installs a theme with Composer. The theme's job is to ship the site's front-end assets, and the malicious code rides in those assets rather than in the PHP. From that point every visitor to the site is served the trojanised script.

The script gates itself. It fires only where navigator.platform does not match Mac or Windows and where the visitor arrived with an external referrer, which passes over desktop users, bots and anyone typing the address directly. Every mobile visitor that clears the gate gets a gambling redirect. iPhone visitors get a second branch: a chain of loaders, one of them on a domain built to be mistaken for Cloudflare, ending in a hidden iframe that reads the iOS version out of the user agent and loads a WebKit exploit matched to that build.

What follows is renderer compromise inside the browser sandbox, a pivot into the GPU process, and a kernel escape through an IOKit driver, at which point the payload reads the keychain. Socket's analysis puts five keychain query routines covering seven wallet apps, alongside collection of Wi-Fi passwords, the SMS database, contacts, Photos, cookies, location history and account databases.

The site operator is a victim in this too, and generally an unwitting one. Their server is not compromised. They are simply serving the attack to everyone who visits.

Every stage was patched before the campaign was rebuilt

This matters more than any other technical detail, because it changes who is exposed and what they should do.

Nothing here is a zero-day

StageFlawApple fixed itBefore the chain was rebuilt
Renderer entryCVE-2025-31277, WebKit29 July 2025, in iOS 18.6More than twelve months
Renderer entryCVE-2025-43529, WebKit12 December 2025, in iOS 18.7.3 and iOS 26.2Eight months
Kernel escapeNo CVE assigned3 November 2025, in iOS 26.1Nine months
Apple release dates from Apple’s own security advisories. Socket dates the redeployment of the chain under fresh filenames to 12 August 2026. The kernel stage carries no CVE identifier: Socket states that Apple Product Security confirmed it was already addressed in iOS and macOS 26.1, and the researcher told The Hacker News that Apple issued no identifier for it and that it is suspected to be one of three kernel fixes in that release. That suspicion is explicitly unconfirmed and is reported here as a suspicion.

Both WebKit identifiers are in CISA's Known Exploited Vulnerabilities catalogue. Socket reports that the rebuilt chain still weaponises only those two, and that its offset tables still cover only iOS 18.4 through 18.6.x, with nothing for iOS 18.7 or iOS 26.

So the exposure statement is unusually clean. At risk: an iPhone XS through iPhone 16 left on iOS 18.4 to 18.6.x. Not exposed to the known stages: iOS 18.7.3 or later on the 18 line, or iOS 26.2 or later. An operating system update closes this entirely, which is not something one can often say.

The numbers that do not exist

Several of the figures circulating with this story are not in the research.

There is no install count for the thirteen packages. Socket did not publish one, and now that the listings are deleted the download totals are not recoverable from the registry. The only install figure anywhere in Socket's work on this operator is roughly 2,750 across the six ophimcms packages in their March report, which is a different and smaller set.

There is no count of affected websites, no count of victims, and no figure for cryptocurrency stolen. There are no wallet addresses and no on-chain tracing. The seed-stealing capability is documented from the code, which is solid; no theft is evidenced, which is a different claim.

The $200 million figure that travels with the name FUNNULL is real but belongs to something else. It comes from the US Treasury's designation of Funnull Technology Inc and its administrator Liu Lizhi on 29 May 2025, and it refers to victim-reported losses from cryptocurrency investment scam websites hosted on that infrastructure. Treasury's own wording is that Funnull "has directly facilitated several of these schemes, resulting in over $200 million in U.S. victim-reported losses". It is not a measure of this campaign.

What to do

Take this with you

If you run a PHP CMS with a third-party theme

  • Search your lockfile for the five vendor names, not the thirteen package names. A takedown removes a listing; composer.lock keeps the record of what you installed, and the code is still in vendor/.
  • Diff the shipped front-end assets against upstream. The malicious block is appended after the closing function of a legitimate library, so file names, versions and directory structure all look correct. Grep the JavaScript you serve for navigator.platform and document.referrer together, which is a combination almost nothing legitimate needs.
  • Treat any Composer repositories entry of type vcs as outside registry protection. A package pulled from Packagist installs perfectly well from its Git URL, and nothing in your pipeline will tell you it was withdrawn.
  • Audit the unescaped output fields in your theme. Anywhere a stored setting reaches a Blade template through {!! !!}, someone with panel access can publish script to every visitor without a deployment.
  • Check the version of your theme vendor’s other packages, including ones you do not use. In this case one sits under a vendor name a single character away from a namespace that was emptied.

For phones the instruction is simply the update. iOS 18.7.3 on the 18 line, or iOS 26.2 and later, closes every stage of this chain as it is currently built.

Sources

  1. Primary13 malicious Packagist themes deliver iOS spyware that steals crypto wallet seeds, 31 August 2026Socketaccessed 2026-09-01
  2. Primaryvsmov1/theme-themphim, version 1.0.1, still listed and installable when checkedPackagistaccessed 2026-09-01
  3. Primaryophimcms/theme-dy, master branch, still carrying the loader appended to the shipped jQueryGitHubaccessed 2026-09-01
  4. PrimarySix malicious Packagist themes ship trojanised jQuery, 12 March 2026, the only install figure published on this operatorSocketaccessed 2026-09-01
  5. PrimaryAbout the security content of iOS 18.6, released 29 July 2025, CVE-2025-31277Appleaccessed 2026-09-01
  6. PrimaryAbout the security content of iOS 18.7.3, released 12 December 2025, CVE-2025-43529Appleaccessed 2026-09-01
  7. PrimaryAbout the security content of iOS 26.1, released 3 November 2025Appleaccessed 2026-09-01
  8. PrimaryTreasury sanctions Funnull Technology Inc and Liu Lizhi, 29 May 2025, the source of the $200 million figureUS Department of the Treasuryaccessed 2026-09-01

Share this briefing

Know someone who owns this problem? Send it to them.

Related briefings

The briefing, in your inbox

Practitioner analysis of cyber and AI security news. No vendor noise.

One email per briefing. Unsubscribe any time.