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.
Files changed (188) hide show
  1. startup_sbom-2.0.0/LICENSE +21 -0
  2. startup_sbom-2.0.0/PKG-INFO +301 -0
  3. startup_sbom-2.0.0/README.md +241 -0
  4. startup_sbom-2.0.0/pyproject.toml +255 -0
  5. startup_sbom-2.0.0/pyproject.toml.orig +156 -0
  6. startup_sbom-2.0.0/src/startup_sbom/__init__.py +45 -0
  7. startup_sbom-2.0.0/src/startup_sbom/__main__.py +6 -0
  8. startup_sbom-2.0.0/src/startup_sbom/ai/__init__.py +84 -0
  9. startup_sbom-2.0.0/src/startup_sbom/ai/a2a.py +208 -0
  10. startup_sbom-2.0.0/src/startup_sbom/ai/acp.py +274 -0
  11. startup_sbom-2.0.0/src/startup_sbom/ai/agents.py +251 -0
  12. startup_sbom-2.0.0/src/startup_sbom/ai/cli.py +289 -0
  13. startup_sbom-2.0.0/src/startup_sbom/ai/grounding.py +321 -0
  14. startup_sbom-2.0.0/src/startup_sbom/ai/index.py +578 -0
  15. startup_sbom-2.0.0/src/startup_sbom/ai/mcp_server.py +360 -0
  16. startup_sbom-2.0.0/src/startup_sbom/ai/orchestrator.py +537 -0
  17. startup_sbom-2.0.0/src/startup_sbom/ai/outputs.py +222 -0
  18. startup_sbom-2.0.0/src/startup_sbom/ai/prompts.py +114 -0
  19. startup_sbom-2.0.0/src/startup_sbom/ai/providers.py +366 -0
  20. startup_sbom-2.0.0/src/startup_sbom/ai/registry.py +417 -0
  21. startup_sbom-2.0.0/src/startup_sbom/ai/tools.py +237 -0
  22. startup_sbom-2.0.0/src/startup_sbom/ai/websearch.py +93 -0
  23. startup_sbom-2.0.0/src/startup_sbom/binaries/__init__.py +20 -0
  24. startup_sbom-2.0.0/src/startup_sbom/binaries/analyze.py +450 -0
  25. startup_sbom-2.0.0/src/startup_sbom/binaries/elf.py +633 -0
  26. startup_sbom-2.0.0/src/startup_sbom/binaries/linker.py +492 -0
  27. startup_sbom-2.0.0/src/startup_sbom/binaries/privileged.py +169 -0
  28. startup_sbom-2.0.0/src/startup_sbom/binaries/shebang.py +119 -0
  29. startup_sbom-2.0.0/src/startup_sbom/boottime.py +90 -0
  30. startup_sbom-2.0.0/src/startup_sbom/cli.py +398 -0
  31. startup_sbom-2.0.0/src/startup_sbom/context.py +70 -0
  32. startup_sbom-2.0.0/src/startup_sbom/data/NOTICE.md +74 -0
  33. startup_sbom-2.0.0/src/startup_sbom/data/attack_techniques.json +1 -0
  34. startup_sbom-2.0.0/src/startup_sbom/data/capec_attack.json +1 -0
  35. startup_sbom-2.0.0/src/startup_sbom/data/cwe.json +1 -0
  36. startup_sbom-2.0.0/src/startup_sbom/data/kev_attack.json +1 -0
  37. startup_sbom-2.0.0/src/startup_sbom/distro.py +456 -0
  38. startup_sbom-2.0.0/src/startup_sbom/errors.py +47 -0
  39. startup_sbom-2.0.0/src/startup_sbom/explain/__init__.py +704 -0
  40. startup_sbom-2.0.0/src/startup_sbom/explain/attribution.py +430 -0
  41. startup_sbom-2.0.0/src/startup_sbom/explain/counterfactual.py +394 -0
  42. startup_sbom-2.0.0/src/startup_sbom/explain/global_.py +145 -0
  43. startup_sbom-2.0.0/src/startup_sbom/explain/provenance.py +144 -0
  44. startup_sbom-2.0.0/src/startup_sbom/explain/ssvc_trace.py +211 -0
  45. startup_sbom-2.0.0/src/startup_sbom/initsys/__init__.py +279 -0
  46. startup_sbom-2.0.0/src/startup_sbom/initsys/base.py +28 -0
  47. startup_sbom-2.0.0/src/startup_sbom/initsys/cmdline.py +1200 -0
  48. startup_sbom-2.0.0/src/startup_sbom/initsys/container.py +163 -0
  49. startup_sbom-2.0.0/src/startup_sbom/initsys/inittab.py +208 -0
  50. startup_sbom-2.0.0/src/startup_sbom/initsys/netconf.py +424 -0
  51. startup_sbom-2.0.0/src/startup_sbom/initsys/openrc.py +338 -0
  52. startup_sbom-2.0.0/src/startup_sbom/initsys/runit.py +235 -0
  53. startup_sbom-2.0.0/src/startup_sbom/initsys/s6.py +177 -0
  54. startup_sbom-2.0.0/src/startup_sbom/initsys/supervisord.py +259 -0
  55. startup_sbom-2.0.0/src/startup_sbom/initsys/systemd/__init__.py +10 -0
  56. startup_sbom-2.0.0/src/startup_sbom/initsys/systemd/analyzer.py +433 -0
  57. startup_sbom-2.0.0/src/startup_sbom/initsys/systemd/boot.py +141 -0
  58. startup_sbom-2.0.0/src/startup_sbom/initsys/systemd/exec.py +84 -0
  59. startup_sbom-2.0.0/src/startup_sbom/initsys/systemd/hardening.py +1283 -0
  60. startup_sbom-2.0.0/src/startup_sbom/initsys/systemd/loader.py +494 -0
  61. startup_sbom-2.0.0/src/startup_sbom/initsys/systemd/parser.py +391 -0
  62. startup_sbom-2.0.0/src/startup_sbom/initsys/systemd/sockets.py +122 -0
  63. startup_sbom-2.0.0/src/startup_sbom/initsys/sysv.py +337 -0
  64. startup_sbom-2.0.0/src/startup_sbom/intel/__init__.py +39 -0
  65. startup_sbom-2.0.0/src/startup_sbom/intel/cli.py +83 -0
  66. startup_sbom-2.0.0/src/startup_sbom/intel/exploits.py +332 -0
  67. startup_sbom-2.0.0/src/startup_sbom/intel/extract.py +372 -0
  68. startup_sbom-2.0.0/src/startup_sbom/intel/fetcher.py +420 -0
  69. startup_sbom-2.0.0/src/startup_sbom/intel/prefetch.py +532 -0
  70. startup_sbom-2.0.0/src/startup_sbom/intel/render.py +188 -0
  71. startup_sbom-2.0.0/src/startup_sbom/intel/search.py +186 -0
  72. startup_sbom-2.0.0/src/startup_sbom/intel/select.py +214 -0
  73. startup_sbom-2.0.0/src/startup_sbom/intel/sources.py +420 -0
  74. startup_sbom-2.0.0/src/startup_sbom/intel/store.py +165 -0
  75. startup_sbom-2.0.0/src/startup_sbom/langpkgs/__init__.py +135 -0
  76. startup_sbom-2.0.0/src/startup_sbom/langpkgs/golang.py +303 -0
  77. startup_sbom-2.0.0/src/startup_sbom/langpkgs/java.py +241 -0
  78. startup_sbom-2.0.0/src/startup_sbom/langpkgs/npm.py +191 -0
  79. startup_sbom-2.0.0/src/startup_sbom/langpkgs/python.py +262 -0
  80. startup_sbom-2.0.0/src/startup_sbom/langpkgs/rust.py +156 -0
  81. startup_sbom-2.0.0/src/startup_sbom/legacy.py +86 -0
  82. startup_sbom-2.0.0/src/startup_sbom/log.py +27 -0
  83. startup_sbom-2.0.0/src/startup_sbom/lz4frame.py +138 -0
  84. startup_sbom-2.0.0/src/startup_sbom/models.py +900 -0
  85. startup_sbom-2.0.0/src/startup_sbom/net.py +327 -0
  86. startup_sbom-2.0.0/src/startup_sbom/pipeline.py +330 -0
  87. startup_sbom-2.0.0/src/startup_sbom/pkgdb/__init__.py +99 -0
  88. startup_sbom-2.0.0/src/startup_sbom/pkgdb/alpm.py +326 -0
  89. startup_sbom-2.0.0/src/startup_sbom/pkgdb/apk.py +264 -0
  90. startup_sbom-2.0.0/src/startup_sbom/pkgdb/base.py +41 -0
  91. startup_sbom-2.0.0/src/startup_sbom/pkgdb/dpkg.py +415 -0
  92. startup_sbom-2.0.0/src/startup_sbom/pkgdb/ownership.py +77 -0
  93. startup_sbom-2.0.0/src/startup_sbom/pkgdb/rpm/__init__.py +23 -0
  94. startup_sbom-2.0.0/src/startup_sbom/pkgdb/rpm/bdb.py +116 -0
  95. startup_sbom-2.0.0/src/startup_sbom/pkgdb/rpm/header.py +281 -0
  96. startup_sbom-2.0.0/src/startup_sbom/pkgdb/rpm/ndb.py +67 -0
  97. startup_sbom-2.0.0/src/startup_sbom/pkgdb/rpm/pgp.py +173 -0
  98. startup_sbom-2.0.0/src/startup_sbom/pkgdb/rpm/reader.py +613 -0
  99. startup_sbom-2.0.0/src/startup_sbom/pkgdb/rpm/sqlite.py +81 -0
  100. startup_sbom-2.0.0/src/startup_sbom/purls.py +192 -0
  101. startup_sbom-2.0.0/src/startup_sbom/py.typed +0 -0
  102. startup_sbom-2.0.0/src/startup_sbom/report/__init__.py +36 -0
  103. startup_sbom-2.0.0/src/startup_sbom/report/assets/report.css +75 -0
  104. startup_sbom-2.0.0/src/startup_sbom/report/assets/report.js +221 -0
  105. startup_sbom-2.0.0/src/startup_sbom/report/cdxvex.py +115 -0
  106. startup_sbom-2.0.0/src/startup_sbom/report/console.py +401 -0
  107. startup_sbom-2.0.0/src/startup_sbom/report/cyclonedx.py +818 -0
  108. startup_sbom-2.0.0/src/startup_sbom/report/graphs.py +313 -0
  109. startup_sbom-2.0.0/src/startup_sbom/report/html.py +625 -0
  110. startup_sbom-2.0.0/src/startup_sbom/report/markdown.py +502 -0
  111. startup_sbom-2.0.0/src/startup_sbom/report/native.py +318 -0
  112. startup_sbom-2.0.0/src/startup_sbom/report/openvex.py +179 -0
  113. startup_sbom-2.0.0/src/startup_sbom/report/pdf/__init__.py +81 -0
  114. startup_sbom-2.0.0/src/startup_sbom/report/pdf/engine.py +142 -0
  115. startup_sbom-2.0.0/src/startup_sbom/report/pdf/templates/components.typ +303 -0
  116. startup_sbom-2.0.0/src/startup_sbom/report/pdf/templates/report.typ +852 -0
  117. startup_sbom-2.0.0/src/startup_sbom/report/pdf/viewmodel.py +1031 -0
  118. startup_sbom-2.0.0/src/startup_sbom/report/sarif.py +363 -0
  119. startup_sbom-2.0.0/src/startup_sbom/report/spdx.py +244 -0
  120. startup_sbom-2.0.0/src/startup_sbom/report/writer.py +185 -0
  121. startup_sbom-2.0.0/src/startup_sbom/rootfs/__init__.py +30 -0
  122. startup_sbom-2.0.0/src/startup_sbom/rootfs/base.py +325 -0
  123. startup_sbom-2.0.0/src/startup_sbom/rootfs/caps.py +79 -0
  124. startup_sbom-2.0.0/src/startup_sbom/rootfs/directory.py +131 -0
  125. startup_sbom-2.0.0/src/startup_sbom/rootfs/tar.py +355 -0
  126. startup_sbom-2.0.0/src/startup_sbom/sources/__init__.py +29 -0
  127. startup_sbom-2.0.0/src/startup_sbom/sources/archive.py +370 -0
  128. startup_sbom-2.0.0/src/startup_sbom/sources/compression.py +181 -0
  129. startup_sbom-2.0.0/src/startup_sbom/sources/engine.py +471 -0
  130. startup_sbom-2.0.0/src/startup_sbom/sources/host.py +128 -0
  131. startup_sbom-2.0.0/src/startup_sbom/sources/oci.py +346 -0
  132. startup_sbom-2.0.0/src/startup_sbom/sources/targets.py +262 -0
  133. startup_sbom-2.0.0/src/startup_sbom/sources/validate.py +205 -0
  134. startup_sbom-2.0.0/src/startup_sbom/supplychain/__init__.py +102 -0
  135. startup_sbom-2.0.0/src/startup_sbom/supplychain/blast.py +199 -0
  136. startup_sbom-2.0.0/src/startup_sbom/supplychain/eol.py +138 -0
  137. startup_sbom-2.0.0/src/startup_sbom/supplychain/graph.py +436 -0
  138. startup_sbom-2.0.0/src/startup_sbom/supplychain/integrity.py +221 -0
  139. startup_sbom-2.0.0/src/startup_sbom/supplychain/provenance.py +494 -0
  140. startup_sbom-2.0.0/src/startup_sbom/supplychain/repos.py +1505 -0
  141. startup_sbom-2.0.0/src/startup_sbom/supplychain/vendors.py +186 -0
  142. startup_sbom-2.0.0/src/startup_sbom/textsafe.py +67 -0
  143. startup_sbom-2.0.0/src/startup_sbom/threat/__init__.py +20 -0
  144. startup_sbom-2.0.0/src/startup_sbom/threat/attack.py +232 -0
  145. startup_sbom-2.0.0/src/startup_sbom/threat/chains.py +276 -0
  146. startup_sbom-2.0.0/src/startup_sbom/threat/cvss.py +151 -0
  147. startup_sbom-2.0.0/src/startup_sbom/threat/cwe.py +168 -0
  148. startup_sbom-2.0.0/src/startup_sbom/threat/facts.py +314 -0
  149. startup_sbom-2.0.0/src/startup_sbom/threat/narrative.py +156 -0
  150. startup_sbom-2.0.0/src/startup_sbom/threat/reachability.py +354 -0
  151. startup_sbom-2.0.0/src/startup_sbom/threat/reverse.py +533 -0
  152. startup_sbom-2.0.0/src/startup_sbom/threat/rules.py +338 -0
  153. startup_sbom-2.0.0/src/startup_sbom/threat/scoring.py +170 -0
  154. startup_sbom-2.0.0/src/startup_sbom/threat/ssvc.py +153 -0
  155. startup_sbom-2.0.0/src/startup_sbom/tui/__init__.py +31 -0
  156. startup_sbom-2.0.0/src/startup_sbom/tui/app.py +213 -0
  157. startup_sbom-2.0.0/src/startup_sbom/tui/commands.py +59 -0
  158. startup_sbom-2.0.0/src/startup_sbom/tui/data.py +225 -0
  159. startup_sbom-2.0.0/src/startup_sbom/tui/integrations.py +157 -0
  160. startup_sbom-2.0.0/src/startup_sbom/tui/messages.py +95 -0
  161. startup_sbom-2.0.0/src/startup_sbom/tui/render.py +561 -0
  162. startup_sbom-2.0.0/src/startup_sbom/tui/safe.py +49 -0
  163. startup_sbom-2.0.0/src/startup_sbom/tui/screens/__init__.py +1 -0
  164. startup_sbom-2.0.0/src/startup_sbom/tui/screens/ai_panel.py +179 -0
  165. startup_sbom-2.0.0/src/startup_sbom/tui/screens/article.py +97 -0
  166. startup_sbom-2.0.0/src/startup_sbom/tui/screens/export.py +119 -0
  167. startup_sbom-2.0.0/src/startup_sbom/tui/screens/home.py +125 -0
  168. startup_sbom-2.0.0/src/startup_sbom/tui/screens/open_report.py +85 -0
  169. startup_sbom-2.0.0/src/startup_sbom/tui/screens/results.py +896 -0
  170. startup_sbom-2.0.0/src/startup_sbom/tui/screens/scan.py +218 -0
  171. startup_sbom-2.0.0/src/startup_sbom/tui/screens/settings.py +306 -0
  172. startup_sbom-2.0.0/src/startup_sbom/tui/screens/target.py +274 -0
  173. startup_sbom-2.0.0/src/startup_sbom/tui/state.py +506 -0
  174. startup_sbom-2.0.0/src/startup_sbom/tui/styles.tcss +318 -0
  175. startup_sbom-2.0.0/src/startup_sbom/tui/widgets.py +67 -0
  176. startup_sbom-2.0.0/src/startup_sbom/viz/__init__.py +9 -0
  177. startup_sbom-2.0.0/src/startup_sbom/viz/svg.py +482 -0
  178. startup_sbom-2.0.0/src/startup_sbom/viz/terminal.py +935 -0
  179. startup_sbom-2.0.0/src/startup_sbom/vulns/__init__.py +25 -0
  180. startup_sbom-2.0.0/src/startup_sbom/vulns/arch.py +145 -0
  181. startup_sbom-2.0.0/src/startup_sbom/vulns/base.py +22 -0
  182. startup_sbom-2.0.0/src/startup_sbom/vulns/epss.py +167 -0
  183. startup_sbom-2.0.0/src/startup_sbom/vulns/kev.py +62 -0
  184. startup_sbom-2.0.0/src/startup_sbom/vulns/match.py +227 -0
  185. startup_sbom-2.0.0/src/startup_sbom/vulns/normalize.py +345 -0
  186. startup_sbom-2.0.0/src/startup_sbom/vulns/nvd.py +277 -0
  187. startup_sbom-2.0.0/src/startup_sbom/vulns/osv.py +651 -0
  188. 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
+ [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.19307312.svg)](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
+ [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.19307312.svg)](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).