Re: [bitbake-devel][PATCH 0/2] fetch/npm: fix security issue and re-enable fetcher

Richard Purdie <[email protected]> Wed, 10 Jun 2026 17:27:06 +0100
Newsgroups org.openembedded.lists.bitbake-devel
Message-ID <411bfc4142ad6d577df4b9350d6a18ca977b7127.camel@linuxfoundation.org>
On Wed, 2026-06-10 at 17:46 +0200, Thomas Perrot via lists.openembedded.org wrote:
> The npm fetcher was disabled in 355cd226 (Jan 2026) because it retrieved
> checksums from the remote registry rather than from the recipe.  A
> compromised registry controls both the tarball and its advertised hash,
> making checksum verification meaningless.
> 
> Fix the root cause by separating URL resolution from checksum handling:
> - _resolve_proxy_url now stores only the bare tarball URL in the .resolved
>   file; the registry-supplied dist.integrity / dist.shasum values are
>   ignored entirely.
> - _setup_proxy builds the proxy URL from that bare tarball URL and injects
>   the checksum from the recipe's own SRC_URI parameters (sha512sum=,
>   sha256sum=, etc.).  When no checksum is provided the proxy URL carries
>   none, and BitBake's standard BB_STRICT_CHECKSUM machinery handles the
>   missing-checksum case the same way the wget fetcher does.  A bb.warn()
>   is emitted so recipe authors get a clear signal instead of a silent
>   unsigned download.
> - version=latest is now a hard ParameterError instead of a warning; it is
>   inherently non-reproducible.
> - Narrow the broad 'except Exception' in _npm_view to json.JSONDecodeError
>   so that FetchError and ParameterError propagate typed to callers.  Also
>   fall back to str(error) when 'summary' is absent in the registry error
>   dict so the message is never silently None.
> - Clear uri.params before rebuilding the proxy URL to prevent a
>   .resolved file written by the npmsw fetcher (which stores the full URI
>   with checksum params) from contaminating the npm proxy URL with a
>   registry-sourced checksum, bypassing the security invariant that only
>   recipe-provided checksums are trusted.
> - Remove dead 'if ud.version == "latest": return True' branch from
>   need_update(); version=latest is rejected at urldata_init time.
> 
> Migration note: recipes using npm:// must now supply a checksum in
> SRC_URI, e.g.:
> 
>   SRC_URI = "npm://registry.npmjs.org;package=lodash;version=4.17.21;sha512sum=<hex>"
> 
> On the first build without a checksum BitBake will download the tarball,
> compute the hash, and instruct the author to add it.  Any stale .resolved
> files under DL_DIR/npm2/ written by the old fetcher (which embedded
> registry-sourced checksums) must be deleted before rebuilding.
> 
> [YOCTO #16105]
> 
> Fixes: 355cd226e072 ("fetch2/npm: Disable npm/npmsw fetchers due to security issues")
> Signed-off-by: Thomas Perrot <[email protected]>
> ---
> Thomas Perrot (2):
>       fetch/npmsw: fix security issue and re-enable fetcher
>       tests/fetch: restore and extend npm/npmsw test coverage
> 
>  lib/bb/fetch2/npmsw.py | 12 +++++-----
>  lib/bb/tests/fetch.py  | 64 +++++++++++++++++++++++++++++++++++---------------
>  2 files changed, 51 insertions(+), 25 deletions(-)

I suspect there is a patch missing or something here as it doesn't
touch npm.py and half the changes above appear missing...

Cheers,

Richard