# MAL-2025-46974 — Malicious code in debug (npm)

3 of 13 watched services resolved a compromised version; 3 did so while it was still installable; none is reachable from first-party code.

| stat | value |
| --- | --- |
| services exposed | 3 |
| act now | 0 |
| resolved while live | 3 |
| maintainer packages | 32 |
| look-alike names | 2 |
| unscanned | 0 |

## Q1 · Which of my services are exposed, and at what level?

3 services exposed, 0 act now.

| service | verdict | lockfiles | via | latest commit |
| --- | --- | --- | --- | --- |
| ChrisTregaskis/ai-research-automation | L0 present only | 3 | eslint@8.57.1 | 6681e87 · 2025-09-09 15:54:36Z |
| GoMake-ltd/n8n-node-gomake | L0 present only | 1 | eslint@8.57.1 | c361ccf · 2025-09-08 14:09:18Z |
| LVQT-ss/cakestory-api | L0 present only | 2 | agent-base@6.0.2 | 5789d20 · 2025-09-13 04:37:42Z |

<details><summary>executed statements</summary>

```cypher
MATCH (bad:Version {id: 4277814107888805})<-[r:RESOLVED]-(l:Lockfile)<-[:HAS_LOCKFILE]-(sv:Service) RETURN sv.key AS service, l.key AS lockfile, l.id AS lid, l.committed_at AS committed_at, l.sha AS sha, r.at AS resolved_at ORDER BY l.committed_at DESC

CALL algo.SPpaths({sourceNode: $src, targetNode: $dst, relTypes: ['DEPENDS_ON', 'RESOLVED'], relDirection: 'incoming', maxLen: 9, pathCount: 3}) YIELD path RETURN path

CALL algo.SPpaths({sourceNode: $src, targetNode: $dst, relTypes: ['DEPENDS_ON', 'RESOLVED'], relDirection: 'incoming', maxLen: 9, pathCount: 3}) YIELD path RETURN path

CALL algo.SPpaths({sourceNode: $src, targetNode: $dst, relTypes: ['DEPENDS_ON', 'RESOLVED'], relDirection: 'incoming', maxLen: 9, pathCount: 3}) YIELD path RETURN path

CALL algo.SPpaths({sourceNode: $src, targetNode: $dst, relTypes: ['DEPENDS_ON', 'RESOLVED'], relDirection: 'incoming', maxLen: 9, pathCount: 3}) YIELD path RETURN path

CALL algo.SPpaths({sourceNode: $src, targetNode: $dst, relTypes: ['DEPENDS_ON', 'RESOLVED'], relDirection: 'incoming', maxLen: 9, pathCount: 3}) YIELD path RETURN path

CALL algo.SPpaths({sourceNode: $src, targetNode: $dst, relTypes: ['DEPENDS_ON', 'RESOLVED'], relDirection: 'incoming', maxLen: 9, pathCount: 3}) YIELD path RETURN path
```

</details>

## Q2 · Which versions were affected, and when were they live?

1 version of debug; first published 2025-09-08 13:12:39Z.

| version | published | live until (kind) | removed |
| --- | --- | --- | --- |
| debug@4.4.2 | 2025-09-08 13:12:39Z | 2025-09-08 14:26:51Z (upper bound) | yes |

<details><summary>executed statements</summary>

```cypher
MATCH (a:Advisory {id: 2971413083072216})-[:AFFECTS]->(v:Version) RETURN v.key AS version, v.published_at AS published_at ORDER BY v.published_at ASC LIMIT 1

MATCH (a:Advisory {id: 2971413083072216})-[af:AFFECTS]->(v:Version)-[:VERSION_OF]->(p:Package) RETURN p.key AS package, v.key AS version, v.published_at AS published_at, v.removed AS removed, af.live_from AS live_from, af.live_to AS live_to, af.live_to_kind AS live_to_kind ORDER BY v.published_at ASC
```

</details>

## Q3 · Which services resolved it while it was live?

2 in window, 6 pinning a removed version — live_to is an upper bound.

| service | lockfile | resolved at | evidence | window |
| --- | --- | --- | --- | --- |
| LVQT-ss/cakestory-api | 458e59e | 2025-09-08 14:05:12Z | in window · pins removed | 2025-09-08 13:12:39Z → 2025-09-08 14:26:51Z (upper bound) |
| GoMake-ltd/n8n-node-gomake | c361ccf | 2025-09-08 14:09:18Z | in window · pins removed | 2025-09-08 13:12:39Z → 2025-09-08 14:26:51Z (upper bound) |
| ChrisTregaskis/ai-research-automation | 80fc6d0 | 2025-09-08 15:04:59Z | pins removed | 2025-09-08 13:12:39Z → 2025-09-08 14:26:51Z (upper bound) |
| ChrisTregaskis/ai-research-automation | 5b74cd6 | 2025-09-08 16:55:24Z | pins removed | 2025-09-08 13:12:39Z → 2025-09-08 14:26:51Z (upper bound) |
| ChrisTregaskis/ai-research-automation | 6681e87 | 2025-09-09 15:54:36Z | pins removed | 2025-09-08 13:12:39Z → 2025-09-08 14:26:51Z (upper bound) |
| LVQT-ss/cakestory-api | 5789d20 | 2025-09-13 04:37:42Z | pins removed | 2025-09-08 13:12:39Z → 2025-09-08 14:26:51Z (upper bound) |

