startup-sbom 2.0.0__tar.gz
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.
- startup_sbom-2.0.0/LICENSE +21 -0
- startup_sbom-2.0.0/PKG-INFO +301 -0
- startup_sbom-2.0.0/README.md +241 -0
- startup_sbom-2.0.0/pyproject.toml +255 -0
- startup_sbom-2.0.0/pyproject.toml.orig +156 -0
- startup_sbom-2.0.0/src/startup_sbom/__init__.py +45 -0
- startup_sbom-2.0.0/src/startup_sbom/__main__.py +6 -0
- startup_sbom-2.0.0/src/startup_sbom/ai/__init__.py +84 -0
- startup_sbom-2.0.0/src/startup_sbom/ai/a2a.py +208 -0
- startup_sbom-2.0.0/src/startup_sbom/ai/acp.py +274 -0
- startup_sbom-2.0.0/src/startup_sbom/ai/agents.py +251 -0
- startup_sbom-2.0.0/src/startup_sbom/ai/cli.py +289 -0
- startup_sbom-2.0.0/src/startup_sbom/ai/grounding.py +321 -0
- startup_sbom-2.0.0/src/startup_sbom/ai/index.py +578 -0
- startup_sbom-2.0.0/src/startup_sbom/ai/mcp_server.py +360 -0
- startup_sbom-2.0.0/src/startup_sbom/ai/orchestrator.py +537 -0
- startup_sbom-2.0.0/src/startup_sbom/ai/outputs.py +222 -0
- startup_sbom-2.0.0/src/startup_sbom/ai/prompts.py +114 -0
- startup_sbom-2.0.0/src/startup_sbom/ai/providers.py +366 -0
- startup_sbom-2.0.0/src/startup_sbom/ai/registry.py +417 -0
- startup_sbom-2.0.0/src/startup_sbom/ai/tools.py +237 -0
- startup_sbom-2.0.0/src/startup_sbom/ai/websearch.py +93 -0
- startup_sbom-2.0.0/src/startup_sbom/binaries/__init__.py +20 -0
- startup_sbom-2.0.0/src/startup_sbom/binaries/analyze.py +450 -0
- startup_sbom-2.0.0/src/startup_sbom/binaries/elf.py +633 -0
- startup_sbom-2.0.0/src/startup_sbom/binaries/linker.py +492 -0
- startup_sbom-2.0.0/src/startup_sbom/binaries/privileged.py +169 -0
- startup_sbom-2.0.0/src/startup_sbom/binaries/shebang.py +119 -0
- startup_sbom-2.0.0/src/startup_sbom/boottime.py +90 -0
- startup_sbom-2.0.0/src/startup_sbom/cli.py +398 -0
- startup_sbom-2.0.0/src/startup_sbom/context.py +70 -0
- startup_sbom-2.0.0/src/startup_sbom/data/NOTICE.md +74 -0
- startup_sbom-2.0.0/src/startup_sbom/data/attack_techniques.json +1 -0
- startup_sbom-2.0.0/src/startup_sbom/data/capec_attack.json +1 -0
- startup_sbom-2.0.0/src/startup_sbom/data/cwe.json +1 -0
- startup_sbom-2.0.0/src/startup_sbom/data/kev_attack.json +1 -0
- startup_sbom-2.0.0/src/startup_sbom/distro.py +456 -0
- startup_sbom-2.0.0/src/startup_sbom/errors.py +47 -0
- startup_sbom-2.0.0/src/startup_sbom/explain/__init__.py +704 -0
- startup_sbom-2.0.0/src/startup_sbom/explain/attribution.py +430 -0
- startup_sbom-2.0.0/src/startup_sbom/explain/counterfactual.py +394 -0
- startup_sbom-2.0.0/src/startup_sbom/explain/global_.py +145 -0
- startup_sbom-2.0.0/src/startup_sbom/explain/provenance.py +144 -0
- startup_sbom-2.0.0/src/startup_sbom/explain/ssvc_trace.py +211 -0
- startup_sbom-2.0.0/src/startup_sbom/initsys/__init__.py +279 -0
- startup_sbom-2.0.0/src/startup_sbom/initsys/base.py +28 -0
- startup_sbom-2.0.0/src/startup_sbom/initsys/cmdline.py +1200 -0
- startup_sbom-2.0.0/src/startup_sbom/initsys/container.py +163 -0
- startup_sbom-2.0.0/src/startup_sbom/initsys/inittab.py +208 -0
- startup_sbom-2.0.0/src/startup_sbom/initsys/netconf.py +424 -0
- startup_sbom-2.0.0/src/startup_sbom/initsys/openrc.py +338 -0
- startup_sbom-2.0.0/src/startup_sbom/initsys/runit.py +235 -0
- startup_sbom-2.0.0/src/startup_sbom/initsys/s6.py +177 -0
- startup_sbom-2.0.0/src/startup_sbom/initsys/supervisord.py +259 -0
- startup_sbom-2.0.0/src/startup_sbom/initsys/systemd/__init__.py +10 -0
- startup_sbom-2.0.0/src/startup_sbom/initsys/systemd/analyzer.py +433 -0
- startup_sbom-2.0.0/src/startup_sbom/initsys/systemd/boot.py +141 -0
- startup_sbom-2.0.0/src/startup_sbom/initsys/systemd/exec.py +84 -0
- startup_sbom-2.0.0/src/startup_sbom/initsys/systemd/hardening.py +1283 -0
- startup_sbom-2.0.0/src/startup_sbom/initsys/systemd/loader.py +494 -0
- startup_sbom-2.0.0/src/startup_sbom/initsys/systemd/parser.py +391 -0
- startup_sbom-2.0.0/src/startup_sbom/initsys/systemd/sockets.py +122 -0
- startup_sbom-2.0.0/src/startup_sbom/initsys/sysv.py +337 -0
- startup_sbom-2.0.0/src/startup_sbom/intel/__init__.py +39 -0
- startup_sbom-2.0.0/src/startup_sbom/intel/cli.py +83 -0
- startup_sbom-2.0.0/src/startup_sbom/intel/exploits.py +332 -0
- startup_sbom-2.0.0/src/startup_sbom/intel/extract.py +372 -0
- startup_sbom-2.0.0/src/startup_sbom/intel/fetcher.py +420 -0
- startup_sbom-2.0.0/src/startup_sbom/intel/prefetch.py +532 -0
- startup_sbom-2.0.0/src/startup_sbom/intel/render.py +188 -0
- startup_sbom-2.0.0/src/startup_sbom/intel/search.py +186 -0
- startup_sbom-2.0.0/src/startup_sbom/intel/select.py +214 -0
- startup_sbom-2.0.0/src/startup_sbom/intel/sources.py +420 -0
- startup_sbom-2.0.0/src/startup_sbom/intel/store.py +165 -0
- startup_sbom-2.0.0/src/startup_sbom/langpkgs/__init__.py +135 -0
- startup_sbom-2.0.0/src/startup_sbom/langpkgs/golang.py +303 -0
- startup_sbom-2.0.0/src/startup_sbom/langpkgs/java.py +241 -0
- startup_sbom-2.0.0/src/startup_sbom/langpkgs/npm.py +191 -0
- startup_sbom-2.0.0/src/startup_sbom/langpkgs/python.py +262 -0
- startup_sbom-2.0.0/src/startup_sbom/langpkgs/rust.py +156 -0
- startup_sbom-2.0.0/src/startup_sbom/legacy.py +86 -0
- startup_sbom-2.0.0/src/startup_sbom/log.py +27 -0
- startup_sbom-2.0.0/src/startup_sbom/lz4frame.py +138 -0
- startup_sbom-2.0.0/src/startup_sbom/models.py +900 -0
- startup_sbom-2.0.0/src/startup_sbom/net.py +327 -0
- startup_sbom-2.0.0/src/startup_sbom/pipeline.py +330 -0
- startup_sbom-2.0.0/src/startup_sbom/pkgdb/__init__.py +99 -0
- startup_sbom-2.0.0/src/startup_sbom/pkgdb/alpm.py +326 -0
- startup_sbom-2.0.0/src/startup_sbom/pkgdb/apk.py +264 -0
- startup_sbom-2.0.0/src/startup_sbom/pkgdb/base.py +41 -0
- startup_sbom-2.0.0/src/startup_sbom/pkgdb/dpkg.py +415 -0
- startup_sbom-2.0.0/src/startup_sbom/pkgdb/ownership.py +77 -0
- startup_sbom-2.0.0/src/startup_sbom/pkgdb/rpm/__init__.py +23 -0
- startup_sbom-2.0.0/src/startup_sbom/pkgdb/rpm/bdb.py +116 -0
- startup_sbom-2.0.0/src/startup_sbom/pkgdb/rpm/header.py +281 -0
- startup_sbom-2.0.0/src/startup_sbom/pkgdb/rpm/ndb.py +67 -0
- startup_sbom-2.0.0/src/startup_sbom/pkgdb/rpm/pgp.py +173 -0
- startup_sbom-2.0.0/src/startup_sbom/pkgdb/rpm/reader.py +613 -0
- startup_sbom-2.0.0/src/startup_sbom/pkgdb/rpm/sqlite.py +81 -0
- startup_sbom-2.0.0/src/startup_sbom/purls.py +192 -0
- startup_sbom-2.0.0/src/startup_sbom/py.typed +0 -0
- startup_sbom-2.0.0/src/startup_sbom/report/__init__.py +36 -0
- startup_sbom-2.0.0/src/startup_sbom/report/assets/report.css +75 -0
- startup_sbom-2.0.0/src/startup_sbom/report/assets/report.js +221 -0
- startup_sbom-2.0.0/src/startup_sbom/report/cdxvex.py +115 -0
- startup_sbom-2.0.0/src/startup_sbom/report/console.py +401 -0
- startup_sbom-2.0.0/src/startup_sbom/report/cyclonedx.py +818 -0
- startup_sbom-2.0.0/src/startup_sbom/report/graphs.py +313 -0
- startup_sbom-2.0.0/src/startup_sbom/report/html.py +625 -0
- startup_sbom-2.0.0/src/startup_sbom/report/markdown.py +502 -0
- startup_sbom-2.0.0/src/startup_sbom/report/native.py +318 -0
- startup_sbom-2.0.0/src/startup_sbom/report/openvex.py +179 -0
- startup_sbom-2.0.0/src/startup_sbom/report/pdf/__init__.py +81 -0
- startup_sbom-2.0.0/src/startup_sbom/report/pdf/engine.py +142 -0
- startup_sbom-2.0.0/src/startup_sbom/report/pdf/templates/components.typ +303 -0
- startup_sbom-2.0.0/src/startup_sbom/report/pdf/templates/report.typ +852 -0
- startup_sbom-2.0.0/src/startup_sbom/report/pdf/viewmodel.py +1031 -0
- startup_sbom-2.0.0/src/startup_sbom/report/sarif.py +363 -0
- startup_sbom-2.0.0/src/startup_sbom/report/spdx.py +244 -0
- startup_sbom-2.0.0/src/startup_sbom/report/writer.py +185 -0
- startup_sbom-2.0.0/src/startup_sbom/rootfs/__init__.py +30 -0
- startup_sbom-2.0.0/src/startup_sbom/rootfs/base.py +325 -0
- startup_sbom-2.0.0/src/startup_sbom/rootfs/caps.py +79 -0
- startup_sbom-2.0.0/src/startup_sbom/rootfs/directory.py +131 -0
- startup_sbom-2.0.0/src/startup_sbom/rootfs/tar.py +355 -0
- startup_sbom-2.0.0/src/startup_sbom/sources/__init__.py +29 -0
- startup_sbom-2.0.0/src/startup_sbom/sources/archive.py +370 -0
- startup_sbom-2.0.0/src/startup_sbom/sources/compression.py +181 -0
- startup_sbom-2.0.0/src/startup_sbom/sources/engine.py +471 -0
- startup_sbom-2.0.0/src/startup_sbom/sources/host.py +128 -0
- startup_sbom-2.0.0/src/startup_sbom/sources/oci.py +346 -0
- startup_sbom-2.0.0/src/startup_sbom/sources/targets.py +262 -0
- startup_sbom-2.0.0/src/startup_sbom/sources/validate.py +205 -0
- startup_sbom-2.0.0/src/startup_sbom/supplychain/__init__.py +102 -0
- startup_sbom-2.0.0/src/startup_sbom/supplychain/blast.py +199 -0
- startup_sbom-2.0.0/src/startup_sbom/supplychain/eol.py +138 -0
- startup_sbom-2.0.0/src/startup_sbom/supplychain/graph.py +436 -0
- startup_sbom-2.0.0/src/startup_sbom/supplychain/integrity.py +221 -0
- startup_sbom-2.0.0/src/startup_sbom/supplychain/provenance.py +494 -0
- startup_sbom-2.0.0/src/startup_sbom/supplychain/repos.py +1505 -0
- startup_sbom-2.0.0/src/startup_sbom/supplychain/vendors.py +186 -0
- startup_sbom-2.0.0/src/startup_sbom/textsafe.py +67 -0
- startup_sbom-2.0.0/src/startup_sbom/threat/__init__.py +20 -0
- startup_sbom-2.0.0/src/startup_sbom/threat/attack.py +232 -0
- startup_sbom-2.0.0/src/startup_sbom/threat/chains.py +276 -0
- startup_sbom-2.0.0/src/startup_sbom/threat/cvss.py +151 -0
- startup_sbom-2.0.0/src/startup_sbom/threat/cwe.py +168 -0
- startup_sbom-2.0.0/src/startup_sbom/threat/facts.py +314 -0
- startup_sbom-2.0.0/src/startup_sbom/threat/narrative.py +156 -0
- startup_sbom-2.0.0/src/startup_sbom/threat/reachability.py +354 -0
- startup_sbom-2.0.0/src/startup_sbom/threat/reverse.py +533 -0
- startup_sbom-2.0.0/src/startup_sbom/threat/rules.py +338 -0
- startup_sbom-2.0.0/src/startup_sbom/threat/scoring.py +170 -0
- startup_sbom-2.0.0/src/startup_sbom/threat/ssvc.py +153 -0
- startup_sbom-2.0.0/src/startup_sbom/tui/__init__.py +31 -0
- startup_sbom-2.0.0/src/startup_sbom/tui/app.py +213 -0
- startup_sbom-2.0.0/src/startup_sbom/tui/commands.py +59 -0
- startup_sbom-2.0.0/src/startup_sbom/tui/data.py +225 -0
- startup_sbom-2.0.0/src/startup_sbom/tui/integrations.py +157 -0
- startup_sbom-2.0.0/src/startup_sbom/tui/messages.py +95 -0
- startup_sbom-2.0.0/src/startup_sbom/tui/render.py +561 -0
- startup_sbom-2.0.0/src/startup_sbom/tui/safe.py +49 -0
- startup_sbom-2.0.0/src/startup_sbom/tui/screens/__init__.py +1 -0
- startup_sbom-2.0.0/src/startup_sbom/tui/screens/ai_panel.py +179 -0
- startup_sbom-2.0.0/src/startup_sbom/tui/screens/article.py +97 -0
- startup_sbom-2.0.0/src/startup_sbom/tui/screens/export.py +119 -0
- startup_sbom-2.0.0/src/startup_sbom/tui/screens/home.py +125 -0
- startup_sbom-2.0.0/src/startup_sbom/tui/screens/open_report.py +85 -0
- startup_sbom-2.0.0/src/startup_sbom/tui/screens/results.py +896 -0
- startup_sbom-2.0.0/src/startup_sbom/tui/screens/scan.py +218 -0
- startup_sbom-2.0.0/src/startup_sbom/tui/screens/settings.py +306 -0
- startup_sbom-2.0.0/src/startup_sbom/tui/screens/target.py +274 -0
- startup_sbom-2.0.0/src/startup_sbom/tui/state.py +506 -0
- startup_sbom-2.0.0/src/startup_sbom/tui/styles.tcss +318 -0
- startup_sbom-2.0.0/src/startup_sbom/tui/widgets.py +67 -0
- startup_sbom-2.0.0/src/startup_sbom/viz/__init__.py +9 -0
- startup_sbom-2.0.0/src/startup_sbom/viz/svg.py +482 -0
- startup_sbom-2.0.0/src/startup_sbom/viz/terminal.py +935 -0
- startup_sbom-2.0.0/src/startup_sbom/vulns/__init__.py +25 -0
- startup_sbom-2.0.0/src/startup_sbom/vulns/arch.py +145 -0
- startup_sbom-2.0.0/src/startup_sbom/vulns/base.py +22 -0
- startup_sbom-2.0.0/src/startup_sbom/vulns/epss.py +167 -0
- startup_sbom-2.0.0/src/startup_sbom/vulns/kev.py +62 -0
- startup_sbom-2.0.0/src/startup_sbom/vulns/match.py +227 -0
- startup_sbom-2.0.0/src/startup_sbom/vulns/normalize.py +345 -0
- startup_sbom-2.0.0/src/startup_sbom/vulns/nvd.py +277 -0
- startup_sbom-2.0.0/src/startup_sbom/vulns/osv.py +651 -0
- startup_sbom-2.0.0/src/startup_sbom/vulns/versions.py +543 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 morpheuslord
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: startup-sbom
|
|
3
|
+
Version: 2.0.0
|
|
4
|
+
Summary: Root-confined static analysis of Linux root filesystems and container images: map what runs at boot to its packages, reverse vulnerabilities into concrete threats, chain attacks and trace supply-chain blast radius.
|
|
5
|
+
Keywords: sbom,cyclonedx,spdx,sarif,vex,systemd,container,oci,vulnerability,cve,threat-modeling,attack-graph,supply-chain
|
|
6
|
+
Author: morpheuslord
|
|
7
|
+
Author-email: morpheuslord <chiranjeevi.naidu@proton.me>
|
|
8
|
+
License-Expression: MIT
|
|
9
|
+
License-File: LICENSE
|
|
10
|
+
Classifier: Development Status :: 4 - Beta
|
|
11
|
+
Classifier: Environment :: Console
|
|
12
|
+
Classifier: Intended Audience :: Developers
|
|
13
|
+
Classifier: Intended Audience :: Information Technology
|
|
14
|
+
Classifier: Intended Audience :: System Administrators
|
|
15
|
+
Classifier: Operating System :: OS Independent
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.15
|
|
23
|
+
Classifier: Topic :: Security
|
|
24
|
+
Classifier: Topic :: System :: Systems Administration
|
|
25
|
+
Classifier: Typing :: Typed
|
|
26
|
+
Requires-Dist: typer>=0.27
|
|
27
|
+
Requires-Dist: rich>=14
|
|
28
|
+
Requires-Dist: pydantic>=2.12
|
|
29
|
+
Requires-Dist: httpx>=0.28.1,<1
|
|
30
|
+
Requires-Dist: cyclonedx-python-lib>=11,<12
|
|
31
|
+
Requires-Dist: packageurl-python>=0.17
|
|
32
|
+
Requires-Dist: license-expression>=30.4
|
|
33
|
+
Requires-Dist: protego>=0.5
|
|
34
|
+
Requires-Dist: platformdirs>=4.4
|
|
35
|
+
Requires-Dist: cvss>=3.6
|
|
36
|
+
Requires-Dist: backports-zstd>=1.0 ; python_full_version < '3.14'
|
|
37
|
+
Requires-Dist: startup-sbom[ai] ; extra == 'agents-server'
|
|
38
|
+
Requires-Dist: fasta2a>=2.1.1,<3 ; extra == 'agents-server'
|
|
39
|
+
Requires-Dist: uvicorn>=0.38 ; extra == 'agents-server'
|
|
40
|
+
Requires-Dist: pydantic-ai-slim[anthropic,openai,google,groq,mistral,openrouter,mcp,duckduckgo]>=2.55,<3 ; extra == 'ai'
|
|
41
|
+
Requires-Dist: mcp>=2.3,<3 ; extra == 'ai'
|
|
42
|
+
Requires-Dist: startup-sbom[tui,pdf,ai,agents-server] ; extra == 'all'
|
|
43
|
+
Requires-Dist: typst>=0.15,<0.16 ; extra == 'pdf'
|
|
44
|
+
Requires-Dist: textual>=8.2,<9 ; extra == 'tui'
|
|
45
|
+
Maintainer: morpheuslord
|
|
46
|
+
Maintainer-email: morpheuslord <chiranjeevi.naidu@proton.me>
|
|
47
|
+
Requires-Python: >=3.11
|
|
48
|
+
Project-URL: Homepage, https://github.com/morpheuslord/Startup-SBOM
|
|
49
|
+
Project-URL: Documentation, https://morpheuslord.github.io/Startup-SBOM/
|
|
50
|
+
Project-URL: Repository, https://github.com/morpheuslord/Startup-SBOM
|
|
51
|
+
Project-URL: Issues, https://github.com/morpheuslord/Startup-SBOM/issues
|
|
52
|
+
Project-URL: Changelog, https://github.com/morpheuslord/Startup-SBOM/blob/main/CHANGELOG.md
|
|
53
|
+
Project-URL: Security, https://github.com/morpheuslord/Startup-SBOM/blob/main/SECURITY.md
|
|
54
|
+
Provides-Extra: agents-server
|
|
55
|
+
Provides-Extra: ai
|
|
56
|
+
Provides-Extra: all
|
|
57
|
+
Provides-Extra: pdf
|
|
58
|
+
Provides-Extra: tui
|
|
59
|
+
Description-Content-Type: text/markdown
|
|
60
|
+
|
|
61
|
+
<p align="center">
|
|
62
|
+
<img src="https://raw.githubusercontent.com/morpheuslord/Startup-SBOM/main/Docs/assets/logo.svg" alt="Startup-SBOM logo" width="140">
|
|
63
|
+
</p>
|
|
64
|
+
|
|
65
|
+
<h1 align="center">Startup-SBOM</h1>
|
|
66
|
+
|
|
67
|
+
<p align="center"><strong>What runs at boot, what it is made of, and how it can be attacked.</strong></p>
|
|
68
|
+
|
|
69
|
+
<p align="center">
|
|
70
|
+
<a href="https://pypi.org/project/startup-sbom/"><img src="https://img.shields.io/pypi/v/startup-sbom" alt="PyPI version"></a>
|
|
71
|
+
<a href="https://pypi.org/project/startup-sbom/"><img src="https://img.shields.io/pypi/pyversions/startup-sbom" alt="Python versions"></a>
|
|
72
|
+
<a href="https://github.com/morpheuslord/Startup-SBOM/actions/workflows/ci.yml"><img src="https://github.com/morpheuslord/Startup-SBOM/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
|
|
73
|
+
<a href="https://morpheuslord.github.io/Startup-SBOM/"><img src="https://img.shields.io/badge/docs-GitHub%20Pages-06b6d4" alt="Documentation"></a>
|
|
74
|
+
<a href="https://github.com/morpheuslord/Startup-SBOM/blob/main/LICENSE"><img src="https://img.shields.io/pypi/l/startup-sbom" alt="License: MIT"></a>
|
|
75
|
+
</p>
|
|
76
|
+
|
|
77
|
+
<p align="center"><a href="https://morpheuslord.github.io/Startup-SBOM/"><strong>Read the documentation →</strong></a></p>
|
|
78
|
+
|
|
79
|
+
Startup-SBOM statically analyses a Linux root filesystem, container or image and
|
|
80
|
+
answers three questions most SBOM tools can't:
|
|
81
|
+
|
|
82
|
+
1. **Vulnerability → threat.** Not "openssl has 14 CVEs", but *"an unauthenticated
|
|
83
|
+
remote attacker who can reach TCP/22 could exploit CVE-2024-6387 in
|
|
84
|
+
openssh-server (sshd, `ssh.service`, enabled at boot, runs as root) to execute
|
|
85
|
+
code as root — EPSS 0.94, known exploited. Fix: upgrade to 1:9.2p1-2+deb12u3."*
|
|
86
|
+
Every finding is placed in context: is it reachable at boot, through which service,
|
|
87
|
+
linked by which binary, as which user, network-exposed, mitigated by which
|
|
88
|
+
systemd hardening, mapped to MITRE ATT&CK, with a CISA SSVC decision
|
|
89
|
+
(Track / Track\* / Attend / Act).
|
|
90
|
+
2. **Chained attacks.** A privilege-state attack graph
|
|
91
|
+
(`remote → local:<user> → root → container escape → persistence`) built from
|
|
92
|
+
vulnerabilities *and* misconfigurations (setuid/capability binaries, privileged
|
|
93
|
+
containers, mounted Docker socket, kernel CVEs, writable units), pruned by
|
|
94
|
+
hardening and ranked by likelihood × impact.
|
|
95
|
+
3. **Supply-chain blast radius.** A vendor → source package → binary package →
|
|
96
|
+
file → service graph built from real code-loading edges (ELF `DT_NEEDED`,
|
|
97
|
+
`.note.dlopen`, `ld.so.preload`, interpreters). It catches the
|
|
98
|
+
xz → liblzma → libsystemd → sshd class of problem, which package dependencies
|
|
99
|
+
alone miss. It also flags provenance risks: third-party repositories, unsigned or
|
|
100
|
+
locally built packages, unmanaged binaries, modified files and EOL distributions.
|
|
101
|
+
|
|
102
|
+
It is **read-only by design**: nothing in the target is executed, mounted,
|
|
103
|
+
extracted or modified, and symlinks can never escape the analysed root.
|
|
104
|
+
|
|
105
|
+
## Install
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
uv tool install startup-sbom # or: pipx install startup-sbom
|
|
109
|
+
uvx startup-sbom --help # run without installing
|
|
110
|
+
docker run --rm ghcr.io/morpheuslord/startup-sbom --help
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
The core scanner has no heavy dependencies; optional features are extras:
|
|
114
|
+
|
|
115
|
+
| Extra | Adds |
|
|
116
|
+
|---|---|
|
|
117
|
+
| `startup-sbom[tui]` | Interactive terminal UI (`startup-sbom tui`) |
|
|
118
|
+
| `startup-sbom[pdf]` | PDF reports (`-f pdf`, Typst; PDF/A-3u + PDF/UA-1 by default) |
|
|
119
|
+
| `startup-sbom[ai]` | AI analysis across multiple LLM providers, DuckDuckGo search, MCP server |
|
|
120
|
+
| `startup-sbom[agents-server]` | A2A and ACP agent servers |
|
|
121
|
+
| `startup-sbom[all]` | Everything above |
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
uv tool install "startup-sbom[all]"
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
From source:
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
git clone https://github.com/morpheuslord/Startup-SBOM && cd Startup-SBOM
|
|
131
|
+
uv sync
|
|
132
|
+
uv run startup-sbom --help
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
Python ≥ 3.11 on Linux, macOS or Windows. Everything except `host:` mode and live
|
|
136
|
+
container acquisition is pure Python and host-OS independent.
|
|
137
|
+
|
|
138
|
+
## Usage
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
# A mounted disk or extracted rootfs
|
|
142
|
+
startup-sbom scan dir:/mnt/target_root -f html -f cyclonedx -o out/
|
|
143
|
+
|
|
144
|
+
# A running or stopped container (docker / podman / nerdctl)
|
|
145
|
+
startup-sbom scan docker:web -f json -f sarif
|
|
146
|
+
|
|
147
|
+
# Images without a container engine
|
|
148
|
+
startup-sbom scan docker-archive:./image.tar # docker/podman save
|
|
149
|
+
startup-sbom scan oci-dir:./layout # OCI image layout
|
|
150
|
+
startup-sbom scan tar:./rootfs.tar.zst # docker export / rootfs tarball
|
|
151
|
+
|
|
152
|
+
# The machine you are on (Linux)
|
|
153
|
+
sudo startup-sbom scan host: -f markdown
|
|
154
|
+
|
|
155
|
+
# CI gate: fail when anything warrants immediate action
|
|
156
|
+
startup-sbom scan oci-archive:img.tar -f sarif --fail-on act
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
| Option | Meaning |
|
|
160
|
+
|---|---|
|
|
161
|
+
| `-f, --format` | `json`, `cyclonedx`, `spdx`, `sarif`, `openvex`, `cdx-vex`, `markdown`, `html`, `dot`, `mermaid`, `pdf` (repeatable) |
|
|
162
|
+
| `-o, --output` | Output directory (default `./startup-sbom-out`), or `-` to stream one format to stdout |
|
|
163
|
+
| `--offline` | No network; use cached intelligence only |
|
|
164
|
+
| `--sources` | Vulnerability sources: `osv`, `arch`, `nvd` (opt-in, set `NVD_API_KEY`), or `none` |
|
|
165
|
+
| `--no-epss`, `--no-kev`, `--no-eol` | Skip exploit-prediction, known-exploited and end-of-life enrichment |
|
|
166
|
+
| `--no-language-packages` | Skip Python/npm/Go/Java/Rust inventory |
|
|
167
|
+
| `--no-link-analysis` | Skip ELF library reachability |
|
|
168
|
+
| `--integrity` | Verify installed files against package-database digests |
|
|
169
|
+
| `--boot-timing FILE` | `systemd-analyze plot` SVG or `blame` output captured on the target |
|
|
170
|
+
| `--platform` | Select a platform from a multi-arch image, e.g. `linux/arm64` |
|
|
171
|
+
| `--cdx-spec` | CycloneDX `1.5`, `1.6` (default) or `1.7` |
|
|
172
|
+
| `--fail-on` | `low` … `critical` (vulnerability severity) or `attend` / `act` (SSVC) |
|
|
173
|
+
| `--prefetch-intel` | Fetch advisories, exploit references and articles for the top findings (opt-in, online) |
|
|
174
|
+
| `-q`, `-v`, `--debug` | Quiet / verbose / debug |
|
|
175
|
+
|
|
176
|
+
Other commands: `startup-sbom tui` (interactive UI), `startup-sbom ai …` (AI analysis
|
|
177
|
+
and agent servers), `startup-sbom intel …` (CVE intelligence lookup),
|
|
178
|
+
`startup-sbom db update|status|clear` (cache KEV/EPSS for offline use),
|
|
179
|
+
`startup-sbom schema` (JSON Schema of the native report), `startup-sbom version`.
|
|
180
|
+
|
|
181
|
+
Exit codes: `0` success, `1` `--fail-on` threshold reached, `2` usage or target
|
|
182
|
+
error, `3` internal error.
|
|
183
|
+
|
|
184
|
+
### Outputs
|
|
185
|
+
|
|
186
|
+
| Format | File | Use it for |
|
|
187
|
+
|---|---|---|
|
|
188
|
+
| `json` | `report.json` | Complete native report (versioned schema) |
|
|
189
|
+
| `cyclonedx` | `sbom.cdx.json` | Dependency-Track, Grype, Trivy; includes services, dependencies and vulnerabilities |
|
|
190
|
+
| `spdx` | `sbom.spdx.json` | SPDX 2.3 consumers |
|
|
191
|
+
| `sarif` | `results.sarif` | GitHub code scanning / CI annotations |
|
|
192
|
+
| `openvex`, `cdx-vex` | `vex.*.json` | Reachability-aware VEX for Grype, Trivy, Dependency-Track |
|
|
193
|
+
| `markdown` | `report.md` | Pull requests and wikis (Mermaid attack graphs render on GitHub) |
|
|
194
|
+
| `html` | `report.html` | Self-contained interactive report (works offline) |
|
|
195
|
+
| `dot`, `mermaid` | `attack-graph.*` | Attack graph for Graphviz / Mermaid |
|
|
196
|
+
| `pdf` | `report.pdf` | Archival PDF with explanations and charts; the JSON report is attached inside |
|
|
197
|
+
|
|
198
|
+
VEX is conservative. A vulnerable package with no observed execution path is
|
|
199
|
+
reported as `under_investigation`, not `not_affected`, because "not started at
|
|
200
|
+
boot" is not the same as "unreachable". Opt in with `--vex-unreachable-not-affected`.
|
|
201
|
+
|
|
202
|
+
## Beyond the scanner
|
|
203
|
+
|
|
204
|
+
**Explainable results.** Every risk score decomposes exactly into its factors
|
|
205
|
+
(baseline + contributions = total), every SSVC decision carries its decision path
|
|
206
|
+
and the flips that would change it, and the report proposes a minimal fix plan
|
|
207
|
+
that breaks every attack chain. The console, HTML, Markdown and PDF outputs render
|
|
208
|
+
these as charts and graphs.
|
|
209
|
+
|
|
210
|
+
**Interactive TUI.** `startup-sbom tui` walks through target selection, scan
|
|
211
|
+
settings, a live scan and an eight-tab results browser with search, filters,
|
|
212
|
+
explanations, intel articles and export.
|
|
213
|
+
|
|
214
|
+
**Intel prefetch.** `--prefetch-intel` gathers vendor advisories, exploit and PoC
|
|
215
|
+
references and readable articles for the highest-risk findings, over an
|
|
216
|
+
SSRF-hardened fetcher. Public exploitation evidence can raise a threat's priority,
|
|
217
|
+
never lower it.
|
|
218
|
+
|
|
219
|
+
**AI analysis.** `startup-sbom ai analyze report.json` runs grounded agents over a
|
|
220
|
+
report on your choice of LLM provider (Anthropic, OpenAI, Google, Groq, Mistral,
|
|
221
|
+
OpenRouter, Ollama) with `--provider`, `--model` or `--profile cheap|balanced|quality`,
|
|
222
|
+
optional DuckDuckGo search and a cost ceiling. Claims the report doesn't support
|
|
223
|
+
are flagged. The same analysis is available over MCP (Model Context Protocol) and as
|
|
224
|
+
A2A / ACP (Agent Communication Protocol) agent servers.
|
|
225
|
+
|
|
226
|
+
## Integrations
|
|
227
|
+
|
|
228
|
+
**GitHub Action**
|
|
229
|
+
|
|
230
|
+
```yaml
|
|
231
|
+
- uses: morpheuslord/Startup-SBOM@v2
|
|
232
|
+
with:
|
|
233
|
+
target: oci-archive:image.tar
|
|
234
|
+
formats: sarif,cyclonedx
|
|
235
|
+
fail-on: act
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
**pre-commit**
|
|
239
|
+
|
|
240
|
+
```yaml
|
|
241
|
+
- repo: https://github.com/morpheuslord/Startup-SBOM
|
|
242
|
+
rev: v2.0.0
|
|
243
|
+
hooks:
|
|
244
|
+
- id: startup-sbom
|
|
245
|
+
args: [scan, "dir:rootfs", --offline, --fail-on, act]
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
**Python**
|
|
249
|
+
|
|
250
|
+
```python
|
|
251
|
+
from startup_sbom import ScanOptions, scan
|
|
252
|
+
|
|
253
|
+
report = scan("docker-archive:image.tar", ScanOptions(offline=True))
|
|
254
|
+
for chain in report.attack_chains:
|
|
255
|
+
print(chain.ssvc_decision, chain.narrative)
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
## Coverage
|
|
259
|
+
|
|
260
|
+
| Area | Supported |
|
|
261
|
+
|---|---|
|
|
262
|
+
| Package databases | dpkg (incl. distroless `status.d`), rpm (sqlite, Berkeley DB, NDB, without host rpm), apk, pacman |
|
|
263
|
+
| Distributions | Debian, Ubuntu, RHEL, Rocky, AlmaLinux, CentOS, Fedora, Oracle, Amazon Linux, SUSE/openSUSE, Azure Linux, Alpine, Wolfi/Chainguard, Arch |
|
|
264
|
+
| Service managers | systemd (search paths, drop-ins, masks, templates, aliases, sockets, timers, boot graph, hardening exposure), SysV/LSB, OpenRC, runit, s6/s6-overlay, supervisord, BusyBox inittab, container entrypoints (tini/dumb-init/`sh -c` unwrapped) |
|
|
265
|
+
| Inputs | directories, live host, rootfs tarballs (gz/xz/bz2/zstd), docker/podman save archives, OCI layouts and archives, docker/podman/nerdctl containers and images |
|
|
266
|
+
| Vulnerability intelligence | OSV.dev (distro-aware, source-package matching), Arch security tracker, NVD (opt-in), FIRST EPSS, CISA KEV, endoflife.date |
|
|
267
|
+
| Language packages | Python, npm, Go (buildinfo), Java (Maven metadata), Rust (cargo-auditable) |
|
|
268
|
+
|
|
269
|
+
When a distribution is not covered by a vulnerability source, the report says so
|
|
270
|
+
explicitly under coverage limitations. It never returns a silent "0 vulnerabilities".
|
|
271
|
+
|
|
272
|
+
## Security model
|
|
273
|
+
|
|
274
|
+
* Never executes, mounts, chroots or uses `sudo`; never writes into the target.
|
|
275
|
+
* All target paths are resolved inside the analysed root, with a symlink budget.
|
|
276
|
+
Non-regular files are refused and reads are size-capped.
|
|
277
|
+
* Archives are indexed in place, never extracted. Setuid bits and file capabilities
|
|
278
|
+
are preserved for analysis.
|
|
279
|
+
* Network access is limited to an allow-list of HTTPS endpoints with TLS
|
|
280
|
+
verification. `--offline` disables it entirely.
|
|
281
|
+
* Container environment variable values are never recorded.
|
|
282
|
+
|
|
283
|
+
See [SECURITY.md](https://github.com/morpheuslord/Startup-SBOM/blob/main/SECURITY.md) for reporting vulnerabilities.
|
|
284
|
+
|
|
285
|
+
## Upgrading from 1.x
|
|
286
|
+
|
|
287
|
+
`python3 main.py …` still works through a compatibility shim that maps the old
|
|
288
|
+
flags. The old `chroot` mode has been removed: it bind-mounted the target over the
|
|
289
|
+
host's `/usr`, `/bin` and `/lib` and ran target binaries as root. Capture
|
|
290
|
+
`systemd-analyze plot > boot.svg` on the target and pass `--boot-timing boot.svg`
|
|
291
|
+
instead. See the [refactor plan](https://github.com/morpheuslord/Startup-SBOM/blob/main/Docs/Refactor%20Plan.md) for every change.
|
|
292
|
+
|
|
293
|
+
## Citation
|
|
294
|
+
|
|
295
|
+
[](https://doi.org/10.5281/zenodo.19307312)
|
|
296
|
+
See [CITATION.cff](https://github.com/morpheuslord/Startup-SBOM/blob/main/CITATION.cff).
|
|
297
|
+
|
|
298
|
+
## License
|
|
299
|
+
|
|
300
|
+
MIT. Bundled MITRE CWE/CAPEC/ATT&CK-derived data and CTID mappings are
|
|
301
|
+
redistributed under their own terms; see [NOTICE.md](https://github.com/morpheuslord/Startup-SBOM/blob/main/src/startup_sbom/data/NOTICE.md).
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="https://raw.githubusercontent.com/morpheuslord/Startup-SBOM/main/Docs/assets/logo.svg" alt="Startup-SBOM logo" width="140">
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
<h1 align="center">Startup-SBOM</h1>
|
|
6
|
+
|
|
7
|
+
<p align="center"><strong>What runs at boot, what it is made of, and how it can be attacked.</strong></p>
|
|
8
|
+
|
|
9
|
+
<p align="center">
|
|
10
|
+
<a href="https://pypi.org/project/startup-sbom/"><img src="https://img.shields.io/pypi/v/startup-sbom" alt="PyPI version"></a>
|
|
11
|
+
<a href="https://pypi.org/project/startup-sbom/"><img src="https://img.shields.io/pypi/pyversions/startup-sbom" alt="Python versions"></a>
|
|
12
|
+
<a href="https://github.com/morpheuslord/Startup-SBOM/actions/workflows/ci.yml"><img src="https://github.com/morpheuslord/Startup-SBOM/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
|
|
13
|
+
<a href="https://morpheuslord.github.io/Startup-SBOM/"><img src="https://img.shields.io/badge/docs-GitHub%20Pages-06b6d4" alt="Documentation"></a>
|
|
14
|
+
<a href="https://github.com/morpheuslord/Startup-SBOM/blob/main/LICENSE"><img src="https://img.shields.io/pypi/l/startup-sbom" alt="License: MIT"></a>
|
|
15
|
+
</p>
|
|
16
|
+
|
|
17
|
+
<p align="center"><a href="https://morpheuslord.github.io/Startup-SBOM/"><strong>Read the documentation →</strong></a></p>
|
|
18
|
+
|
|
19
|
+
Startup-SBOM statically analyses a Linux root filesystem, container or image and
|
|
20
|
+
answers three questions most SBOM tools can't:
|
|
21
|
+
|
|
22
|
+
1. **Vulnerability → threat.** Not "openssl has 14 CVEs", but *"an unauthenticated
|
|
23
|
+
remote attacker who can reach TCP/22 could exploit CVE-2024-6387 in
|
|
24
|
+
openssh-server (sshd, `ssh.service`, enabled at boot, runs as root) to execute
|
|
25
|
+
code as root — EPSS 0.94, known exploited. Fix: upgrade to 1:9.2p1-2+deb12u3."*
|
|
26
|
+
Every finding is placed in context: is it reachable at boot, through which service,
|
|
27
|
+
linked by which binary, as which user, network-exposed, mitigated by which
|
|
28
|
+
systemd hardening, mapped to MITRE ATT&CK, with a CISA SSVC decision
|
|
29
|
+
(Track / Track\* / Attend / Act).
|
|
30
|
+
2. **Chained attacks.** A privilege-state attack graph
|
|
31
|
+
(`remote → local:<user> → root → container escape → persistence`) built from
|
|
32
|
+
vulnerabilities *and* misconfigurations (setuid/capability binaries, privileged
|
|
33
|
+
containers, mounted Docker socket, kernel CVEs, writable units), pruned by
|
|
34
|
+
hardening and ranked by likelihood × impact.
|
|
35
|
+
3. **Supply-chain blast radius.** A vendor → source package → binary package →
|
|
36
|
+
file → service graph built from real code-loading edges (ELF `DT_NEEDED`,
|
|
37
|
+
`.note.dlopen`, `ld.so.preload`, interpreters). It catches the
|
|
38
|
+
xz → liblzma → libsystemd → sshd class of problem, which package dependencies
|
|
39
|
+
alone miss. It also flags provenance risks: third-party repositories, unsigned or
|
|
40
|
+
locally built packages, unmanaged binaries, modified files and EOL distributions.
|
|
41
|
+
|
|
42
|
+
It is **read-only by design**: nothing in the target is executed, mounted,
|
|
43
|
+
extracted or modified, and symlinks can never escape the analysed root.
|
|
44
|
+
|
|
45
|
+
## Install
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
uv tool install startup-sbom # or: pipx install startup-sbom
|
|
49
|
+
uvx startup-sbom --help # run without installing
|
|
50
|
+
docker run --rm ghcr.io/morpheuslord/startup-sbom --help
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
The core scanner has no heavy dependencies; optional features are extras:
|
|
54
|
+
|
|
55
|
+
| Extra | Adds |
|
|
56
|
+
|---|---|
|
|
57
|
+
| `startup-sbom[tui]` | Interactive terminal UI (`startup-sbom tui`) |
|
|
58
|
+
| `startup-sbom[pdf]` | PDF reports (`-f pdf`, Typst; PDF/A-3u + PDF/UA-1 by default) |
|
|
59
|
+
| `startup-sbom[ai]` | AI analysis across multiple LLM providers, DuckDuckGo search, MCP server |
|
|
60
|
+
| `startup-sbom[agents-server]` | A2A and ACP agent servers |
|
|
61
|
+
| `startup-sbom[all]` | Everything above |
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
uv tool install "startup-sbom[all]"
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
From source:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
git clone https://github.com/morpheuslord/Startup-SBOM && cd Startup-SBOM
|
|
71
|
+
uv sync
|
|
72
|
+
uv run startup-sbom --help
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Python ≥ 3.11 on Linux, macOS or Windows. Everything except `host:` mode and live
|
|
76
|
+
container acquisition is pure Python and host-OS independent.
|
|
77
|
+
|
|
78
|
+
## Usage
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
# A mounted disk or extracted rootfs
|
|
82
|
+
startup-sbom scan dir:/mnt/target_root -f html -f cyclonedx -o out/
|
|
83
|
+
|
|
84
|
+
# A running or stopped container (docker / podman / nerdctl)
|
|
85
|
+
startup-sbom scan docker:web -f json -f sarif
|
|
86
|
+
|
|
87
|
+
# Images without a container engine
|
|
88
|
+
startup-sbom scan docker-archive:./image.tar # docker/podman save
|
|
89
|
+
startup-sbom scan oci-dir:./layout # OCI image layout
|
|
90
|
+
startup-sbom scan tar:./rootfs.tar.zst # docker export / rootfs tarball
|
|
91
|
+
|
|
92
|
+
# The machine you are on (Linux)
|
|
93
|
+
sudo startup-sbom scan host: -f markdown
|
|
94
|
+
|
|
95
|
+
# CI gate: fail when anything warrants immediate action
|
|
96
|
+
startup-sbom scan oci-archive:img.tar -f sarif --fail-on act
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
| Option | Meaning |
|
|
100
|
+
|---|---|
|
|
101
|
+
| `-f, --format` | `json`, `cyclonedx`, `spdx`, `sarif`, `openvex`, `cdx-vex`, `markdown`, `html`, `dot`, `mermaid`, `pdf` (repeatable) |
|
|
102
|
+
| `-o, --output` | Output directory (default `./startup-sbom-out`), or `-` to stream one format to stdout |
|
|
103
|
+
| `--offline` | No network; use cached intelligence only |
|
|
104
|
+
| `--sources` | Vulnerability sources: `osv`, `arch`, `nvd` (opt-in, set `NVD_API_KEY`), or `none` |
|
|
105
|
+
| `--no-epss`, `--no-kev`, `--no-eol` | Skip exploit-prediction, known-exploited and end-of-life enrichment |
|
|
106
|
+
| `--no-language-packages` | Skip Python/npm/Go/Java/Rust inventory |
|
|
107
|
+
| `--no-link-analysis` | Skip ELF library reachability |
|
|
108
|
+
| `--integrity` | Verify installed files against package-database digests |
|
|
109
|
+
| `--boot-timing FILE` | `systemd-analyze plot` SVG or `blame` output captured on the target |
|
|
110
|
+
| `--platform` | Select a platform from a multi-arch image, e.g. `linux/arm64` |
|
|
111
|
+
| `--cdx-spec` | CycloneDX `1.5`, `1.6` (default) or `1.7` |
|
|
112
|
+
| `--fail-on` | `low` … `critical` (vulnerability severity) or `attend` / `act` (SSVC) |
|
|
113
|
+
| `--prefetch-intel` | Fetch advisories, exploit references and articles for the top findings (opt-in, online) |
|
|
114
|
+
| `-q`, `-v`, `--debug` | Quiet / verbose / debug |
|
|
115
|
+
|
|
116
|
+
Other commands: `startup-sbom tui` (interactive UI), `startup-sbom ai …` (AI analysis
|
|
117
|
+
and agent servers), `startup-sbom intel …` (CVE intelligence lookup),
|
|
118
|
+
`startup-sbom db update|status|clear` (cache KEV/EPSS for offline use),
|
|
119
|
+
`startup-sbom schema` (JSON Schema of the native report), `startup-sbom version`.
|
|
120
|
+
|
|
121
|
+
Exit codes: `0` success, `1` `--fail-on` threshold reached, `2` usage or target
|
|
122
|
+
error, `3` internal error.
|
|
123
|
+
|
|
124
|
+
### Outputs
|
|
125
|
+
|
|
126
|
+
| Format | File | Use it for |
|
|
127
|
+
|---|---|---|
|
|
128
|
+
| `json` | `report.json` | Complete native report (versioned schema) |
|
|
129
|
+
| `cyclonedx` | `sbom.cdx.json` | Dependency-Track, Grype, Trivy; includes services, dependencies and vulnerabilities |
|
|
130
|
+
| `spdx` | `sbom.spdx.json` | SPDX 2.3 consumers |
|
|
131
|
+
| `sarif` | `results.sarif` | GitHub code scanning / CI annotations |
|
|
132
|
+
| `openvex`, `cdx-vex` | `vex.*.json` | Reachability-aware VEX for Grype, Trivy, Dependency-Track |
|
|
133
|
+
| `markdown` | `report.md` | Pull requests and wikis (Mermaid attack graphs render on GitHub) |
|
|
134
|
+
| `html` | `report.html` | Self-contained interactive report (works offline) |
|
|
135
|
+
| `dot`, `mermaid` | `attack-graph.*` | Attack graph for Graphviz / Mermaid |
|
|
136
|
+
| `pdf` | `report.pdf` | Archival PDF with explanations and charts; the JSON report is attached inside |
|
|
137
|
+
|
|
138
|
+
VEX is conservative. A vulnerable package with no observed execution path is
|
|
139
|
+
reported as `under_investigation`, not `not_affected`, because "not started at
|
|
140
|
+
boot" is not the same as "unreachable". Opt in with `--vex-unreachable-not-affected`.
|
|
141
|
+
|
|
142
|
+
## Beyond the scanner
|
|
143
|
+
|
|
144
|
+
**Explainable results.** Every risk score decomposes exactly into its factors
|
|
145
|
+
(baseline + contributions = total), every SSVC decision carries its decision path
|
|
146
|
+
and the flips that would change it, and the report proposes a minimal fix plan
|
|
147
|
+
that breaks every attack chain. The console, HTML, Markdown and PDF outputs render
|
|
148
|
+
these as charts and graphs.
|
|
149
|
+
|
|
150
|
+
**Interactive TUI.** `startup-sbom tui` walks through target selection, scan
|
|
151
|
+
settings, a live scan and an eight-tab results browser with search, filters,
|
|
152
|
+
explanations, intel articles and export.
|
|
153
|
+
|
|
154
|
+
**Intel prefetch.** `--prefetch-intel` gathers vendor advisories, exploit and PoC
|
|
155
|
+
references and readable articles for the highest-risk findings, over an
|
|
156
|
+
SSRF-hardened fetcher. Public exploitation evidence can raise a threat's priority,
|
|
157
|
+
never lower it.
|
|
158
|
+
|
|
159
|
+
**AI analysis.** `startup-sbom ai analyze report.json` runs grounded agents over a
|
|
160
|
+
report on your choice of LLM provider (Anthropic, OpenAI, Google, Groq, Mistral,
|
|
161
|
+
OpenRouter, Ollama) with `--provider`, `--model` or `--profile cheap|balanced|quality`,
|
|
162
|
+
optional DuckDuckGo search and a cost ceiling. Claims the report doesn't support
|
|
163
|
+
are flagged. The same analysis is available over MCP (Model Context Protocol) and as
|
|
164
|
+
A2A / ACP (Agent Communication Protocol) agent servers.
|
|
165
|
+
|
|
166
|
+
## Integrations
|
|
167
|
+
|
|
168
|
+
**GitHub Action**
|
|
169
|
+
|
|
170
|
+
```yaml
|
|
171
|
+
- uses: morpheuslord/Startup-SBOM@v2
|
|
172
|
+
with:
|
|
173
|
+
target: oci-archive:image.tar
|
|
174
|
+
formats: sarif,cyclonedx
|
|
175
|
+
fail-on: act
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
**pre-commit**
|
|
179
|
+
|
|
180
|
+
```yaml
|
|
181
|
+
- repo: https://github.com/morpheuslord/Startup-SBOM
|
|
182
|
+
rev: v2.0.0
|
|
183
|
+
hooks:
|
|
184
|
+
- id: startup-sbom
|
|
185
|
+
args: [scan, "dir:rootfs", --offline, --fail-on, act]
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
**Python**
|
|
189
|
+
|
|
190
|
+
```python
|
|
191
|
+
from startup_sbom import ScanOptions, scan
|
|
192
|
+
|
|
193
|
+
report = scan("docker-archive:image.tar", ScanOptions(offline=True))
|
|
194
|
+
for chain in report.attack_chains:
|
|
195
|
+
print(chain.ssvc_decision, chain.narrative)
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
## Coverage
|
|
199
|
+
|
|
200
|
+
| Area | Supported |
|
|
201
|
+
|---|---|
|
|
202
|
+
| Package databases | dpkg (incl. distroless `status.d`), rpm (sqlite, Berkeley DB, NDB, without host rpm), apk, pacman |
|
|
203
|
+
| Distributions | Debian, Ubuntu, RHEL, Rocky, AlmaLinux, CentOS, Fedora, Oracle, Amazon Linux, SUSE/openSUSE, Azure Linux, Alpine, Wolfi/Chainguard, Arch |
|
|
204
|
+
| Service managers | systemd (search paths, drop-ins, masks, templates, aliases, sockets, timers, boot graph, hardening exposure), SysV/LSB, OpenRC, runit, s6/s6-overlay, supervisord, BusyBox inittab, container entrypoints (tini/dumb-init/`sh -c` unwrapped) |
|
|
205
|
+
| Inputs | directories, live host, rootfs tarballs (gz/xz/bz2/zstd), docker/podman save archives, OCI layouts and archives, docker/podman/nerdctl containers and images |
|
|
206
|
+
| Vulnerability intelligence | OSV.dev (distro-aware, source-package matching), Arch security tracker, NVD (opt-in), FIRST EPSS, CISA KEV, endoflife.date |
|
|
207
|
+
| Language packages | Python, npm, Go (buildinfo), Java (Maven metadata), Rust (cargo-auditable) |
|
|
208
|
+
|
|
209
|
+
When a distribution is not covered by a vulnerability source, the report says so
|
|
210
|
+
explicitly under coverage limitations. It never returns a silent "0 vulnerabilities".
|
|
211
|
+
|
|
212
|
+
## Security model
|
|
213
|
+
|
|
214
|
+
* Never executes, mounts, chroots or uses `sudo`; never writes into the target.
|
|
215
|
+
* All target paths are resolved inside the analysed root, with a symlink budget.
|
|
216
|
+
Non-regular files are refused and reads are size-capped.
|
|
217
|
+
* Archives are indexed in place, never extracted. Setuid bits and file capabilities
|
|
218
|
+
are preserved for analysis.
|
|
219
|
+
* Network access is limited to an allow-list of HTTPS endpoints with TLS
|
|
220
|
+
verification. `--offline` disables it entirely.
|
|
221
|
+
* Container environment variable values are never recorded.
|
|
222
|
+
|
|
223
|
+
See [SECURITY.md](https://github.com/morpheuslord/Startup-SBOM/blob/main/SECURITY.md) for reporting vulnerabilities.
|
|
224
|
+
|
|
225
|
+
## Upgrading from 1.x
|
|
226
|
+
|
|
227
|
+
`python3 main.py …` still works through a compatibility shim that maps the old
|
|
228
|
+
flags. The old `chroot` mode has been removed: it bind-mounted the target over the
|
|
229
|
+
host's `/usr`, `/bin` and `/lib` and ran target binaries as root. Capture
|
|
230
|
+
`systemd-analyze plot > boot.svg` on the target and pass `--boot-timing boot.svg`
|
|
231
|
+
instead. See the [refactor plan](https://github.com/morpheuslord/Startup-SBOM/blob/main/Docs/Refactor%20Plan.md) for every change.
|
|
232
|
+
|
|
233
|
+
## Citation
|
|
234
|
+
|
|
235
|
+
[](https://doi.org/10.5281/zenodo.19307312)
|
|
236
|
+
See [CITATION.cff](https://github.com/morpheuslord/Startup-SBOM/blob/main/CITATION.cff).
|
|
237
|
+
|
|
238
|
+
## License
|
|
239
|
+
|
|
240
|
+
MIT. Bundled MITRE CWE/CAPEC/ATT&CK-derived data and CTID mappings are
|
|
241
|
+
redistributed under their own terms; see [NOTICE.md](https://github.com/morpheuslord/Startup-SBOM/blob/main/src/startup_sbom/data/NOTICE.md).
|