penthera 1.7.0 → 1.8.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/CHANGELOG.md +315 -0
- package/README.md +139 -76
- package/SECURITY.md +8 -6
- package/docs/examples/pr-dependency-review.yml +1 -1
- package/lib/adaptive-probes.js +3 -3
- package/lib/advisories/evidence.js +248 -0
- package/lib/advisories/index.js +228 -0
- package/lib/advisories/products.js +83 -0
- package/lib/advisories/versions.js +65 -0
- package/lib/agents/hidden-content.js +122 -11
- package/lib/agents/index.js +26 -6
- package/lib/agents/lock.js +33 -5
- package/lib/agents/rules.js +33 -4
- package/lib/compliance/index.js +4 -4
- package/lib/crawler.js +12 -15
- package/lib/deps/capabilities.js +21 -5
- package/lib/deps/findings.js +309 -0
- package/lib/deps/index.js +13 -272
- package/lib/deps/iocs.js +74 -0
- package/lib/deps/lockfile.js +3 -8
- package/lib/deps/online.js +8 -3
- package/lib/deps/popular-packages.json.gz +0 -0
- package/lib/deps/popular-pypi.json.gz +0 -0
- package/lib/deps/python/capabilities.js +16 -3
- package/lib/deps/python/index.js +5 -1
- package/lib/deps/python/lockfiles.js +11 -5
- package/lib/deps/python/source.js +75 -26
- package/lib/deps/python/toml.js +15 -3
- package/lib/deps/source.js +28 -9
- package/lib/deps/typosquat.js +30 -5
- package/lib/fix/apply.js +253 -34
- package/lib/fix/index.js +7 -4
- package/lib/fix/model.js +25 -5
- package/lib/fix/util.js +6 -2
- package/lib/fuzzer.js +3 -3
- package/lib/git.js +65 -0
- package/lib/hook/index.js +157 -73
- package/lib/hook/policy.js +10 -4
- package/lib/install/index.js +4 -7
- package/lib/machine.js +0 -13
- package/lib/memory/store.js +11 -4
- package/lib/nuclei-loader.js +0 -25
- package/lib/owasp-wstg.js +4 -0
- package/lib/plugins.js +1 -1
- package/lib/provenance.js +1 -0
- package/lib/recon.js +12 -31
- package/lib/references.json +224 -0
- package/lib/retirejs.js +4 -4
- package/lib/rules/advisories/advisories.json +186 -0
- package/lib/rules/advisories/eol.json +413 -0
- package/lib/rules/advisories/pack.json +20 -0
- package/lib/rules/advisories/pack.json.sig +6 -0
- package/lib/rules/allowed_signers +13 -0
- package/lib/rules/core/agent-exec.json +29 -0
- package/lib/rules/core/agent-instructions.json +17 -0
- package/lib/rules/core/pack.json +30 -0
- package/lib/rules/core/pack.json.sig +6 -0
- package/lib/rules/core/secrets.json +161 -0
- package/lib/rules/core/templates.json +52 -0
- package/lib/rules/index.js +107 -0
- package/lib/rules/ioc-2025-2026/files.json +43 -0
- package/lib/rules/ioc-2025-2026/hosts.json +35 -0
- package/lib/rules/ioc-2025-2026/pack.json +25 -0
- package/lib/rules/ioc-2025-2026/pack.json.sig +6 -0
- package/lib/rules/ioc-2025-2026/packages.json +1048 -0
- package/lib/rules/pack.js +452 -0
- package/lib/rules/regex-guard.js +81 -9
- package/lib/rules/sshsig.js +205 -0
- package/lib/templates.js +24 -20
- package/lib/tmp.js +21 -0
- package/lib/whitebox/frameworks.js +1 -1
- package/lib/whitebox/secrets.js +117 -41
- package/package.json +12 -4
- package/scripts/rules/build-pack.mjs +80 -0
- package/scripts/rules/check-bundled.mjs +30 -0
- package/scripts/rules/sign-pack.sh +32 -0
- package/skills/penthera/SKILL.md +16 -15
- package/src/agent/git.js +147 -14
- package/src/agent/loop.js +165 -46
- package/src/cli/agent.js +11 -5
- package/src/cli/deps.js +0 -2
- package/src/cli/detect.js +14 -7
- package/src/cli/fix.js +26 -8
- package/src/cli/hook.js +2 -1
- package/src/cli/onboarding.js +14 -6
- package/src/cli/report-outputs.js +1 -0
- package/src/cli/rules.js +144 -0
- package/src/cli/ui.js +43 -10
- package/src/cli.js +24 -1
- package/src/report/evidence.js +105 -21
- package/src/report/footer.js +1 -1
- package/src/report/md-escape.js +8 -0
- package/src/scan-repo.js +6 -0
- package/src/scan-url.js +11 -3
- package/src/ui/api/data.js +39 -6
- package/src/ui/api/routes.js +44 -11
- package/src/ui/api/runs.js +32 -7
- package/src/ui/security.js +20 -23
- package/src/ui/server.js +52 -27
- package/src/ui/static/app.css +583 -213
- package/src/ui/static/favicon.svg +1 -1
- package/src/ui/static/fonts/DepartureMono-LICENSE.txt +93 -0
- package/src/ui/static/fonts/DepartureMono-Regular.woff2 +0 -0
- package/src/ui/static/index.html +5 -4
- package/src/ui/static/js/api.js +114 -6
- package/src/ui/static/js/app.js +81 -42
- package/src/ui/static/js/center.js +246 -133
- package/src/ui/static/js/charts.js +99 -18
- package/src/ui/static/js/copy.js +68 -9
- package/src/ui/static/js/dialog.js +152 -0
- package/src/ui/static/js/left.js +23 -60
- package/src/ui/static/js/menubar.js +170 -0
- package/src/ui/static/js/onboarding.js +104 -0
- package/src/ui/static/js/panels.js +186 -0
- package/src/ui/static/js/right.js +69 -188
- package/src/ui/static/js/state.js +36 -5
- package/src/ui/static/logo.svg +10 -0
- package/src/ui/static/mark.svg +3 -0
- package/src/utils/http.js +162 -13
- package/docs/METHODOLOGY.md +0 -375
- package/docs/commands/README.md +0 -24
- package/docs/commands/action.md +0 -21
- package/docs/commands/agents.md +0 -38
- package/docs/commands/deps.md +0 -115
- package/docs/commands/fix.md +0 -53
- package/docs/commands/hook.md +0 -69
- package/docs/commands/init.md +0 -114
- package/docs/commands/install.md +0 -53
- package/docs/commands/scan.md +0 -100
- package/docs/commands/skill.md +0 -58
- package/docs/compare/README.md +0 -25
- package/docs/compare/github.md +0 -60
- package/docs/compare/semgrep.md +0 -54
- package/docs/compare/snyk.md +0 -62
- package/docs/compare/socket.md +0 -78
- package/docs/compare/zap.md +0 -59
- package/docs/compliance-cra.md +0 -141
- package/docs/compliance-nis2.md +0 -168
- package/docs/dashboard.md +0 -187
- package/docs/evidence.md +0 -162
- package/docs/funding/due-diligence-checklist.md +0 -79
- package/docs/funding/nlnet-ngi-zero-draft.md +0 -273
- package/docs/funding/partner-one-pager.md +0 -84
- package/docs/funding/sponsor-tiers.md +0 -81
- package/docs/index.md +0 -81
- package/docs/internal-audit.md +0 -83
- package/docs/local-loop.md +0 -276
- package/docs/marketing.md +0 -151
- package/docs/owasp-wstg-coverage.md +0 -79
- package/docs/plan.md +0 -102
- package/docs/privacy.md +0 -38
- package/docs/references.bib +0 -559
- package/docs/references.md +0 -119
- package/docs/release-plan.md +0 -228
- package/docs/research/socket-positioning-notes.md +0 -183
- package/docs/use-cases/README.md +0 -14
- package/docs/use-cases/agencies.md +0 -71
- package/docs/use-cases/ai-coding-teams.md +0 -81
- package/docs/use-cases/eu-sme-compliance.md +0 -68
- package/docs/use-cases/open-source-maintainers.md +0 -75
- package/docs/use-cases/solo-founder.md +0 -65
- package/lib/deps/popular-packages.json +0 -1
- package/lib/deps/popular-pypi.json +0 -1
package/docs/compare/github.md
DELETED
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
# Penthera and GitHub (Dependabot and code scanning)
|
|
2
|
-
|
|
3
|
-
*Last checked: 2026-10-19 against GitHub's docs and security plans page.*
|
|
4
|
-
|
|
5
|
-
## Use them together
|
|
6
|
-
|
|
7
|
-
If your code is on GitHub, you probably have Dependabot already. It alerts you
|
|
8
|
-
when a dependency has a known, reviewed vulnerability and opens a pull request
|
|
9
|
-
to the patched version. Code scanning with CodeQL finds bugs in your own code.
|
|
10
|
-
Penthera covers what those do not look at: what a package can do when it has no
|
|
11
|
-
advisory yet, the running app, and your AI tooling. Its SARIF output uploads
|
|
12
|
-
into the same code scanning tab, so findings sit in one place.
|
|
13
|
-
|
|
14
|
-
## Side by side
|
|
15
|
-
|
|
16
|
-
| | Penthera | Dependabot and code scanning |
|
|
17
|
-
|---|---|---|
|
|
18
|
-
| Dependencies | Capabilities and the upgrade diff, typosquats, licenses; npm and Python | Alerts from GitHub-reviewed advisories in the GitHub Advisory Database ([alerts](https://docs.github.com/en/code-security/dependabot/dependabot-alerts/about-dependabot-alerts)); security and version update PRs |
|
|
19
|
-
| Pull requests | Action that comments the capability diff | Dependency review action that can block a vulnerable change ([dependency review](https://docs.github.com/en/code-security/supply-chain-security/understanding-your-software-supply-chain/about-dependency-review)) |
|
|
20
|
-
| Your code | Routes, trust boundaries, secrets (JS/TS frameworks) | CodeQL queries across many languages |
|
|
21
|
-
| Secrets | Repo scan and a pre-commit hook on staged files | Secret scanning and push protection ([features](https://docs.github.com/en/code-security/getting-started/github-security-features)) |
|
|
22
|
-
| Running app | URL scan | No |
|
|
23
|
-
| AI tooling | `penthera agents` | No dedicated check |
|
|
24
|
-
| Where it runs | Your machine or any CI, offline | GitHub; the CodeQL CLI also runs locally ([CodeQL CLI](https://docs.github.com/en/code-security/codeql-cli/getting-started-with-the-codeql-cli/about-the-codeql-cli)) |
|
|
25
|
-
| Cost | Free | Dependabot is free on all plans. Code scanning, dependency review and secret scanning are free on public repos; private repos need GitHub Code Security ($30) or Secret Protection ($19) per active committer a month ([plans](https://github.com/security/plans)) |
|
|
26
|
-
|
|
27
|
-
## Where GitHub goes further
|
|
28
|
-
|
|
29
|
-
- **Known-vulnerability coverage** across ecosystems, with update pull requests
|
|
30
|
-
generated for you. Penthera does not open pull requests at all.
|
|
31
|
-
- **CodeQL** is a far deeper code analyser than Penthera's repo scan.
|
|
32
|
-
- **Push protection** stops secrets on the server side, for every contributor,
|
|
33
|
-
without anyone installing a hook.
|
|
34
|
-
- **Zero setup** for public repositories.
|
|
35
|
-
|
|
36
|
-
## Where Penthera adds something
|
|
37
|
-
|
|
38
|
-
- **Before an advisory exists.** Dependabot needs a reviewed advisory. Penthera's
|
|
39
|
-
capability diff shows a new install script or network call on the day it
|
|
40
|
-
appears.
|
|
41
|
-
- **The live app and your agent setup**, which GitHub's tools do not scan.
|
|
42
|
-
- **Private repos without a GitHub Advanced Security licence**, and code that is
|
|
43
|
-
not on GitHub.
|
|
44
|
-
|
|
45
|
-
## Run both
|
|
46
|
-
|
|
47
|
-
Keep Dependabot and code scanning on. Add Penthera's action for the capability
|
|
48
|
-
diff ([docs/commands/action.md](../commands/action.md)) and upload its SARIF:
|
|
49
|
-
|
|
50
|
-
```yaml
|
|
51
|
-
- run: npx penthera@1.7.0 "$PREVIEW_URL" --sarif reports/scan.sarif
|
|
52
|
-
- uses: github/codeql-action/upload-sarif@6f2ac81f5cd81fe351a197ba0b00d91d03cd2aee # v4.39.0
|
|
53
|
-
with:
|
|
54
|
-
sarif_file: reports/scan.sarif
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
Uploading SARIF to code scanning in a private repository also needs GitHub Code
|
|
58
|
-
Security.
|
|
59
|
-
|
|
60
|
-
[All comparisons](README.md) · [Back to the README](../../README.md)
|
package/docs/compare/semgrep.md
DELETED
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
# Penthera and Semgrep
|
|
2
|
-
|
|
3
|
-
*Last checked: 2026-10-19 against Semgrep's docs, GitHub and pricing page.*
|
|
4
|
-
|
|
5
|
-
## Use them together
|
|
6
|
-
|
|
7
|
-
[Semgrep](https://semgrep.dev) is a static analyser for your own code. The
|
|
8
|
-
Community Edition engine is open source (LGPL-2.1) and runs locally; the
|
|
9
|
-
commercial AppSec Platform adds cross-file analysis, supply-chain reachability,
|
|
10
|
-
secrets and AI triage ([CE vs platform](https://docs.semgrep.dev/semgrep-pro-vs-oss)).
|
|
11
|
-
Penthera's repo scan is narrower than Semgrep's. What Penthera adds is the rest
|
|
12
|
-
of the picture: the running app, what your dependencies can do, and your AI
|
|
13
|
-
tooling.
|
|
14
|
-
|
|
15
|
-
A reasonable setup: Semgrep on every pull request for code patterns, with your
|
|
16
|
-
own rules if you write them. Penthera for the lockfile, the preview URL and the
|
|
17
|
-
agent config.
|
|
18
|
-
|
|
19
|
-
## Side by side
|
|
20
|
-
|
|
21
|
-
| | Penthera | Semgrep |
|
|
22
|
-
|---|---|---|
|
|
23
|
-
| Your code | Route discovery, trust-boundary mapping and secrets for Next.js, Express, Hono, Fastify | Pattern-based analysis in many languages; CE works within a single file, the platform adds cross-file taint analysis ([CE vs platform](https://docs.semgrep.dev/semgrep-pro-vs-oss)) |
|
|
24
|
-
| Rules | Built in and readable; no rule language for users | A rule language plus 2,000+ community rules in the Registry ([repo](https://github.com/semgrep/semgrep)) |
|
|
25
|
-
| Dependencies | Capabilities, upgrade diff, typosquats, licenses (npm and Python) | Semgrep Supply Chain with reachability, on the platform |
|
|
26
|
-
| Running app | URL scan | No |
|
|
27
|
-
| AI tooling | `penthera agents` | No dedicated check |
|
|
28
|
-
| Network | None needed | CE with local rules sends no metrics by default; `--metrics=off` turns them off ([metrics](https://docs.semgrep.dev/metrics)) |
|
|
29
|
-
| Cost | Free, MIT | CE is free. Platform free for up to 10 contributors; Teams from $30 per contributor a month per product ([pricing](https://semgrep.dev/pricing)) |
|
|
30
|
-
|
|
31
|
-
## Where Semgrep goes further
|
|
32
|
-
|
|
33
|
-
- **Code analysis depth and breadth**: many languages, and dataflow across files
|
|
34
|
-
on the platform.
|
|
35
|
-
- **Your own rules.** If your team has patterns to ban, Semgrep's rule language
|
|
36
|
-
is the right tool. Penthera has no user rule language for code.
|
|
37
|
-
- **Reachability** for dependency vulnerabilities.
|
|
38
|
-
|
|
39
|
-
## Where Penthera adds something
|
|
40
|
-
|
|
41
|
-
- **Outside the source**: the running app, what packages do when installed, and
|
|
42
|
-
the agent config on your machine.
|
|
43
|
-
- **Fixes that are verified** by a re-scan on a local branch.
|
|
44
|
-
- **EU evidence** from the same runs.
|
|
45
|
-
|
|
46
|
-
## Run both
|
|
47
|
-
|
|
48
|
-
```bash
|
|
49
|
-
semgrep scan --config p/default --sarif -o semgrep.sarif
|
|
50
|
-
npx penthera http://localhost:3000 --repo . --sarif penthera.sarif
|
|
51
|
-
npx penthera deps --base origin/main
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
[All comparisons](README.md) · [Back to the README](../../README.md)
|
package/docs/compare/snyk.md
DELETED
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
# Penthera and Snyk
|
|
2
|
-
|
|
3
|
-
*Last checked: 2026-10-19 against Snyk's public docs, pricing page and GitHub.*
|
|
4
|
-
|
|
5
|
-
## Use them together
|
|
6
|
-
|
|
7
|
-
[Snyk](https://snyk.io) is a developer security platform built around a curated
|
|
8
|
-
vulnerability database: it tells you which of your dependencies, containers and
|
|
9
|
-
infrastructure files have known issues, across many languages, and opens fix
|
|
10
|
-
pull requests. Penthera asks different questions: what can a package do (not
|
|
11
|
-
only which CVEs it has), how does the running app behave, and what is in your
|
|
12
|
-
AI tooling config. It does this offline and without an account.
|
|
13
|
-
|
|
14
|
-
A reasonable setup: Snyk for known-vulnerability coverage across your stack.
|
|
15
|
-
Penthera for the behaviour diff on lockfile changes, the scan of your preview
|
|
16
|
-
URL before a deploy, and the agent-config audit.
|
|
17
|
-
|
|
18
|
-
## Side by side
|
|
19
|
-
|
|
20
|
-
| | Penthera | Snyk |
|
|
21
|
-
|---|---|---|
|
|
22
|
-
| Dependencies | What each npm and Python package can do (install scripts, shell, network, env, obfuscation), what an upgrade added, typosquats, licenses | Known vulnerabilities and licenses across 13+ package ecosystems ([supported languages](https://docs.snyk.io/supported-languages/supported-languages-package-managers-and-frameworks)) |
|
|
23
|
-
| Your code | Route discovery, trust boundaries and secrets for JS/TS frameworks | Snyk Code static analysis in 16 languages ([supported languages](https://docs.snyk.io/supported-languages/supported-languages-package-managers-and-frameworks)) |
|
|
24
|
-
| Running app | URL scan (headers, TLS, CORS, auth, JWT, IDOR, OAuth, OpenAPI; opt-in injection and fuzzing) | Snyk API & Web, a DAST product on Enterprise plans ([plans](https://snyk.io/plans/)) |
|
|
25
|
-
| Containers, IaC | No | Yes ([CLI](https://docs.snyk.io/developer-tools/snyk-cli)) |
|
|
26
|
-
| AI tooling | `penthera agents`: skills, MCP servers, hooks, permissions, plugins, rule files, checked locally | Snyk Agent Scan: MCP servers and skills, sends component metadata to Snyk's API and needs a token ([agent-scan](https://github.com/snyk/agent-scan)) |
|
|
27
|
-
| Account | None | Required for the CLI ([authenticate](https://docs.snyk.io/developer-tools/snyk-cli/authenticate-to-use-the-cli)) |
|
|
28
|
-
| Fixes | Deterministic recipes as local diffs, re-scanned to verify; never pushes | Fix pull requests through SCM integrations ([fix PRs](https://docs.snyk.io/scan-with-snyk/pull-requests/snyk-fix-pull-or-merge-requests)) |
|
|
29
|
-
| Editor | Through your coding agent (Agent Skill) | Plugins for VS Code, JetBrains, Visual Studio, Eclipse ([IDE](https://docs.snyk.io/developer-tools/snyk-ide-plugins-and-extensions)) |
|
|
30
|
-
| Licence | MIT | CLI is Apache-2.0 ([repo](https://github.com/snyk/cli)); the platform is commercial |
|
|
31
|
-
| Cost | Free | Free plan with 5 projects and 100 Snyk Code tests a month; Team from $25 a month ([plans](https://snyk.io/plans/)) |
|
|
32
|
-
|
|
33
|
-
## Where Snyk goes further
|
|
34
|
-
|
|
35
|
-
- **Curated vulnerability data** across many languages, with advisories written
|
|
36
|
-
and maintained by a research team. Penthera does not track CVEs for your
|
|
37
|
-
dependencies beyond the vendored Retire.js database for front-end scripts.
|
|
38
|
-
- **Breadth**: containers, infrastructure as code, many more languages.
|
|
39
|
-
- **Reachability analysis** to cut a CVE list down to what you call.
|
|
40
|
-
- **Organisation features**: dashboards, policies across many repos, reporting.
|
|
41
|
-
|
|
42
|
-
## Where Penthera adds something
|
|
43
|
-
|
|
44
|
-
- **Behaviour, not only known issues.** A new install script or a package that
|
|
45
|
-
suddenly reads your whole environment shows up even when no CVE exists yet.
|
|
46
|
-
- **The running app**, free, on localhost.
|
|
47
|
-
- **Fully local.** No account, no API calls, nothing about your code leaves the
|
|
48
|
-
machine. The AI-tooling audit is local too.
|
|
49
|
-
- **EU evidence**: NIS2 readiness, CRA report drafts, SBOM and AI-BOM, and a
|
|
50
|
-
signable evidence bundle.
|
|
51
|
-
|
|
52
|
-
## Run both
|
|
53
|
-
|
|
54
|
-
```bash
|
|
55
|
-
snyk test # known vulnerabilities in dependencies
|
|
56
|
-
npx penthera deps --base origin/main # what the new packages can do
|
|
57
|
-
npx penthera http://localhost:3000 --repo .
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
Both write SARIF, so both can upload to GitHub code scanning.
|
|
61
|
-
|
|
62
|
-
[All comparisons](README.md) · [Back to the README](../../README.md)
|
package/docs/compare/socket.md
DELETED
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
# Penthera and Socket
|
|
2
|
-
|
|
3
|
-
*Last checked: 2026-10-19 against Socket's public docs and pricing page.*
|
|
4
|
-
|
|
5
|
-
## Use them together
|
|
6
|
-
|
|
7
|
-
[Socket](https://socket.dev) watches the open-source registries for malicious and
|
|
8
|
-
risky packages and tells you about them in pull requests, in your editor and at
|
|
9
|
-
install time. Penthera runs on your machine and checks the app you built, the
|
|
10
|
-
packages already in your lockfile, and the AI tooling you build it with.
|
|
11
|
-
|
|
12
|
-
A reasonable setup: Socket's GitHub app or firewall on every dependency change,
|
|
13
|
-
because it watches new releases across the registries and Penthera does
|
|
14
|
-
not. Penthera before each deploy, for the app scan, the agent-config audit
|
|
15
|
-
and the evidence, and anywhere a network call or an account is not an option.
|
|
16
|
-
|
|
17
|
-
## Side by side
|
|
18
|
-
|
|
19
|
-
| | Penthera | Socket |
|
|
20
|
-
|---|---|---|
|
|
21
|
-
| Main question | Is the thing I am about to ship safe, and can I prove it? | Is this package safe to depend on? |
|
|
22
|
-
| Scope | Your running app (URL scan), your source (repo scan), your dependencies, your AI tooling (skills, MCP, hooks), fixes, NIS2 and CRA evidence | Packages across many ecosystems, plus browser extensions and AI models ([language support](https://docs.socket.dev/docs/language-support)) |
|
|
23
|
-
| Ecosystems for dependencies | npm and Python | JS/TS, Python, Go, Java, Ruby, .NET, Rust and more ([language support](https://docs.socket.dev/docs/language-support)) |
|
|
24
|
-
| How it decides | Deterministic rules in the repo, with `file:line` evidence and a confidence label | Static analysis followed by an LLM stage, with researchers confirming detections ([AI alert](https://socket.dev/alerts/gptMalware)) |
|
|
25
|
-
| Threat intelligence | None beyond what ships in a release | Registry-wide and continuously updated |
|
|
26
|
-
| Network | None needed; `--offline` limits traffic to the target you named | The CLI and firewall query Socket's API ([CLI](https://github.com/SocketDev/socket-cli), [firewall](https://docs.socket.dev/docs/socket-firewall-overview)) |
|
|
27
|
-
| Account | None | API token for the CLI; the firewall's free wrapper mode needs no key ([firewall](https://docs.socket.dev/docs/socket-firewall-overview)) |
|
|
28
|
-
| Install-time guard | `penthera install`: reviews capabilities and install scripts before any script runs (npm) | Socket Firewall (`sfw`): blocks known-malicious packages for npm, yarn, pnpm, pip, uv and cargo in free mode |
|
|
29
|
-
| Pull requests | GitHub Action that comments the capability diff | GitHub app that comments on risky dependency changes ([docs](https://docs.socket.dev/docs/socket-for-github)) |
|
|
30
|
-
| AI tooling | Audits the skills, MCP servers, hooks, permissions and plugins already on disk | An MCP server agents can use to look up package scores ([MCP guide](https://docs.socket.dev/docs/guide-to-socket-mcp)); firewall coverage for agent skills and AI models as downloads ([firewall](https://socket.dev/features/firewall)) |
|
|
31
|
-
| App security | URL and repo scans, fix recipes | Not its focus; SAST and secrets are on the Enterprise plan ([pricing](https://socket.dev/pricing)) |
|
|
32
|
-
| SBOM | CycloneDX SBOM and AI-BOM, free | Business plan and up ([pricing](https://socket.dev/pricing)) |
|
|
33
|
-
| Licence | MIT | `socket` CLI and MCP server MIT; `sfw` under PolyForm Shield 1.0.0 (source-available) ([sfw-free](https://github.com/SocketDev/sfw-free)) |
|
|
34
|
-
| Cost | Free | Free plan (1 seat, 1,000 scans a month); free Business plan for OSI-licensed public projects ([announcement](https://socket.dev/blog/free-business-plan-upgrades-for-open-source)); paid seats from $25 a month ([pricing](https://socket.dev/pricing)) |
|
|
35
|
-
|
|
36
|
-
## Where Socket goes further
|
|
37
|
-
|
|
38
|
-
- **It sees the whole registry.** A freshly published package with a
|
|
39
|
-
credential stealer in it can be flagged by Socket before you install it.
|
|
40
|
-
Penthera only sees what is in front of it, with rules from its last release.
|
|
41
|
-
- **More ecosystems.** Penthera's dependency checks cover npm and Python today,
|
|
42
|
-
and its install firewall covers npm only.
|
|
43
|
-
- **Human research.** Socket's researchers confirm and publish malware
|
|
44
|
-
findings. Penthera has no threat-research team.
|
|
45
|
-
- **Reachability** on paid plans, which narrows a long CVE list to the code paths
|
|
46
|
-
you call.
|
|
47
|
-
|
|
48
|
-
## Where Penthera adds something
|
|
49
|
-
|
|
50
|
-
- **Your app, not only its packages.** Headers, auth, IDOR, OAuth, OpenAPI,
|
|
51
|
-
secrets in source, and fixes that are re-scanned to prove they worked.
|
|
52
|
-
- **The AI tooling on your machine.** `penthera agents --home` reads your Claude
|
|
53
|
-
Code, Cursor and MCP config and flags hidden instructions, unpinned servers and
|
|
54
|
-
over-broad permissions.
|
|
55
|
-
- **Offline and account-free**, which matters on air-gapped machines, in some
|
|
56
|
-
public-sector work, and for anyone who cannot send a dependency list to a
|
|
57
|
-
vendor.
|
|
58
|
-
- **Readable verdicts.** Every finding points at a rule in this repository.
|
|
59
|
-
|
|
60
|
-
## A note on AI verdicts
|
|
61
|
-
|
|
62
|
-
Socket's AI scanner once flagged Penthera itself as malware. That is an
|
|
63
|
-
understandable call: Penthera's test suite contains real attack payloads,
|
|
64
|
-
because a security scanner has to be tested against them. It is also a fair
|
|
65
|
-
illustration of the trade-off. An AI stage catches novel malware that no rule
|
|
66
|
-
anticipated, and it can misread intent. Deterministic rules miss what they were
|
|
67
|
-
not written for, and they always tell you exactly why they fired. The two
|
|
68
|
-
approaches cover each other's gaps, which is a good reason to run both.
|
|
69
|
-
|
|
70
|
-
## Run both
|
|
71
|
-
|
|
72
|
-
```bash
|
|
73
|
-
sfw npm install # Socket Firewall: block known-bad packages at install
|
|
74
|
-
npx penthera deps --base origin/main # what the new packages can do, offline
|
|
75
|
-
npx penthera agents --home # your AI tooling
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
[All comparisons](README.md) · [Back to the README](../../README.md)
|
package/docs/compare/zap.md
DELETED
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
# Penthera and OWASP ZAP
|
|
2
|
-
|
|
3
|
-
*Last checked: 2026-10-19 against zaproxy.org and the ZAP GitHub repositories.*
|
|
4
|
-
|
|
5
|
-
## Use them together
|
|
6
|
-
|
|
7
|
-
[ZAP](https://www.zaproxy.org) is the long-standing open-source dynamic scanner
|
|
8
|
-
for web apps: a proxy, spiders, passive and active scan rules, scripting, and an
|
|
9
|
-
automation framework. Since September 2024 it is branded ZAP by Checkmarx and
|
|
10
|
-
remains Apache 2.0 ([announcement](https://www.zaproxy.org/blog/2024-09-24-zap-has-joined-forces-with-checkmarx/)).
|
|
11
|
-
Penthera's URL scan covers a smaller, opinionated set of checks, and pairs them
|
|
12
|
-
with the source code, your dependencies and your AI tooling.
|
|
13
|
-
|
|
14
|
-
A reasonable setup: Penthera as the quick first pass on every preview URL,
|
|
15
|
-
with source context and fixes. ZAP for deeper dynamic testing, manual
|
|
16
|
-
exploration through its proxy, and anything that needs a logged-in browser crawl.
|
|
17
|
-
|
|
18
|
-
## Side by side
|
|
19
|
-
|
|
20
|
-
| | Penthera | ZAP |
|
|
21
|
-
|---|---|---|
|
|
22
|
-
| Dynamic testing | Headers, TLS, CORS, cookies, auth hardening, JWT, IDOR, OAuth, OpenAPI probes; injection and fuzzing are opt-in | Passive and active scan rules, spider and AJAX spider ([features](https://www.zaproxy.org/docs/desktop/start/features/), [AJAX spider](https://www.zaproxy.org/docs/desktop/addons/ajax-spider/)) |
|
|
23
|
-
| API definitions | OpenAPI and FastAPI | OpenAPI, SOAP and GraphQL ([API scan](https://www.zaproxy.org/docs/docker/api-scan/)) |
|
|
24
|
-
| Manual testing | No | Intercepting proxy and desktop UI |
|
|
25
|
-
| Source code | Repo scan in the same run (`--repo .`) maps routes and finds secrets | No |
|
|
26
|
-
| Dependencies, AI tooling | Yes | No |
|
|
27
|
-
| Fixes | Framework-aware fix recipes, re-scanned to verify | Reports alerts |
|
|
28
|
-
| Automation | CLI, GitHub Action, SARIF | YAML Automation Framework, Docker packaged scans, the ZAP Baseline Scan action ([automate](https://www.zaproxy.org/docs/automate/)) |
|
|
29
|
-
| Runtime | Node.js 22+ | Java 17+, or Docker ([download](https://www.zaproxy.org/download/)) |
|
|
30
|
-
| Licence | MIT | Apache 2.0 |
|
|
31
|
-
|
|
32
|
-
## Where ZAP goes further
|
|
33
|
-
|
|
34
|
-
- **Depth of dynamic testing**: many more active scan rules, a mature crawler
|
|
35
|
-
for JavaScript-heavy apps, and years of tuning.
|
|
36
|
-
- **Manual work**: the intercepting proxy lets a person explore and replay.
|
|
37
|
-
- **Authentication**: browser-based, scripted and OAuth2 logins in the
|
|
38
|
-
automation framework ([automation framework](https://www.zaproxy.org/docs/automate/automation-framework/)).
|
|
39
|
-
Penthera takes a cookie or bearer token.
|
|
40
|
-
- **Community**: a large add-on ecosystem and documentation.
|
|
41
|
-
|
|
42
|
-
## Where Penthera adds something
|
|
43
|
-
|
|
44
|
-
- **Black box and white box together.** A URL finding can point at the route
|
|
45
|
-
handler in your repo, and the repo scan finds routes the crawler never saw.
|
|
46
|
-
- **Fixes**, applied as diffs on a local branch and re-scanned.
|
|
47
|
-
- **Beyond the app**: dependency capabilities, AI-tooling audit, NIS2 and CRA
|
|
48
|
-
evidence.
|
|
49
|
-
- **A confidence label on every finding**, so a heuristic match never reads as a
|
|
50
|
-
confirmed vulnerability.
|
|
51
|
-
|
|
52
|
-
## Run both
|
|
53
|
-
|
|
54
|
-
```bash
|
|
55
|
-
npx penthera http://localhost:3000 --repo . --sarif penthera.sarif
|
|
56
|
-
docker run -t ghcr.io/zaproxy/zaproxy:stable zap-baseline.py -t http://host.docker.internal:3000
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
[All comparisons](README.md) · [Back to the README](../../README.md)
|
package/docs/compliance-cra.md
DELETED
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
# Compliance: the Cyber Resilience Act (CRA)
|
|
2
|
-
|
|
3
|
-
Back to the [README](../README.md). NIS2 lives in
|
|
4
|
-
[compliance-nis2.md](compliance-nis2.md).
|
|
5
|
-
|
|
6
|
-
The Cyber Resilience Act, [Regulation (EU) 2024/2847](https://eur-lex.europa.eu/eli/reg/2024/2847/oj/eng),
|
|
7
|
-
puts security duties on manufacturers of products with digital elements, which
|
|
8
|
-
includes software you sell or make available in the EU. Most of it applies from
|
|
9
|
-
11 December 2027. The reporting duty in **Article 14 has applied since
|
|
10
|
-
11 September 2026** (Art. 71(2)), and it also covers products placed on the
|
|
11
|
-
market before December 2027 (Art. 69(3)).
|
|
12
|
-
|
|
13
|
-
Penthera helps with two pieces of CRA evidence, offline:
|
|
14
|
-
|
|
15
|
-
| Command | What you get |
|
|
16
|
-
|---------|--------------|
|
|
17
|
-
| `--cra-init cra.json` then `--cra cra.json` | Article 14 timeline with real due dates, overdue flags, and drafts of every report |
|
|
18
|
-
| `--repo . --aibom aibom.cdx.json` | CycloneDX 1.6 AI-BOM: AI SDKs, models referenced in code, MCP servers, skills, prompt files |
|
|
19
|
-
|
|
20
|
-
Penthera does not make you CRA compliant and does not certify anything. The
|
|
21
|
-
drafts are not the ENISA platform's official form, and none of this is legal
|
|
22
|
-
advice.
|
|
23
|
-
|
|
24
|
-
## Article 14 reporting helper
|
|
25
|
-
|
|
26
|
-
### What the regulation asks
|
|
27
|
-
|
|
28
|
-
Checked on 2026-10-19 against the Official Journal text and the
|
|
29
|
-
[ENISA Single Reporting Platform (SRP) FAQ](https://www.enisa.europa.eu/topics/product-security/vulnerability-services/eu-incident-response-and-cyber-crisis-management/single-reporting-platform-srp/frequently-asked-questions).
|
|
30
|
-
|
|
31
|
-
| | Actively exploited vulnerability (Art. 14(1)-(2)) | Severe incident (Art. 14(3)-(5)) |
|
|
32
|
-
|---|---|---|
|
|
33
|
-
| Early warning | within 24 hours of becoming aware, with the Member States where the product is available | within 24 hours, including whether it is suspected to be caused by unlawful or malicious acts, plus Member States |
|
|
34
|
-
| Notification | within 72 hours: the product, the general nature of the exploit and the vulnerability, corrective or mitigating measures taken and ones users can take, how sensitive the information is | within 72 hours: nature of the incident, an initial assessment, measures taken and ones users can take, sensitivity |
|
|
35
|
-
| Final report | no later than **14 days after a corrective or mitigating measure is available**: description with severity and impact, any malicious actor, details of the security update | within **one month after the incident notification**: detailed description with severity and impact, type of threat or root cause, applied and ongoing mitigations |
|
|
36
|
-
|
|
37
|
-
- **Where to send it.** Through the [ENISA Single Reporting Platform](https://portal.cra-srp.enisa.europa.eu/),
|
|
38
|
-
using the end-point of the CSIRT designated as coordinator in the Member State
|
|
39
|
-
of your main establishment. ENISA receives it at the same time (Art. 14(1),
|
|
40
|
-
14(3), 14(7)). For the Netherlands that CSIRT is **NCSC-NL**, per ENISA's
|
|
41
|
-
[list of CSIRTs designated as coordinators](https://www.enisa.europa.eu/topics/product-security/vulnerability-services/eu-incident-response-and-cyber-crisis-management/single-reporting-platform-srp/list-of-csirts-designated-as-coordinators).
|
|
42
|
-
- **Inform your users.** After becoming aware, inform impacted users (and where
|
|
43
|
-
appropriate all users), with mitigations they can deploy, where appropriate
|
|
44
|
-
in a machine-readable format (Art. 14(8)).
|
|
45
|
-
- **One notification** per vulnerability or incident, even across subsidiaries
|
|
46
|
-
(ENISA SRP FAQ). The CSIRT may ask for an intermediate report (Art. 14(6)).
|
|
47
|
-
- An *actively exploited vulnerability* is one with reliable evidence that a
|
|
48
|
-
malicious actor exploited it without the system owner's permission (Art. 3(42)).
|
|
49
|
-
An incident is *severe* if it can harm the availability, authenticity,
|
|
50
|
-
integrity or confidentiality of sensitive or important data or functions, or
|
|
51
|
-
can lead to malicious code in the product or a user's systems (Art. 14(5)).
|
|
52
|
-
|
|
53
|
-
### Use it
|
|
54
|
-
|
|
55
|
-
```bash
|
|
56
|
-
penthera --cra-init cra.json # set type ("vulnerability" or "incident") and aware_at
|
|
57
|
-
penthera --cra cra.json # writes cra-reports.md and prints the deadlines
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
`cra-reports.md` holds the timeline (UTC and your local time), a status per
|
|
61
|
-
report (`due in 21h 30m`, `submitted`, `submitted late`, `OVERDUE`,
|
|
62
|
-
`waiting for a fix`), a draft of each report with `NEEDS INPUT` for every fact
|
|
63
|
-
still missing, and a draft user advisory for Art. 14(8). Record what you've sent
|
|
64
|
-
in `submitted.early_warning` / `submitted.notification` / `submitted.final_report`
|
|
65
|
-
and re-run; for a severe incident the final report then counts from the real
|
|
66
|
-
submission time instead of the 72-hour deadline.
|
|
67
|
-
|
|
68
|
-
**Prefill from your scan and SBOM.** Name the affected dependency in
|
|
69
|
-
`component.name` and point `prefill` at Penthera output (paths relative to
|
|
70
|
-
`cra.json`):
|
|
71
|
-
|
|
72
|
-
```json
|
|
73
|
-
{
|
|
74
|
-
"type": "vulnerability",
|
|
75
|
-
"aware_at": "2026-10-24T09:00:00+02:00",
|
|
76
|
-
"component": { "name": "jquery" },
|
|
77
|
-
"prefill": { "scan": "scan.json", "sbom": "sbom.cdx.json" }
|
|
78
|
-
}
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
```bash
|
|
82
|
-
penthera https://staging.example.com --repo . --sbom sbom.cdx.json -o scan.json
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
From the SBOM it fills the product name and version and the component's version
|
|
86
|
-
and purl; from the scan, matching CVE ids, the scanner severity, and the finding
|
|
87
|
-
titles. Prefilled values are marked *verify* in the draft, and anything you wrote
|
|
88
|
-
yourself is never overwritten. A full example lives in `tests/fixtures/cra/`.
|
|
89
|
-
|
|
90
|
-
### How the deadlines are counted
|
|
91
|
-
|
|
92
|
-
- **Hours are elapsed hours** from `aware_at`. If the clocks change in between,
|
|
93
|
-
the local due time shifts (24 hours from 09:00 CEST on 24 October 2026 is
|
|
94
|
-
08:00 CET on 25 October).
|
|
95
|
-
- **Days and months are calendar periods** in your `timezone` (default
|
|
96
|
-
`Europe/Amsterdam`), ending at the same clock time. One month from 31 January
|
|
97
|
-
ends on 28 (or 29) February, following
|
|
98
|
-
[Regulation 1182/71](https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:31971R1182) Art. 3(2)(c).
|
|
99
|
-
- A timestamp without an offset is read in `timezone`. Use ISO 8601.
|
|
100
|
-
- This is the **strict reading**. Regulation 1182/71 can give a little more
|
|
101
|
-
time (a period runs to the end of the hour or day, and a days or months period
|
|
102
|
-
that ends on a weekend or public holiday moves to the next working day).
|
|
103
|
-
Don't plan on that; report early.
|
|
104
|
-
|
|
105
|
-
The helper warns if `aware_at` is before 11 September 2026, if
|
|
106
|
-
`main_establishment` is not the Netherlands (so NCSC-NL is not your CSIRT), and
|
|
107
|
-
if the type or time zone is unknown.
|
|
108
|
-
|
|
109
|
-
## AI-BOM (CycloneDX 1.6)
|
|
110
|
-
|
|
111
|
-
Customers and auditors increasingly ask what AI a product contains: which
|
|
112
|
-
providers get your data, which models, which agent tooling. `--aibom`
|
|
113
|
-
inventories it from the repo, offline:
|
|
114
|
-
|
|
115
|
-
```bash
|
|
116
|
-
penthera --repo . --aibom aibom.cdx.json
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
| Found | How | CycloneDX |
|
|
120
|
-
|-------|-----|-----------|
|
|
121
|
-
| AI SDKs: `openai`, `@anthropic-ai/sdk`, `@google/genai`, `ai` / `@ai-sdk/*`, `langchain` / `@langchain/*`, `llamaindex`, `ollama`, `@huggingface/transformers`; on PyPI `anthropic`, `transformers`, `torch`, `langchain-*`, `llama-index-*`, `litellm`, `mcp` and others | lockfile, `package.json`, `requirements.txt`, `pyproject.toml` | `library` with purl |
|
|
122
|
-
| Models: `claude-*`, `gpt-*`, `o3`, `text-embedding-*`, `gemini-*`, `gemma*`, `llama*`, `mistral-*`, `deepseek-*`, `qwen*`, `phi-*`, `grok-*`, Hugging Face ids (`meta-llama/Llama-3.1-8B-Instruct`) | whole string literals in code and `model:` keys in YAML/TOML; HF ids only for known orgs or next to a loader call | `machine-learning-model` with supplier, `modelCard` stub, `evidence.occurrences` (file and line) |
|
|
123
|
-
| MCP servers | `lib/agents/discover.js` (`.mcp.json`, `.cursor/`, `.vscode/mcp.json`, ...) | `services` with transport, package, endpoint and trust boundary; env var *names* only, never values or args |
|
|
124
|
-
| Agent Skills | `SKILL.md` folders | `data` with SHA-256 |
|
|
125
|
-
| Prompt files | `*.prompt`, `*.prompty`, `*.prompt.md`, anything under a `prompts/` folder | `data` with SHA-256 |
|
|
126
|
-
|
|
127
|
-
Every item hangs off the root component in `dependencies`. The BOM is only the
|
|
128
|
-
AI slice; use `--sbom` for all dependencies.
|
|
129
|
-
|
|
130
|
-
Spec references: the [CycloneDX 1.6 JSON reference](https://cyclonedx.org/docs/1.6/json/),
|
|
131
|
-
the [ML-BOM capability page](https://cyclonedx.org/capabilities/mlbom/), and the
|
|
132
|
-
[official schema](https://github.com/CycloneDX/specification/blob/master/schema/bom-1.6.schema.json).
|
|
133
|
-
That schema (with its SPDX and JSF dependencies) is vendored in
|
|
134
|
-
`tests/fixtures/cyclonedx/`, and the tests validate every generated AI-BOM
|
|
135
|
-
against it without network. Penthera emits 1.6 (ML-BOM first appeared in 1.5);
|
|
136
|
-
CycloneDX 1.7 is also published and is a later upgrade.
|
|
137
|
-
|
|
138
|
-
**Limits.** A model string in code means the model is referenced, not that it
|
|
139
|
-
runs in production; the evidence lines let a reviewer check. Model ids built at
|
|
140
|
-
runtime (`` `claude-${tier}` ``) are not detected. The `modelCard` is a stub:
|
|
141
|
-
fill in task, datasets and considerations from the provider's model card.
|
package/docs/compliance-nis2.md
DELETED
|
@@ -1,168 +0,0 @@
|
|
|
1
|
-
# Compliance: NIS2 and the cyberwetgeving
|
|
2
|
-
|
|
3
|
-
Back to the [README](../README.md). Shipping a product? The Cyber Resilience
|
|
4
|
-
Act's Article 14 reporting helper and the AI-BOM are in
|
|
5
|
-
[compliance-cra.md](compliance-cra.md).
|
|
6
|
-
|
|
7
|
-
The EU NIS2 directive and its national transpositions (the Cyberbeveiligingswet
|
|
8
|
-
in the Netherlands, the NIS2-wet in Belgium) put a duty of care, the *zorgplicht*,
|
|
9
|
-
on in-scope organisations. That duty is the set of risk-management measures in
|
|
10
|
-
Article 21(2) of the directive. Most of them are organisational. Some are
|
|
11
|
-
technical and testable, and that is the part Penthera helps with.
|
|
12
|
-
|
|
13
|
-
Penthera does not make you compliant and does not certify anything. What it gives
|
|
14
|
-
you is automated, repeatable technical evidence for the measures a scanner can
|
|
15
|
-
honestly verify: the kind of artefact you can attach to a risk file, show an
|
|
16
|
-
auditor, or run in CI so a regression shows up before it ships.
|
|
17
|
-
|
|
18
|
-
| Art. 21(2) measure | What Penthera does | Coverage |
|
|
19
|
-
|--------------------|--------------------|----------|
|
|
20
|
-
| **(a)** Risk analysis & information-security policy | Findings, severity, and baseline history feed your risk analysis | Evidence |
|
|
21
|
-
| **(b)** Incident handling | `--incident` drafts the 24h / 72h / 1-month reports against your authority's required content | Partial |
|
|
22
|
-
| **(c)** Business continuity, backup, crisis management | Organisational; outside a scanner's reach | Out of scope |
|
|
23
|
-
| **(d)** Supply-chain security | Known-CVE checks on JS dependencies, leaked credentials, a CycloneDX SBOM (`--sbom`), and passive supplier rating (`--suppliers`) | Partial |
|
|
24
|
-
| **(e)** Security in acquisition, development & maintenance; **vulnerability handling** | The core: black- + white-box scanning mapped to OWASP WSTG, SARIF → GitHub, baseline regression, scan-and-fix loop | **Strong** |
|
|
25
|
-
| **(f)** Assessing the effectiveness of measures | Baseline diff, re-scan-to-verify, and `--history` tracking of time-to-fix, ageing, and drift | Partial |
|
|
26
|
-
| **(g)** Cyber hygiene & training | Remediation playbook + secure-defaults guidance (guidance, not a training programme) | Partial |
|
|
27
|
-
| **(h)** Cryptography & encryption | TLS protocol/cipher/certificate audit, HSTS, cookie `Secure` (transport layer only) | Partial |
|
|
28
|
-
| **(i)** HR security, **access control**, asset management | Access control tested: JWT, IDOR/BOLA, OAuth redirect, client-side-auth, trust-boundary mapping | Partial |
|
|
29
|
-
| **(j)** Multi-factor authentication & secure communications | MFA probe (on the roadmap) | Planned |
|
|
30
|
-
|
|
31
|
-
**Coverage key:** *Strong* = automated technical testing · *Partial* = part of the
|
|
32
|
-
measure · *Evidence* = output feeds the measure, no direct test · *Planned* = on the
|
|
33
|
-
roadmap · *Out of scope* = organisational or physical.
|
|
34
|
-
|
|
35
|
-
In practice, Penthera today gives you solid automated evidence for the
|
|
36
|
-
secure-development and vulnerability-handling duty (e), which is the technical
|
|
37
|
-
heart of the zorgplicht, plus meaningful coverage of supply chain (d),
|
|
38
|
-
cryptography in transit (h), access control (i), and effectiveness testing (f).
|
|
39
|
-
That is not the whole duty of care, but it is a real, defensible start you can run
|
|
40
|
-
today and re-run on every deploy.
|
|
41
|
-
|
|
42
|
-
> **Not legal advice, not a certification, not a guarantee of compliance.**
|
|
43
|
-
> Penthera automates the technical-testing part of the duty of care. The
|
|
44
|
-
> directive's organisational duties (governance, risk-management policy,
|
|
45
|
-
> incident-notification processes, supply-chain contracts, staff training) need
|
|
46
|
-
> human process and, where it matters, review by a qualified advisor. For an
|
|
47
|
-
> authoritative reading, consult your national authority (the NCSC in the
|
|
48
|
-
> Netherlands, the CCB and its CyFun framework in Belgium) or a specialised jurist.
|
|
49
|
-
|
|
50
|
-
Generate this mapping for your own scan with `--framework nis2`. It adds a
|
|
51
|
-
per-run coverage table (which measures *this* scan actually exercised, driven by
|
|
52
|
-
the probes that ran) to the terminal, Markdown, and JSON reports:
|
|
53
|
-
|
|
54
|
-
```bash
|
|
55
|
-
penthera https://myapp.com --framework nis2 -o reports/scan.json
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
### Readiness report (clone → report in two commands)
|
|
59
|
-
|
|
60
|
-
Go further than the mapping: combine the scan with a short offline
|
|
61
|
-
self-assessment (the organisational measures a scanner can't test, like policies,
|
|
62
|
-
backups, training, and MFA) into a full NIS2 readiness report. Every Article 21
|
|
63
|
-
measure is marked `met / partial / gap / n-a`, with proportionality notes, your
|
|
64
|
-
incident-reporting deadlines, and provenance on every piece of evidence.
|
|
65
|
-
|
|
66
|
-
```bash
|
|
67
|
-
# 1. Create your self-assessment (offline, one-time). Fill in yes | partial | no | na.
|
|
68
|
-
penthera --assessment-init assessment.json
|
|
69
|
-
|
|
70
|
-
# 2. Scan + self-assessment → readiness report (writes reports/scan-readiness.md)
|
|
71
|
-
penthera https://myapp.com --repo . --readiness --assessment assessment.json -o reports/scan.json
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
The readiness report is **evidence and self-assessment tooling, not a
|
|
75
|
-
certification**. It is provenance-linked (`source, method, collected_at,
|
|
76
|
-
confidence`) and reproducible, and it lists exactly what only you can attest to.
|
|
77
|
-
Jurisdiction specifics live in [`lib/jurisdictions/nl.json`](../lib/jurisdictions/nl.json) (NL today; BE and
|
|
78
|
-
others are just added config).
|
|
79
|
-
|
|
80
|
-
### Answer a customer's security questionnaire
|
|
81
|
-
|
|
82
|
-
The questionnaire blocking your deal, drafted from evidence you already have:
|
|
83
|
-
|
|
84
|
-
```bash
|
|
85
|
-
# one question per line, pasted from the customer's form
|
|
86
|
-
penthera https://myapp.com --readiness --assessment assessment.json --questionnaire questions.txt
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
Each question is mapped to the Article 21 measure it belongs to and answered
|
|
90
|
-
from the scan and your self-assessment, with the backing evidence cited.
|
|
91
|
-
Anything Penthera can't map is marked `NEEDS HUMAN INPUT` instead of guessed.
|
|
92
|
-
Review every answer before you send it.
|
|
93
|
-
|
|
94
|
-
### Policy pack
|
|
95
|
-
|
|
96
|
-
Generate the proportionate written policies NIS2 expects, pre-filled from your
|
|
97
|
-
readiness gaps and the NL incident deadlines:
|
|
98
|
-
|
|
99
|
-
```bash
|
|
100
|
-
penthera --policy-pack ./policies --org "Your Company" --readiness --assessment assessment.json
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
Writes editable Markdown starting points: information security, access control,
|
|
104
|
-
incident response, backup/continuity, acceptable use, supplier security, and
|
|
105
|
-
vulnerability management. **Templates, not legal advice.** Keep them short and
|
|
106
|
-
used. A two-page policy that genuinely exists is what "proportionate" means.
|
|
107
|
-
|
|
108
|
-
### Incident-report helper
|
|
109
|
-
|
|
110
|
-
NIS2 has hard reporting deadlines (24h early warning, 72h notification, 1-month
|
|
111
|
-
final report). If something happens, get the timeline and draft reports:
|
|
112
|
-
|
|
113
|
-
```bash
|
|
114
|
-
penthera --incident-init incident.json # fill in what happened (set aware_at)
|
|
115
|
-
penthera --incident incident.json # writes incident-reports.md
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
It computes your three deadlines from when you became aware, flags anything
|
|
119
|
-
overdue, and drafts the early-warning, notification, and final report against
|
|
120
|
-
the required content, with `NEEDS INPUT` where you still have to fill in facts.
|
|
121
|
-
**These are drafts to help you meet the deadlines, not a substitute for your
|
|
122
|
-
authority's official form.**
|
|
123
|
-
|
|
124
|
-
### Software bill of materials (SBOM)
|
|
125
|
-
|
|
126
|
-
Emit a standard CycloneDX SBOM of your dependencies. It's what enterprises
|
|
127
|
-
increasingly require of suppliers, and direct evidence for supply-chain security
|
|
128
|
-
(measure d):
|
|
129
|
-
|
|
130
|
-
```bash
|
|
131
|
-
penthera --repo . --sbom sbom.cdx.json
|
|
132
|
-
```
|
|
133
|
-
|
|
134
|
-
Parses `package-lock.json` / `package.json` / `requirements.txt` offline (no
|
|
135
|
-
network), with resolved versions and package URLs (purls).
|
|
136
|
-
|
|
137
|
-
### Remediation tracking (the audit loop)
|
|
138
|
-
|
|
139
|
-
Closing findings matters more than finding them. Track them over time:
|
|
140
|
-
time-to-fix, ageing of open items, and what changed since the last scan (evidence
|
|
141
|
-
for measure f, effectiveness):
|
|
142
|
-
|
|
143
|
-
```bash
|
|
144
|
-
penthera https://myapp.com --history reports/history.json -o reports/scan.json
|
|
145
|
-
```
|
|
146
|
-
|
|
147
|
-
Each run folds the current findings into a small history keyed by a **stable
|
|
148
|
-
fingerprint** (so a re-worded or re-counted finding isn't mistaken for a new
|
|
149
|
-
one), then reports open vs resolved, median time-to-fix, and ageing buckets.
|
|
150
|
-
Re-run on a cadence to watch the trend.
|
|
151
|
-
|
|
152
|
-
### Supplier rating (passive)
|
|
153
|
-
|
|
154
|
-
Assess your suppliers' public security posture for supply-chain risk (measure d):
|
|
155
|
-
|
|
156
|
-
```bash
|
|
157
|
-
printf 'supplier1.com\nsupplier2.com\n' > suppliers.txt
|
|
158
|
-
penthera --suppliers suppliers.txt
|
|
159
|
-
```
|
|
160
|
-
|
|
161
|
-
**Strictly passive and public-data-only.** One homepage GET (security headers),
|
|
162
|
-
a TLS handshake (certificate), and public DNS lookups (SPF/DMARC/MX) per domain.
|
|
163
|
-
No endpoint discovery, no auth probes, no intrusive testing. You get a
|
|
164
|
-
red/amber/green rating per supplier. It's a screening aid for your own vendor
|
|
165
|
-
risk assessment, **not** an authorised penetration test of the supplier.
|
|
166
|
-
|
|
167
|
-
Because the mapping targets the NIS2 directive itself, it applies across the
|
|
168
|
-
national transpositions; jurisdiction-specific profiles (NL, BE) are on the roadmap.
|