penthera 1.6.0 → 1.7.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 +67 -0
- package/README.md +158 -301
- package/bin/scan.js +2 -2
- package/docs/METHODOLOGY.md +236 -182
- package/docs/commands/README.md +2 -1
- package/docs/commands/init.md +114 -0
- package/docs/commands/scan.md +1 -1
- package/docs/compare/github.md +1 -1
- package/docs/dashboard.md +95 -152
- package/docs/examples/github-actions-scan.yml +1 -1
- package/docs/internal-audit.md +1 -1
- package/docs/plan.md +3 -2
- package/docs/references.bib +43 -33
- package/docs/references.md +92 -51
- package/lib/whitebox/frameworks.js +36 -0
- package/package.json +1 -1
- package/skills/penthera/SKILL.md +19 -5
- package/src/cli/deps.js +1 -1
- package/src/cli/detect.js +125 -0
- package/src/cli/onboarding.js +428 -6
- package/src/cli/prompt.js +42 -0
- package/src/cli.js +18 -5
- package/src/ui/api/data.js +30 -0
- package/src/ui/api/demo.js +13 -0
- package/src/ui/api/routes.js +1 -0
- package/src/ui/static/app.css +286 -560
- package/src/ui/static/index.html +8 -39
- package/src/ui/static/js/app.js +105 -107
- package/src/ui/static/js/center.js +388 -0
- package/src/ui/static/js/copy.js +36 -62
- package/src/ui/static/js/dom.js +0 -38
- package/src/ui/static/js/left.js +83 -0
- package/src/ui/static/js/right.js +270 -0
- package/src/ui/static/js/state.js +35 -0
- package/src/ui/static/js/views/ai.js +0 -68
- package/src/ui/static/js/views/deps.js +0 -96
- package/src/ui/static/js/views/evidence.js +0 -115
- package/src/ui/static/js/views/findings.js +0 -165
- package/src/ui/static/js/views/history.js +0 -92
- package/src/ui/static/js/views/overview.js +0 -184
- package/src/ui/static/js/views/run.js +0 -349
- package/src/ui/static/js/views/settings.js +0 -67
package/docs/references.bib
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
% Penthera bibliography. Every entry verified 2026-10-19 against Crossref (publisher-deposited DOI metadata),
|
|
1
|
+
% Penthera bibliography, rendered in APA 7 style into references.md. Every entry verified 2026-10-19 against Crossref (publisher-deposited DOI metadata, including editors),
|
|
2
2
|
% USENIX, NDSS, arXiv, RFC Editor, OWASP, MITRE, NIST, OASIS and the EU Publications Office.
|
|
3
3
|
|
|
4
4
|
% ---------------------------------------------------------------- blackbox
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
author = {Doup{\'e}, Adam and Cova, Marco and Vigna, Giovanni},
|
|
18
18
|
title = {Why {Johnny} Can't Pentest: An Analysis of Black-Box Web Vulnerability Scanners},
|
|
19
19
|
booktitle = {Detection of Intrusions and Malware, and Vulnerability Assessment (DIMVA 2010)},
|
|
20
|
+
editor = {Kreibich, Christian and Jahnke, Marko},
|
|
20
21
|
series = {Lecture Notes in Computer Science},
|
|
21
22
|
publisher = {Springer},
|
|
22
23
|
year = {2010},
|
|
@@ -51,8 +52,9 @@
|
|
|
51
52
|
@misc{owaspbenchmark,
|
|
52
53
|
shorthand = {OWASP Benchmark},
|
|
53
54
|
author = {{OWASP Foundation}},
|
|
54
|
-
title = {{OWASP
|
|
55
|
-
|
|
55
|
+
title = {{OWASP Benchmark} Project},
|
|
56
|
+
version = {1.2},
|
|
57
|
+
annote = {OWASP project page; project leader Dave Wichers},
|
|
56
58
|
url = {https://owasp.org/www-project-benchmark/},
|
|
57
59
|
urldate = {2026-10-19},
|
|
58
60
|
note = {blackbox}
|
|
@@ -97,7 +99,9 @@
|
|
|
97
99
|
@misc{kohnfelder1999threats,
|
|
98
100
|
author = {Kohnfelder, Loren and Garg, Praerit},
|
|
99
101
|
title = {The Threats to Our Products},
|
|
100
|
-
|
|
102
|
+
titleaddon = {Internal publication},
|
|
103
|
+
organization = {Microsoft},
|
|
104
|
+
annote = {Microsoft internal \emph{Interface} journal, 1 April 1999; copy hosted by Adam Shostack},
|
|
101
105
|
year = {1999},
|
|
102
106
|
url = {https://shostack.org/files/microsoft/The-Threats-To-Our-Products.docx},
|
|
103
107
|
urldate = {2026-10-19},
|
|
@@ -120,6 +124,7 @@
|
|
|
120
124
|
author = {Ohm, Marc and Plate, Henrik and Sykosch, Arnold and Meier, Michael},
|
|
121
125
|
title = {Backstabber's Knife Collection: A Review of Open Source Software Supply Chain Attacks},
|
|
122
126
|
booktitle = {Detection of Intrusions and Malware, and Vulnerability Assessment (DIMVA 2020)},
|
|
127
|
+
editor = {Maurice, Cl{\'e}mentine and Bilge, Leyla and Stringhini, Gianluca and Neves, Nuno},
|
|
123
128
|
series = {Lecture Notes in Computer Science},
|
|
124
129
|
publisher = {Springer},
|
|
125
130
|
year = {2020},
|
|
@@ -143,7 +148,7 @@
|
|
|
143
148
|
@inproceedings{lauinger2017thou,
|
|
144
149
|
author = {Lauinger, Tobias and Chaabane, Abdelberi and Arshad, Sajjad and Robertson, William and Wilson, Christo and Kirda, Engin},
|
|
145
150
|
title = {Thou Shalt Not Depend on Me: Analysing the Use of Outdated {JavaScript} Libraries on the Web},
|
|
146
|
-
booktitle = {Network and Distributed System Security Symposium
|
|
151
|
+
booktitle = {Proceedings 2017 Network and Distributed System Security Symposium},
|
|
147
152
|
publisher = {Internet Society},
|
|
148
153
|
year = {2017},
|
|
149
154
|
doi = {10.14722/ndss.2017.23414},
|
|
@@ -164,7 +169,7 @@
|
|
|
164
169
|
|
|
165
170
|
@inproceedings{torresarias2019intoto,
|
|
166
171
|
author = {Torres-Arias, Santiago and Afzali, Hammad and Kuppusamy, Trishank Karthik and Curtmola, Reza and Cappos, Justin},
|
|
167
|
-
title = {in-toto: Providing farm-to-table guarantees for bits and bytes},
|
|
172
|
+
title = {{in-toto}: Providing farm-to-table guarantees for bits and bytes},
|
|
168
173
|
booktitle = {28th USENIX Security Symposium (USENIX Security 19)},
|
|
169
174
|
publisher = {USENIX Association},
|
|
170
175
|
year = {2019},
|
|
@@ -188,8 +193,8 @@
|
|
|
188
193
|
% ---------------------------------------------------------------- secrets
|
|
189
194
|
@inproceedings{meli2019bad,
|
|
190
195
|
author = {Meli, Michael and McNiece, Matthew R. and Reaves, Bradley},
|
|
191
|
-
title = {How Bad Can It Git? Characterizing Secret Leakage in Public {GitHub} Repositories},
|
|
192
|
-
booktitle = {Network and Distributed System Security Symposium
|
|
196
|
+
title = {How Bad Can It {Git}? Characterizing Secret Leakage in Public {GitHub} Repositories},
|
|
197
|
+
booktitle = {Proceedings 2019 Network and Distributed System Security Symposium},
|
|
193
198
|
publisher = {Internet Society},
|
|
194
199
|
year = {2019},
|
|
195
200
|
doi = {10.14722/ndss.2019.23418},
|
|
@@ -210,7 +215,7 @@
|
|
|
210
215
|
% ---------------------------------------------------------------- web
|
|
211
216
|
@inproceedings{weichselbaum2016csp,
|
|
212
217
|
author = {Weichselbaum, Lukas and Spagnuolo, Michele and Lekies, Sebastian and Janc, Artur},
|
|
213
|
-
title = {{CSP} Is Dead, Long Live {CSP}! On the Insecurity of Whitelists and the Future of Content Security Policy},
|
|
218
|
+
title = {{CSP} Is Dead, Long Live {CSP}! On the Insecurity of Whitelists and the Future of {Content Security Policy}},
|
|
214
219
|
booktitle = {Proceedings of the 2016 ACM SIGSAC Conference on Computer and Communications Security (CCS '16)},
|
|
215
220
|
publisher = {ACM},
|
|
216
221
|
year = {2016},
|
|
@@ -223,6 +228,7 @@
|
|
|
223
228
|
author = {Kocher, Paul C.},
|
|
224
229
|
title = {Timing Attacks on Implementations of {Diffie-Hellman}, {RSA}, {DSS}, and Other Systems},
|
|
225
230
|
booktitle = {Advances in Cryptology -- CRYPTO '96},
|
|
231
|
+
editor = {Koblitz, Neal},
|
|
226
232
|
series = {Lecture Notes in Computer Science},
|
|
227
233
|
publisher = {Springer},
|
|
228
234
|
year = {1996},
|
|
@@ -353,8 +359,8 @@
|
|
|
353
359
|
@misc{owasp2023api,
|
|
354
360
|
shorthand = {OWASP API Top 10:2023},
|
|
355
361
|
author = {{OWASP Foundation}},
|
|
356
|
-
title = {{OWASP
|
|
357
|
-
|
|
362
|
+
title = {{OWASP Top 10} {API} Security Risks -- 2023},
|
|
363
|
+
organization = {OWASP API Security Project},
|
|
358
364
|
year = {2023},
|
|
359
365
|
url = {https://owasp.org/API-Security/editions/2023/en/0x11-t10/},
|
|
360
366
|
urldate = {2026-10-19},
|
|
@@ -384,8 +390,7 @@
|
|
|
384
390
|
@misc{owasp2021top10,
|
|
385
391
|
shorthand = {OWASP Top 10:2021},
|
|
386
392
|
author = {{OWASP Foundation}},
|
|
387
|
-
title = {{OWASP
|
|
388
|
-
howpublished = {OWASP Foundation},
|
|
393
|
+
title = {{OWASP Top 10}:2021},
|
|
389
394
|
year = {2021},
|
|
390
395
|
url = {https://top10.owasp.org/2021},
|
|
391
396
|
urldate = {2026-10-19},
|
|
@@ -395,8 +400,7 @@
|
|
|
395
400
|
@misc{owasp2025top10,
|
|
396
401
|
shorthand = {OWASP Top 10:2025},
|
|
397
402
|
author = {{OWASP Foundation}},
|
|
398
|
-
title = {{OWASP
|
|
399
|
-
howpublished = {OWASP Foundation},
|
|
403
|
+
title = {{OWASP Top 10}:2025},
|
|
400
404
|
year = {2025},
|
|
401
405
|
url = {https://top10.owasp.org/2025},
|
|
402
406
|
urldate = {2026-10-19},
|
|
@@ -406,8 +410,7 @@
|
|
|
406
410
|
@misc{owaspwstg42,
|
|
407
411
|
shorthand = {OWASP WSTG v4.2},
|
|
408
412
|
author = {{OWASP Foundation}},
|
|
409
|
-
title = {{OWASP
|
|
410
|
-
howpublished = {OWASP Foundation},
|
|
413
|
+
title = {{OWASP Web Security Testing Guide}, Version 4.2},
|
|
411
414
|
url = {https://wstg.owasp.org/v4.2/},
|
|
412
415
|
urldate = {2026-10-19},
|
|
413
416
|
note = {web}
|
|
@@ -442,7 +445,7 @@
|
|
|
442
445
|
@misc{perez2022ignore,
|
|
443
446
|
author = {Perez, F{\'a}bio and Ribeiro, Ian},
|
|
444
447
|
title = {Ignore Previous Prompt: Attack Techniques For Language Models},
|
|
445
|
-
|
|
448
|
+
annote = {Presented at the NeurIPS 2022 ML Safety Workshop},
|
|
446
449
|
year = {2022},
|
|
447
450
|
eprint = {2211.09527},
|
|
448
451
|
archivePrefix = {arXiv},
|
|
@@ -453,7 +456,7 @@
|
|
|
453
456
|
@misc{liu2023prompt,
|
|
454
457
|
author = {Liu, Yi and Deng, Gelei and Li, Yuekang and Wang, Kailong and Wang, Zihao and Wang, Xiaofeng and Zhang, Tianwei and Liu, Yepang and Wang, Haoyu and Zheng, Yan and Zhang, Leo Yu and Liu, Yang},
|
|
455
458
|
title = {Prompt Injection attack against {LLM}-integrated Applications},
|
|
456
|
-
|
|
459
|
+
annote = {arXiv preprint},
|
|
457
460
|
year = {2023},
|
|
458
461
|
eprint = {2306.05499},
|
|
459
462
|
archivePrefix = {arXiv},
|
|
@@ -464,9 +467,11 @@
|
|
|
464
467
|
@misc{owasp2024llmtop10,
|
|
465
468
|
shorthand = {OWASP LLM Top 10 (2025)},
|
|
466
469
|
author = {{OWASP Foundation}},
|
|
467
|
-
title = {{OWASP
|
|
468
|
-
|
|
470
|
+
title = {{OWASP Top 10} for {LLM} Applications 2025},
|
|
471
|
+
organization = {OWASP Gen AI Security Project},
|
|
469
472
|
year = {2024},
|
|
473
|
+
month = nov,
|
|
474
|
+
day = {17},
|
|
470
475
|
url = {https://genai.owasp.org/resource/owasp-top-10-for-llm-applications-2025/},
|
|
471
476
|
urldate = {2026-10-19},
|
|
472
477
|
note = {llm}
|
|
@@ -475,9 +480,11 @@
|
|
|
475
480
|
@misc{owasp2025agentic,
|
|
476
481
|
shorthand = {OWASP Agentic Top 10 (2026)},
|
|
477
482
|
author = {{OWASP Foundation}},
|
|
478
|
-
title = {{OWASP
|
|
479
|
-
|
|
483
|
+
title = {{OWASP Top 10} for Agentic Applications for 2026},
|
|
484
|
+
organization = {OWASP Gen AI Security Project},
|
|
480
485
|
year = {2025},
|
|
486
|
+
month = dec,
|
|
487
|
+
day = {9},
|
|
481
488
|
url = {https://genai.owasp.org/resource/owasp-top-10-for-agentic-applications-for-2026/},
|
|
482
489
|
urldate = {2026-10-19},
|
|
483
490
|
note = {llm}
|
|
@@ -486,8 +493,9 @@
|
|
|
486
493
|
@misc{owasp2025mcptop10,
|
|
487
494
|
shorthand = {OWASP MCP Top 10},
|
|
488
495
|
author = {{OWASP Foundation}},
|
|
489
|
-
title = {{OWASP
|
|
490
|
-
|
|
496
|
+
title = {{OWASP MCP Top 10}},
|
|
497
|
+
titleaddon = {Beta},
|
|
498
|
+
annote = {OWASP project page; living document; items MCP01:2025--MCP10:2025; project lead Vandana Verma Sehgal},
|
|
491
499
|
year = {2025},
|
|
492
500
|
url = {https://owasp.org/www-project-mcp-top-10/},
|
|
493
501
|
urldate = {2026-10-19},
|
|
@@ -497,8 +505,8 @@
|
|
|
497
505
|
@misc{mitreatlas,
|
|
498
506
|
shorthand = {MITRE ATLAS},
|
|
499
507
|
author = {{The MITRE Corporation}},
|
|
500
|
-
title = {{MITRE ATLAS}: Adversarial Threat Landscape for
|
|
501
|
-
|
|
508
|
+
title = {{MITRE ATLAS}: {Adversarial Threat Landscape for AI Systems}},
|
|
509
|
+
annote = {Knowledge base of adversary tactics and techniques against AI systems},
|
|
502
510
|
url = {https://atlas.mitre.org/},
|
|
503
511
|
urldate = {2026-10-19},
|
|
504
512
|
note = {llm}
|
|
@@ -508,10 +516,12 @@
|
|
|
508
516
|
@misc{oasis2023sarif,
|
|
509
517
|
shorthand = {SARIF 2.1.0},
|
|
510
518
|
author = {Fanning, Michael C. and Golding, Laurence J.},
|
|
511
|
-
title = {Static Analysis Results Interchange Format ({SARIF}) Version 2.1.0 Plus Errata 01},
|
|
512
|
-
|
|
519
|
+
title = {{Static Analysis Results Interchange Format} ({SARIF}) Version 2.1.0 Plus Errata 01},
|
|
520
|
+
titleaddon = {OASIS Standard incorporating Approved Errata},
|
|
513
521
|
organization = {OASIS},
|
|
514
522
|
year = {2023},
|
|
523
|
+
month = aug,
|
|
524
|
+
day = {28},
|
|
515
525
|
url = {https://docs.oasis-open.org/sarif/sarif/v2.1.0/errata01/os/sarif-v2.1.0-errata01-os-complete.html},
|
|
516
526
|
urldate = {2026-10-19},
|
|
517
527
|
note = {standards}
|
|
@@ -531,8 +541,8 @@
|
|
|
531
541
|
@misc{mitrecwe,
|
|
532
542
|
shorthand = {MITRE CWE},
|
|
533
543
|
author = {{The MITRE Corporation}},
|
|
534
|
-
title = {{CWE}: Common Weakness Enumeration},
|
|
535
|
-
|
|
544
|
+
title = {{CWE}: {Common Weakness Enumeration}},
|
|
545
|
+
annote = {Community-developed list of software and hardware weakness types, sponsored by CISA},
|
|
536
546
|
url = {https://cwe.mitre.org/},
|
|
537
547
|
urldate = {2026-10-19},
|
|
538
548
|
note = {standards}
|
|
@@ -541,8 +551,8 @@
|
|
|
541
551
|
@misc{spdxlicenselist,
|
|
542
552
|
shorthand = {SPDX License List},
|
|
543
553
|
author = {{SPDX Workgroup, The Linux Foundation}},
|
|
544
|
-
title = {{SPDX
|
|
545
|
-
|
|
554
|
+
title = {{SPDX License List}},
|
|
555
|
+
annote = {Standardized short identifiers for open source licenses, used by package manifests and SBOMs},
|
|
546
556
|
url = {https://spdx.org/licenses/},
|
|
547
557
|
urldate = {2026-10-19},
|
|
548
558
|
note = {standards}
|
package/docs/references.md
CHANGED
|
@@ -1,78 +1,119 @@
|
|
|
1
1
|
# References
|
|
2
2
|
|
|
3
|
-
The research and standards Penthera's methodology and
|
|
3
|
+
The research and standards that Penthera's [methodology](METHODOLOGY.md) and per-finding sources cite, in APA 7th edition style, grouped by topic and sorted alphabetically by first author within each group. The BibTeX source is [references.bib](references.bib); this page is generated from it by `node scripts/build-references.mjs`, and a test fails if the two drift or if a citation in METHODOLOGY.md does not resolve to an entry here.
|
|
4
4
|
|
|
5
|
-
Every entry was checked against the publisher or standards body (Crossref DOI metadata, USENIX, NDSS, arXiv, the RFC Editor, OWASP, MITRE, OASIS, the EU Publications Office) on 2026-10-19. Entries that could not be verified were left out.
|
|
5
|
+
Every entry was checked against the publisher or standards body (Crossref DOI metadata, USENIX, NDSS, arXiv, the RFC Editor, OWASP, MITRE, OASIS, the EU Publications Office) on 2026-10-19. Entries that could not be verified were left out, and so were fields (pages, volume, issue, editors) that the publisher's metadata does not record. Each entry has an anchor named after its BibTeX key, for example [`#bau2010state`](#bau2010state), which is also the key reports and SARIF use.
|
|
6
6
|
|
|
7
7
|
## Black-box scanning and benchmarking
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
-
|
|
9
|
+
<a id="antunes2010benchmarking"></a>Antunes, N., & Vieira, M. (2010). Benchmarking vulnerability detection tools for web services. In *2010 IEEE International Conference on Web Services (ICWS)* (pp. 203–210). IEEE. <https://doi.org/10.1109/ICWS.2010.76>
|
|
10
|
+
|
|
11
|
+
<a id="antunes2015assessing"></a>Antunes, N., & Vieira, M. (2015). Assessing and comparing vulnerability detection tools for web services: Benchmarking approach and examples. *IEEE Transactions on Services Computing*, *8*(2), 269–283. <https://doi.org/10.1109/TSC.2014.2310221>
|
|
12
|
+
|
|
13
|
+
<a id="bau2010state"></a>Bau, J., Bursztein, E., Gupta, D., & Mitchell, J. (2010). State of the art: Automated black-box web application vulnerability testing. In *2010 IEEE Symposium on Security and Privacy* (pp. 332–345). IEEE. <https://doi.org/10.1109/SP.2010.27>
|
|
14
|
+
|
|
15
|
+
<a id="doupe2010johnny"></a>Doupé, A., Cova, M., & Vigna, G. (2010). Why Johnny can't pentest: An analysis of black-box web vulnerability scanners. In C. Kreibich & M. Jahnke (Eds.), *Detection of Intrusions and Malware, and Vulnerability Assessment (DIMVA 2010)* (pp. 111–131). Springer. <https://doi.org/10.1007/978-3-642-14215-4_7>
|
|
16
|
+
|
|
17
|
+
<a id="owaspbenchmark"></a>OWASP Foundation. (n.d.-a). *OWASP Benchmark project* (Version 1.2). Retrieved October 19, 2026, from <https://owasp.org/www-project-benchmark/>
|
|
14
18
|
|
|
15
19
|
## Security design principles
|
|
16
20
|
|
|
17
|
-
|
|
21
|
+
<a id="saltzer1975protection"></a>Saltzer, J. H., & Schroeder, M. D. (1975). The protection of information in computer systems. *Proceedings of the IEEE*, *63*(9), 1278–1308. <https://doi.org/10.1109/PROC.1975.9939>
|
|
18
22
|
|
|
19
23
|
## Threat modeling
|
|
20
24
|
|
|
21
|
-
|
|
22
|
-
|
|
25
|
+
<a id="kohnfelder1999threats"></a>Kohnfelder, L., & Garg, P. (1999). *The threats to our products* [Internal publication]. Microsoft. Retrieved October 19, 2026, from <https://shostack.org/files/microsoft/The-Threats-To-Our-Products.docx>
|
|
26
|
+
|
|
27
|
+
<a id="shostack2014threat"></a>Shostack, A. (2014). *Threat modeling: Designing for security*. Wiley. <https://www.wiley-vch.de/de/fachgebiete/computer-und-informatik/threat-modeling-978-1-118-80999-0>
|
|
23
28
|
|
|
24
29
|
## Software supply chain
|
|
25
30
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
<a id="ladisa2023sok"></a>Ladisa, P., Plate, H., Martinez, M., & Barais, O. (2023). SoK: Taxonomy of attacks on open-source software supply chains. In *2023 IEEE Symposium on Security and Privacy (SP)* (pp. 1509–1526). IEEE. <https://doi.org/10.1109/SP46215.2023.10179304>
|
|
32
|
+
|
|
33
|
+
<a id="lauinger2017thou"></a>Lauinger, T., Chaabane, A., Arshad, S., Robertson, W., Wilson, C., & Kirda, E. (2017). Thou shalt not depend on me: Analysing the use of outdated JavaScript libraries on the web. In *Proceedings 2017 Network and Distributed System Security Symposium*. Internet Society. <https://doi.org/10.14722/ndss.2017.23414>
|
|
34
|
+
|
|
35
|
+
<a id="ohm2020backstabber"></a>Ohm, M., Plate, H., Sykosch, A., & Meier, M. (2020). Backstabber's knife collection: A review of open source software supply chain attacks. In C. Maurice, L. Bilge, G. Stringhini, & N. Neves (Eds.), *Detection of Intrusions and Malware, and Vulnerability Assessment (DIMVA 2020)* (pp. 23–43). Springer. <https://doi.org/10.1007/978-3-030-52683-2_2>
|
|
36
|
+
|
|
37
|
+
<a id="samuel2010survivable"></a>Samuel, J., Mathewson, N., Cappos, J., & Dingledine, R. (2010). Survivable key compromise in software update systems. In *Proceedings of the 17th ACM Conference on Computer and Communications Security (CCS '10)* (pp. 61–72). ACM. <https://doi.org/10.1145/1866307.1866315>
|
|
38
|
+
|
|
39
|
+
<a id="thompson1984reflections"></a>Thompson, K. (1984). Reflections on trusting trust. *Communications of the ACM*, *27*(8), 761–763. <https://doi.org/10.1145/358198.358210>
|
|
40
|
+
|
|
41
|
+
<a id="torresarias2019intoto"></a>Torres-Arias, S., Afzali, H., Kuppusamy, T. K., Curtmola, R., & Cappos, J. (2019). in-toto: Providing farm-to-table guarantees for bits and bytes. In *28th USENIX Security Symposium (USENIX Security 19)* (pp. 1393–1410). USENIX Association. <https://www.usenix.org/conference/usenixsecurity19/presentation/torres-arias>
|
|
42
|
+
|
|
43
|
+
<a id="zimmermann2019small"></a>Zimmermann, M., Staicu, C.-A., Tenny, C., & Pradel, M. (2019). Small world with high risks: A study of security threats in the npm ecosystem. In *28th USENIX Security Symposium (USENIX Security 19)* (pp. 995–1010). USENIX Association. <https://www.usenix.org/conference/usenixsecurity19/presentation/zimmerman>
|
|
33
44
|
|
|
34
45
|
## Secret leakage
|
|
35
46
|
|
|
36
|
-
|
|
37
|
-
|
|
47
|
+
<a id="basak2023secretbench"></a>Basak, S. K., Neil, L., Reaves, B., & Williams, L. (2023). SecretBench: A dataset of software secrets. In *2023 IEEE/ACM 20th International Conference on Mining Software Repositories (MSR)* (pp. 347–351). IEEE. <https://doi.org/10.1109/MSR59073.2023.00053>
|
|
48
|
+
|
|
49
|
+
<a id="meli2019bad"></a>Meli, M., McNiece, M. R., & Reaves, B. (2019). How bad can it Git? Characterizing secret leakage in public GitHub repositories. In *Proceedings 2019 Network and Distributed System Security Symposium*. Internet Society. <https://doi.org/10.14722/ndss.2019.23418>
|
|
38
50
|
|
|
39
51
|
## Web application security
|
|
40
52
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
-
|
|
53
|
+
<a id="barth2008robust"></a>Barth, A., Jackson, C., & Mitchell, J. C. (2008). Robust defenses for cross-site request forgery. In *Proceedings of the 15th ACM Conference on Computer and Communications Security (CCS '08)* (pp. 75–88). ACM. <https://doi.org/10.1145/1455770.1455782>
|
|
54
|
+
|
|
55
|
+
<a id="chen2018cors"></a>Chen, J., Jiang, J., Duan, H., Wan, T., Chen, S., Paxson, V., & Yang, M. (2018). We still don't have secure cross-domain requests: An empirical study of CORS. In *27th USENIX Security Symposium (USENIX Security 18)* (pp. 1079–1093). USENIX Association. <https://www.usenix.org/conference/usenixsecurity18/presentation/chen-jianjun>
|
|
56
|
+
|
|
57
|
+
<a id="crosby2009opportunities"></a>Crosby, S. A., Wallach, D. S., & Riedi, R. H. (2009). Opportunities and limits of remote timing attacks. *ACM Transactions on Information and System Security*, *12*(3), 1–29. <https://doi.org/10.1145/1455526.1455530>
|
|
58
|
+
|
|
59
|
+
<a id="fett2016comprehensive"></a>Fett, D., Küsters, R., & Schmitz, G. (2016). A comprehensive formal security analysis of OAuth 2.0. In *Proceedings of the 2016 ACM SIGSAC Conference on Computer and Communications Security (CCS '16)* (pp. 1204–1215). ACM. <https://doi.org/10.1145/2976749.2978385>
|
|
60
|
+
|
|
61
|
+
<a id="hodges2012rfc6797"></a>Hodges, J., Jackson, C., & Barth, A. (2012). *HTTP strict transport security (HSTS)* (RFC 6797). RFC Editor. <https://doi.org/10.17487/RFC6797>
|
|
62
|
+
|
|
63
|
+
<a id="jones2015rfc7519"></a>Jones, M., Bradley, J., & Sakimura, N. (2015). *JSON web token (JWT)* (RFC 7519). RFC Editor. <https://doi.org/10.17487/RFC7519>
|
|
64
|
+
|
|
65
|
+
<a id="kitterman2014rfc7208"></a>Kitterman, S. (2014). *Sender policy framework (SPF) for authorizing use of domains in email, version 1* (RFC 7208). RFC Editor. <https://doi.org/10.17487/RFC7208>
|
|
66
|
+
|
|
67
|
+
<a id="kocher1996timing"></a>Kocher, P. C. (1996). Timing attacks on implementations of Diffie-Hellman, RSA, DSS, and other systems. In N. Koblitz (Ed.), *Advances in Cryptology – CRYPTO '96* (pp. 104–113). Springer. <https://doi.org/10.1007/3-540-68697-5_9>
|
|
68
|
+
|
|
69
|
+
<a id="kucherawy2015rfc7489"></a>Kucherawy, M., & Zwicky, E. (2015). *Domain-based message authentication, reporting, and conformance (DMARC)* (RFC 7489). RFC Editor. <https://doi.org/10.17487/RFC7489>
|
|
70
|
+
|
|
71
|
+
<a id="lekies2013flows"></a>Lekies, S., Stock, B., & Johns, M. (2013). 25 million flows later: Large-scale detection of DOM-based XSS. In *Proceedings of the 2013 ACM SIGSAC Conference on Computer and Communications Security (CCS '13)* (pp. 1193–1204). ACM. <https://doi.org/10.1145/2508859.2516703>
|
|
72
|
+
|
|
73
|
+
<a id="lodderstedt2025rfc9700"></a>Lodderstedt, T., Bradley, J., Labunets, A., & Fett, D. (2025). *Best current practice for OAuth 2.0 security* (RFC 9700, BCP 240). RFC Editor. <https://doi.org/10.17487/RFC9700>
|
|
74
|
+
|
|
75
|
+
<a id="owaspwstg42"></a>OWASP Foundation. (n.d.-b). *OWASP Web Security Testing Guide, version 4.2*. Retrieved October 19, 2026, from <https://wstg.owasp.org/v4.2/>
|
|
76
|
+
|
|
77
|
+
<a id="owasp2021top10"></a>OWASP Foundation. (2021). *OWASP Top 10:2021*. Retrieved October 19, 2026, from <https://top10.owasp.org/2021>
|
|
78
|
+
|
|
79
|
+
<a id="owasp2023api"></a>OWASP Foundation. (2023). *OWASP Top 10 API security risks – 2023*. OWASP API Security Project. Retrieved October 19, 2026, from <https://owasp.org/API-Security/editions/2023/en/0x11-t10/>
|
|
80
|
+
|
|
81
|
+
<a id="owasp2025top10"></a>OWASP Foundation. (2025c). *OWASP Top 10:2025*. Retrieved October 19, 2026, from <https://top10.owasp.org/2025>
|
|
82
|
+
|
|
83
|
+
<a id="sakimura2015rfc7636"></a>Sakimura, N., Bradley, J., & Agarwal, N. (2015). *Proof key for code exchange by OAuth public clients* (RFC 7636). RFC Editor. <https://doi.org/10.17487/RFC7636>
|
|
84
|
+
|
|
85
|
+
<a id="sheffer2020rfc8725"></a>Sheffer, Y., Hardt, D., & Jones, M. (2020). *JSON web token best current practices* (RFC 8725, BCP 225). RFC Editor. <https://doi.org/10.17487/RFC8725>
|
|
86
|
+
|
|
87
|
+
<a id="stock2014precise"></a>Stock, B., Lekies, S., Mueller, T., Spiegel, P., & Johns, M. (2014). Precise client-side protection against DOM-based cross-site scripting. In *23rd USENIX Security Symposium (USENIX Security 14)* (pp. 655–670). USENIX Association. <https://www.usenix.org/conference/usenixsecurity14/technical-sessions/presentation/stock>
|
|
88
|
+
|
|
89
|
+
<a id="weichselbaum2016csp"></a>Weichselbaum, L., Spagnuolo, M., Lekies, S., & Janc, A. (2016). CSP is dead, long live CSP! On the insecurity of whitelists and the future of Content Security Policy. In *Proceedings of the 2016 ACM SIGSAC Conference on Computer and Communications Security (CCS '16)* (pp. 1376–1387). ACM. <https://doi.org/10.1145/2976749.2978363>
|
|
60
90
|
|
|
61
91
|
## LLM and agent security
|
|
62
92
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
93
|
+
<a id="greshake2023signed"></a>Greshake, K., Abdelnabi, S., Mishra, S., Endres, C., Holz, T., & Fritz, M. (2023). Not what you've signed up for: Compromising real-world LLM-integrated applications with indirect prompt injection. In *Proceedings of the 16th ACM Workshop on Artificial Intelligence and Security (AISec '23)* (pp. 79–90). ACM. <https://doi.org/10.1145/3605764.3623985>
|
|
94
|
+
|
|
95
|
+
<a id="liu2023prompt"></a>Liu, Y., Deng, G., Li, Y., Wang, K., Wang, Z., Wang, X., Zhang, T., Liu, Y., Wang, H., Zheng, Y., Zhang, L. Y., & Liu, Y. (2023). *Prompt injection attack against LLM-integrated applications* [Preprint]. arXiv. <https://doi.org/10.48550/arXiv.2306.05499>
|
|
96
|
+
|
|
97
|
+
<a id="mitreatlas"></a>The MITRE Corporation. (n.d.-b). *MITRE ATLAS: Adversarial Threat Landscape for AI Systems*. Retrieved October 19, 2026, from <https://atlas.mitre.org/>
|
|
98
|
+
|
|
99
|
+
<a id="owasp2024llmtop10"></a>OWASP Foundation. (2024, November 17). *OWASP Top 10 for LLM applications 2025*. OWASP Gen AI Security Project. Retrieved October 19, 2026, from <https://genai.owasp.org/resource/owasp-top-10-for-llm-applications-2025/>
|
|
100
|
+
|
|
101
|
+
<a id="owasp2025mcptop10"></a>OWASP Foundation. (2025a). *OWASP MCP Top 10* [Beta]. Retrieved October 19, 2026, from <https://owasp.org/www-project-mcp-top-10/>
|
|
102
|
+
|
|
103
|
+
<a id="owasp2025agentic"></a>OWASP Foundation. (2025b, December 9). *OWASP Top 10 for agentic applications for 2026*. OWASP Gen AI Security Project. Retrieved October 19, 2026, from <https://genai.owasp.org/resource/owasp-top-10-for-agentic-applications-for-2026/>
|
|
104
|
+
|
|
105
|
+
<a id="perez2022ignore"></a>Perez, F., & Ribeiro, I. (2022). *Ignore previous prompt: Attack techniques for language models* [Preprint]. arXiv. <https://doi.org/10.48550/arXiv.2211.09527>
|
|
106
|
+
|
|
107
|
+
<a id="spracklen2025package"></a>Spracklen, J., Wijewickrama, R., Sakib, A. H. M. N., Maiti, A., Viswanath, B., & Jadliwala, M. (2025). We have a package for you! A comprehensive analysis of package hallucinations by code generating LLMs. In *34th USENIX Security Symposium (USENIX Security 25)* (pp. 3687–3706). USENIX Association. <https://www.usenix.org/conference/usenixsecurity25/presentation/spracklen>
|
|
71
108
|
|
|
72
109
|
## Standards and regulation
|
|
73
110
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
111
|
+
<a id="eu2022nis2"></a>European Parliament and Council of the European Union. (2022). *Directive (EU) 2022/2555 of the European Parliament and of the Council of 14 December 2022 on measures for a high common level of cybersecurity across the Union, amending Regulation (EU) No 910/2014 and Directive (EU) 2018/1972, and repealing Directive (EU) 2016/1148 (NIS 2 Directive)*. Official Journal of the European Union, L 333, 27.12.2022, p. 80. Retrieved October 19, 2026, from <https://eur-lex.europa.eu/eli/dir/2022/2555/oj>
|
|
112
|
+
|
|
113
|
+
<a id="oasis2023sarif"></a>Fanning, M. C., & Golding, L. J. (2023, August 28). *Static Analysis Results Interchange Format (SARIF) version 2.1.0 plus errata 01* [OASIS Standard incorporating Approved Errata]. OASIS. Retrieved October 19, 2026, from <https://docs.oasis-open.org/sarif/sarif/v2.1.0/errata01/os/sarif-v2.1.0-errata01-os-complete.html>
|
|
114
|
+
|
|
115
|
+
<a id="mitrecwe"></a>The MITRE Corporation. (n.d.-a). *CWE: Common Weakness Enumeration*. Retrieved October 19, 2026, from <https://cwe.mitre.org/>
|
|
116
|
+
|
|
117
|
+
<a id="scarfone2008sp800115"></a>Scarfone, K. A., Souppaya, M. P., Cody, A., & Orebaugh, A. D. (2008). *Technical guide to information security testing and assessment* (NIST Special Publication 800-115). National Institute of Standards and Technology. <https://doi.org/10.6028/NIST.SP.800-115>
|
|
118
|
+
|
|
119
|
+
<a id="spdxlicenselist"></a>SPDX Workgroup, The Linux Foundation. (n.d.). *SPDX License List*. Retrieved October 19, 2026, from <https://spdx.org/licenses/>
|
|
@@ -140,3 +140,39 @@ export function discoverFrameworkRoutes(repoPath) {
|
|
|
140
140
|
|
|
141
141
|
return all.sort((a, b) => a.url.localeCompare(b.url));
|
|
142
142
|
}
|
|
143
|
+
|
|
144
|
+
// Web frameworks by manifest dependency, most specific first (Next.js ships React,
|
|
145
|
+
// SvelteKit ships Vite). Python names are matched in requirements/pyproject text.
|
|
146
|
+
const NPM_FRAMEWORKS = [
|
|
147
|
+
["next", "Next.js"], ["nuxt", "Nuxt"], ["@remix-run/node", "Remix"], ["@sveltejs/kit", "SvelteKit"],
|
|
148
|
+
["astro", "Astro"], ["@nestjs/core", "NestJS"], ["hono", "Hono"], ["fastify", "Fastify"],
|
|
149
|
+
["express", "Express"], ["koa", "Koa"], ["vite", "Vite"],
|
|
150
|
+
];
|
|
151
|
+
const PY_FRAMEWORKS = [["django", "Django"], ["fastapi", "FastAPI"], ["flask", "Flask"]];
|
|
152
|
+
const SOURCE_NAMES = { express: "Express", hono: "Hono", fastify: "Fastify" };
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Name the project's web framework from its manifests, offline. Falls back to
|
|
156
|
+
* detectFramework() on the server entry files.
|
|
157
|
+
* @param {string} repoPath
|
|
158
|
+
* @returns {string|null} e.g. "Next.js", "Express", "FastAPI"
|
|
159
|
+
*/
|
|
160
|
+
export function detectProjectFramework(repoPath) {
|
|
161
|
+
try {
|
|
162
|
+
const pkg = JSON.parse(readFileSync(join(repoPath, "package.json"), "utf-8"));
|
|
163
|
+
const deps = { ...pkg.dependencies, ...pkg.devDependencies };
|
|
164
|
+
for (const [dep, name] of NPM_FRAMEWORKS) if (deps[dep]) return name;
|
|
165
|
+
} catch { /* no or unreadable package.json */ }
|
|
166
|
+
let py = "";
|
|
167
|
+
for (const f of ["requirements.txt", "pyproject.toml", "Pipfile"]) {
|
|
168
|
+
try { py += readFileSync(join(repoPath, f), "utf-8").toLowerCase() + "\n"; } catch { /* absent */ }
|
|
169
|
+
}
|
|
170
|
+
for (const [dep, name] of PY_FRAMEWORKS) if (new RegExp(`(^|[^a-z0-9_-])${dep}([^a-z0-9_-]|$)`, "m").test(py)) return name;
|
|
171
|
+
for (const entry of ["server.js", "server.ts", "index.js", "index.ts", "app.js", "app.ts", "src/index.ts"]) {
|
|
172
|
+
try {
|
|
173
|
+
const name = SOURCE_NAMES[detectFramework(readFileSync(join(repoPath, entry), "utf-8"))];
|
|
174
|
+
if (name) return name;
|
|
175
|
+
} catch { /* absent */ }
|
|
176
|
+
}
|
|
177
|
+
return null;
|
|
178
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "penthera",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.7.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Open-source security for the apps and AI systems you ship. Check it before you deploy, vet what you build with (dependencies, MCP servers, skills), keep watching after you ship. Offline, deterministic, free.",
|
|
6
6
|
"repository": {
|
package/skills/penthera/SKILL.md
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
name: penthera
|
|
3
3
|
description: >
|
|
4
4
|
Open-source security for the apps and AI systems the user ships, run locally with
|
|
5
|
-
the Penthera CLI.
|
|
6
|
-
user's own live URL and repo (TLS, headers, auth, OpenAPI, secrets incl. AI keys,
|
|
5
|
+
the Penthera CLI. Sets it up in one command ("set up penthera in this repo").
|
|
6
|
+
Scans the user's own live URL and repo (TLS, headers, auth, OpenAPI, secrets incl. AI keys,
|
|
7
7
|
opt-in injection); checks npm and Python dependencies offline ("is this dependency safe?",
|
|
8
8
|
"what changed in my deps?", "install X safely", "any AGPL in our deps?"); blocks
|
|
9
9
|
secrets and risky agent config before they are committed ("add a pre-commit hook");
|
|
@@ -19,7 +19,7 @@ compatibility: Node.js 22+, network access to target, Penthera CLI (npm link or
|
|
|
19
19
|
allowed-tools: "Bash(node:*) Bash(npm:*) Bash(penthera:*) Read Write Edit"
|
|
20
20
|
metadata:
|
|
21
21
|
author: danoszz
|
|
22
|
-
version: 1.
|
|
22
|
+
version: 1.7.0
|
|
23
23
|
category: security
|
|
24
24
|
---
|
|
25
25
|
|
|
@@ -66,7 +66,7 @@ All examples below use `penthera`; substitute `node bin/penthera.js` when needed
|
|
|
66
66
|
|
|
67
67
|
| User intent | Command pattern |
|
|
68
68
|
|-------------|-----------------|
|
|
69
|
-
| First-time / unsure | `penthera` (
|
|
69
|
+
| First-time / unsure / "set up penthera in this repo" | `penthera init` (see **Set up in one command**); `penthera-scan` for a URL-first wizard |
|
|
70
70
|
| Scan a live URL | `penthera <url> --profile standard -o reports/scan.json` |
|
|
71
71
|
| Scan repo only (secrets, routes) | `penthera --repo . -o reports/repo-scan.json` |
|
|
72
72
|
| Is this dependency safe? / what changed in my deps? | `penthera deps` or `penthera deps --base origin/main` (see **Dependency risk scan**) |
|
|
@@ -314,6 +314,20 @@ penthera deps --license-policy permissive --json # presets: permissive, weak-c
|
|
|
314
314
|
1. Findings have category `license`: a breach or `UNLICENSED` is high; a missing, custom or non-SPDX license is medium.
|
|
315
315
|
2. Without the flag, the `licenses` section of `penthera.policy.json` applies if present. Never add packages to `allowPackages` without the user's say-so; that is a legal decision, not a technical one.
|
|
316
316
|
|
|
317
|
+
## Set up in one command
|
|
318
|
+
|
|
319
|
+
**Triggers:** "set up penthera in this repo", "get started with penthera", "onboard this project", "add penthera to this project"
|
|
320
|
+
|
|
321
|
+
```bash
|
|
322
|
+
penthera init --dry-run --yes # show the plan: detected items, checks, files it would write
|
|
323
|
+
penthera init --yes # code, deps and AI tooling checks offline; hook, workflow, .gitignore
|
|
324
|
+
penthera init # the interactive wizard, in the user's terminal
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
1. Run `--dry-run --yes` first and show the user the plan. `--yes` never scans a URL, never runs the fix loop and never opens the dashboard; it writes the pre-commit hook, `.github/workflows/penthera.yml` and a `reports/` line in `.gitignore`. Ask before running it if the user only asked a question.
|
|
328
|
+
2. Reports land in `reports/penthera-<date>/`; read `summary.md` and walk the user through the "Fix first" items.
|
|
329
|
+
3. Never commit or push the workflow file it writes; tell the user to review and commit it. To scan the running app, use `penthera <url>` after the authorization gate above, not `init --yes`.
|
|
330
|
+
|
|
317
331
|
## Pre-commit hook
|
|
318
332
|
|
|
319
333
|
**Triggers:** "add a pre-commit hook", "stop me committing secrets / API keys", "check before I commit", "block bad MCP config in commits"
|
|
@@ -339,7 +353,7 @@ penthera ui --demo --open # fake data, to look around
|
|
|
339
353
|
|
|
340
354
|
1. Start it in the user's terminal (it keeps running until Ctrl-C). It binds 127.0.0.1 on a random port and prints a one-time URL: tell the user to open that link (or pass `--open`). Never paste the token anywhere else.
|
|
341
355
|
2. It reads only the `--project` folders, the reports folder and `~/.penthera`. If the screens are empty, scan with `-o reports/<name>.json` first (and `penthera deps -o reports/deps.json`, `penthera agents . -o reports/agents.json`).
|
|
342
|
-
3. The
|
|
356
|
+
3. The bar at the bottom of the view starts scans, dependency checks, AI tooling audits and the fix loop for the selected project. The fix loop is `penthera agent --loop` with the same rules: the user approves every diff in the page, nothing is pushed. A URL that is not on this machine needs its hostname typed to confirm; the authorization gate above still applies.
|
|
343
357
|
|
|
344
358
|
See [docs/dashboard.md](../../docs/dashboard.md).
|
|
345
359
|
|
package/src/cli/deps.js
CHANGED
|
@@ -28,7 +28,7 @@ export const DEPS_UNSUPPORTED = [
|
|
|
28
28
|
* The license policy for this run: `--license-policy <preset|file>`, else the
|
|
29
29
|
* `licenses` section of penthera.policy.json, else none.
|
|
30
30
|
*/
|
|
31
|
-
async function resolveLicensePolicy(root, flag) {
|
|
31
|
+
export async function resolveLicensePolicy(root, flag) {
|
|
32
32
|
const { normalizeLicensePolicy, LICENSE_PRESETS } = await import("../../lib/deps/license.js");
|
|
33
33
|
if (flag) {
|
|
34
34
|
if (LICENSE_PRESETS[flag]) return normalizeLicensePolicy({ preset: flag }, "--license-policy");
|