supply-chain-guard 6.2.5 → 6.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +192 -39
- package/action.yml +3 -3
- package/dist/attack-graph.d.ts.map +1 -1
- package/dist/attack-graph.js +7 -2
- package/dist/attack-graph.js.map +1 -1
- package/dist/broad-gap-pattern-matchers.d.ts +24 -0
- package/dist/broad-gap-pattern-matchers.d.ts.map +1 -1
- package/dist/broad-gap-pattern-matchers.js +287 -12
- package/dist/broad-gap-pattern-matchers.js.map +1 -1
- package/dist/cargo-scanner.d.ts +8 -0
- package/dist/cargo-scanner.d.ts.map +1 -1
- package/dist/cargo-scanner.js +70 -4
- package/dist/cargo-scanner.js.map +1 -1
- package/dist/catalog-digest.d.ts +4 -4
- package/dist/catalog-digest.js +4 -4
- package/dist/cli.js +2 -2
- package/dist/cli.js.map +1 -1
- package/dist/composer-scanner.js +4 -2
- package/dist/composer-scanner.js.map +1 -1
- package/dist/config-scanner.js +2 -1
- package/dist/config-scanner.js.map +1 -1
- package/dist/container-image.d.ts +63 -0
- package/dist/container-image.d.ts.map +1 -0
- package/dist/container-image.js +409 -0
- package/dist/container-image.js.map +1 -0
- package/dist/dependency-confusion.d.ts +23 -1
- package/dist/dependency-confusion.d.ts.map +1 -1
- package/dist/dependency-confusion.js +102 -20
- package/dist/dependency-confusion.js.map +1 -1
- package/dist/dependency-governance.d.ts +11 -0
- package/dist/dependency-governance.d.ts.map +1 -1
- package/dist/dependency-governance.js +39 -13
- package/dist/dependency-governance.js.map +1 -1
- package/dist/disguised-asset.d.ts +31 -0
- package/dist/disguised-asset.d.ts.map +1 -0
- package/dist/disguised-asset.js +79 -0
- package/dist/disguised-asset.js.map +1 -0
- package/dist/dockerfile-scanner.d.ts.map +1 -1
- package/dist/dockerfile-scanner.js +7 -1
- package/dist/dockerfile-scanner.js.map +1 -1
- package/dist/ecosystem-registry.d.ts +51 -0
- package/dist/ecosystem-registry.d.ts.map +1 -0
- package/dist/ecosystem-registry.js +873 -0
- package/dist/ecosystem-registry.js.map +1 -0
- package/dist/entropy.d.ts +13 -0
- package/dist/entropy.d.ts.map +1 -1
- package/dist/entropy.js +44 -1
- package/dist/entropy.js.map +1 -1
- package/dist/extension-identity.d.ts +56 -0
- package/dist/extension-identity.d.ts.map +1 -0
- package/dist/extension-identity.js +172 -0
- package/dist/extension-identity.js.map +1 -0
- package/dist/feed.js +2 -1
- package/dist/feed.js.map +1 -1
- package/dist/github-actions-scanner.d.ts +24 -1
- package/dist/github-actions-scanner.d.ts.map +1 -1
- package/dist/github-actions-scanner.js +173 -40
- package/dist/github-actions-scanner.js.map +1 -1
- package/dist/go-scanner.d.ts +7 -0
- package/dist/go-scanner.d.ts.map +1 -1
- package/dist/go-scanner.js +66 -3
- package/dist/go-scanner.js.map +1 -1
- package/dist/install-guard.d.ts +1 -1
- package/dist/install-guard.d.ts.map +1 -1
- package/dist/install-guard.js +16 -3
- package/dist/install-guard.js.map +1 -1
- package/dist/install-hook-scanner.d.ts +26 -0
- package/dist/install-hook-scanner.d.ts.map +1 -1
- package/dist/install-hook-scanner.js +114 -7
- package/dist/install-hook-scanner.js.map +1 -1
- package/dist/internal-disclosure.d.ts.map +1 -1
- package/dist/internal-disclosure.js +289 -12
- package/dist/internal-disclosure.js.map +1 -1
- package/dist/ioc-blocklist.d.ts +1 -1
- package/dist/ioc-blocklist.d.ts.map +1 -1
- package/dist/ioc-blocklist.js +64 -7
- package/dist/ioc-blocklist.js.map +1 -1
- package/dist/lockfile-checker.d.ts +14 -4
- package/dist/lockfile-checker.d.ts.map +1 -1
- package/dist/lockfile-checker.js +86 -12
- package/dist/lockfile-checker.js.map +1 -1
- package/dist/lockfile-feed.d.ts +60 -0
- package/dist/lockfile-feed.d.ts.map +1 -0
- package/dist/lockfile-feed.js +131 -0
- package/dist/lockfile-feed.js.map +1 -0
- package/dist/maven-scanner.d.ts +52 -0
- package/dist/maven-scanner.d.ts.map +1 -0
- package/dist/maven-scanner.js +494 -0
- package/dist/maven-scanner.js.map +1 -0
- package/dist/mcp-scanner.d.ts +7 -0
- package/dist/mcp-scanner.d.ts.map +1 -1
- package/dist/mcp-scanner.js +5 -2
- package/dist/mcp-scanner.js.map +1 -1
- package/dist/mcp-server.d.ts +28 -0
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +114 -22
- package/dist/mcp-server.js.map +1 -1
- package/dist/nested-manifests.d.ts +28 -0
- package/dist/nested-manifests.d.ts.map +1 -0
- package/dist/nested-manifests.js +69 -0
- package/dist/nested-manifests.js.map +1 -0
- package/dist/npm-scanner.d.ts.map +1 -1
- package/dist/npm-scanner.js +12 -4
- package/dist/npm-scanner.js.map +1 -1
- package/dist/nuget-scanner.d.ts +5 -0
- package/dist/nuget-scanner.d.ts.map +1 -1
- package/dist/nuget-scanner.js +47 -5
- package/dist/nuget-scanner.js.map +1 -1
- package/dist/osv-export.d.ts.map +1 -1
- package/dist/osv-export.js +3 -5
- package/dist/osv-export.js.map +1 -1
- package/dist/pattern-applicability.d.ts +7 -0
- package/dist/pattern-applicability.d.ts.map +1 -1
- package/dist/pattern-applicability.js +51 -1
- package/dist/pattern-applicability.js.map +1 -1
- package/dist/patterns.d.ts +25 -0
- package/dist/patterns.d.ts.map +1 -1
- package/dist/patterns.js +93 -20
- package/dist/patterns.js.map +1 -1
- package/dist/policy-engine.d.ts +13 -0
- package/dist/policy-engine.d.ts.map +1 -1
- package/dist/policy-engine.js +24 -1
- package/dist/policy-engine.js.map +1 -1
- package/dist/pub-scanner.d.ts +42 -0
- package/dist/pub-scanner.d.ts.map +1 -0
- package/dist/pub-scanner.js +395 -0
- package/dist/pub-scanner.js.map +1 -0
- package/dist/publishing-anomaly-detector.d.ts +8 -0
- package/dist/publishing-anomaly-detector.d.ts.map +1 -1
- package/dist/publishing-anomaly-detector.js +12 -3
- package/dist/publishing-anomaly-detector.js.map +1 -1
- package/dist/pypi-scanner.js +1 -1
- package/dist/python-lockfile-scanner.d.ts +16 -1
- package/dist/python-lockfile-scanner.d.ts.map +1 -1
- package/dist/python-lockfile-scanner.js +67 -4
- package/dist/python-lockfile-scanner.js.map +1 -1
- package/dist/remediation-engine.d.ts +15 -0
- package/dist/remediation-engine.d.ts.map +1 -1
- package/dist/remediation-engine.js +27 -4
- package/dist/remediation-engine.js.map +1 -1
- package/dist/reporter.d.ts.map +1 -1
- package/dist/reporter.js +74 -12
- package/dist/reporter.js.map +1 -1
- package/dist/rubygems-scanner.js +4 -2
- package/dist/rubygems-scanner.js.map +1 -1
- package/dist/sbom-generator.js +1 -1
- package/dist/scanner.d.ts.map +1 -1
- package/dist/scanner.js +265 -114
- package/dist/scanner.js.map +1 -1
- package/dist/skills-scanner.d.ts +52 -0
- package/dist/skills-scanner.d.ts.map +1 -1
- package/dist/skills-scanner.js +386 -63
- package/dist/skills-scanner.js.map +1 -1
- package/dist/terraform-scanner.d.ts +88 -0
- package/dist/terraform-scanner.d.ts.map +1 -0
- package/dist/terraform-scanner.js +410 -0
- package/dist/terraform-scanner.js.map +1 -0
- package/dist/text-lines.d.ts +49 -0
- package/dist/text-lines.d.ts.map +1 -0
- package/dist/text-lines.js +119 -0
- package/dist/text-lines.js.map +1 -0
- package/dist/threat-intel.d.ts +25 -2
- package/dist/threat-intel.d.ts.map +1 -1
- package/dist/threat-intel.js +841 -545
- package/dist/threat-intel.js.map +1 -1
- package/dist/types.d.ts +22 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/vscode-scanner.d.ts.map +1 -1
- package/dist/vscode-scanner.js +17 -5
- package/dist/vscode-scanner.js.map +1 -1
- package/dist/workflow-ast.d.ts.map +1 -1
- package/dist/workflow-ast.js +24 -8
- package/dist/workflow-ast.js.map +1 -1
- package/dist/workflow-graph.d.ts.map +1 -1
- package/dist/workflow-graph.js +4 -2
- package/dist/workflow-graph.js.map +1 -1
- package/dist/workflow-modeler.d.ts +42 -0
- package/dist/workflow-modeler.d.ts.map +1 -1
- package/dist/workflow-modeler.js +585 -22
- package/dist/workflow-modeler.js.map +1 -1
- package/package.json +20 -6
- package/self-scan-manifest.json +18 -18
package/README.md
CHANGED
|
@@ -1,20 +1,67 @@
|
|
|
1
1
|
# supply-chain-guard
|
|
2
2
|
|
|
3
|
-
Open-source supply-chain security scanner
|
|
3
|
+
Open-source supply-chain security scanner that runs locally and offline. It matches known-malicious packages, extensions, plugins, providers, container images and CI actions in 15 ecosystems, with tested matchers ready for more (see Ecosystem Coverage), reading manifests and lockfiles at any depth of a repository, including the transitive dependencies a lockfile pins; and it analyses what you install for malware behavior: GlassWorm, Vidar, Shai-Hulud, fake AI tool repos, account takeovers and 350+ threat indicators in all. It generates CycloneDX 1.6 SBOMs with real dependency inventories, grades SLSA provenance (parses and structurally validates in-toto/DSSE attestations), and correlates findings into attack-chain incidents. Supports EU Cyber Resilience Act SBOM and component-documentation work, and NIS2 supply chain risk-management measures.
|
|
4
4
|
|
|
5
5
|
[](https://www.npmjs.com/package/supply-chain-guard)
|
|
6
6
|
[](https://www.npmjs.com/package/supply-chain-guard)
|
|
7
7
|
[](https://nodejs.org)
|
|
8
8
|
[](https://www.typescriptlang.org/)
|
|
9
9
|
[](https://github.com/homeofe/supply-chain-guard/actions/workflows/ci.yml)
|
|
10
|
+
[](https://scorecard.dev/viewer/?uri=github.com/homeofe/supply-chain-guard)
|
|
11
|
+
[](https://www.bestpractices.dev/projects/14934)
|
|
10
12
|
[](https://github.com/homeofe/supply-chain-guard/actions/workflows/aahp-verify.yml)
|
|
11
13
|
[](https://github.com/homeofe/AAHP)
|
|
12
14
|
[](https://github.com/homeofe/supply-chain-guard/commits/main)
|
|
13
|
-
[](https://github.com/homeofe/supply-chain-guard/actions/workflows/self-scan.yml)
|
|
14
16
|
[](https://opensource.org/licenses/Apache-2.0)
|
|
15
17
|
|
|
16
18
|

|
|
17
19
|
|
|
20
|
+
## Start in 30 seconds
|
|
21
|
+
|
|
22
|
+
Scan a project. No account, no configuration, and the scan itself makes no
|
|
23
|
+
network request:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
npx supply-chain-guard scan .
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
It exits `1` on a high finding or a scan that could not examine everything, and
|
|
30
|
+
`2` on a critical finding, so it can gate a script as it is. To add the historical
|
|
31
|
+
package catalog, run `npx supply-chain-guard feed refresh` with network access in
|
|
32
|
+
the directory you scan from. The catalog is cached there in `.scg-cache` and
|
|
33
|
+
belongs to the installed version, so refresh again after an upgrade.
|
|
34
|
+
|
|
35
|
+
Gate every pull request:
|
|
36
|
+
|
|
37
|
+
```yaml
|
|
38
|
+
- uses: actions/checkout@v4
|
|
39
|
+
- uses: homeofe/supply-chain-guard@v6.3.0
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Let your AI coding agent check a package before it installs it (MCP):
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
npm install -g supply-chain-guard
|
|
46
|
+
claude mcp add supply-chain-guard supply-chain-guard mcp
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Every release is published to npm from this repository's CI with a signed
|
|
50
|
+
[SLSA provenance attestation](https://www.npmjs.com/package/supply-chain-guard),
|
|
51
|
+
and the Action installs that exact version. Each GitHub Release also carries
|
|
52
|
+
the tarball with that provenance as a Sigstore bundle (`.sigstore.json`). To check
|
|
53
|
+
one yourself:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
gh attestation verify supply-chain-guard-X.Y.Z.tgz \
|
|
57
|
+
--bundle supply-chain-guard-X.Y.Z.tgz.sigstore.json \
|
|
58
|
+
--repo homeofe/supply-chain-guard --digest-alg sha512
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Everything else, from output
|
|
62
|
+
formats to policies, is further down: [Quickstart](#quickstart),
|
|
63
|
+
[GitHub Action](#github-action), [For AI Coding Agents (MCP)](#for-ai-coding-agents-mcp).
|
|
64
|
+
|
|
18
65
|
## Contents
|
|
19
66
|
|
|
20
67
|
- [Background](#background)
|
|
@@ -28,7 +75,7 @@ Open-source supply-chain security scanner for npm, PyPI, Cargo, Go, RubyGems, Co
|
|
|
28
75
|
- [Policy Configuration](#policy-configuration-v44)
|
|
29
76
|
- [Baseline Diffing](#baseline-diffing-v44)
|
|
30
77
|
- [Example Output](#example-output)
|
|
31
|
-
- [
|
|
78
|
+
- [Ecosystem Coverage](#ecosystem-coverage)
|
|
32
79
|
- [How It Compares](#how-it-compares)
|
|
33
80
|
- [GitHub Action](#github-action)
|
|
34
81
|
- [For AI Coding Agents (MCP)](#for-ai-coding-agents-mcp)
|
|
@@ -48,6 +95,24 @@ For a deep dive into how GlassWorm infiltrates the software supply chain and the
|
|
|
48
95
|
|
|
49
96
|
## What It Detects
|
|
50
97
|
|
|
98
|
+
### Known-Malicious Packages and Components
|
|
99
|
+
Package, extension, plugin and image identities are matched against the threat feed. This list is
|
|
100
|
+
generated from the indicators that actually ship, so an ecosystem is only named as covered once there
|
|
101
|
+
is something to match:
|
|
102
|
+
|
|
103
|
+
<!-- ecosystem-list:begin (generated by scripts/generate-coverage-table.mjs; edit src/ecosystem-coverage.json) -->
|
|
104
|
+
- Known-malicious indicators ship for 15 ecosystems: npm, PyPI, RubyGems, Composer (PHP), NuGet (.NET), Cargo (Rust), Go modules, Maven / Gradle / SBT / Bazel, Dart / Flutter (pub), Terraform / OpenTofu providers, Container images, GitHub Actions, VS Code / Open VSX extensions, Browser extensions (Chrome, Edge, Firefox) and JetBrains plugins.
|
|
105
|
+
- Homebrew has a tested matcher and ships an indicator, but is not counted: its one indicator (the compromised Trivy tap release 0.69.4) needs a version, and only the legacy Brewfile.lock.json records one; current Homebrew writes no lock file, so a Brewfile alone cannot match it.
|
|
106
|
+
- Matchers are built and tested, but no malicious package is publicly known yet, for 8 more: Swift Package Manager, CocoaPods, Hex (Elixir / Erlang), CRAN (R), Conan (C / C++), Terraform / OpenTofu modules, Helm charts and Ansible Galaxy. They report the day an indicator is published, through the importer or a curated entry.
|
|
107
|
+
<!-- ecosystem-list:end -->
|
|
108
|
+
|
|
109
|
+
- The files read per ecosystem are in [Ecosystem Coverage](#ecosystem-coverage).
|
|
110
|
+
- Manifests and lockfiles are read wherever they sit in the tree, so a monorepo service or a .NET project
|
|
111
|
+
in `src/App/` is covered, and a lockfile's transitive dependencies are matched, not only direct ones.
|
|
112
|
+
- A version pin fires only on the exact malicious release; a hijacked legitimate package is never blocked
|
|
113
|
+
by name. Registry-specific identities stay separate (Marketplace vs Open VSX, Chrome vs Edge, public vs
|
|
114
|
+
private registries), and a commit SHA or image digest matches under any repository name.
|
|
115
|
+
|
|
51
116
|
### Malware Campaigns
|
|
52
117
|
- GlassWorm campaign markers and Solana blockchain C2
|
|
53
118
|
- Vidar/GhostSocks infostealers (April 2026 Claude Code leak campaign)
|
|
@@ -73,10 +138,12 @@ For a deep dive into how GlassWorm infiltrates the software supply chain and the
|
|
|
73
138
|
### Infrastructure & CI/CD
|
|
74
139
|
- GitHub Actions: unpinned actions, secrets exfiltration, encoded payloads, curl piping
|
|
75
140
|
- Agentic workflows (GitLost class): AI-agent steps and gh-aw `.github/workflows/*.md` that ingest untrusted issue/PR text, hold a cross-repo token, and can post publicly - the prompt-injection data-leak posture
|
|
76
|
-
- Dockerfile / Containerfile: curl pipe, base images on a moving channel tag or without a
|
|
77
|
-
hardcoded secrets, SUID bits.
|
|
78
|
-
(see [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md#base-image-pinning-decision-record))
|
|
79
|
-
|
|
141
|
+
- Dockerfile / Containerfile hardening: curl pipe, base images on a moving channel tag or without a
|
|
142
|
+
digest, hardcoded secrets, SUID bits. These rules read Dockerfile instructions only
|
|
143
|
+
(see [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md#base-image-pinning-decision-record)); known-malicious
|
|
144
|
+
images are matched separately in Dockerfiles and in every YAML `image:` value (Compose, Kubernetes,
|
|
145
|
+
workflow containers), see [Ecosystem Coverage](#ecosystem-coverage)
|
|
146
|
+
- Terraform/IaC: inline scripts, external modules, hardcoded secrets; known-malicious providers and registry modules are matched as listed in [Ecosystem Coverage](#ecosystem-coverage)
|
|
80
147
|
- Package manager configs (.npmrc, .yarnrc, pip.conf): HTTP registries, exposed tokens
|
|
81
148
|
- Git hooks and submodule security
|
|
82
149
|
|
|
@@ -142,7 +209,7 @@ Run the scanner as a [pre-commit](https://pre-commit.com) hook (Python-ecosystem
|
|
|
142
209
|
```yaml
|
|
143
210
|
repos:
|
|
144
211
|
- repo: https://github.com/homeofe/supply-chain-guard
|
|
145
|
-
rev: v6.
|
|
212
|
+
rev: v6.3.0
|
|
146
213
|
hooks:
|
|
147
214
|
- id: supply-chain-guard
|
|
148
215
|
```
|
|
@@ -174,7 +241,7 @@ The hook scans the repository root on every commit and fails on high or critical
|
|
|
174
241
|
Run the scanner without a Node toolchain via the official multi-arch image (linux/amd64, linux/arm64), published to GHCR on every release tag:
|
|
175
242
|
|
|
176
243
|
```bash
|
|
177
|
-
docker run --rm -v ${PWD}:/scan ghcr.io/homeofe/supply-chain-guard:6.
|
|
244
|
+
docker run --rm -v ${PWD}:/scan ghcr.io/homeofe/supply-chain-guard:6.3.0 scan /scan
|
|
178
245
|
```
|
|
179
246
|
|
|
180
247
|
`${PWD}` works in bash, zsh, and PowerShell; in cmd.exe use `%cd%` instead.
|
|
@@ -212,7 +279,7 @@ supply-chain-guard org my-github-org
|
|
|
212
279
|
# Scan only files changed since a commit (diff mode)
|
|
213
280
|
supply-chain-guard scan ./project --since HEAD~5
|
|
214
281
|
|
|
215
|
-
#
|
|
282
|
+
# Opt in to public registry queries (requires network; sends package names to npm and PyPI)
|
|
216
283
|
supply-chain-guard scan ./project --check-registry
|
|
217
284
|
|
|
218
285
|
# Expand every repeated text finding (text groups by rule and file by default)
|
|
@@ -659,22 +726,68 @@ supply-chain-guard scan ./project --baseline .scg-baseline.json
|
|
|
659
726
|
└──────────────────────────────────────────────────────────────────────────────┘
|
|
660
727
|
```
|
|
661
728
|
|
|
662
|
-
##
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
729
|
+
## Ecosystem Coverage
|
|
730
|
+
|
|
731
|
+
Two different claims live here, and they are proven differently.
|
|
732
|
+
|
|
733
|
+
**Known-malicious identity matching.** For every ecosystem below, a directory scan reads the listed files
|
|
734
|
+
at the scan root and at any depth below it, extracts the package, extension, plugin, provider, image or
|
|
735
|
+
action identities, and matches them against the threat feed: the bundled indicators, and the downloadable
|
|
736
|
+
catalog after `feed refresh`. A version pin fires only on the exact malicious release; a range or a
|
|
737
|
+
constraint in a manifest leaves the version unknown, so only a whole-name entry can match there.
|
|
738
|
+
|
|
739
|
+
This table is generated from [`src/ecosystem-coverage.json`](src/ecosystem-coverage.json) and checked by
|
|
740
|
+
the build (`check:coverage`); it is not written by hand. Every row is proven by
|
|
741
|
+
[`coverage-matrix.test.ts`](src/__tests__/coverage-matrix.test.ts), which puts an indicator into each
|
|
742
|
+
listed file format, at the scan root and one directory down, runs a real scan and requires the rule to
|
|
743
|
+
report it exactly once. A format listed here without such a test fails the test suite. "Indicators shipped"
|
|
744
|
+
says whether any indicator exists today; "none yet (matcher ready)" means the matcher is proven but no
|
|
745
|
+
malicious package is known in that ecosystem yet, and the importer or a curated entry will fill it.
|
|
746
|
+
|
|
747
|
+
<!-- ecosystem-coverage:begin (generated by scripts/generate-coverage-table.mjs; edit src/ecosystem-coverage.json) -->
|
|
748
|
+
| Ecosystem | Files read | Rule | Indicators shipped | Imported automatically from |
|
|
749
|
+
| --- | --- | --- | --- | --- |
|
|
750
|
+
| npm | `package.json`, `package-lock.json`, `yarn.lock`, `pnpm-lock.yaml`, `bun.lock` | `MALICIOUS_DEPENDENCY`, `LOCKFILE_MALICIOUS_VERSION`, `LOCKFILE_MALICIOUS_PACKAGE` | bundle + catalog | GitHub Advisory Database, OpenSSF / OSV |
|
|
751
|
+
| PyPI | `requirements.txt`, `pyproject.toml`, `poetry.lock`, `uv.lock`, `Pipfile.lock` | `PYTHON_MALICIOUS_PACKAGE` | bundle + catalog | GitHub Advisory Database, OpenSSF / OSV |
|
|
752
|
+
| RubyGems | `Gemfile`, `Gemfile.lock` | `RUBY_MALICIOUS_GEM` | bundle + catalog | GitHub Advisory Database, OpenSSF / OSV |
|
|
753
|
+
| Composer (PHP) | `composer.json`, `composer.lock` | `COMPOSER_MALICIOUS_PACKAGE` | bundle + catalog | GitHub Advisory Database, OpenSSF / OSV |
|
|
754
|
+
| NuGet (.NET) | `packages.lock.json`, `*.csproj`, `packages.config` | `NUGET_MALICIOUS_PACKAGE` | bundle + catalog | GitHub Advisory Database, OpenSSF / OSV |
|
|
755
|
+
| Cargo (Rust) | `Cargo.toml`, `Cargo.lock` | `CARGO_MALICIOUS_CRATE` | bundle + catalog | GitHub Advisory Database, OpenSSF / OSV |
|
|
756
|
+
| Go modules | `go.mod`, `go.sum` | `GO_MALICIOUS_MODULE` | bundle | GitHub Advisory Database, OpenSSF / OSV |
|
|
757
|
+
| Maven / Gradle / SBT / Bazel | `pom.xml`, `gradle.lockfile`, `build.gradle`, `build.gradle.kts`, `libs.versions.toml`, `build.sbt`, `maven_install.json` | `MAVEN_MALICIOUS_PACKAGE` | bundle + catalog | GitHub Advisory Database, OpenSSF / OSV |
|
|
758
|
+
| Dart / Flutter (pub) | `pubspec.lock`, `pubspec.yaml` | `PUB_MALICIOUS_PACKAGE` | bundle | GitHub Advisory Database, OSV |
|
|
759
|
+
| Swift Package Manager | `Package.resolved`, `Package.swift` | `SWIFT_MALICIOUS_PACKAGE` | none yet (matcher ready) | GitHub Advisory Database, OSV (SwiftURL) |
|
|
760
|
+
| CocoaPods | `Podfile.lock`, `Podfile` | `COCOAPODS_MALICIOUS_POD` | none yet (matcher ready) | curated only |
|
|
761
|
+
| Hex (Elixir / Erlang) | `mix.lock`, `mix.exs` | `HEX_MALICIOUS_PACKAGE` | none yet (matcher ready) | GitHub Advisory Database, OSV |
|
|
762
|
+
| CRAN (R) | `renv.lock`, `DESCRIPTION` | `CRAN_MALICIOUS_PACKAGE` | none yet (matcher ready) | OSV |
|
|
763
|
+
| Conan (C / C++) | `conan.lock`, `conanfile.txt`, `conanfile.py` | `CONAN_MALICIOUS_PACKAGE` | none yet (matcher ready) | curated only |
|
|
764
|
+
| Terraform / OpenTofu providers | `*.tf (required_providers)`, `.terraform.lock.hcl` | `TERRAFORM_MALICIOUS_PROVIDER` | bundle | curated only |
|
|
765
|
+
| Terraform / OpenTofu modules | `*.tf (module)`, `.terraform/modules/modules.json` | `TERRAFORM_MALICIOUS_MODULE` | none yet (matcher ready) | curated only |
|
|
766
|
+
| Helm charts | `Chart.yaml`, `Chart.lock` | `HELM_MALICIOUS_CHART` | none yet (matcher ready) | curated only |
|
|
767
|
+
| Ansible Galaxy | `requirements.yml`, `galaxy.yml` | `ANSIBLE_MALICIOUS_CONTENT` | none yet (matcher ready) | curated only |
|
|
768
|
+
| Container images | `Dockerfile`, `docker-compose.yml`, `Kubernetes manifest (image:)` | `DOCKER_MALICIOUS_IMAGE` | bundle | curated only |
|
|
769
|
+
| GitHub Actions | `.github/workflows/*.yml`, `action.yml (composite)` | `GHA_KNOWN_MALICIOUS_SHA` | bundle | curated only |
|
|
770
|
+
| Homebrew | `Brewfile`, `Brewfile.lock.json` | `HOMEBREW_MALICIOUS_PACKAGE` | bundle (legacy format only) | curated only |
|
|
771
|
+
| VS Code / Open VSX extensions | `.vscode/extensions.json`, `devcontainer.json`, `installed extension package.json` | `VSCODE_MALICIOUS_EXTENSION` | bundle + catalog | OpenSSF / OSV (VSCode) |
|
|
772
|
+
| Browser extensions (Chrome, Edge, Firefox) | `Chromium policy JSON`, `Firefox policies.json`, `installed Chromium extension`, `Firefox extension manifest` | `BROWSER_MALICIOUS_EXTENSION` | bundle | curated only |
|
|
773
|
+
| JetBrains plugins | `.idea/externalDependencies.xml`, `META-INF/plugin.xml` | `JETBRAINS_MALICIOUS_PLUGIN` | bundle | curated only |
|
|
774
|
+
<!-- ecosystem-coverage:end -->
|
|
775
|
+
|
|
776
|
+
**Behavior and hardening analysis.** Independent of the feed, these read what a package or repository
|
|
777
|
+
actually does:
|
|
778
|
+
|
|
779
|
+
| Target | Command | What It Scans |
|
|
780
|
+
|--------|---------|---------------|
|
|
781
|
+
| npm package | `npm <pkg>`, `scan` | package.json install scripts and tarball contents: install-hook chains, obfuscation, exfiltration |
|
|
782
|
+
| PyPI package | `pypi <pkg>` | setup.py, setup.cfg, pyproject.toml build hooks and package contents |
|
|
783
|
+
| VS Code / Open VSX extension | `vscode <id or .vsix>` | activation events, dangerous APIs and bundled code, plus the extension's own identity |
|
|
784
|
+
| Source trees | `scan` | code patterns across JavaScript, TypeScript, Python, shell, Go, Rust and more |
|
|
785
|
+
| Cargo / Go | `scan` | build.rs, proc macros, go.mod replace directives, init() functions, CGo |
|
|
786
|
+
| Docker | `scan` | Dockerfile, Dockerfile.*, Containerfile hardening (instructions only) |
|
|
787
|
+
| Terraform | `scan` | provisioners, external module sources, hardcoded secrets |
|
|
788
|
+
| GitHub Actions | `scan` | .github/workflows: unpinned actions, secrets exfiltration, injection, agentic workflows |
|
|
789
|
+
| npm lockfiles | `scan` | integrity hashes, non-registry resolved URLs, version downgrades (package-lock.json, pnpm-lock.yaml, yarn.lock v1 and Berry, bun.lock) |
|
|
790
|
+
| GitHub repositories | `repo` | trust signals, releases, README lures |
|
|
678
791
|
| Solana | `monitor` | C2 wallet memo transactions |
|
|
679
792
|
|
|
680
793
|
## How It Compares
|
|
@@ -685,7 +798,7 @@ There is one axis where it goes somewhere the others do not go at all. Credentia
|
|
|
685
798
|
|
|
686
799
|
| Tool | Focus | Malware / behavior detection | Known-CVE lookup | Ecosystems | Open source | Account needed |
|
|
687
800
|
|---|---|---|---|---|---|---|
|
|
688
|
-
| **supply-chain-guard** | Malware campaigns, IOCs, behavior heuristics in installed artifacts; SBOM + SLSA provenance grading (in-toto/DSSE structural validation) | Yes: 350+ static heuristics plus multi-source GHSA/OpenSSF package verdicts and campaign-IOC matching,
|
|
801
|
+
| **supply-chain-guard** | Malware campaigns, IOCs, behavior heuristics in installed artifacts; SBOM + SLSA provenance grading (in-toto/DSSE structural validation) | Yes: 350+ static heuristics plus multi-source GHSA/OpenSSF package verdicts and campaign-IOC matching, local at scan time (recent and curated indicators offline, the historical package catalog after a `feed refresh`) | No | 15 ecosystems of packages, extensions, plugins, providers, images and CI actions with shipped indicators, and tested matchers for more (see [Ecosystem Coverage](#ecosystem-coverage)), plus GitHub repos | Yes (Apache-2.0) | No |
|
|
689
802
|
| [OSV-Scanner](https://github.com/google/osv-scanner) | Known vulnerabilities in dependency inventories (OSV.dev database lookup) | Known-malicious versions via OSV MAL- entries only; no behavior or IOC analysis | Yes (offline mode available) | 11+ ecosystems, 19+ lockfile formats, container images, SBOM input | Yes (Apache-2.0) | No |
|
|
690
803
|
| [Socket](https://socket.dev) | Proactive behavioral analysis of entire registries (SaaS) | Yes: 70+ risk types registry-wide, before advisories exist; engine is closed source and cloud-side | Yes | npm, PyPI, Maven, Go, Cargo, RubyGems, NuGet, more; Actions workflows | CLI only (MIT); detection engine proprietary | Yes (except Firewall Free) |
|
|
691
804
|
| [GuardDog](https://github.com/DataDog/guarddog) | Heuristic 0-10 risk scoring of individual packages (YARA + registry metadata) | Yes: heuristics only, no known-malware or campaign-IOC database; sandboxed scanning | No | npm, PyPI, Go, RubyGems, GitHub Actions, VS Code extensions | Yes (Apache-2.0) | No |
|
|
@@ -836,10 +949,20 @@ Apache-2.0, no account required, and no telemetry: the scanner reports only to
|
|
|
836
949
|
its own output.
|
|
837
950
|
|
|
838
951
|
**Offline by default:**
|
|
839
|
-
`scan` on a local path runs fully offline
|
|
840
|
-
|
|
841
|
-
all report formatters. These
|
|
842
|
-
for air-gapped and
|
|
952
|
+
`scan` on a local path runs fully offline (unless one of the opt-in flags
|
|
953
|
+
`--check-registry` or `--external-intel` is passed), as do `guard`, `feed stats`,
|
|
954
|
+
and all report formatters. These
|
|
955
|
+
commands make zero network requests and are suitable for air-gapped and
|
|
956
|
+
data-egress-restricted environments.
|
|
957
|
+
|
|
958
|
+
An offline scan matches against the bundled indicator set: every domain, URL, IP
|
|
959
|
+
and hash, every curated campaign, and the recent package indicators. Older
|
|
960
|
+
package indicators live in the historical catalog, which is much larger than the
|
|
961
|
+
bundle and is downloaded by `supply-chain-guard feed refresh` into `.scg-cache`
|
|
962
|
+
in the working directory (or `--cache-dir`). A scan without that cache, or with
|
|
963
|
+
one left over from another release, runs against the bundled set only, and every
|
|
964
|
+
`scan` report says so in its Catalog line (see
|
|
965
|
+
[THREAT_FEED_CATALOG_MISSING](#threat_feed_catalog_missing)).
|
|
843
966
|
|
|
844
967
|
**Networked commands and external disclosures:**
|
|
845
968
|
The commands that reach the network do so deliberately for their specific functions:
|
|
@@ -849,7 +972,8 @@ The commands that reach the network do so deliberately for their specific functi
|
|
|
849
972
|
- `supply-chain-guard monitor <wallet>`: polls public Solana RPC nodes for C2 wallet transaction activity.
|
|
850
973
|
- `supply-chain-guard feed refresh`: downloads updated threat intelligence from the upstream repository into the local cache.
|
|
851
974
|
- `supply-chain-guard scan <github-url>`: clones a remote repository via Git for analysis.
|
|
852
|
-
- `supply-chain-guard scan . --check-registry`: opt-in flag that queries the public npm registry for the package's latest published version to detect version drift.
|
|
975
|
+
- `supply-chain-guard scan . --check-registry`: opt-in flag that queries the public npm registry for the package's latest published version to detect version drift, and **transmits each Python dependency name** from `requirements.txt` / `pyproject.toml` to the public PyPI registry for dependency-confusion signals. Up to v6.2.5 the PyPI lookups ran on every scan of a Python project, contrary to the offline guarantee above; they now need this flag.
|
|
976
|
+
- `supply-chain-guard scan . --external-intel`: opt-in flag for the two-tier score. It **sends each dependency's name, ecosystem and version to the OSV API**, the CVE ids found to FIRST's EPSS API, and the project's GitHub `owner/repo` to the OpenSSF Scorecard API, and downloads the public CISA KEV catalog.
|
|
853
977
|
|
|
854
978
|
Offline runs use the feed bundled with the installed version, so pin the version
|
|
855
979
|
you intend to audit against.
|
|
@@ -874,7 +998,7 @@ jobs:
|
|
|
874
998
|
runs-on: ubuntu-latest
|
|
875
999
|
steps:
|
|
876
1000
|
- uses: actions/checkout@v4
|
|
877
|
-
- uses: homeofe/supply-chain-guard@v6.
|
|
1001
|
+
- uses: homeofe/supply-chain-guard@v6.3.0
|
|
878
1002
|
with:
|
|
879
1003
|
fail-on: critical
|
|
880
1004
|
comment-on-pr: true
|
|
@@ -962,7 +1086,7 @@ two are never confused. If a deliberately frozen rule set is the intent, exclude
|
|
|
962
1086
|
the rule by name:
|
|
963
1087
|
|
|
964
1088
|
```yaml
|
|
965
|
-
- uses: homeofe/supply-chain-guard@v6.
|
|
1089
|
+
- uses: homeofe/supply-chain-guard@v6.3.0
|
|
966
1090
|
with:
|
|
967
1091
|
exclude-rules: THREAT_FEED_STALE
|
|
968
1092
|
```
|
|
@@ -981,12 +1105,14 @@ catalog is narrower than a scan with it, and without this rule it reports exactl
|
|
|
981
1105
|
the same success.
|
|
982
1106
|
|
|
983
1107
|
`supply-chain-guard feed refresh` downloads the catalog and caches it for later
|
|
984
|
-
scans
|
|
1108
|
+
scans, in `.scg-cache` under the working directory unless `--cache-dir` names
|
|
1109
|
+
another. The cache belongs to one release, so an upgrade needs a new refresh.
|
|
1110
|
+
The finding names how many historical indicators were not consulted and
|
|
985
1111
|
why, and the reason matters:
|
|
986
1112
|
|
|
987
1113
|
| Reason | Severity | What it means |
|
|
988
1114
|
|--------|----------|---------------|
|
|
989
|
-
| not downloaded yet | info | No catalog
|
|
1115
|
+
| not downloaded yet | info | No catalog in the cache directory. Run a refresh there. |
|
|
990
1116
|
| unreadable | medium | The cache could not be parsed. |
|
|
991
1117
|
| built for a different release | low | Left over from an older version. |
|
|
992
1118
|
| does not match the pinned digest | high | Not the catalog this release expects. |
|
|
@@ -996,6 +1122,23 @@ The last two are not normal states. They say the scanner's own detection data is
|
|
|
996
1122
|
either corrupt or has been modified in place, which is a different problem from
|
|
997
1123
|
"not downloaded yet" and is worth looking at the machine for.
|
|
998
1124
|
|
|
1125
|
+
"Not downloaded yet" is `info` so that it does not turn every first run yellow,
|
|
1126
|
+
and that also means `--min-severity low`, the Action's default, filters the
|
|
1127
|
+
finding out. The same state is therefore recorded as provenance, independent of
|
|
1128
|
+
any severity filter:
|
|
1129
|
+
|
|
1130
|
+
- every `scan` report carries a Catalog line in every format, in bold in the
|
|
1131
|
+
Markdown report (and so in the Action's pull request comment whenever one is
|
|
1132
|
+
posted) when the catalog was not consulted. The `npm`, `pypi` and `vscode`
|
|
1133
|
+
commands, which vet one remote package, carry no Catalog line;
|
|
1134
|
+
- JSON and SARIF carry `detectionSet.catalog` (`consulted`, `entryCount`,
|
|
1135
|
+
`reason`), and the CycloneDX SBOM carries
|
|
1136
|
+
`supply-chain-guard:detection-set:catalog-consulted`;
|
|
1137
|
+
- the MCP `ioc_lookup` result carries `checkedAgainst.catalog`, plus a
|
|
1138
|
+
`coverageNote` on a clean package verdict reached without the catalog.
|
|
1139
|
+
|
|
1140
|
+
None of these changes the score, the risk level, the badge or the exit code.
|
|
1141
|
+
|
|
999
1142
|
The cache checksum is also compared with an entries digest compiled into the
|
|
1000
1143
|
package. A cache with the right public header, recomputed checksum and entry
|
|
1001
1144
|
count is still refused when its actual indicators differ from this release.
|
|
@@ -1014,7 +1157,7 @@ preceding `feed refresh` in the workflow does not count. `catalog: required`
|
|
|
1014
1157
|
on the Action therefore needs:
|
|
1015
1158
|
|
|
1016
1159
|
```yaml
|
|
1017
|
-
- uses: homeofe/supply-chain-guard@v6.
|
|
1160
|
+
- uses: homeofe/supply-chain-guard@v6.3.0
|
|
1018
1161
|
with:
|
|
1019
1162
|
refresh-catalog: true
|
|
1020
1163
|
```
|
|
@@ -1025,7 +1168,7 @@ setting rather than firing on every scan. If scanning against the bundled set
|
|
|
1025
1168
|
alone is the intent, exclude the rule by name:
|
|
1026
1169
|
|
|
1027
1170
|
```yaml
|
|
1028
|
-
- uses: homeofe/supply-chain-guard@v6.
|
|
1171
|
+
- uses: homeofe/supply-chain-guard@v6.3.0
|
|
1029
1172
|
with:
|
|
1030
1173
|
exclude-rules: THREAT_FEED_CATALOG_MISSING
|
|
1031
1174
|
```
|
|
@@ -1092,7 +1235,9 @@ note that PowerShell swallows the bare `--` itself, so on Windows prefer the
|
|
|
1092
1235
|
global-install form above.
|
|
1093
1236
|
|
|
1094
1237
|
Exposes three tools over stdio: `ioc_lookup` (offline IOC + known-bad-version check
|
|
1095
|
-
for
|
|
1238
|
+
for every supported ecosystem; package verdicts include the historical catalog only
|
|
1239
|
+
after `feed refresh`, and the result says which), `scan_directory`, and
|
|
1240
|
+
`scan_npm_package`.
|
|
1096
1241
|
Client config snippets for Claude Code, Claude Desktop, and Cursor: [docs/mcp.md](docs/mcp.md).
|
|
1097
1242
|
|
|
1098
1243
|
## Live Threat Feed
|
|
@@ -1242,6 +1387,14 @@ If supply-chain-guard runs in your CI, add the badge to your README:
|
|
|
1242
1387
|
[](https://github.com/homeofe/supply-chain-guard)
|
|
1243
1388
|
```
|
|
1244
1389
|
|
|
1390
|
+
A static badge only claims the scan. To make it prove one, point it at the
|
|
1391
|
+
status of the workflow that runs the scan, the way this repository's own
|
|
1392
|
+
badge shows [its self-scan](.github/workflows/self-scan.yml):
|
|
1393
|
+
|
|
1394
|
+
```markdown
|
|
1395
|
+
[](https://github.com/OWNER/REPO/actions/workflows/supply-chain-guard.yml)
|
|
1396
|
+
```
|
|
1397
|
+
|
|
1245
1398
|
## Contributing
|
|
1246
1399
|
|
|
1247
1400
|
See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines. The most impactful contribution is adding new detection patterns for emerging threats.
|
package/action.yml
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
name: "Supply Chain Guard"
|
|
2
|
-
description: "Scan
|
|
2
|
+
description: "Scan a repository for supply-chain malware and known-malicious dependencies in 15 ecosystems."
|
|
3
3
|
author: "Elvatis <emre.kohler@elvatis.com>"
|
|
4
4
|
|
|
5
5
|
branding:
|
|
@@ -79,12 +79,12 @@ runs:
|
|
|
79
79
|
- name: Setup Node.js
|
|
80
80
|
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
|
|
81
81
|
with:
|
|
82
|
-
node-version: "
|
|
82
|
+
node-version: "24"
|
|
83
83
|
package-manager-cache: false
|
|
84
84
|
|
|
85
85
|
- name: Install supply-chain-guard
|
|
86
86
|
shell: bash
|
|
87
|
-
run: npm install -g supply-chain-guard@6.
|
|
87
|
+
run: npm install -g supply-chain-guard@6.3.0 --ignore-scripts --no-audit --no-fund
|
|
88
88
|
|
|
89
89
|
- name: Run scan
|
|
90
90
|
id: scan
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attack-graph.d.ts","sourceRoot":"","sources":["../src/attack-graph.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,OAAO,EAAE,WAAW,EACrB,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,OAAO,EAAE,EACnB,MAAM,EAAE,MAAM,GACb,WAAW,CAyDb;
|
|
1
|
+
{"version":3,"file":"attack-graph.d.ts","sourceRoot":"","sources":["../src/attack-graph.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,OAAO,EAAE,WAAW,EACrB,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,OAAO,EAAE,EACnB,MAAM,EAAE,MAAM,GACb,WAAW,CAyDb;AAoGD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAyB7D"}
|
package/dist/attack-graph.js
CHANGED
|
@@ -121,11 +121,16 @@ function addNode(map, nodes, id, type, label, findingRules) {
|
|
|
121
121
|
if (map.has(id)) {
|
|
122
122
|
const existing = map.get(id);
|
|
123
123
|
if (findingRules) {
|
|
124
|
-
|
|
124
|
+
// Appended in place: copying the list for every finding is quadratic
|
|
125
|
+
// when one file carries many findings.
|
|
126
|
+
existing.findings ??= [];
|
|
127
|
+
for (const rule of findingRules)
|
|
128
|
+
existing.findings.push(rule);
|
|
125
129
|
}
|
|
126
130
|
return;
|
|
127
131
|
}
|
|
128
|
-
|
|
132
|
+
// A copy: the list grows in place above and must not alias the caller's array.
|
|
133
|
+
const node = { id, type, label, findings: findingRules?.slice() };
|
|
129
134
|
map.set(id, node);
|
|
130
135
|
nodes.push(node);
|
|
131
136
|
}
|
package/dist/attack-graph.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attack-graph.js","sourceRoot":"","sources":["../src/attack-graph.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"attack-graph.js","sourceRoot":"","sources":["../src/attack-graph.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;AAMH;;GAEG;AACH,0BACE,QAAmB,EACnB,MAAc;IAEd,MAAM,KAAK,GAAgB,EAAE,CAAC;IAC9B,MAAM,KAAK,GAAgB,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAqB,CAAC;IAE7C,YAAY;IACZ,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAElD,sCAAsC;IACtC,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,aAAa;QACb,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;YACX,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;YAChC,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAC9D,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;QACvE,CAAC;QAED,YAAY;QACZ,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YACtG,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;YAC9B,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAChF,IAAI,CAAC,CAAC,IAAI;gBAAE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACpG,CAAC;QAED,eAAe;QACf,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,oBAAoB,CAAC,EAAE,CAAC;YACtH,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC;YACpC,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAC9D,IAAI,CAAC,CAAC,IAAI;gBAAE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACxG,CAAC;QAED,mBAAmB;QACnB,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5F,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC;YAChC,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YACpE,IAAI,CAAC,CAAC,IAAI;gBAAE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACpG,CAAC;QAED,iBAAiB;QACjB,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,IAAI,IAAI,SAAS,EAAE,CAAC;YAC/C,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,IAAI,IAAI,gBAAgB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAChF,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QACnE,CAAC;QAED,uBAAuB;QACvB,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACvE,MAAM,QAAQ,GAAG,kBAAkB,CAAC,CAAC,IAAI,IAAI,KAAK,EAAE,CAAC;YACrD,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YACxE,IAAI,CAAC,CAAC,IAAI;gBAAE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QACpG,CAAC;IACH,CAAC;IAED,wBAAwB;IACxB,MAAM,KAAK,GAAG,mBAAmB,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IAE1D,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAC1B,KAAkB,EAClB,KAAkB,EAClB,QAAmB;IAEnB,MAAM,KAAK,GAAiB,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAEnD,8CAA8C;IAC9C,IACE,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QAC5G,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,EACvG,CAAC;QACD,KAAK,CAAC,IAAI,CAAC;YACT,EAAE,EAAE,uBAAuB;YAC3B,WAAW,EAAE,yEAAyE;YACtF,QAAQ,EAAE,UAAU;YACpB,UAAU,EAAE,GAAG;YACf,OAAO,EAAE,aAAa,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;SACjD,CAAC,CAAC;IACL,CAAC;IAED,oDAAoD;IACpD,IACE,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QACrE,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,EACtE,CAAC;QACD,KAAK,CAAC,IAAI,CAAC;YACT,EAAE,EAAE,sBAAsB;YAC1B,WAAW,EAAE,gFAAgF;YAC7F,QAAQ,EAAE,UAAU;YACpB,UAAU,EAAE,IAAI;YAChB,OAAO,EAAE,aAAa,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;SACpD,CAAC,CAAC;IACL,CAAC;IAED,gDAAgD;IAChD,IACE,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC;QAC5B,CAAC,KAAK,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,EAClE,CAAC;QACD,KAAK,CAAC,IAAI,CAAC;YACT,EAAE,EAAE,6BAA6B;YACjC,WAAW,EAAE,oEAAoE;YACjF,QAAQ,EAAE,UAAU;YACpB,UAAU,EAAE,IAAI;YAChB,OAAO,EAAE,aAAa,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;SAC7D,CAAC,CAAC;IACL,CAAC;IAED,6CAA6C;IAC7C,IACE,CAAC,KAAK,CAAC,GAAG,CAAC,4BAA4B,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QAC9E,CAAC,KAAK,CAAC,GAAG,CAAC,0BAA0B,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC,EAC/E,CAAC;QACD,KAAK,CAAC,IAAI,CAAC;YACT,EAAE,EAAE,4BAA4B;YAChC,WAAW,EAAE,qFAAqF;YAClG,QAAQ,EAAE,UAAU;YACpB,UAAU,EAAE,GAAG;YACf,OAAO,EAAE,aAAa,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;SACpD,CAAC,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,OAAO,CACd,GAA2B,EAC3B,KAAkB,EAClB,EAAU,EACV,IAAuB,EACvB,KAAa,EACb,YAAuB;IAEvB,IAAI,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;QAChB,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC;QAC9B,IAAI,YAAY,EAAE,CAAC;YACjB,qEAAqE;YACrE,uCAAuC;YACvC,QAAQ,CAAC,QAAQ,KAAK,EAAE,CAAC;YACzB,KAAK,MAAM,IAAI,IAAI,YAAY;gBAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChE,CAAC;QACD,OAAO;IACT,CAAC;IACD,+EAA+E;IAC/E,MAAM,IAAI,GAAc,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,CAAC;IAC7E,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAClB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACnB,CAAC;AAED,SAAS,aAAa,CAAC,KAAkB,EAAE,KAAe;IACxD,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACtE,CAAC;AAED;;GAEG;AACH,4BAAmC,KAAkB;IACnD,MAAM,KAAK,GAAG,CAAC,UAAU,CAAC,CAAC;IAE3B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;YAC3C,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;gBAC5C,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,KAAK,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAClD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;QAC1D,KAAK,CAAC,IAAI,CAAC,KAAK,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,GAAG,KAAK,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACzF,CAAC;IAED,yBAAyB;IACzB,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,qBAAqB,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,UAAU,CAAC,EAAU;IAC5B,OAAO,EAAE,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -1,4 +1,13 @@
|
|
|
1
1
|
import type { CorrelatedPatternMatcher } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Network transport for the beacon rules, shared with their pattern strings in
|
|
4
|
+
* patterns.ts so matcher and regex cannot drift. Identifier boundaries and a
|
|
5
|
+
* call shape keep `fetchNotifications` and `forgotPassword` out, while member
|
|
6
|
+
* calls such as `axios.post(` and `got.get(` still count.
|
|
7
|
+
*/
|
|
8
|
+
export declare const WALLET_NAME_SOURCE: string;
|
|
9
|
+
export declare const WALLET_TARGET_SOURCE: string;
|
|
10
|
+
export declare const BEACON_TRANSPORT_SOURCE: string;
|
|
2
11
|
/**
|
|
3
12
|
* Whole-file Shai-Hulud corroboration without repeated-prefix correlations.
|
|
4
13
|
* This is deliberately symmetric: the legacy reverse-order branch accidentally
|
|
@@ -11,6 +20,21 @@ export declare function hasShaiHuludCorroboration(content: string): boolean;
|
|
|
11
20
|
* `Buffer.from\([^)]*base64` branch and linear repeated-prefix behaviour.
|
|
12
21
|
*/
|
|
13
22
|
export declare function hasDropperPayloadPreparation(content: string): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* True when an anchored regex can only accept [A-Za-z0-9_-]. That excludes
|
|
25
|
+
* `/`, `\`, `.` and `%` (a percent-encoded dot segment still resolves), so an
|
|
26
|
+
* accepted value cannot leave the static prefix's directory. Anything outside
|
|
27
|
+
* this small grammar, including alternation, groups and negated classes, is
|
|
28
|
+
* refused rather than interpreted.
|
|
29
|
+
*/
|
|
30
|
+
export declare function isPathSafeAllowlistRegex(body: string, flags: string): boolean;
|
|
31
|
+
/**
|
|
32
|
+
* True when every template import() on a hit line has a static prefix and
|
|
33
|
+
* extension, interpolates one bare identifier, and that identifier was tested
|
|
34
|
+
* earlier in the same function against an anchored allowlist that admits no
|
|
35
|
+
* path characters. IMPORT_EXPRESSION then reports at info.
|
|
36
|
+
*/
|
|
37
|
+
export declare function isAllowlistGuardedImportLine(content: string, line: number): boolean;
|
|
14
38
|
export declare const CORE_BROAD_GAP_RULES: readonly ["EVAL_HEX", "ENV_EXFILTRATION", "DNS_EXFILTRATION", "SCRIPT_NODE_INLINE", "XZ_BUILD_INJECT", "CODECOV_EXFIL", "SUNBURST_DELAYED_EXEC", "UAPARSER_PREINSTALL_DL", "MINI_SHAI_HULUD_PREINSTALL", "ANTV_WAVE_OTEL_C2", "COA_RC_POSTINSTALL", "PYPI_ENV_EXFILTRATION", "PYPI_HOSTNAME_EXFIL", "BEACON_INTERVAL_FETCH", "BEACON_TIMEOUT_FETCH", "PROTESTWARE_LOCALE_DESTRUCT", "PROTESTWARE_GEOIP_DESTRUCT", "BUILD_PLUGIN_DOWNLOAD", "BUILD_ENV_EXFIL", "WORKSPACE_ROOT_POSTINSTALL", "WORKSPACE_PRIVATE_PUBLISH", "SHAI_HULUD_WORM", "IMPORT_EXPRESSION", "STEGANOGRAPHY_DECODE", "SVG_SCRIPT_INJECTION", "IAC_HARDCODED_SECRET", "DEAD_DROP_DNS_TXT", "VIDAR_BROWSER_THEFT", "VIDAR_WALLET_THEFT", "DROPPER_ANTIVM", "README_LURE_URGENCY", "CAMPAIGN_CLAUDE_LURE", "CAMPAIGN_AI_TOOL_LURE", "C2_DYNAMIC_CONFIG", "SECRETS_SSH_KEY_READ", "CODE_RUNTIME_DEOBFUSCATION"];
|
|
15
39
|
export type CoreBroadGapRule = typeof CORE_BROAD_GAP_RULES[number];
|
|
16
40
|
export declare function createCoreBroadGapMatchers(isLikelyRealSecretValue: (value: string) => boolean): Readonly<Record<CoreBroadGapRule, CorrelatedPatternMatcher>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"broad-gap-pattern-matchers.d.ts","sourceRoot":"","sources":["../src/broad-gap-pattern-matchers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,wBAAwB,EACzB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"broad-gap-pattern-matchers.d.ts","sourceRoot":"","sources":["../src/broad-gap-pattern-matchers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,wBAAwB,EACzB,MAAM,YAAY,CAAC;AA6DpB;;;;;GAKG;AAMH,eAAO,MAAM,kBAAkB,QACmE,CAAC;AACnG,eAAO,MAAM,oBAAoB,QAC+B,CAAC;AAEjE,eAAO,MAAM,uBAAuB,QAC0H,CAAC;AA0mB/J;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAElE;AAMD;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAoBrE;AAwED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CA2C7E;AA4GD;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAsBnF;AAED,eAAO,MAAM,oBAAoB,YAC/B,UAAU,EACV,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,EACf,uBAAuB,EACvB,wBAAwB,EACxB,4BAA4B,EAC5B,mBAAmB,EACnB,oBAAoB,EACpB,uBAAuB,EACvB,qBAAqB,EACrB,uBAAuB,EACvB,sBAAsB,EACtB,6BAA6B,EAC7B,4BAA4B,EAC5B,uBAAuB,EACvB,iBAAiB,EACjB,4BAA4B,EAC5B,2BAA2B,EAC3B,iBAAiB,EACjB,mBAAmB,EACnB,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,EACpB,gBAAgB,EAChB,qBAAqB,EACrB,sBAAsB,EACtB,uBAAuB,EACvB,mBAAmB,EACnB,sBAAsB,EACtB,4BAA4B,CACpB,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAC;AAEnE,wBAAgB,0BAA0B,CACxC,uBAAuB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,GAClD,QAAQ,CAAC,MAAM,CAAC,gBAAgB,EAAE,wBAAwB,CAAC,CAAC,CA0U9D"}
|