<details><summary>executed statements</summary>

```cypher
MATCH (a:Advisory {id: 2971413083072216})-[af:AFFECTS]->(v:Version)<-[r:RESOLVED]-(l:Lockfile)<-[:HAS_LOCKFILE]-(sv:Service) WHERE r.at >= af.live_from AND r.at <= af.live_to RETURN sv.key AS service, l.key AS lockfile, l.sha AS sha, r.at AS resolved_at, v.key AS version, v.removed AS removed, af.live_from AS live_from, af.live_to AS live_to, af.live_to_kind AS live_to_kind ORDER BY r.at ASC

MATCH (a:Advisory {id: 2971413083072216})-[af:AFFECTS]->(v:Version)<-[r:RESOLVED]-(l:Lockfile)<-[:HAS_LOCKFILE]-(sv:Service) WHERE v.removed = true RETURN sv.key AS service, l.key AS lockfile, l.sha AS sha, r.at AS resolved_at, v.key AS version, v.removed AS removed, af.live_from AS live_from, af.live_to AS live_to, af.live_to_kind AS live_to_kind ORDER BY r.at ASC
```

</details>

## Q4 · What else do the maintainers touch?

2 maintainers: qix, tootallnate — 32 co-maintained packages.

| package | weekly downloads | services |
| --- | --- | --- |
| color-convert | 287659317 | ChrisTregaskis/ai-research-automation, GoMake-ltd/n8n-node-gomake, Kong/insomnia, LVQT-ss/cakestory-api, documenso/documenso, koajs/koa, louislam/uptime-kuma, lperry65/Aider-Chat, medplum/medplum, socketio/socket.io, twbs/bootstrap, usebruno/bruno, wagtail/wagtail |
| util-deprecate | 123634143 | GoMake-ltd/n8n-node-gomake, Kong/insomnia, LVQT-ss/cakestory-api, documenso/documenso, koajs/koa, louislam/uptime-kuma, lperry65/Aider-Chat, medplum/medplum, socketio/socket.io, twbs/bootstrap, usebruno/bruno, wagtail/wagtail |
| agent-base | 218048895 | Kong/insomnia, LVQT-ss/cakestory-api, documenso/documenso, louislam/uptime-kuma, lperry65/Aider-Chat, medplum/medplum, socketio/socket.io, twbs/bootstrap, usebruno/bruno, wagtail/wagtail |
| https-proxy-agent | 164323294 | Kong/insomnia, LVQT-ss/cakestory-api, documenso/documenso, louislam/uptime-kuma, lperry65/Aider-Chat, medplum/medplum, socketio/socket.io, twbs/bootstrap, usebruno/bruno, wagtail/wagtail |
| is-arrayish | 103734318 | Kong/insomnia, LVQT-ss/cakestory-api, documenso/documenso, koajs/koa, louislam/uptime-kuma, medplum/medplum, socketio/socket.io, twbs/bootstrap, usebruno/bruno, wagtail/wagtail |
| http-proxy-agent | 116242737 | Kong/insomnia, LVQT-ss/cakestory-api, documenso/documenso, louislam/uptime-kuma, lperry65/Aider-Chat, medplum/medplum, socketio/socket.io, usebruno/bruno, wagtail/wagtail |
| error-ex | 79832971 | Kong/insomnia, documenso/documenso, koajs/koa, louislam/uptime-kuma, medplum/medplum, socketio/socket.io, twbs/bootstrap, usebruno/bruno, wagtail/wagtail |
| data-uri-to-buffer | 79532327 | Kong/insomnia, documenso/documenso, louislam/uptime-kuma, medplum/medplum, socketio/socket.io |
| color-string | 43984374 | — not computed |
| socks-proxy-agent | 38234480 | — not computed |
| color | 34051424 | — not computed |
| simple-swizzle | 25876284 | — not computed |
| proxy-agent | 24531177 | — not computed |
| get-uri | 23982124 | — not computed |
| pac-proxy-agent | 23844963 | — not computed |
| pac-resolver | 23433970 | — not computed |
| bindings | 22660329 | — not computed |
| file-uri-to-path | 18789500 | — not computed |
| degenerator | 18521699 | — not computed |
| plist | 15137727 | — not computed |
| is-module | 12143324 | — not computed |
| canvas | 6938373 | — not computed |
| stat-mode | 5972843 | — not computed |
| ent | 5196737 | — not computed |
| bcrypt | 4872612 | — not computed |
| tlds | 4798479 | — not computed |
| dom-serialize | 2687123 | — not computed |
| custom-event | 2331329 | — not computed |
| has-cors | 1384753 | — not computed |
| component-bind | 473227 | — not computed |
| @tootallnate/once | — | — not computed |
| @tootallnate/quickjs-emscripten | — | — not computed |

