penthera 1.6.1 → 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.
Files changed (42) hide show
  1. package/CHANGELOG.md +58 -0
  2. package/README.md +158 -301
  3. package/bin/scan.js +2 -2
  4. package/docs/METHODOLOGY.md +236 -182
  5. package/docs/commands/README.md +2 -1
  6. package/docs/commands/init.md +114 -0
  7. package/docs/commands/scan.md +1 -1
  8. package/docs/compare/github.md +1 -1
  9. package/docs/dashboard.md +95 -152
  10. package/docs/examples/github-actions-scan.yml +1 -1
  11. package/docs/internal-audit.md +1 -1
  12. package/docs/plan.md +3 -2
  13. package/docs/references.bib +43 -33
  14. package/docs/references.md +92 -51
  15. package/lib/whitebox/frameworks.js +36 -0
  16. package/package.json +1 -1
  17. package/skills/penthera/SKILL.md +19 -5
  18. package/src/cli/deps.js +1 -1
  19. package/src/cli/detect.js +125 -0
  20. package/src/cli/onboarding.js +428 -6
  21. package/src/cli/prompt.js +42 -0
  22. package/src/cli.js +18 -5
  23. package/src/ui/api/data.js +30 -0
  24. package/src/ui/api/demo.js +13 -0
  25. package/src/ui/api/routes.js +1 -0
  26. package/src/ui/static/app.css +286 -560
  27. package/src/ui/static/index.html +8 -39
  28. package/src/ui/static/js/app.js +105 -107
  29. package/src/ui/static/js/center.js +388 -0
  30. package/src/ui/static/js/copy.js +36 -62
  31. package/src/ui/static/js/dom.js +0 -38
  32. package/src/ui/static/js/left.js +83 -0
  33. package/src/ui/static/js/right.js +270 -0
  34. package/src/ui/static/js/state.js +35 -0
  35. package/src/ui/static/js/views/ai.js +0 -68
  36. package/src/ui/static/js/views/deps.js +0 -96
  37. package/src/ui/static/js/views/evidence.js +0 -115
  38. package/src/ui/static/js/views/findings.js +0 -165
  39. package/src/ui/static/js/views/history.js +0 -92
  40. package/src/ui/static/js/views/overview.js +0 -184
  41. package/src/ui/static/js/views/run.js +0 -349
  42. package/src/ui/static/js/views/settings.js +0 -67
@@ -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} Benchmark Project},
55
- howpublished = {OWASP project page (v1.2; project leader Dave Wichers)},
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
- howpublished = {Microsoft internal \emph{Interface} journal, 1 April 1999; copy hosted by Adam Shostack},
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 (NDSS 2017)},
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 (NDSS 2019)},
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} Top 10 {API} Security Risks -- 2023},
357
- howpublished = {OWASP API Security Project},
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} Top 10:2021},
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} Top 10:2025},
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} Web Security Testing Guide, Version 4.2},
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
- howpublished = {NeurIPS 2022 ML Safety Workshop; arXiv:2211.09527},
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
- howpublished = {arXiv preprint arXiv:2306.05499},
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} Top 10 for {LLM} Applications 2025},
468
- howpublished = {OWASP Gen AI Security Project, published 17 November 2024},
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} Top 10 for Agentic Applications for 2026},
479
- howpublished = {OWASP Gen AI Security Project, published 9 December 2025},
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} {MCP} Top 10},
490
- howpublished = {OWASP project page (beta, living document; items MCP01:2025--MCP10:2025; project lead Vandana Verma Sehgal)},
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 {AI} Systems},
501
- howpublished = {Knowledge base of adversary tactics and techniques against AI systems},
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
- howpublished = {OASIS Standard incorporating Approved Errata, 28 August 2023},
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
- howpublished = {Community-developed list of software and hardware weakness types, sponsored by CISA},
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} License List},
545
- howpublished = {Standardized short identifiers for open source licenses, used by package manifests and SBOMs},
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}
@@ -1,78 +1,119 @@
1
1
  # References
2
2
 
