penthera 1.2.0 → 1.5.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 +269 -0
- package/README.md +493 -45
- package/docs/METHODOLOGY.md +321 -0
- package/docs/compliance-cra.md +141 -0
- package/docs/compliance-nis2.md +3 -1
- package/docs/evidence.md +158 -0
- package/docs/examples/github-actions-deps.yml +105 -0
- package/docs/examples/github-actions-scan.yml +1 -1
- package/docs/examples/pr-dependency-review.yml +56 -0
- package/docs/funding/due-diligence-checklist.md +79 -0
- package/docs/funding/nlnet-ngi-zero-draft.md +273 -0
- package/docs/funding/partner-one-pager.md +84 -0
- package/docs/funding/sponsor-tiers.md +81 -0
- package/docs/index.md +12 -1
- package/docs/local-loop.md +276 -0
- package/docs/plan.md +100 -0
- package/docs/references.bib +539 -0
- package/docs/references.md +77 -0
- package/docs/release-plan.md +228 -0
- package/lib/adaptive-probes.js +8 -5
- package/lib/agents/discover.js +384 -0
- package/lib/agents/hidden-content.js +387 -0
- package/lib/agents/index.js +286 -0
- package/lib/agents/lock.js +115 -0
- package/lib/agents/owasp.js +83 -0
- package/lib/agents/rules.js +376 -0
- package/lib/compliance/cra.js +525 -0
- package/lib/crawler.js +5 -15
- package/lib/data/retire-jsrepository.json.gz +0 -0
- package/lib/data/retire-jsrepository.meta.json +7 -0
- package/lib/deps/capabilities.js +523 -0
- package/lib/deps/diff.js +84 -0
- package/lib/deps/index.js +440 -0
- package/lib/deps/license.js +329 -0
- package/lib/deps/lockfile.js +109 -0
- package/lib/deps/online.js +132 -0
- package/lib/deps/popular-packages.json +1 -0
- package/lib/deps/report.js +190 -0
- package/lib/deps/source.js +171 -0
- package/lib/deps/spdx.json +1 -0
- package/lib/deps/typosquat.js +113 -0
- package/lib/fix/apply.js +95 -0
- package/lib/fix/diff.js +199 -0
- package/lib/fix/index.js +129 -0
- package/lib/fix/model.js +108 -0
- package/lib/fix/recipes/cookies.js +130 -0
- package/lib/fix/recipes/cors.js +116 -0
- package/lib/fix/recipes/headers.js +250 -0
- package/lib/fix/recipes/rate-limit.js +211 -0
- package/lib/fix/recipes/secrets.js +110 -0
- package/lib/fix/util.js +231 -0
- package/lib/fuzzer.js +14 -8
- package/lib/hook/index.js +312 -0
- package/lib/hook/policy.js +62 -0
- package/lib/injections.js +19 -15
- package/lib/install/index.js +271 -0
- package/lib/install/policy.js +125 -0
- package/lib/jurisdictions/nl.json +9 -0
- package/lib/memory/history.js +52 -0
- package/lib/memory/index.js +111 -0
- package/lib/memory/repo-suppress.js +64 -0
- package/lib/memory/store.js +325 -0
- package/lib/memory/views.js +198 -0
- package/lib/params.js +4 -12
- package/lib/provenance.js +2 -0
- package/lib/recon.js +12 -20
- package/lib/references.js +31 -0
- package/lib/references.json +374 -0
- package/lib/remediation/index.js +28 -0
- package/lib/retirejs.js +50 -22
- package/lib/templates.js +7 -10
- package/lib/whitebox/aibom.js +384 -0
- package/lib/whitebox/frameworks.js +1 -1
- package/lib/whitebox/sbom.js +45 -10
- package/lib/whitebox/secrets.js +11 -1
- package/package.json +17 -4
- package/skills/penthera/SKILL.md +132 -22
- package/src/agent/git.js +87 -0
- package/src/agent/loop.js +519 -0
- package/src/agent/tests.js +48 -0
- package/src/cli/agent.js +183 -0
- package/src/cli/deps.js +104 -0
- package/src/cli/evidence.js +67 -0
- package/src/cli/fix.js +191 -0
- package/src/cli/hook.js +131 -0
- package/src/cli/install.js +225 -0
- package/src/cli/memory.js +146 -0
- package/src/cli/merge-results.js +2 -0
- package/src/cli/report-outputs.js +72 -0
- package/src/cli/run-scan.js +2 -0
- package/src/cli.js +212 -8
- package/src/report/audience.js +270 -0
- package/src/report/evidence.js +253 -0
- package/src/report/markdown.js +65 -2
- package/src/report/model.js +212 -0
- package/src/report/template.js +175 -0
- package/src/report/timeline.js +145 -0
- package/src/reporter.js +109 -5
- package/src/scan-url.js +31 -7
- package/src/utils/http.js +252 -11
- package/src/utils/url.js +23 -0
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# Example: comment a dependency capability diff on every PR that changes the lockfile.
|
|
2
|
+
#
|
|
3
|
+
# Copy this file into YOUR app's repo as `.github/workflows/penthera-deps.yml`.
|
|
4
|
+
# It installs the base and PR dependency trees with `--ignore-scripts` (no
|
|
5
|
+
# package code runs), then `penthera deps --diff` reports packages that are new
|
|
6
|
+
# or that gained capabilities (network, shell, install scripts, whole
|
|
7
|
+
# environment, dynamic code, ...) and posts that as one PR comment, updated in
|
|
8
|
+
# place on every push. Penthera itself runs offline; nothing is sent anywhere
|
|
9
|
+
# except the comment to your own PR.
|
|
10
|
+
#
|
|
11
|
+
# Pin PENTHERA_VERSION to a release you have reviewed (and, ideally, the actions
|
|
12
|
+
# below to commit SHAs) so this job never runs code you have not looked at.
|
|
13
|
+
#
|
|
14
|
+
# Fork PRs get a read-only token, so the comment step is skipped for them; the
|
|
15
|
+
# report is still uploaded as an artifact. Do not switch this to
|
|
16
|
+
# `pull_request_target`: that would run with write access next to untrusted code.
|
|
17
|
+
|
|
18
|
+
name: Dependency capability diff
|
|
19
|
+
|
|
20
|
+
on:
|
|
21
|
+
pull_request:
|
|
22
|
+
paths:
|
|
23
|
+
- package-lock.json
|
|
24
|
+
- npm-shrinkwrap.json
|
|
25
|
+
|
|
26
|
+
permissions:
|
|
27
|
+
contents: read
|
|
28
|
+
|
|
29
|
+
jobs:
|
|
30
|
+
deps:
|
|
31
|
+
runs-on: ubuntu-latest
|
|
32
|
+
permissions:
|
|
33
|
+
contents: read
|
|
34
|
+
pull-requests: write
|
|
35
|
+
env:
|
|
36
|
+
PENTHERA_VERSION: latest # pin, e.g. 1.3.0
|
|
37
|
+
steps:
|
|
38
|
+
- uses: actions/checkout@v7
|
|
39
|
+
with:
|
|
40
|
+
path: head
|
|
41
|
+
persist-credentials: false
|
|
42
|
+
|
|
43
|
+
- uses: actions/checkout@v7
|
|
44
|
+
with:
|
|
45
|
+
ref: ${{ github.event.pull_request.base.sha }}
|
|
46
|
+
path: base
|
|
47
|
+
persist-credentials: false
|
|
48
|
+
|
|
49
|
+
- uses: actions/setup-node@v6
|
|
50
|
+
with:
|
|
51
|
+
node-version: 22
|
|
52
|
+
|
|
53
|
+
- name: Install both trees without running install scripts
|
|
54
|
+
run: |
|
|
55
|
+
(cd head && npm ci --ignore-scripts --no-audit --no-fund)
|
|
56
|
+
(cd base && npm ci --ignore-scripts --no-audit --no-fund)
|
|
57
|
+
|
|
58
|
+
- name: Diff dependency capabilities
|
|
59
|
+
id: deps
|
|
60
|
+
# Run from the temp dir so `npx` can't pick up a `penthera` binary that
|
|
61
|
+
# the PR's own node_modules might provide.
|
|
62
|
+
working-directory: ${{ runner.temp }}
|
|
63
|
+
run: |
|
|
64
|
+
set +e
|
|
65
|
+
npx --yes "penthera@${PENTHERA_VERSION}" deps "$GITHUB_WORKSPACE/head" \
|
|
66
|
+
--diff "$GITHUB_WORKSPACE/base" \
|
|
67
|
+
--pr-comment "$RUNNER_TEMP/deps-comment.md" \
|
|
68
|
+
--sarif "$RUNNER_TEMP/deps.sarif" \
|
|
69
|
+
-o "$RUNNER_TEMP/deps.json"
|
|
70
|
+
code=$?
|
|
71
|
+
set -e
|
|
72
|
+
echo "code=$code" >> "$GITHUB_OUTPUT"
|
|
73
|
+
# 1 = critical/high findings (reported in the comment); 2 = scan error.
|
|
74
|
+
if [ "$code" -eq 2 ]; then exit 2; fi
|
|
75
|
+
|
|
76
|
+
- name: Comment on the PR (updated in place)
|
|
77
|
+
if: github.event.pull_request.head.repo.full_name == github.repository
|
|
78
|
+
env:
|
|
79
|
+
GH_TOKEN: ${{ github.token }}
|
|
80
|
+
REPO: ${{ github.repository }}
|
|
81
|
+
PR: ${{ github.event.pull_request.number }}
|
|
82
|
+
run: |
|
|
83
|
+
body="$RUNNER_TEMP/deps-comment.md"
|
|
84
|
+
id=$(gh api "repos/$REPO/issues/$PR/comments" --paginate \
|
|
85
|
+
--jq '.[] | select(.body | startswith("<!-- penthera-deps -->")) | .id' | head -n1)
|
|
86
|
+
if [ -n "$id" ]; then
|
|
87
|
+
gh api -X PATCH "repos/$REPO/issues/comments/$id" -F body=@"$body" > /dev/null
|
|
88
|
+
else
|
|
89
|
+
gh pr comment "$PR" --repo "$REPO" --body-file "$body"
|
|
90
|
+
fi
|
|
91
|
+
|
|
92
|
+
- uses: actions/upload-artifact@v7
|
|
93
|
+
if: always()
|
|
94
|
+
with:
|
|
95
|
+
name: penthera-deps
|
|
96
|
+
path: |
|
|
97
|
+
${{ runner.temp }}/deps-comment.md
|
|
98
|
+
${{ runner.temp }}/deps.json
|
|
99
|
+
${{ runner.temp }}/deps.md
|
|
100
|
+
${{ runner.temp }}/deps.sarif
|
|
101
|
+
|
|
102
|
+
# Optional: block the merge when critical or high findings appear.
|
|
103
|
+
# - name: Fail on critical/high
|
|
104
|
+
# if: steps.deps.outputs.code == '1'
|
|
105
|
+
# run: exit 1
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# Example: comment a dependency capability diff on every PR that changes the lockfile.
|
|
2
|
+
#
|
|
3
|
+
# Copy this file into YOUR repo as `.github/workflows/pr-dependency-review.yml`.
|
|
4
|
+
# The Penthera action reports packages that are new or that gained capabilities
|
|
5
|
+
# (network, shell, install scripts, whole environment, dynamic code, ...) in one
|
|
6
|
+
# PR comment, updated in place on every push, and uploads SARIF to code scanning.
|
|
7
|
+
# Penthera runs offline from the action's own checkout: no npx, no registry
|
|
8
|
+
# lookups, no telemetry. The only API call is the comment on your own PR.
|
|
9
|
+
#
|
|
10
|
+
# Pin the action to a release commit SHA. Find it with:
|
|
11
|
+
# git ls-remote https://github.com/danoszz/penthera refs/tags/v1.4.0
|
|
12
|
+
#
|
|
13
|
+
# Fork PRs get a read-only token: the comment is skipped and the diff goes to the
|
|
14
|
+
# job summary instead. Do not switch this to `pull_request_target`; that would
|
|
15
|
+
# run with write access next to untrusted code.
|
|
16
|
+
|
|
17
|
+
name: Dependency review
|
|
18
|
+
|
|
19
|
+
on:
|
|
20
|
+
pull_request:
|
|
21
|
+
paths:
|
|
22
|
+
- package-lock.json
|
|
23
|
+
- npm-shrinkwrap.json
|
|
24
|
+
|
|
25
|
+
permissions:
|
|
26
|
+
contents: read
|
|
27
|
+
pull-requests: write
|
|
28
|
+
security-events: write
|
|
29
|
+
|
|
30
|
+
jobs:
|
|
31
|
+
penthera:
|
|
32
|
+
runs-on: ubuntu-latest
|
|
33
|
+
steps:
|
|
34
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
35
|
+
|
|
36
|
+
- uses: actions/setup-node@249970729cb0ef3589644e2896645e5dc5ba9c38 # v6.5.0
|
|
37
|
+
with:
|
|
38
|
+
node-version: 22
|
|
39
|
+
|
|
40
|
+
# Optional but recommended: Penthera reads package code from node_modules
|
|
41
|
+
# and npm's cache. Installing both trees with --ignore-scripts (no package
|
|
42
|
+
# code runs) lets it inspect every changed version. Without this step the
|
|
43
|
+
# comment lists upgrades it could not compare.
|
|
44
|
+
- name: Install base and PR trees without running scripts
|
|
45
|
+
env:
|
|
46
|
+
BASE_SHA: ${{ github.event.pull_request.base.sha }}
|
|
47
|
+
run: |
|
|
48
|
+
git fetch --no-tags --depth=1 origin "$BASE_SHA"
|
|
49
|
+
git worktree add --detach "$RUNNER_TEMP/base" "$BASE_SHA"
|
|
50
|
+
(cd "$RUNNER_TEMP/base" && npm ci --ignore-scripts --no-audit --no-fund)
|
|
51
|
+
npm ci --ignore-scripts --no-audit --no-fund
|
|
52
|
+
|
|
53
|
+
- uses: danoszz/penthera@0000000000000000000000000000000000000000 # v1.4.0 (replace with the release commit SHA)
|
|
54
|
+
with:
|
|
55
|
+
mode: deps
|
|
56
|
+
fail-on: none # or high / critical to block the merge
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# Due diligence checklist
|
|
2
|
+
|
|
3
|
+
What a funder, sponsor or acquirer is likely to check, what is already in
|
|
4
|
+
place, and what is still open. Checked on 2026-10-19 against the `main` branch
|
|
5
|
+
at commit 156eda6.
|
|
6
|
+
|
|
7
|
+
Legend: **Done**, **Open** (needs action), **Decide** (maintainer's call).
|
|
8
|
+
|
|
9
|
+
## 1. Contributions and sign-off (DCO)
|
|
10
|
+
|
|
11
|
+
| Item | Status | Notes |
|
|
12
|
+
|------|--------|-------|
|
|
13
|
+
| Contributors are all known | Done | `git shortlog -sne --all`: 54 commits as "Daan van der Zwaag <daan@devign.it>", 6 as "Daan <daan@devign.it>" (same person, commits made in the GitHub web UI), 1 from dependabot. No outside human contributors. All 8 pull requests so far were opened by the maintainer or dependabot. |
|
|
14
|
+
| DCO sign-off required | Open | The Developer Certificate of Origin 1.1 (https://developercertificate.org/) lets a contributor certify they have the right to submit their code under the project licence. This PR adds a DCO section to CONTRIBUTING.md. Enforcement is not on yet. To enforce, install a DCO check app on the repo, or turn on "Require contributors to sign off on web-based commits" in repository settings. |
|
|
15
|
+
| Past commits | Decide | Past commits are not signed off, but all are by the maintainer, so no outside rights are in question. A short statement in the README or this file is enough; rewriting history is not worth it. |
|
|
16
|
+
| Author identity | Open | Add a `.mailmap` mapping "Daan" to "Daan van der Zwaag" so tools show one author. |
|
|
17
|
+
| AI-assisted commits | Done | 45 commit messages carry `Co-Authored-By: Claude ...` trailers, recording which work was AI-assisted. NLnet's GenAI policy names commit messages as one acceptable way to log this (https://nlnet.nl/foundation/policies/generativeAI/). |
|
|
18
|
+
|
|
19
|
+
## 2. Licence and copyright
|
|
20
|
+
|
|
21
|
+
| Item | Status | Notes |
|
|
22
|
+
|------|--------|-------|
|
|
23
|
+
| Project licence | Done | MIT, in `LICENSE`, `package.json` and `.claude-plugin/plugin.json`. |
|
|
24
|
+
| Copyright line | Open | `LICENSE` says "Copyright (c) 2026 daan". Change to the full legal name, or to a company if the maintainer moves the project into one: "Copyright (c) 2026 Daan van der Zwaag". |
|
|
25
|
+
| Runtime dependencies | Done | One: `yaml` (ISC). Dev dependency: `vitest` (MIT). Both permissive. |
|
|
26
|
+
| Third-party data in the source | Open | `lib/params.js` has a parameter wordlist with the comment "Curated from SecLists, Arjun defaults, and CommonCrawl analysis." SecLists is MIT and Arjun is AGPL-3.0 (GitHub licence metadata for both repositories). A list of common parameter names like `id` and `page` is unlikely to carry copyright on its own, but an acquirer's lawyer will ask. Options: document which entries came from where, or rebuild the list from MIT sources only and change the comment. Add a `THIRD_PARTY_NOTICES` file crediting SecLists. |
|
|
27
|
+
| Other inspiration notes | Decide | The same file says "Inspired by: Arjun (6.2k stars), ParamSpider". Inspiration for an algorithm is fine; make sure no code was copied, and keep the note. |
|
|
28
|
+
| Copyright of AI-assisted code | Decide | The US Copyright Office's report "Copyright and Artificial Intelligence, Part 2: Copyrightability" (29 January 2025, https://www.copyright.gov/ai/) addresses protection for AI-generated material. It is a US source; EU and Dutch law may differ. This matters little for an MIT project but may come up in an acquisition. Keep the co-author trailers as the record of human direction and review. Not legal advice. |
|
|
29
|
+
| Assets | Done | `assets/` holds the project's own logo, social image and demo GIF. Confirm the logo was made by the maintainer or under a licence that allows transfer. |
|
|
30
|
+
|
|
31
|
+
## 3. Name and trademark
|
|
32
|
+
|
|
33
|
+
| Item | Status | Notes |
|
|
34
|
+
|------|--------|-------|
|
|
35
|
+
| Existing "Penthera" company | Decide | Penthera (penthera.com) is a US company, founded around 2004 to 2005, that sells a video download SDK for mobile apps and describes itself as a SaaS company for streaming providers (https://www.penthera.com/about, https://pitchbook.com/profiles/company/61416-37). Different field (video delivery, not security), but the same word. A search found no registered PENTHERA mark; that search was not exhaustive. |
|
|
36
|
+
| Similar name in security | Decide | Pentera (pentera.io), formerly Pcysys, sells automated security validation and pentesting software (https://en.wikipedia.org/wiki/Pentera). Pentera Security Ltd. has filed US trademark applications for PENTERA covering security software (https://trademarks.justia.com/owners/pentera-security-ltd-5403910). "Penthera" and "Pentera" differ by one letter in the same product category. This is the bigger risk: an acquirer will notice, and a confusion claim is plausible. |
|
|
37
|
+
| Recommended next steps | Open | 1. Search EUIPO eSearch plus, TMview and the BOIP register for PENTHERA and PENTERA in classes 9 and 42. 2. Ask an IP lawyer for a short clearance opinion before spending on a filing or a brand. 3. If cleared, a Benelux filing at BOIP costs EUR 244 for one class (https://boip.int/en/node/2163, verify before filing); an EU trade mark at EUIPO costs more. 4. If not cleared, a rename is cheapest now, while adoption is small. |
|
|
38
|
+
| npm and GitHub names | Done | `penthera` on npm and `danoszz/penthera` on GitHub are held by the maintainer. |
|
|
39
|
+
|
|
40
|
+
## 4. Security posture of the project itself
|
|
41
|
+
|
|
42
|
+
| Item | Status | Notes |
|
|
43
|
+
|------|--------|-------|
|
|
44
|
+
| Pinned GitHub Actions | Done | Every `uses:` in `.github/workflows/` is pinned to a full commit SHA with the version in a comment. Dependabot proposes updates (an update to `actions/setup-node` is open as pull request #11). |
|
|
45
|
+
| Staged npm publishing with 2FA | Done | `publish.yml` runs `npm stage publish`; nothing goes live until the maintainer approves the staged version with 2FA on npmjs.com. A hijacked workflow can stage, never ship. Merged in pull request #13. |
|
|
46
|
+
| Trusted publishing, no stored token | Done | Publishing uses npm trusted publishing (OIDC). No npm token is stored in the repo or in secrets. |
|
|
47
|
+
| npm provenance | Done | `--provenance` links each tarball to the workflow run and commit. |
|
|
48
|
+
| CodeQL | Done | `.github/workflows/codeql.yml`. |
|
|
49
|
+
| OpenSSF Scorecard | Done | Runs weekly and on push. Score 6.3 / 10 on 2026-10-19 (https://scorecard.dev/viewer/?uri=github.com/danoszz/penthera). |
|
|
50
|
+
| Scorecard: Token-Permissions 0 | Open | Scorecard reports workflow tokens with excessive permissions. `publish.yml` grants `contents: write` and `id-token: write` at the top level; move them to the job and set `permissions: read-all` or `{}` at the top. Check the other workflows the same way. |
|
|
51
|
+
| Scorecard: Code-Review 0 | Decide | 0 of 15 changesets were reviewed by a second person. Expected for a solo project. A second maintainer or an outside reviewer would fix it. |
|
|
52
|
+
| Scorecard: Signed-Releases 0 | Open | Scorecard looks for signatures or provenance attached to GitHub Releases. npm provenance exists, but the GitHub Release has no signed artefact. Attaching the packed tarball with a provenance attestation (for example `actions/attest-build-provenance`) would cover it. |
|
|
53
|
+
| Scorecard: CII-Best-Practices 0 | Open | Apply for the OpenSSF Best Practices badge (https://www.bestpractices.dev/). Most criteria are already met. |
|
|
54
|
+
| Scorecard: Fuzzing 0 | Decide | Penthera has property-based API fuzzing as a feature, but the project's own code is not fuzzed. Low priority. |
|
|
55
|
+
| Scorecard: Branch-Protection not scored | Open | Scorecard could not read branch protection (needs an admin token). Check that `main` requires PRs and passing CI. |
|
|
56
|
+
| Security policy | Done | `SECURITY.md` with private advisory reporting, response times and safe harbour. |
|
|
57
|
+
| Offline tests | Done | Tests do not reach the internet (CONTRIBUTING.md). |
|
|
58
|
+
| No telemetry | Done | Stated in README "Privacy". An acquirer may want to verify it; the egress guard on the roadmap would make it testable. |
|
|
59
|
+
|
|
60
|
+
## 5. Business and governance
|
|
61
|
+
|
|
62
|
+
| Item | Status | Notes |
|
|
63
|
+
|------|--------|-------|
|
|
64
|
+
| Legal entity | Decide | The project is held by an individual. Funders such as NLnet accept individuals. An acquisition is simpler if the code, names and accounts sit in one entity. |
|
|
65
|
+
| Accounts that would transfer | Open | List them: GitHub repo, npm package and its trusted publisher config, skills.sh listing, plugin marketplace entries, domain (if any), GitHub Sponsors profile. Make sure each has 2FA and a recovery path. |
|
|
66
|
+
| Bus factor | Open | One maintainer. A documented release runbook exists (CONTRIBUTING.md, "Cutting a release"). Consider a second npm owner with 2FA for continuity. |
|
|
67
|
+
| Funding history | Done | None so far. Keep a simple record of any grant or sponsorship income from the start. |
|
|
68
|
+
| Claims in public material | Done | README and docs say "readiness" and "evidence", never "certified" or "compliant". Keep it that way in pitches. |
|
|
69
|
+
|
|
70
|
+
## Sources
|
|
71
|
+
|
|
72
|
+
- DCO 1.1: https://developercertificate.org/
|
|
73
|
+
- NLnet GenAI policy: https://nlnet.nl/foundation/policies/generativeAI/
|
|
74
|
+
- US Copyright Office AI reports: https://www.copyright.gov/ai/
|
|
75
|
+
- Penthera (video SDK company): https://www.penthera.com/about , https://pitchbook.com/profiles/company/61416-37
|
|
76
|
+
- Pentera: https://en.wikipedia.org/wiki/Pentera , https://trademarks.justia.com/owners/pentera-security-ltd-5403910
|
|
77
|
+
- BOIP fees: https://boip.int/en/node/2163
|
|
78
|
+
- OpenSSF Scorecard result: https://api.scorecard.dev/projects/github.com/danoszz/penthera
|
|
79
|
+
- Arjun licence: https://github.com/s0md3v/Arjun ; SecLists licence: https://github.com/danielmiessler/SecLists
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
# NLnet application draft: Penthera
|
|
2
|
+
|
|
3
|
+
Status: draft for the maintainer to edit. Nothing has been submitted.
|
|
4
|
+
|
|
5
|
+
## Call status, checked on 2026-10-19
|
|
6
|
+
|
|
7
|
+
The task asked for an NGI Zero application. NGI Zero is no longer taking
|
|
8
|
+
proposals, so this draft targets its successor instead.
|
|
9
|
+
|
|
10
|
+
| Item | What nlnet.nl says | Source |
|
|
11
|
+
|------|--------------------|--------|
|
|
12
|
+
| NGI Zero Commons Fund | Closed. "The thirteenth and final call of NGI Zero Commons Fund closed on June 1st 2026." | https://nlnet.nl/commonsfund/ |
|
|
13
|
+
| NGI Zero Core | Closed. Final call closed on October 1st 2024. | https://nlnet.nl/core/ |
|
|
14
|
+
| Transition | News item of 2026-06-12: "Transitioning from NGI to Open Internet Stack, open calls temporarily paused." | https://nlnet.nl/news/ |
|
|
15
|
+
| Open now | Restack and CodeSupply, both part of the Open Internet Stack initiative (Horizon Europe, DG CNECT). | https://nlnet.nl/funding.html |
|
|
16
|
+
| Deadline | **3 November 2026, 12:00 CET** (noon). NLnet now runs deadlines on the 3rd of every odd month. | https://nlnet.nl/propose/ , https://nlnet.nl/restack/ |
|
|
17
|
+
| Amount | EUR 5,000 to 50,000 for a first grant. Above 50k needs a completed earlier grant. | https://nlnet.nl/propose/ , https://nlnet.nl/restack/guideforapplicants/ |
|
|
18
|
+
| Scoring | Technical excellence and feasibility 30%, relevance and impact 40%, cost effectiveness 30%. Weighted score must exceed 5.0 of 7 to reach round two. | https://nlnet.nl/restack/guideforapplicants/ |
|
|
19
|
+
|
|
20
|
+
### Which fund
|
|
21
|
+
|
|
22
|
+
**Recommended: Restack.** Its scope explicitly lists "full stack security" and
|
|
23
|
+
"software supply chain management", and it asks for tools that make the stack
|
|
24
|
+
trustworthy. See https://nlnet.nl/restack/.
|
|
25
|
+
|
|
26
|
+
**Risk to manage: Restack's AI exclusion.** The Restack page says
|
|
27
|
+
"AI-related projects are not within scope", with an exception only for AI
|
|
28
|
+
already used by more than 1 million active users. Penthera does not build or
|
|
29
|
+
train AI. The relevant work audits configuration files and packages
|
|
30
|
+
(skills, MCP servers, hooks, rule files) that developer tools install, using
|
|
31
|
+
deterministic rules. This draft frames that work as software supply chain
|
|
32
|
+
security, which is what it is, and leaves out the optional local-model part of
|
|
33
|
+
the agent loop and the LLM endpoint probes. If the maintainer wants those in,
|
|
34
|
+
the proposal is more likely to be ruled out of scope.
|
|
35
|
+
|
|
36
|
+
**Alternative: CodeSupply.** A pilot on software supply chain metadata with
|
|
37
|
+
about EUR 400,000 reserved for open calls. Its three objectives are about
|
|
38
|
+
publishing software metadata and data sets. Penthera fits only if the proposal
|
|
39
|
+
centres on publishing a data set (for example signed scan results for popular
|
|
40
|
+
skills and MCP servers), which ROADMAP.md lists as "under consideration" and
|
|
41
|
+
outside the offline core. Not recommended for a first proposal. See
|
|
42
|
+
https://nlnet.nl/codesupply/.
|
|
43
|
+
|
|
44
|
+
### Form fields (from https://nlnet.nl/propose/)
|
|
45
|
+
|
|
46
|
+
| Field | Limit |
|
|
47
|
+
|-------|-------|
|
|
48
|
+
| Which fund (Restack / CodeSupply / Other, open call) | dropdown |
|
|
49
|
+
| Proposal title | none stated |
|
|
50
|
+
| Website(s) / repositories | none stated |
|
|
51
|
+
| Abstract: summary of the project and expected results | 1000 characters |
|
|
52
|
+
| Requested amount (EUR) | none stated |
|
|
53
|
+
| Budget breakdown: tasks, effort, rate used, expenses | 4000 characters |
|
|
54
|
+
| Comparison with other efforts, and whether you considered contributing to them | 4000 characters |
|
|
55
|
+
| Expected technical challenges | 4000 characters |
|
|
56
|
+
| Ecosystem, dependencies, main users | 2000 characters |
|
|
57
|
+
| Why you are the right person(s), relevant experience | 2000 characters |
|
|
58
|
+
| Other funding sources | 1000 characters |
|
|
59
|
+
| Attachments | optional, 50 MB total |
|
|
60
|
+
| Generative AI use: yes/no, model, purpose, prompts | 8000 characters, plus file upload |
|
|
61
|
+
| Contact: name, email, optional OpenPGP key, phone, applicant type, organisation, country, European dimension | short fields |
|
|
62
|
+
|
|
63
|
+
### Generative AI disclosure: this matters
|
|
64
|
+
|
|
65
|
+
NLnet's GenAI policy (v1.1, effective 26 January 2026) allows AI help in
|
|
66
|
+
writing a proposal but requires disclosure and a prompt provenance log: model,
|
|
67
|
+
dates and times, the prompts, and the unedited output. Non-compliance can lead
|
|
68
|
+
to rejection. See https://nlnet.nl/foundation/policies/generativeAI/.
|
|
69
|
+
|
|
70
|
+
This draft was written with Claude (Anthropic, model Claude Opus 5.5) in
|
|
71
|
+
Claude Code. If any of its text ends up in the submission, answer **Yes** on
|
|
72
|
+
the form and attach the session transcript. The same policy also asks funded
|
|
73
|
+
projects to mark AI-generated code contributions. Penthera already records
|
|
74
|
+
this with `Co-Authored-By:` trailers in commit messages, which the policy
|
|
75
|
+
names as one acceptable method. Say so in the proposal.
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## Draft answers
|
|
80
|
+
|
|
81
|
+
Edit before submitting. Character counts are approximate and include spaces.
|
|
82
|
+
|
|
83
|
+
### Fund
|
|
84
|
+
|
|
85
|
+
Restack
|
|
86
|
+
|
|
87
|
+
### Proposal title
|
|
88
|
+
|
|
89
|
+
Penthera: offline security and supply chain checks for small EU teams and their developer tooling
|
|
90
|
+
|
|
91
|
+
### Website / repository
|
|
92
|
+
|
|
93
|
+
https://github.com/danoszz/penthera
|
|
94
|
+
https://www.npmjs.com/package/penthera
|
|
95
|
+
|
|
96
|
+
### Abstract (limit 1000, draft about 950)
|
|
97
|
+
|
|
98
|
+
Small organisations in the EU now face NIS2 and the Cyber Resilience Act, but
|
|
99
|
+
most security tooling assumes a security team, a SaaS account, and sending
|
|
100
|
+
code or findings to a vendor cloud. Penthera is an MIT-licensed scanner that
|
|
101
|
+
runs entirely on the user's machine: it checks live web apps and APIs, scans
|
|
102
|
+
repositories for secrets and risky routes, and produces NIS2 readiness evidence
|
|
103
|
+
without claiming certification. It has no telemetry. This project extends it in
|
|
104
|
+
three directions: (1) a deterministic audit of the software that developer
|
|
105
|
+
tools install, such as plugins, MCP servers, hooks and rule files, including
|
|
106
|
+
hidden-content detection, hash pinning and install-time package checks; (2) a
|
|
107
|
+
local scan, fix and verify loop with a strict egress guard so the tool can only
|
|
108
|
+
reach the target the user named; (3) CRA vulnerability reporting support and
|
|
109
|
+
improved evidence output for auditors. All results ship as open source with
|
|
110
|
+
tests and documentation.
|
|
111
|
+
|
|
112
|
+
### Requested amount
|
|
113
|
+
|
|
114
|
+
EUR 47,850 (placeholder, see budget)
|
|
115
|
+
|
|
116
|
+
### Budget breakdown (limit 4000)
|
|
117
|
+
|
|
118
|
+
Rate used: EUR 55 per hour (placeholder; the maintainer should set this to a
|
|
119
|
+
rate they can justify for part-time work in the Netherlands). No other
|
|
120
|
+
expenses. Work done before the grant, including `penthera agents` (pull
|
|
121
|
+
request #12), is not charged.
|
|
122
|
+
|
|
123
|
+
Milestone 1: Supply chain audit for developer tooling (290 h, EUR 15,950)
|
|
124
|
+
- 1a Hidden-content engine: Unicode tag, zero-width and bidi characters,
|
|
125
|
+
whitespace padding, embedded `.pyc` files and archives, `curl | sh`,
|
|
126
|
+
auto-approve hooks, unpinned `npx -y` servers. Tests per pattern. 80 h
|
|
127
|
+
- 1b `penthera.lock`: hash-pin installed skills, MCP tool definitions and
|
|
128
|
+
hooks; a CI check that fails on silent changes. 80 h
|
|
129
|
+
- 1c Install-time package checks: non-existent or very new packages,
|
|
130
|
+
risky `postinstall` scripts, offline IOC packs for known npm worm
|
|
131
|
+
campaigns. 100 h
|
|
132
|
+
- 1d Detect provider keys exposed in browser JavaScript bundles through
|
|
133
|
+
public build variables. 30 h
|
|
134
|
+
|
|
135
|
+
Milestone 2: Local scan, fix and verify loop (300 h, EUR 16,500)
|
|
136
|
+
- 2a `--offline` egress guard: one HTTP client that can only reach the named
|
|
137
|
+
target; recon sources and the CVE database become explicit opt-ins with a
|
|
138
|
+
vendored fallback. 80 h
|
|
139
|
+
- 2b Deterministic fixes for common findings (headers, cookies, CORS), applied
|
|
140
|
+
on a local branch after human approval, then re-scanned to prove the fix.
|
|
141
|
+
No language model involved. 140 h
|
|
142
|
+
- 2c Audience-specific reports (developer, owner, auditor), a found, fixed and
|
|
143
|
+
verified timeline, and a hashed evidence bundle. 80 h
|
|
144
|
+
|
|
145
|
+
Milestone 3: Compliance support for small organisations (220 h, EUR 12,100)
|
|
146
|
+
- 3a CRA Article 14 reporting helper, reusing the existing NIS2 incident
|
|
147
|
+
helper. 40 h
|
|
148
|
+
- 3b Map checks for developer tooling to the OWASP MCP Top 10, with a per-run
|
|
149
|
+
coverage table. 50 h
|
|
150
|
+
- 3c Extend the CycloneDX SBOM with installed plugins, MCP servers and skills.
|
|
151
|
+
70 h
|
|
152
|
+
- 3d MFA probe, the last NIS2 Article 21 measure still marked as planned. 60 h
|
|
153
|
+
|
|
154
|
+
Milestone 4: Release, documentation and outreach (60 h, EUR 3,300)
|
|
155
|
+
- Documentation for each feature, a Dutch-language NIS2 guide for small
|
|
156
|
+
organisations, release engineering with staged npm publishing and
|
|
157
|
+
provenance, and two feedback sessions with small organisations. 60 h
|
|
158
|
+
|
|
159
|
+
Total: 870 h, EUR 47,850.
|
|
160
|
+
|
|
161
|
+
### Comparison with other efforts (limit 4000)
|
|
162
|
+
|
|
163
|
+
Commercial platforms such as Snyk, Aikido, Socket, GitGuardian and Semgrep
|
|
164
|
+
cover parts of this space, mostly as hosted services that need an account. Two
|
|
165
|
+
are close to milestone 1:
|
|
166
|
+
|
|
167
|
+
- Snyk Agent Scan (formerly Invariant Labs mcp-scan, Apache-2.0) scans MCP
|
|
168
|
+
servers, skills and agent configurations. It sends tool names, descriptions,
|
|
169
|
+
server configurations and skill content to a remote API for analysis, needs a
|
|
170
|
+
Snyk token, and starts stdio MCP servers from the config to read their tools.
|
|
171
|
+
Source: https://github.com/snyk/agent-scan
|
|
172
|
+
- GitGuardian added AI hooks and an inventory of agents and MCP servers per
|
|
173
|
+
endpoint (September 2026), focused on secrets in prompts and tool calls. It is
|
|
174
|
+
part of a licensed product. Source:
|
|
175
|
+
https://docs.gitguardian.com/releases/saas/2026/09/07/changelog
|
|
176
|
+
|
|
177
|
+
Penthera differs in three ways. It is offline and deterministic: rules, not a
|
|
178
|
+
remote model, decide findings, so results are reproducible and nothing about
|
|
179
|
+
the user's setup leaves the machine. It reads configuration files without
|
|
180
|
+
executing the servers they describe. And it ties the result to evidence a
|
|
181
|
+
small organisation can use for NIS2 and CRA, without claiming certification.
|
|
182
|
+
|
|
183
|
+
On contributing instead: Snyk Agent Scan is open source, but its design
|
|
184
|
+
depends on the remote analysis API, so offline operation would mean a different
|
|
185
|
+
architecture rather than a patch. For web app checks, Penthera already accepts
|
|
186
|
+
Nuclei-compatible templates, so it builds on that ecosystem rather than
|
|
187
|
+
replacing it. SARIF output lets results flow into GitHub code scanning and
|
|
188
|
+
other tools.
|
|
189
|
+
|
|
190
|
+
### Expected technical challenges (limit 4000)
|
|
191
|
+
|
|
192
|
+
- False positives from hidden-content rules. Many legitimate files contain
|
|
193
|
+
zero-width joiners or non-Latin text. Each rule needs a fixture corpus of
|
|
194
|
+
both malicious and benign samples, and a confidence label on every finding.
|
|
195
|
+
- Hash pinning across tools that store configuration differently and update
|
|
196
|
+
without notice. `penthera.lock` must normalise formats so it flags real
|
|
197
|
+
changes, not reformatting.
|
|
198
|
+
- Package checks without network access. Registry age and existence need a
|
|
199
|
+
network call, so the offline mode needs a vendored snapshot and a clear
|
|
200
|
+
label when data is stale.
|
|
201
|
+
- A strict egress guard in Node.js. Every HTTP path, including dependencies,
|
|
202
|
+
must go through one client. This needs tests that fail if any other path
|
|
203
|
+
opens a socket.
|
|
204
|
+
- Safe automated fixes. A fix must apply to a local branch only, never push,
|
|
205
|
+
and be proven by a re-scan. Framework detection must be conservative.
|
|
206
|
+
- Keeping compliance output honest. NIS2 and CRA texts are interpreted
|
|
207
|
+
differently per member state. Jurisdiction data lives in config, and the
|
|
208
|
+
output says "readiness" and "evidence", never "compliant".
|
|
209
|
+
|
|
210
|
+
### Ecosystem, dependencies, main users (limit 2000)
|
|
211
|
+
|
|
212
|
+
Penthera is a Node.js (22+) CLI published on npm, and an Agent Skill installed
|
|
213
|
+
through skills.sh and plugin marketplaces. Runtime dependencies are minimal:
|
|
214
|
+
one (`yaml`). It reads OpenAPI, Nuclei-compatible templates and writes SARIF,
|
|
215
|
+
JSON, Markdown and CycloneDX.
|
|
216
|
+
|
|
217
|
+
Main users are developers and small teams who build web apps, often with AI
|
|
218
|
+
coding assistants, and small organisations that need NIS2 evidence without a
|
|
219
|
+
security department. Public adoption on 2026-10-19: 46 GitHub stars, 11 forks,
|
|
220
|
+
59 installs on skills.sh, and 46 npm downloads in the 30 days to 2026-10-16
|
|
221
|
+
(api.npmjs.org). The project is four months old.
|
|
222
|
+
|
|
223
|
+
Outreach: the README and docs, the skills.sh listing, Dutch-language material
|
|
224
|
+
for NIS2 (the Dutch Cyberbeveiligingswet entered into force on 15 August
|
|
225
|
+
2026),
|
|
226
|
+
and SARIF output that drops into existing CI.
|
|
227
|
+
|
|
228
|
+
### Why you (limit 2000)
|
|
229
|
+
|
|
230
|
+
Placeholder for the maintainer to write in their own words. Suggested points:
|
|
231
|
+
background and years of experience; built and released Penthera v1.0 to v1.2
|
|
232
|
+
in 2026; the release pipeline uses SHA-pinned actions, least-privilege
|
|
233
|
+
workflows, CodeQL, OpenSSF Scorecard, npm trusted publishing with provenance,
|
|
234
|
+
and staged releases approved with 2FA; based in the Netherlands, close to the
|
|
235
|
+
NIS2 and CRA context of the target users.
|
|
236
|
+
|
|
237
|
+
### Other funding sources (limit 1000)
|
|
238
|
+
|
|
239
|
+
None. Penthera is maintained part-time without funding. A GitHub Sponsors
|
|
240
|
+
profile has been requested; any sponsorship income will be reported here if it
|
|
241
|
+
exists at submission time.
|
|
242
|
+
|
|
243
|
+
### Applicant type and country
|
|
244
|
+
|
|
245
|
+
Individual (or SME, if the maintainer applies through a company). Country:
|
|
246
|
+
the Netherlands.
|
|
247
|
+
|
|
248
|
+
---
|
|
249
|
+
|
|
250
|
+
## Sources
|
|
251
|
+
|
|
252
|
+
- NLnet funding overview: https://nlnet.nl/funding.html
|
|
253
|
+
- Proposal form and deadline: https://nlnet.nl/propose/
|
|
254
|
+
- Restack: https://nlnet.nl/restack/
|
|
255
|
+
- Restack guide for applicants: https://nlnet.nl/restack/guideforapplicants/
|
|
256
|
+
- CodeSupply: https://nlnet.nl/codesupply/
|
|
257
|
+
- NGI Zero Commons Fund (closed): https://nlnet.nl/commonsfund/
|
|
258
|
+
- NGI Zero Core (closed): https://nlnet.nl/core/
|
|
259
|
+
- NLnet GenAI policy: https://nlnet.nl/foundation/policies/generativeAI/
|
|
260
|
+
- CRA reporting from 11 September 2026: https://digital-strategy.ec.europa.eu/en/policies/cra-reporting
|
|
261
|
+
- Dutch Cyberbeveiligingswet in force 15 August 2026: https://www.nldigitalgovernment.nl/nis2-directive-cyberbeveiligingswet-cbw/
|
|
262
|
+
- Snyk Agent Scan: https://github.com/snyk/agent-scan
|
|
263
|
+
- GitGuardian changelog, 2026-09-07: https://docs.gitguardian.com/releases/saas/2026/09/07/changelog
|
|
264
|
+
- npm downloads: https://api.npmjs.org/downloads/point/last-month/penthera
|
|
265
|
+
|
|
266
|
+
## Before submitting
|
|
267
|
+
|
|
268
|
+
- [ ] Set a real hourly rate and recompute the budget.
|
|
269
|
+
- [ ] Decide whether to keep AI-adjacent wording given the Restack scope note.
|
|
270
|
+
- [ ] Write "Why you" in your own words.
|
|
271
|
+
- [ ] Refresh the adoption numbers on the day you submit.
|
|
272
|
+
- [ ] Answer the generative AI question honestly and attach the log.
|
|
273
|
+
- [ ] Re-check the deadline on https://nlnet.nl/propose/ (3 November 2026, 12:00 CET at time of writing).
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# Penthera: a one-page brief for security platforms
|
|
2
|
+
|
|
3
|
+
For: teams at security platforms such as Aikido, Socket, Snyk, GitGuardian and
|
|
4
|
+
Semgrep. Draft, not sent to anyone.
|
|
5
|
+
|
|
6
|
+
## What Penthera is
|
|
7
|
+
|
|
8
|
+
An MIT-licensed security scanner that runs on the developer's own machine, as a
|
|
9
|
+
CLI (`npx penthera`) and as an Agent Skill for Claude Code and Cursor. It has no
|
|
10
|
+
accounts and no telemetry. It does three things:
|
|
11
|
+
|
|
12
|
+
1. **Scans the app.** Black-box checks of a live URL (TLS, headers, CORS,
|
|
13
|
+
cookies, OpenAPI discovery, auth hardening, JWT, IDOR, OAuth redirects, opt-in
|
|
14
|
+
injection probes) and white-box checks of a repo (routes, trust boundaries,
|
|
15
|
+
hardcoded secrets including keys for a dozen AI providers).
|
|
16
|
+
2. **Audits the AI developer toolchain.** `penthera agents` (in review, pull
|
|
17
|
+
request #12) reads `.mcp.json`, `~/.claude`, `~/.cursor`, hooks, plugins,
|
|
18
|
+
skills and rule files, and grades them A to F, with SARIF output.
|
|
19
|
+
3. **Produces NIS2 evidence.** A per-measure readiness report, self-assessment,
|
|
20
|
+
policy pack, incident report drafts and a CycloneDX SBOM. It never claims
|
|
21
|
+
certification.
|
|
22
|
+
|
|
23
|
+
## Where it differs from your products
|
|
24
|
+
|
|
25
|
+
Checked against public product pages on 2026-10-19. These are differences in
|
|
26
|
+
approach, not claims that one is better.
|
|
27
|
+
|
|
28
|
+
| Penthera | What we found in public sources |
|
|
29
|
+
|----------|--------------------------------|
|
|
30
|
+
| **Offline, deterministic audit of agent configuration.** Rules decide findings; nothing about the user's setup leaves the machine; MCP servers are read from config, not started. | Snyk Agent Scan (formerly Invariant mcp-scan) covers MCP servers, skills and agent harnesses, but sends tool descriptions, server configs and skill content to a remote API, needs a Snyk token, and starts stdio servers to read their tools ([repo](https://github.com/snyk/agent-scan)). GitGuardian added AI hooks and an agent and MCP inventory in September 2026, focused on secrets in prompts and tool calls ([changelog](https://docs.gitguardian.com/releases/saas/2026/09/07/changelog)). We found no MCP or skill audit product in Socket's getting-started docs ([docs](https://docs.socket.dev/docs/getting-started)), though Socket does publish audits of individual skills listed on skills.sh. |
|
|
31
|
+
| **App DAST inside the coding agent, with a scan, fix, verify loop.** The skill scans, proposes a framework-aware fix, and re-scans to prove it, all locally. | Aikido offers DAST, API scanning, AI pentesting and fix and verify agents as a hosted platform ([aikido.dev](https://www.aikido.dev/)). Snyk has DAST through its 2024 Probely acquisition ([Snyk news](https://snyk.io/news/snyk-acquires-developer-first-dast-provider-probely/)). Semgrep's product list covers SAST, supply chain and secrets, with no DAST listed ([semgrep.dev](https://semgrep.dev/)). |
|
|
32
|
+
| **NIS2 and CRA evidence for small organisations.** Output is readiness and evidence for the Dutch Cyberbeveiligingswet and NIS2 Article 21, plus a CRA Article 14 reporting helper on the roadmap. | Aikido's homepage cites its own SOC 2 Type II and ISO 27001 status but does not mention NIS2 or CRA ([aikido.dev](https://www.aikido.dev/)). Semgrep's homepage does not mention them either ([semgrep.dev](https://semgrep.dev/)). We did not check Socket, Snyk or GitGuardian for this, and a homepage check can miss features documented elsewhere. |
|
|
33
|
+
|
|
34
|
+
Where Penthera does not compete: hosted dashboards, organisation-wide policy,
|
|
35
|
+
runtime protection, cloud posture, container scanning, and broad SAST rule sets.
|
|
36
|
+
The platforms above are far ahead there, and Penthera has no plans to build
|
|
37
|
+
them ([ROADMAP.md, "Not planned"](../../ROADMAP.md)).
|
|
38
|
+
|
|
39
|
+
## How it fits next to a platform
|
|
40
|
+
|
|
41
|
+
- **SARIF out.** Every scan can write SARIF, which GitHub code scanning accepts
|
|
42
|
+
from third-party tools ([GitHub docs](https://docs.github.com/en/code-security/code-scanning/integrating-with-code-scanning/uploading-a-sarif-file-to-github)).
|
|
43
|
+
A platform that ingests third-party SARIF can show Penthera findings
|
|
44
|
+
next to its own. We have not yet confirmed which of the five platforms
|
|
45
|
+
accept third-party SARIF; that is a question for each partner.
|
|
46
|
+
- **The local step before CI.** Penthera runs in the editor and agent before a
|
|
47
|
+
commit. A platform covers the repo, pipeline and runtime after it.
|
|
48
|
+
- **The offline option for customers who need it.** For teams that cannot send
|
|
49
|
+
code or configuration to a vendor, Penthera can be the documented local
|
|
50
|
+
fallback.
|
|
51
|
+
- **Planned: a "use alongside" guide** (`docs/use-alongside.md`, not yet
|
|
52
|
+
written) showing how to run Penthera with each platform without duplicate
|
|
53
|
+
findings.
|
|
54
|
+
|
|
55
|
+
## Possible ways to work together
|
|
56
|
+
|
|
57
|
+
- Ingest Penthera SARIF, or list it as a supported third-party source.
|
|
58
|
+
- Sponsor the project ([sponsor-tiers.md](sponsor-tiers.md)).
|
|
59
|
+
- Share detection research: for example Penthera's deterministic rules for
|
|
60
|
+
hidden content in skills and MCP tool descriptions.
|
|
61
|
+
- Longer term, a closer arrangement. The maintainer is open to that
|
|
62
|
+
conversation. Any arrangement would keep the MIT core, the offline mode, and
|
|
63
|
+
the no-telemetry rule.
|
|
64
|
+
|
|
65
|
+
## Adoption, honestly
|
|
66
|
+
|
|
67
|
+
Fetched on 2026-10-19. Penthera is four months old (first release 2026-06-30)
|
|
68
|
+
and small.
|
|
69
|
+
|
|
70
|
+
| Metric | Value | Source |
|
|
71
|
+
|--------|-------|--------|
|
|
72
|
+
| npm downloads, last 30 days | 46 (2026-09-17 to 2026-10-16) | https://api.npmjs.org/downloads/point/last-month/penthera |
|
|
73
|
+
| npm downloads, since 2026-06-01 | 435 (to 2026-10-18) | https://api.npmjs.org/downloads/range/2026-06-01:2026-10-18/penthera |
|
|
74
|
+
| skills.sh installs | 59 total | https://skills.sh/danoszz/penthera |
|
|
75
|
+
| GitHub stars | 46 | https://github.com/danoszz/penthera |
|
|
76
|
+
| GitHub forks | 11 | https://github.com/danoszz/penthera |
|
|
77
|
+
| OpenSSF Scorecard | 6.3 / 10 (2026-10-19) | https://scorecard.dev/viewer/?uri=github.com/danoszz/penthera |
|
|
78
|
+
|
|
79
|
+
npm counts include CI and mirror downloads, so they overstate human users.
|
|
80
|
+
There is no telemetry, so there is no other usage data.
|
|
81
|
+
|
|
82
|
+
## Contact
|
|
83
|
+
|
|
84
|
+
Daan van der Zwaag, maintainer. GitHub: [@danoszz](https://github.com/danoszz).
|