<details><summary>executed statements</summary>

```cypher
MATCH (bad:Version {id: 4277814107888805})-[:VERSION_OF]->(p:Package)<-[:MAINTAINS]-(m:Maintainer)-[:MAINTAINS]->(other:Package) RETURN m.key AS maintainer, m.twofa AS twofa, m.account_created AS account_created, p.key AS bad_package, other.key AS package, other.id AS pid, other.downloads AS downloads

MATCH (p:Package {id: 4380943100042017})<-[:VERSION_OF]-(v:Version)<-[:RESOLVED]-(l:Lockfile)<-[:HAS_LOCKFILE]-(sv:Service) RETURN sv.key AS service, count(*) AS n

MATCH (p:Package {id: 2155802479278732})<-[:VERSION_OF]-(v:Version)<-[:RESOLVED]-(l:Lockfile)<-[:HAS_LOCKFILE]-(sv:Service) RETURN sv.key AS service, count(*) AS n

MATCH (p:Package {id: 2857034762624845})<-[:VERSION_OF]-(v:Version)<-[:RESOLVED]-(l:Lockfile)<-[:HAS_LOCKFILE]-(sv:Service) RETURN sv.key AS service, count(*) AS n

MATCH (p:Package {id: 2996606650714712})<-[:VERSION_OF]-(v:Version)<-[:RESOLVED]-(l:Lockfile)<-[:HAS_LOCKFILE]-(sv:Service) RETURN sv.key AS service, count(*) AS n

MATCH (p:Package {id: 1723152998288652})<-[:VERSION_OF]-(v:Version)<-[:RESOLVED]-(l:Lockfile)<-[:HAS_LOCKFILE]-(sv:Service) RETURN sv.key AS service, count(*) AS n

MATCH (p:Package {id: 3688734141769757})<-[:VERSION_OF]-(v:Version)<-[:RESOLVED]-(l:Lockfile)<-[:HAS_LOCKFILE]-(sv:Service) RETURN sv.key AS service, count(*) AS n

MATCH (p:Package {id: 117786138360580})<-[:VERSION_OF]-(v:Version)<-[:RESOLVED]-(l:Lockfile)<-[:HAS_LOCKFILE]-(sv:Service) RETURN sv.key AS service, count(*) AS n

MATCH (p:Package {id: 3127339569977186})<-[:VERSION_OF]-(v:Version)<-[:RESOLVED]-(l:Lockfile)<-[:HAS_LOCKFILE]-(sv:Service) RETURN sv.key AS service, count(*) AS n
```

</details>

## Q5 · Which look-alike names exist?

2 names across 1 kind.

- **scope confusion**: `@prisma/debug (d1)`, `@types/debug (d1)`

<details><summary>executed statement</summary>

```cypher
MATCH (suspect:Package)-[sim:NAME_SIMILAR_TO]->(popular:Package {id: 171969907551371}) WHERE sim.distance <= $maxd MATCH (suspect)<-[:MAINTAINS]-(m:Maintainer) RETURN suspect.key AS package, suspect.downloads AS downloads, sim.distance AS distance, sim.kind AS kind, m.key AS maintainer, m.account_created AS account_created, m.twofa AS twofa ORDER BY sim.distance ASC, suspect.downloads ASC
```

</details>

## Q6 · What is the blast radius, service by service?

- **act now (0)**: none
- **resolved while live (3)**: LVQT-ss/cakestory-api (458e59e · 2025-09-08 14:05:12Z), GoMake-ltd/n8n-node-gomake (c361ccf · 2025-09-08 14:09:18Z), ChrisTregaskis/ai-research-automation (80fc6d0 · 2025-09-08 15:04:59Z)
- **present only (3)**: ChrisTregaskis/ai-research-automation, GoMake-ltd/n8n-node-gomake, LVQT-ss/cakestory-api
- **unscanned (0)**: none

## Provenance

- generated 2026-08-16 14:28:33Z
- engine ghcr.io/hydra-db/hydradb@sha256:db78309a233be54662db29744047e985a39b51c45a270d1a1f47c31a62cdb709
- bolt bolt://127.0.0.1:7687
- graph Advisory 657 · Lockfile 246 · Maintainer 3028 · Package 6446 · Service 13 · Version 55507
- composed in 16.45 s

[open the report](https://reachable-lac.vercel.app/incident/MAL-2025-46974)
