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.
Files changed (163) hide show
  1. package/CHANGELOG.md +315 -0
  2. package/README.md +139 -76
  3. package/SECURITY.md +8 -6
  4. package/docs/examples/pr-dependency-review.yml +1 -1
  5. package/lib/adaptive-probes.js +3 -3
  6. package/lib/advisories/evidence.js +248 -0
  7. package/lib/advisories/index.js +228 -0
  8. package/lib/advisories/products.js +83 -0
  9. package/lib/advisories/versions.js +65 -0
  10. package/lib/agents/hidden-content.js +122 -11
  11. package/lib/agents/index.js +26 -6
  12. package/lib/agents/lock.js +33 -5
  13. package/lib/agents/rules.js +33 -4
  14. package/lib/compliance/index.js +4 -4
  15. package/lib/crawler.js +12 -15
  16. package/lib/deps/capabilities.js +21 -5
  17. package/lib/deps/findings.js +309 -0
  18. package/lib/deps/index.js +13 -272
  19. package/lib/deps/iocs.js +74 -0
  20. package/lib/deps/lockfile.js +3 -8
  21. package/lib/deps/online.js +8 -3
  22. package/lib/deps/popular-packages.json.gz +0 -0
  23. package/lib/deps/popular-pypi.json.gz +0 -0
  24. package/lib/deps/python/capabilities.js +16 -3
  25. package/lib/deps/python/index.js +5 -1
  26. package/lib/deps/python/lockfiles.js +11 -5
  27. package/lib/deps/python/source.js +75 -26
  28. package/lib/deps/python/toml.js +15 -3
  29. package/lib/deps/source.js +28 -9
  30. package/lib/deps/typosquat.js +30 -5
  31. package/lib/fix/apply.js +253 -34
  32. package/lib/fix/index.js +7 -4
  33. package/lib/fix/model.js +25 -5
  34. package/lib/fix/util.js +6 -2
  35. package/lib/fuzzer.js +3 -3
  36. package/lib/git.js +65 -0
  37. package/lib/hook/index.js +157 -73
  38. package/lib/hook/policy.js +10 -4
  39. package/lib/install/index.js +4 -7
  40. package/lib/machine.js +0 -13
  41. package/lib/memory/store.js +11 -4
  42. package/lib/nuclei-loader.js +0 -25
  43. package/lib/owasp-wstg.js +4 -0
  44. package/lib/plugins.js +1 -1
  45. package/lib/provenance.js +1 -0
  46. package/lib/recon.js +12 -31
  47. package/lib/references.json +224 -0
  48. package/lib/retirejs.js +4 -4
  49. package/lib/rules/advisories/advisories.json +186 -0
  50. package/lib/rules/advisories/eol.json +413 -0
  51. package/lib/rules/advisories/pack.json +20 -0
  52. package/lib/rules/advisories/pack.json.sig +6 -0
  53. package/lib/rules/allowed_signers +13 -0
  54. package/lib/rules/core/agent-exec.json +29 -0
  55. package/lib/rules/core/agent-instructions.json +17 -0
  56. package/lib/rules/core/pack.json +30 -0
  57. package/lib/rules/core/pack.json.sig +6 -0
  58. package/lib/rules/core/secrets.json +161 -0
  59. package/lib/rules/core/templates.json +52 -0
  60. package/lib/rules/index.js +107 -0
  61. package/lib/rules/ioc-2025-2026/files.json +43 -0
  62. package/lib/rules/ioc-2025-2026/hosts.json +35 -0
  63. package/lib/rules/ioc-2025-2026/pack.json +25 -0
  64. package/lib/rules/ioc-2025-2026/pack.json.sig +6 -0
  65. package/lib/rules/ioc-2025-2026/packages.json +1048 -0
  66. package/lib/rules/pack.js +452 -0
  67. package/lib/rules/regex-guard.js +81 -9
  68. package/lib/rules/sshsig.js +205 -0
  69. package/lib/templates.js +24 -20
  70. package/lib/tmp.js +21 -0
  71. package/lib/whitebox/frameworks.js +1 -1
  72. package/lib/whitebox/secrets.js +117 -41
  73. package/package.json +12 -4
  74. package/scripts/rules/build-pack.mjs +80 -0
  75. package/scripts/rules/check-bundled.mjs +30 -0
  76. package/scripts/rules/sign-pack.sh +32 -0
  77. package/skills/penthera/SKILL.md +16 -15
  78. package/src/agent/git.js +147 -14
  79. package/src/agent/loop.js +165 -46
  80. package/src/cli/agent.js +11 -5
  81. package/src/cli/deps.js +0 -2
  82. package/src/cli/detect.js +14 -7
  83. package/src/cli/fix.js +26 -8
  84. package/src/cli/hook.js +2 -1
  85. package/src/cli/onboarding.js +14 -6
  86. package/src/cli/report-outputs.js +1 -0
  87. package/src/cli/rules.js +144 -0
  88. package/src/cli/ui.js +43 -10
  89. package/src/cli.js +24 -1
  90. package/src/report/evidence.js +105 -21
  91. package/src/report/footer.js +1 -1
  92. package/src/report/md-escape.js +8 -0
  93. package/src/scan-repo.js +6 -0
  94. package/src/scan-url.js +11 -3
  95. package/src/ui/api/data.js +39 -6
  96. package/src/ui/api/routes.js +44 -11
  97. package/src/ui/api/runs.js +32 -7
  98. package/src/ui/security.js +20 -23
  99. package/src/ui/server.js +52 -27
  100. package/src/ui/static/app.css +583 -213
  101. package/src/ui/static/favicon.svg +1 -1
  102. package/src/ui/static/fonts/DepartureMono-LICENSE.txt +93 -0
  103. package/src/ui/static/fonts/DepartureMono-Regular.woff2 +0 -0
  104. package/src/ui/static/index.html +5 -4
  105. package/src/ui/static/js/api.js +114 -6
  106. package/src/ui/static/js/app.js +81 -42
  107. package/src/ui/static/js/center.js +246 -133
  108. package/src/ui/static/js/charts.js +99 -18
  109. package/src/ui/static/js/copy.js +68 -9
  110. package/src/ui/static/js/dialog.js +152 -0
  111. package/src/ui/static/js/left.js +23 -60
  112. package/src/ui/static/js/menubar.js +170 -0
  113. package/src/ui/static/js/onboarding.js +104 -0
  114. package/src/ui/static/js/panels.js +186 -0
  115. package/src/ui/static/js/right.js +69 -188
  116. package/src/ui/static/js/state.js +36 -5
  117. package/src/ui/static/logo.svg +10 -0
  118. package/src/ui/static/mark.svg +3 -0
  119. package/src/utils/http.js +162 -13
  120. package/docs/METHODOLOGY.md +0 -375
  121. package/docs/commands/README.md +0 -24
  122. package/docs/commands/action.md +0 -21
  123. package/docs/commands/agents.md +0 -38
  124. package/docs/commands/deps.md +0 -115
  125. package/docs/commands/fix.md +0 -53
  126. package/docs/commands/hook.md +0 -69
  127. package/docs/commands/init.md +0 -114
  128. package/docs/commands/install.md +0 -53
  129. package/docs/commands/scan.md +0 -100
  130. package/docs/commands/skill.md +0 -58
  131. package/docs/compare/README.md +0 -25
  132. package/docs/compare/github.md +0 -60
  133. package/docs/compare/semgrep.md +0 -54
  134. package/docs/compare/snyk.md +0 -62
  135. package/docs/compare/socket.md +0 -78
  136. package/docs/compare/zap.md +0 -59
  137. package/docs/compliance-cra.md +0 -141
  138. package/docs/compliance-nis2.md +0 -168
  139. package/docs/dashboard.md +0 -187
  140. package/docs/evidence.md +0 -162
  141. package/docs/funding/due-diligence-checklist.md +0 -79
  142. package/docs/funding/nlnet-ngi-zero-draft.md +0 -273
  143. package/docs/funding/partner-one-pager.md +0 -84
  144. package/docs/funding/sponsor-tiers.md +0 -81
  145. package/docs/index.md +0 -81
  146. package/docs/internal-audit.md +0 -83
  147. package/docs/local-loop.md +0 -276
  148. package/docs/marketing.md +0 -151
  149. package/docs/owasp-wstg-coverage.md +0 -79
  150. package/docs/plan.md +0 -102
  151. package/docs/privacy.md +0 -38
  152. package/docs/references.bib +0 -559
  153. package/docs/references.md +0 -119
  154. package/docs/release-plan.md +0 -228
  155. package/docs/research/socket-positioning-notes.md +0 -183
  156. package/docs/use-cases/README.md +0 -14
  157. package/docs/use-cases/agencies.md +0 -71
  158. package/docs/use-cases/ai-coding-teams.md +0 -81
  159. package/docs/use-cases/eu-sme-compliance.md +0 -68
  160. package/docs/use-cases/open-source-maintainers.md +0 -75
  161. package/docs/use-cases/solo-founder.md +0 -65
  162. package/lib/deps/popular-packages.json +0 -1
  163. package/lib/deps/popular-pypi.json +0 -1
@@ -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)
@@ -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)
@@ -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)
@@ -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)
@@ -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)
@@ -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.
@@ -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.