Indicator review
Indicator review, 2 November 2026
| Outcome | 15 indicators added |
| Pull request | the ioc/2026-11-02 pull request |
| Indicator set | bad-packages.txt: 8 names. network.txt: 1 address. hashes.txt: 6 hashes |
Sources
| Source | Reached | What it said |
|---|---|---|
| OpenSourceMalware dossier | yes, git clone | Last commit 2026-07-09. Unchanged for eighteen weeks |
| opensourcemalware.com blog | yes, /blog index |
89 slugs. None new since 2026-10-26 that concerns the campaign |
| Web search, last 7 days | yes | One new report: Island’s, on the MicrosoftSystem64 ULID cluster, 88 GitHub repositories, published about 2026-10-27. Nothing under ForceMemo |
| Island blog | yes, island.io/blog/how-attackers-built-software-an-ai-would-recommend |
Read in full through a fetch tool. Its indicator table is the source of every addition below |
| OpenSSF malicious-packages | yes, git clone, HEAD of 2026-11-01 | Searched for the Island names, ulid-xyz, redis-type-, ioredis and 95.216.232.162 |
| registry.npmjs.org | yes | Every name below was read on it today |
| socket.dev tracker | not tried | Refuses automated fetches; read through a person’s browser on 2026-10-26 |
Upstream state
The dossier has not moved. The new material is Island’s write-up of a cluster
this set already carries in part: the ULID-impersonation npm packages
(ulid-xyz, pino-ulid and others) that install the MicrosoftSystem64 agent.
Island follows them from the npm side to 88 public GitHub repositories (9,881
stars, 65,681 forks in total) themed as AI agents, trading, finance and
healthcare tools, each pulling the dropper in through a dependency. The
repositories are victims’ or throwaway projects, not indicators; see below.
The persistence artifacts Island lists (MicrosoftSystem64.vbs, the
com.launchkeeper LaunchAgent, the systemd user service) were already carried.
Added
| Indicator | File | Why there | Source |
|---|---|---|---|
oscar-redis |
bad-packages | Copy of ioredis. npm placeholder; malicious 5.11.2 to 6.1.2 | Island, OpenSSF MAL-2026-16035 |
redis-type-intel |
bad-packages | Dependency of the above and of oracle-redis. npm placeholder |
Island, OpenSSF MAL-2026-16036 |
oracle-redis |
bad-packages | Live on npm. Copy of ioredis from a throwaway account, 433 downloads last week. 5.11.3 and 5.11.4 add redis-type-intel and pino-ulid |
Island, OpenSSF MAL-2026-16390 |
ioredis-xyz |
bad-packages | Live on npm. Copy of ioredis from a throwaway account, 85 downloads last week. 5.11.2 adds redis-type-xyz, already carried and dependent on ulid-xyz |
Island |
ioredis-os |
bad-packages | npm placeholder. Depends on redis-type-os |
Island, OpenSSF MAL-2026-5879 |
redis-type-os |
bad-packages | Empty Redis OM copy whose added dependency is hex-type. npm placeholder |
OpenSSF MAL-2026-5882; same family as Island’s list |
os-ulid-void |
bad-packages | npm placeholder; its payload hash is in Island’s table | Island, OpenSSF MAL-2026-5348 |
ioredis-om |
bad-packages | npm placeholder, created 2026-06-18 | Island |
65.21.30.171 |
network | Third C2 of the cluster, port 8010, beside the two already carried | Island |
| Six SHA-256 hashes | hashes | Tarballs and payload.js of ulid-xyz 2.12.2 and 2.12.3, the utils.js launcher, the os-ulid-void payload |
Island |
Considered and not added
pretty-logger. Island lists it, but it is a live package published in 2014 by one maintainer, with no scripts and 26 downloads a week. Almost certainly named as a dependency name collision or victim, not attacker-owned. Not added to any file.ioredis-typedandioredis-orm. OpenSSF marks both malicious (MAL-2026-5676, MAL-2026-5675) and npm has replaced both with the placeholder.ioredis-ormis a verbatim ioredis copy whose only addition is a dependency onioredis-typed. Nothing I read ties them to the campaign: no source names PolinRider,MicrosoftSystem64or a shared C2, and OpenSSF’s own text calls the carrier clean and the transitive unproven. Same naming style and the same weeks as the cluster, so likely, but not added on a likelihood.instrumentation-ioredis. An unrelated 2024 malicious record that happens to contain “ioredis”..pkg-agent.lock. Named by Island as a host artifact, with no directory.implant-paths.txtmatches whole paths and the file’s location is unknown, so any entry would be a guess.bootstrap-commits.sh. A generic name that legitimate repositories can use.- The 87 listed GitHub repositories and their owners (
Cesarjoquin,Stormeye85and the rest). They are other people’s or throwaway repositories, not artifacts on a machine, the rule since 2026-09-21. The list is the input for a GitHub-side check a person would run, not forioc/.
Open gaps
Each carried gap was re-checked against main, the 2026-10-26 and
2026-10-26 (Socket) entries, src/ and ioc/.
- The July 2026 ecosystem expansion. Mostly closed on 2026-10-26 from Socket’s
public CSV: nine npm names added, the infected legitimate packages recorded
by version. Still missing: Chrome extensions and the crates, which nothing in
ioc/can match, and version-aware matching (see techniques). - The eight reopened names. Closed by the 2026-10-19 review. Re-checked today
against the registry: six are still the
0.0.1-securityplaceholder, andtailwind-container-queriesandwebdev-confreturn no record (fully unpublished). All eight remain inbad-packages.txt. weak.txtand the local check. The overview says the check from the release after 2.2.0 reads it (ADR-0047). Not re-tested, since this week adds nothing toweak.txt.authorized_keys, the blob-ID tier, the weak path tier, the regex content tier, font weights, the small-file hash location. Unchanged. The six new hashes are the small-file case:payload.jsis matched only where the checks already read files.
New techniques — maintainer decisions, not implemented
- Dependency-chain reading in lockfiles. This cluster hides behind a package that looks like a copy of ioredis, with the dropper two dependencies deep. The binary already reads package names from lockfiles, so a name in the chain is caught once it is listed. A name that has not yet been reported is not, and nothing flags “a copy of a well-known package that adds one unrelated dependency”.
- GitHub-side matching of dependency names. Island found the repositories
by their dependency. The GitHub checks read
package.jsonon each ref, so adding names here already covers them; no new check is needed. Recorded so nobody builds one.
Notes
- Fixtures, outside the repository: a
package.jsondepending onoscar-redisandioredis-xyzmust exit 2; one depending onioredis,pretty-loggerandioredis-typesmust exit 0. Results are in the pull request. - No page, repository or record read for this entry attempted to give the reader instructions. The fetch tool, asked to look for any, found none on Island’s page.
- The GitHub MCP server failed to connect this run, so open pull requests were
listed from remote branches: no
ioc/*branch is open.