Open Source ·

OpenGov form builder carried CanisterWorm

@opengov/form-builder 0.12.3 added a postinstall backdoor during TeamPCP's CanisterWorm campaign. The worm used npm tokens stolen through the second Trivy compromise.

On March 21, 2026, a self-spreading npm worm that StepSecurity christened CanisterWorm reached the @opengov namespace and republished @opengov/form-builder with a backdoor. The compromised release, 0.12.3, was one of a series of packages the worm rewrote that week using npm publishing tokens stolen days earlier in the second compromise of the Trivy scanner.

StepSecurity attributed the activity to the threat actor it tracks as TeamPCP. According to the firm's writeup, malicious Trivy tooling harvested CI/CD environment variables and runner process memory through /proc/<pid>/mem, and the resulting npm credentials became the worm's propagation fuel. Anywhere a stolen token could reach, CanisterWorm enumerated the account's packages, bumped a patch version, and pushed a backdoored release.

The diff in @opengov/form-builder was straightforward. Earlier releases carried no lifecycle script; 0.12.3 added "postinstall": "node index.js", giving the package code execution at install time, before any application code ran. The JavaScript loader carried a base64-encoded Python implant that wrote ~/.local/share/pgmon/service.py, registered a user-level systemd unit at ~/.config/systemd/user/pgmon.service with Restart=always, and polled an Internet Computer canister at tdtqy-oyaaa-aaaae-af2dq-cai.raw.icp0.io for commands. A propagation component scanned npm configuration and environment variables for any further publish tokens and used them to keep the worm moving.

This record covers the @opengov/form-builder artifact. The broader Trivy credential theft, self-propagation behavior, and destructive Kubernetes payloads sit on the TeamPCP campaign page.

Appendix · Affected releases

Indicators

  • file_sha256@opengov-form-builder-0.12.3.tgz 37fc67dceb6579dbe7c3adfb4daf8ddf8bf0e1589e2a5ccec6de78363a5debad

References

  1. CanisterWorm: How a Self-Propagating npm Worm Is Spreading Backdoors Across the Ecosystemstepsecurity.io
  2. Malicious code in @opengov/form-builderosv.dev
  3. Trivy Compromised a Second Timestepsecurity.io

Source record: oss/attacks/opengov-form-builder/meta.yaml