Skip to content

Back to the catalog

Thinkst Package Proxy
blog.thinkst.comtool

Thinkst Package Proxy

Thinkst released Package Proxy, a Cloudflare Workers-based inline proxy for npm, PyPI, pip, uv, and Cargo index/metadata requests that enforces supply-chain safety checks (minimum package age, upload-mechanism regression detection, allow/block lists) without requiring any client-side software or workflow changes. The proxy returns 404 for packages failing policy and logs installs to a D1 database, and Thinkst reports it protected them from the TanStack, Bitwarden, and TeamPCP npm compromises via its 10-day age check and integrity-downgrade detection.

TL;DR Thinkst's open-source Cloudflare Workers proxy blocks malicious/too-new packages across npm, PyPI, pip, uv, and Cargo without client-side agents.
Document

What it is

Package Proxy, an open-source Cloudflare Workers tool from Thinkst that intercepts package-manager index requests (npm, pip, uv, cargo) and applies inline supply-chain policy before serving packages. Motivated by the escalating pace of attacks — the post cites Socket's report of 639 compromised npm packages in one coordinated campaign, and the Axios breach — as a reaction to backdoored/typosquatted/maintainer-compromise packages.

How it works

Package managers fetch metadata from a configurable index URL (e.g. https://pypi.org/simple for pip). You repoint that URL at the proxy. The proxy sees which packages a client wants, runs its checks, and either returns 404 for packages that fail policy or fetches and serves the package if it passes. No client-side agent — the only change is the index URL. This differs from the alternative "wrapper around the package manager" approach (commercial and OSS options exist); Thinkst chose the proxy to avoid adding a new dependency everywhere.

Preconditions / Affected

  • Tied to Cloudflare Workers; the design is portable in principle but the released implementation is not.
  • Only the fast checks are done inline. The post explicitly rules out inline code scanning (minutes-to-hours) and domain-expiry/maintainer-email checks (emails aren't mandatory on PyPI).

Coverage — read the asymmetry

Checks are not uniform across ecosystems. What ships out of the box:

CheckPyPInpmcargouv
≥10-day package age✓✓✓—
Upload-mechanism regression✓✓——
Audit-fix bypass—✓——
Block list✓✓✓—
Allow list✓✓✓—

The upload-mechanism check flags when a package was pushed directly rather than through its usual automated pipeline — a signal of maintainer-account compromise. cargo gets age + lists only; uv is listed as supported but no specific checks are enumerated for it.

What to do

  • Deploy from the Thinkst GitHub repo via 1-click Cloudflare deploy, then repoint your package managers' index URLs at it.
  • For a stronger posture, mirror Thinkst's internal fork: block npm packages by default and require developers to request allow-list additions.

Caveats

  • The author states plainly that even with all checks applied, an attacker can still construct a path past them — the goal is to raise attacker cost, not to guarantee safety.
  • The 10-day age window is a heuristic bet that someone else encounters a malicious package first; it does nothing for a threat that stays undetected past that window.

Technologies named here

Techniques named here

  • Package age enforcement
  • Upload method/integrity regression detection
  • Domain expiration/re-registration check
  • Version diffing for backdoors
  • Automated code scanning
  • Allow list / block list enforcement
  • Typosquatting
  • Maintainer account compromise

Threat actors named here