3
- The research and standards Penthera's methodology and findings cite. The BibTeX source is [references.bib](references.bib); this page is generated from it by `node scripts/build-references.mjs`.
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. How each one is used is described in [METHODOLOGY.md](METHODOLOGY.md).
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
- - `bau2010state`: Bau, Jason; Bursztein, Elie; Gupta, Divij; Mitchell, John (2010). *State of the Art: Automated Black-Box Web Application Vulnerability Testing*. 2010 IEEE Symposium on Security and Privacy. <https://doi.org/10.1109/SP.2010.27>
10
- - `doupe2010johnny`: Doupé, Adam; Cova, Marco; Vigna, Giovanni (2010). *Why Johnny Can't Pentest: An Analysis of Black-Box Web Vulnerability Scanners*. Detection of Intrusions and Malware, and Vulnerability Assessment (DIMVA 2010). <https://doi.org/10.1007/978-3-642-14215-4_7>
11
- - `antunes2010benchmarking`: Antunes, Nuno; Vieira, Marco (2010). *Benchmarking Vulnerability Detection Tools for Web Services*. 2010 IEEE International Conference on Web Services (ICWS). <https://doi.org/10.1109/ICWS.2010.76>
12
- - `antunes2015assessing`: Antunes, Nuno; Vieira, Marco (2015). *Assessing and Comparing Vulnerability Detection Tools for Web Services: Benchmarking Approach and Examples*. IEEE Transactions on Services Computing. <https://doi.org/10.1109/TSC.2014.2310221>
13
- - `owaspbenchmark`: OWASP Foundation. *OWASP Benchmark Project*. OWASP project page (v1.2; project leader Dave Wichers). <https://owasp.org/www-project-benchmark/>
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
- - `saltzer1975protection`: Saltzer, J. H.; Schroeder, M. D. (1975). *The Protection of Information in Computer Systems*. Proceedings of the IEEE. <https://doi.org/10.1109/PROC.1975.9939>
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
- - `shostack2014threat`: Shostack, Adam (2014). *Threat Modeling: Designing for Security*. Wiley. <https://www.wiley-vch.de/de/fachgebiete/computer-und-informatik/threat-modeling-978-1-118-80999-0>
22
- - `kohnfelder1999threats`: Kohnfelder, Loren; Garg, Praerit (1999). *The Threats to Our Products*. Microsoft internal Interface journal, 1 April 1999; copy hosted by Adam Shostack. <https://shostack.org/files/microsoft/The-Threats-To-Our-Products.docx>
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
- - `ladisa2023sok`: Ladisa, Piergiorgio; Plate, Henrik; Martinez, Matias; Barais, Olivier (2023). *SoK: Taxonomy of Attacks on Open-Source Software Supply Chains*. 2023 IEEE Symposium on Security and Privacy (SP). <https://doi.org/10.1109/SP46215.2023.10179304>
27
- - `ohm2020backstabber`: Ohm, Marc; Plate, Henrik; Sykosch, Arnold; Meier, Michael (2020). *Backstabber's Knife Collection: A Review of Open Source Software Supply Chain Attacks*. Detection of Intrusions and Malware, and Vulnerability Assessment (DIMVA 2020). <https://doi.org/10.1007/978-3-030-52683-2_2>
28
- - `zimmermann2019small`: Zimmermann, Markus; Staicu, Cristian-Alexandru; Tenny, Cam; Pradel, Michael (2019). *Small World with High Risks: A Study of Security Threats in the npm Ecosystem*. 28th USENIX Security Symposium (USENIX Security 19). <https://www.usenix.org/conference/usenixsecurity19/presentation/zimmerman>
29
- - `lauinger2017thou`: Lauinger, Tobias; Chaabane, Abdelberi; Arshad, Sajjad; Robertson, William; Wilson, Christo; Kirda, Engin (2017). *Thou Shalt Not Depend on Me: Analysing the Use of Outdated JavaScript Libraries on the Web*. Network and Distributed System Security Symposium (NDSS 2017). <https://doi.org/10.14722/ndss.2017.23414>
30
- - `thompson1984reflections`: Thompson, Ken (1984). *Reflections on Trusting Trust*. Communications of the ACM. <https://doi.org/10.1145/358198.358210>
31
- - `torresarias2019intoto`: Torres-Arias, Santiago; Afzali, Hammad; Kuppusamy, Trishank Karthik; Curtmola, Reza; Cappos, Justin (2019). *in-toto: Providing farm-to-table guarantees for bits and bytes*. 28th USENIX Security Symposium (USENIX Security 19). <https://www.usenix.org/conference/usenixsecurity19/presentation/torres-arias>
32
- - `samuel2010survivable`: Samuel, Justin; Mathewson, Nick; Cappos, Justin; Dingledine, Roger (2010). *Survivable Key Compromise in Software Update Systems*. Proceedings of the 17th ACM Conference on Computer and Communications Security (CCS '10). <https://doi.org/10.1145/1866307.1866315>
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
- - `meli2019bad`: Meli, Michael; McNiece, Matthew R.; Reaves, Bradley (2019). *How Bad Can It Git? Characterizing Secret Leakage in Public GitHub Repositories*. Network and Distributed System Security Symposium (NDSS 2019). <https://doi.org/10.14722/ndss.2019.23418>
37
- - `basak2023secretbench`: Basak, Setu Kumar; Neil, Lorenzo; Reaves, Bradley; Williams, Laurie (2023). *SecretBench: A Dataset of Software Secrets*. 2023 IEEE/ACM 20th International Conference on Mining Software Repositories (MSR). <https://doi.org/10.1109/MSR59073.2023.00053>
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
- - `weichselbaum2016csp`: Weichselbaum, Lukas; Spagnuolo, Michele; Lekies, Sebastian; Janc, Artur (2016). *CSP Is Dead, Long Live CSP! On the Insecurity of Whitelists and the Future of Content Security Policy*. Proceedings of the 2016 ACM SIGSAC Conference on Computer and Communications Security (CCS '16). <https://doi.org/10.1145/2976749.2978363>
42
- - `kocher1996timing`: Kocher, Paul C. (1996). *Timing Attacks on Implementations of Diffie-Hellman, RSA, DSS, and Other Systems*. Advances in Cryptology - CRYPTO '96. <https://doi.org/10.1007/3-540-68697-5_9>
43
- - `crosby2009opportunities`: Crosby, Scott A.; Wallach, Dan S.; Riedi, Rudolf H. (2009). *Opportunities and Limits of Remote Timing Attacks*. ACM Transactions on Information and System Security. <https://doi.org/10.1145/1455526.1455530>
44
- - `lekies2013flows`: Lekies, Sebastian; Stock, Ben; Johns, Martin (2013). *25 Million Flows Later: Large-scale Detection of DOM-based XSS*. Proceedings of the 2013 ACM SIGSAC Conference on Computer and Communications Security (CCS '13). <https://doi.org/10.1145/2508859.2516703>
45
- - `stock2014precise`: Stock, Ben; Lekies, Sebastian; Mueller, Tobias; Spiegel, Patrick; Johns, Martin (2014). *Precise Client-side Protection against DOM-based Cross-Site Scripting*. 23rd USENIX Security Symposium (USENIX Security 14). <https://www.usenix.org/conference/usenixsecurity14/technical-sessions/presentation/stock>
46
- - `barth2008robust`: Barth, Adam; Jackson, Collin; Mitchell, John C. (2008). *Robust Defenses for Cross-Site Request Forgery*. Proceedings of the 15th ACM Conference on Computer and Communications Security (CCS '08). <https://doi.org/10.1145/1455770.1455782>
47
- - `fett2016comprehensive`: Fett, Daniel; Küsters, Ralf; Schmitz, Guido (2016). *A Comprehensive Formal Security Analysis of OAuth 2.0*. Proceedings of the 2016 ACM SIGSAC Conference on Computer and Communications Security (CCS '16). <https://doi.org/10.1145/2976749.2978385>
48
- - `hodges2012rfc6797`: Hodges, J.; Jackson, C.; Barth, A. (2012). *HTTP Strict Transport Security (HSTS)*. RFC 6797, Proposed Standard, RFC Editor. <https://doi.org/10.17487/RFC6797>
49
- - `jones2015rfc7519`: Jones, M.; Bradley, J.; Sakimura, N. (2015). *JSON Web Token (JWT)*. RFC 7519, Proposed Standard, RFC Editor. <https://doi.org/10.17487/RFC7519>
50
- - `sakimura2015rfc7636`: Sakimura, N.; Bradley, J.; Agarwal, N. (2015). *Proof Key for Code Exchange by OAuth Public Clients*. RFC 7636, Proposed Standard, RFC Editor. <https://doi.org/10.17487/RFC7636>
51
- - `lodderstedt2025rfc9700`: 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>
52
- - `chen2018cors`: Chen, Jianjun; Jiang, Jian; Duan, Haixin; Wan, Tao; Chen, Shuo; Paxson, Vern; Yang, Min (2018). *We Still Don't Have Secure Cross-Domain Requests: an Empirical Study of CORS*. 27th USENIX Security Symposium (USENIX Security 18). <https://www.usenix.org/conference/usenixsecurity18/presentation/chen-jianjun>
53
- - `sheffer2020rfc8725`: 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>
54
- - `owasp2023api`: OWASP Foundation (2023). *OWASP Top 10 API Security Risks - 2023*. OWASP API Security Project. <https://owasp.org/API-Security/editions/2023/en/0x11-t10/>
55
- - `kitterman2014rfc7208`: Kitterman, S. (2014). *Sender Policy Framework (SPF) for Authorizing Use of Domains in Email, Version 1*. RFC 7208, Proposed Standard, RFC Editor. <https://doi.org/10.17487/RFC7208>
56
- - `kucherawy2015rfc7489`: Kucherawy, M.; Zwicky, E. (2015). *Domain-based Message Authentication, Reporting, and Conformance (DMARC)*. RFC 7489, Informational, RFC Editor. <https://doi.org/10.17487/RFC7489>
57
- - `owasp2021top10`: OWASP Foundation (2021). *OWASP Top 10:2021*. OWASP Foundation. <https://top10.owasp.org/2021>
58
- - `owasp2025top10`: OWASP Foundation (2025). *OWASP Top 10:2025*. OWASP Foundation. <https://top10.owasp.org/2025>
59
- - `owaspwstg42`: OWASP Foundation. *OWASP Web Security Testing Guide, Version 4.2*. OWASP Foundation. <https://wstg.owasp.org/v4.2/>
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
- - `greshake2023signed`: Greshake, Kai; Abdelnabi, Sahar; Mishra, Shailesh; Endres, Christoph; Holz, Thorsten; Fritz, Mario (2023). *Not What You've Signed Up For: Compromising Real-World LLM-Integrated Applications with Indirect Prompt Injection*. Proceedings of the 16th ACM Workshop on Artificial Intelligence and Security (AISec '23). <https://doi.org/10.1145/3605764.3623985>
64
- - `spracklen2025package`: Spracklen, Joseph; Wijewickrama, Raveen; Sakib, A H M Nazmus; Maiti, Anindya; Viswanath, Bimal; Jadliwala, Murtuza (2025). *We Have a Package for You! A Comprehensive Analysis of Package Hallucinations by Code Generating LLMs*. 34th USENIX Security Symposium (USENIX Security 25). <https://www.usenix.org/conference/usenixsecurity25/presentation/spracklen>
65
- - `perez2022ignore`: Perez, Fábio; Ribeiro, Ian (2022). *Ignore Previous Prompt: Attack Techniques For Language Models*. NeurIPS 2022 ML Safety Workshop; arXiv:2211.09527. <https://doi.org/10.48550/arXiv.2211.09527>
66
- - `liu2023prompt`: Liu, Yi; Deng, Gelei; Li, Yuekang; Wang, Kailong; Wang, Zihao; Wang, Xiaofeng; Zhang, Tianwei; Liu, Yepang; Wang, Haoyu; Zheng, Yan; Zhang, Leo Yu; Liu, Yang (2023). *Prompt Injection attack against LLM-integrated Applications*. arXiv preprint arXiv:2306.05499. <https://doi.org/10.48550/arXiv.2306.05499>
67
- - `owasp2024llmtop10`: OWASP Foundation (2024). *OWASP Top 10 for LLM Applications 2025*. OWASP Gen AI Security Project, published 17 November 2024. <https://genai.owasp.org/resource/owasp-top-10-for-llm-applications-2025/>
68
- - `owasp2025agentic`: OWASP Foundation (2025). *OWASP Top 10 for Agentic Applications for 2026*. OWASP Gen AI Security Project, published 9 December 2025. <https://genai.owasp.org/resource/owasp-top-10-for-agentic-applications-for-2026/>
69
- - `owasp2025mcptop10`: OWASP Foundation (2025). *OWASP MCP Top 10*. OWASP project page (beta, living document; items MCP01:2025-MCP10:2025; project lead Vandana Verma Sehgal). <https://owasp.org/www-project-mcp-top-10/>
70
- - `mitreatlas`: The MITRE Corporation. *MITRE ATLAS: Adversarial Threat Landscape for AI Systems*. Knowledge base of adversary tactics and techniques against AI systems. <https://atlas.mitre.org/>
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
- - `scarfone2008sp800115`: Scarfone, K. A.; Souppaya, M. P.; Cody, A.; Orebaugh, A. D. (2008). *Technical Guide to Information Security Testing and Assessment*. National Institute of Standards and Technology. <https://doi.org/10.6028/NIST.SP.800-115>
75
- - `oasis2023sarif`: Fanning, Michael C.; Golding, Laurence J. (2023). *Static Analysis Results Interchange Format (SARIF) Version 2.1.0 Plus Errata 01*. OASIS Standard incorporating Approved Errata, 28 August 2023. <https://docs.oasis-open.org/sarif/sarif/v2.1.0/errata01/os/sarif-v2.1.0-errata01-os-complete.html>
76
- - `eu2022nis2`: European Parliament; 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. <https://eur-lex.europa.eu/eli/dir/2022/2555/oj>
77
- - `mitrecwe`: The MITRE Corporation. *CWE: Common Weakness Enumeration*. Community-developed list of software and hardware weakness types, sponsored by CISA. <https://cwe.mitre.org/>
78
- - `spdxlicenselist`: SPDX Workgroup, The Linux Foundation. *SPDX License List*. Standardized short identifiers for open source licenses, used by package manifests and SBOMs. <https://spdx.org/licenses/>
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.6.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": {
@@ -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. Scans the
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.6.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` (interactive wizard, TTY) or `penthera-scan` |
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 Run screen starts scans, dependency checks, AI tooling audits and the fix loop. 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.
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");