incidents/MAL-2025-46969

MAL-2025-46969

L0 present onlymalwarecritical
published 2025-09-08 17:11:19Zsource osv.devpackage chalk

Malicious code in chalk (npm). 1 of 13 watched services resolved a compromised version; 1 did so while it was still installable; none is reachable from first-party code.

1
services exposed
0
act now
1
resolved while live
283
maintainer packages
0
look-alike names
0
unscanned
blast radiusversion → dependency → lockfile → service
versiondependencylockfileservicechalk@5.6.1chalk@5.6.1affectedlint-staged@16.1.6lint-staged@16.1.60 hopslperry65/Aider-Chat@b1d64b4d834eAider-Chat@b1d64b4pins removedlperry65/Aider-Chatlperry65/Aider-ChatL0 present only
  • lockfile resolved while installable
  • L2 act now
  • L1 imported
  • L0 present only
  • unscanned
Q1

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

1 service
0 act now
L2 act now 0L1 imported 0L0 present only 1unscanned 0
serviceverdictlockfilespulled in vialatest commit
lperry65/Aider-ChatL0 present only1lint-staged@16.1.6 · 0 hopsb1d64b4 · 2025-09-08 17:18:24Zopen →

notes ·verdict is per service, highest across its lockfiles. unscanned means the service resolves an affected version but its source was not read — not that it is clean.

Membership is exact (RESOLVED = the lockfile's flattened install tree). Explanation paths are the 3 shortest per lockfile, not all of them.

Q2

Which versions were installable, and for how long?

1 version
1 removed
versionpublished (exact)live untilstate
chalk@5.6.1first2025-09-08 13:13:05Z2025-09-08 14:47:54Zupper boundremoved

notes ·live_to is an upper bound: npm publishes no takedown time; we use min(next surviving publish, advisory published).

Q3

Who pulled it in while it was still installable?

0 in window
1 pin removed
13:0014:0015:0016:0017:0018:00chalk@5.6.1 · 2025-09-08T13:13:05+00:00 → 2025-09-08T14:47:54+00:00 (upper bound)installable · 1 versionupper boundadvisory publishedlperry65/Aider-Chat · b1d64b4d834e · 2025-09-08T17:18:24+00:00 · pinned removedAider-Chat
  • installable window
  • upper bound · npm publishes no takedown time
  • lockfile resolved in window
  • pins a removed version
  • advisory published
servicelockfileresolved atcommitin windowwindow
lperry65/Aider-Chatchalk@5.6.12025-09-08 17:18:24Zb1d64b4no · pins removed2025-09-08 13:13:05Z2025-09-08 14:47:54Z upper bound

notes ·live_from is exact (npm keeps the publish timestamp after erasing the version). live_to is an upper bound where marked — npm publishes no takedown time.

in_window: the pin was committed while the artifact was installable; it does not prove an install happened. pinned_removed: the lockfile pins a version npm has erased, which is only possible while it was live — commit time is irrelevant.

Q4

What else could the same maintainers reach?

1 maintainer
283 packages
sindresorhus283 packages2FA unknown
packageweekly downloadsservices that would be reached
ansi-styles571,691,924
13ai-research-automation, n8n-node-gomake, insomnia, cakestory-api, documenso, koa, uptime-kuma, Aider-Chat, medplum, socket.io, bootstrap, bruno, wagtail
strip-ansi432,082,533
13ai-research-automation, n8n-node-gomake, insomnia, cakestory-api, documenso, koa, uptime-kuma, Aider-Chat, medplum, socket.io, bootstrap, bruno, wagtail
string-width415,333,702
13ai-research-automation, n8n-node-gomake, insomnia, cakestory-api, documenso, koa, uptime-kuma, Aider-Chat, medplum, socket.io, bootstrap, bruno, wagtail
ansi-regex403,212,379
13ai-research-automation, n8n-node-gomake, insomnia, cakestory-api, documenso, koa, uptime-kuma, Aider-Chat, medplum, socket.io, bootstrap, bruno, wagtail
wrap-ansi360,294,876
13ai-research-automation, n8n-node-gomake, insomnia, cakestory-api, documenso, koa, uptime-kuma, Aider-Chat, medplum, socket.io, bootstrap, bruno, wagtail
supports-color332,865,084
13ai-research-automation, n8n-node-gomake, insomnia, cakestory-api, documenso, koa, uptime-kuma, Aider-Chat, medplum, socket.io, bootstrap, bruno, wagtail
type-fest315,194,335
12ai-research-automation, n8n-node-gomake, insomnia, documenso, koa, uptime-kuma, Aider-Chat, medplum, socket.io, bootstrap, bruno, wagtail
escape-string-regexp298,664,858
12ai-research-automation, n8n-node-gomake, insomnia, documenso, koa, uptime-kuma, Aider-Chat, medplum, socket.io, bootstrap, bruno, wagtail
p-limit275,763,785
— not computed
find-up271,310,344
— not computed
has-flag268,889,263
— not computed
locate-path264,631,832
— not computed
p-locate263,528,764
— not computed
path-key229,214,082
— not computed
is-fullwidth-code-point218,280,345
— not computed

limits ·past the computed cap the reach cell reads “— not computed” — never a 0.

283 co-maintained packages; exposure computed for the 8 most downloaded.

twofa / account_created are not exposed by the public npm registry; shown as unknown, never guessed.

'services at risk' = services resolving the co-maintained package today — the exposure IF that package is compromised next, not exposure to this incident.

Q5

Which look-alike names exist?

0 names
0 kinds

no near-names in the ingested corpus for chalk

notes ·The corpus is packages present in the ingested graph, so near-neighbours may be legitimate look-alikes; distance and kind are facts, 'typosquat' is a hypothesis.

Q6

What is the blast radius, service by service?

1 service
0 unscanned
act now0
none
resolved while live1
lperry65/Aider-Chatb1d64b4 · 2025-09-08 17:18:24Z
present only1
unscanned0
none

notes ·1 service · 1 lockfile snapshot · 283 co-maintained packages · composed in 30.99 s

composed
2026-08-16 14:29:04Z · every figure above is read from this report’s own JSON, and each card carries the statement that produced it.
badge · lperry65/Aider-Chat
reachable badge for lperry65/Aider-Chat![reachable](/badge/lperry65/Aider-Chat.svg)

Beyond the watched set

public repositories on GitHub that pin an affected version today, not yet scanned by Reachable
report generated 2026-08-16 14:29:04Zgraph snapshot advisory 657 · lockfile 246 · maintainer 3,028 · package 6,446 · service 13 · version 55,50717 statements · 287 rows · 30.99 s total
engine sha256:db78309a233bbolt://127.0.0.1:7687 · Linux-7.1.8-arch1-3-x86_64-with-glibc2.44

All ms are wall-clock from the Python driver over loopback Bolt; cold = first run after the node was idle, warm = subsequent runs. Both are reported; neither is estimated.