vigil-fuse 0.3.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 (111) hide show
  1. vigil_fuse-0.3.0/LICENSE +108 -0
  2. vigil_fuse-0.3.0/PKG-INFO +164 -0
  3. vigil_fuse-0.3.0/README.md +118 -0
  4. vigil_fuse-0.3.0/pyproject.toml +100 -0
  5. vigil_fuse-0.3.0/setup.cfg +4 -0
  6. vigil_fuse-0.3.0/src/vigil_fuse/__init__.py +3 -0
  7. vigil_fuse-0.3.0/src/vigil_fuse/__main__.py +3 -0
  8. vigil_fuse-0.3.0/src/vigil_fuse/analyzer_runtime.py +892 -0
  9. vigil_fuse-0.3.0/src/vigil_fuse/analyzer_sandbox.py +234 -0
  10. vigil_fuse-0.3.0/src/vigil_fuse/analyzers.py +28 -0
  11. vigil_fuse-0.3.0/src/vigil_fuse/baseline.py +708 -0
  12. vigil_fuse-0.3.0/src/vigil_fuse/build_context.py +520 -0
  13. vigil_fuse-0.3.0/src/vigil_fuse/cli.py +1849 -0
  14. vigil_fuse-0.3.0/src/vigil_fuse/config.py +200 -0
  15. vigil_fuse-0.3.0/src/vigil_fuse/dependency_analyzers.py +575 -0
  16. vigil_fuse-0.3.0/src/vigil_fuse/esp_idf_lock.py +379 -0
  17. vigil_fuse-0.3.0/src/vigil_fuse/firmware_analyzer.py +117 -0
  18. vigil_fuse-0.3.0/src/vigil_fuse/firmware_inventory.py +167 -0
  19. vigil_fuse-0.3.0/src/vigil_fuse/ghidra_analyzer.py +1085 -0
  20. vigil_fuse-0.3.0/src/vigil_fuse/github_actions.py +551 -0
  21. vigil_fuse-0.3.0/src/vigil_fuse/hardware.py +101 -0
  22. vigil_fuse-0.3.0/src/vigil_fuse/hardware_bom.py +207 -0
  23. vigil_fuse-0.3.0/src/vigil_fuse/hardware_netlist.py +219 -0
  24. vigil_fuse-0.3.0/src/vigil_fuse/history_analyzer.py +383 -0
  25. vigil_fuse-0.3.0/src/vigil_fuse/input_types.py +62 -0
  26. vigil_fuse-0.3.0/src/vigil_fuse/limits.py +12 -0
  27. vigil_fuse-0.3.0/src/vigil_fuse/model.py +487 -0
  28. vigil_fuse-0.3.0/src/vigil_fuse/path_safety.py +52 -0
  29. vigil_fuse-0.3.0/src/vigil_fuse/platform_context.py +674 -0
  30. vigil_fuse-0.3.0/src/vigil_fuse/product_context.py +454 -0
  31. vigil_fuse-0.3.0/src/vigil_fuse/profiles.py +129 -0
  32. vigil_fuse-0.3.0/src/vigil_fuse/reporting.py +617 -0
  33. vigil_fuse-0.3.0/src/vigil_fuse/resources/ghidra/FuseExport.java +416 -0
  34. vigil_fuse-0.3.0/src/vigil_fuse/rule_execution.py +389 -0
  35. vigil_fuse-0.3.0/src/vigil_fuse/rule_worker.py +57 -0
  36. vigil_fuse-0.3.0/src/vigil_fuse/rules/__init__.py +1 -0
  37. vigil_fuse-0.3.0/src/vigil_fuse/rules/base.py +365 -0
  38. vigil_fuse-0.3.0/src/vigil_fuse/rules/credentials.py +231 -0
  39. vigil_fuse-0.3.0/src/vigil_fuse/rules/esp_idf_boot_validation.py +68 -0
  40. vigil_fuse-0.3.0/src/vigil_fuse/rules/esp_idf_deep_sleep_validation.py +71 -0
  41. vigil_fuse-0.3.0/src/vigil_fuse/rules/plaintext_http.py +105 -0
  42. vigil_fuse-0.3.0/src/vigil_fuse/rules/plaintext_mqtt.py +61 -0
  43. vigil_fuse-0.3.0/src/vigil_fuse/rules/private_key.py +47 -0
  44. vigil_fuse-0.3.0/src/vigil_fuse/rules/registry.py +18 -0
  45. vigil_fuse-0.3.0/src/vigil_fuse/rules/tls.py +211 -0
  46. vigil_fuse-0.3.0/src/vigil_fuse/sarif.py +219 -0
  47. vigil_fuse-0.3.0/src/vigil_fuse/scanner.py +952 -0
  48. vigil_fuse-0.3.0/src/vigil_fuse/schemas/fuse-report-1.1.schema.json +117 -0
  49. vigil_fuse-0.3.0/src/vigil_fuse/schemas/fuse-report-1.10.schema.json +1849 -0
  50. vigil_fuse-0.3.0/src/vigil_fuse/schemas/fuse-report-1.11.schema.json +1854 -0
  51. vigil_fuse-0.3.0/src/vigil_fuse/schemas/fuse-report-1.2.schema.json +131 -0
  52. vigil_fuse-0.3.0/src/vigil_fuse/schemas/fuse-report-1.3.schema.json +179 -0
  53. vigil_fuse-0.3.0/src/vigil_fuse/schemas/fuse-report-1.4.schema.json +225 -0
  54. vigil_fuse-0.3.0/src/vigil_fuse/schemas/fuse-report-1.5.schema.json +875 -0
  55. vigil_fuse-0.3.0/src/vigil_fuse/schemas/fuse-report-1.6.schema.json +905 -0
  56. vigil_fuse-0.3.0/src/vigil_fuse/schemas/fuse-report-1.7.schema.json +1007 -0
  57. vigil_fuse-0.3.0/src/vigil_fuse/schemas/fuse-report-1.8.schema.json +1590 -0
  58. vigil_fuse-0.3.0/src/vigil_fuse/schemas/fuse-report-1.9.schema.json +1833 -0
  59. vigil_fuse-0.3.0/src/vigil_fuse/schemas/ghidra-analysis.schema.json +304 -0
  60. vigil_fuse-0.3.0/src/vigil_fuse/schemas/ghidra-benchmark.schema.json +111 -0
  61. vigil_fuse-0.3.0/src/vigil_fuse/support-matrix.json +190 -0
  62. vigil_fuse-0.3.0/src/vigil_fuse/support.py +180 -0
  63. vigil_fuse-0.3.0/src/vigil_fuse/target_labels.py +29 -0
  64. vigil_fuse-0.3.0/src/vigil_fuse/terminal.py +28 -0
  65. vigil_fuse-0.3.0/src/vigil_fuse/text_safety.py +54 -0
  66. vigil_fuse-0.3.0/src/vigil_fuse/zephyr_hardening.py +262 -0
  67. vigil_fuse-0.3.0/src/vigil_fuse.egg-info/PKG-INFO +164 -0
  68. vigil_fuse-0.3.0/src/vigil_fuse.egg-info/SOURCES.txt +109 -0
  69. vigil_fuse-0.3.0/src/vigil_fuse.egg-info/dependency_links.txt +1 -0
  70. vigil_fuse-0.3.0/src/vigil_fuse.egg-info/entry_points.txt +2 -0
  71. vigil_fuse-0.3.0/src/vigil_fuse.egg-info/requires.txt +24 -0
  72. vigil_fuse-0.3.0/src/vigil_fuse.egg-info/top_level.txt +1 -0
  73. vigil_fuse-0.3.0/tests/test_analyzer_conformance_harnesses.py +58 -0
  74. vigil_fuse-0.3.0/tests/test_analyzer_facade.py +29 -0
  75. vigil_fuse-0.3.0/tests/test_analyzer_sandbox.py +499 -0
  76. vigil_fuse-0.3.0/tests/test_analyzer_sandbox_docker.py +71 -0
  77. vigil_fuse-0.3.0/tests/test_analyzer_tool_installer.py +153 -0
  78. vigil_fuse-0.3.0/tests/test_analyzers.py +727 -0
  79. vigil_fuse-0.3.0/tests/test_architecture_contracts.py +160 -0
  80. vigil_fuse-0.3.0/tests/test_binwalk_adapter_workflow.py +94 -0
  81. vigil_fuse-0.3.0/tests/test_binwalk_verification.py +235 -0
  82. vigil_fuse-0.3.0/tests/test_build_and_product_context.py +395 -0
  83. vigil_fuse-0.3.0/tests/test_cli_embedded_project_integration.py +155 -0
  84. vigil_fuse-0.3.0/tests/test_compare_repository_scan_snapshots.py +241 -0
  85. vigil_fuse-0.3.0/tests/test_dependency_policy.py +43 -0
  86. vigil_fuse-0.3.0/tests/test_docs_validation.py +57 -0
  87. vigil_fuse-0.3.0/tests/test_esp_idf_build_verifier.py +82 -0
  88. vigil_fuse-0.3.0/tests/test_extended_inventory.py +550 -0
  89. vigil_fuse-0.3.0/tests/test_ghidra_analyzer.py +645 -0
  90. vigil_fuse-0.3.0/tests/test_ghidra_benchmark_schema.py +32 -0
  91. vigil_fuse-0.3.0/tests/test_hardware.py +22 -0
  92. vigil_fuse-0.3.0/tests/test_holdout_scan_summary.py +159 -0
  93. vigil_fuse-0.3.0/tests/test_input_types.py +41 -0
  94. vigil_fuse-0.3.0/tests/test_mermaid_render.py +82 -0
  95. vigil_fuse-0.3.0/tests/test_performance_benchmark.py +69 -0
  96. vigil_fuse-0.3.0/tests/test_platform_context.py +439 -0
  97. vigil_fuse-0.3.0/tests/test_report_schema.py +159 -0
  98. vigil_fuse-0.3.0/tests/test_repository_benchmark.py +377 -0
  99. vigil_fuse-0.3.0/tests/test_repository_path_check.py +29 -0
  100. vigil_fuse-0.3.0/tests/test_repository_performance_workflow.py +74 -0
  101. vigil_fuse-0.3.0/tests/test_repository_scan_dashboard.py +55 -0
  102. vigil_fuse-0.3.0/tests/test_repository_scan_runner.py +142 -0
  103. vigil_fuse-0.3.0/tests/test_rule_execution.py +336 -0
  104. vigil_fuse-0.3.0/tests/test_rule_worker.py +96 -0
  105. vigil_fuse-0.3.0/tests/test_rules.py +492 -0
  106. vigil_fuse-0.3.0/tests/test_sard_cohort.py +297 -0
  107. vigil_fuse-0.3.0/tests/test_scanner_reporting.py +969 -0
  108. vigil_fuse-0.3.0/tests/test_support.py +22 -0
  109. vigil_fuse-0.3.0/tests/test_target_labels_and_baselines.py +488 -0
  110. vigil_fuse-0.3.0/tests/test_terminal.py +45 -0
  111. vigil_fuse-0.3.0/tests/test_zephyr_hardening.py +173 -0
@@ -0,0 +1,108 @@
1
+ VIGIL-FUSE RESTRICTED USE LICENSE, VERSION 1.1
2
+
3
+ Copyright (c) 2026 VIGIL-IoT
4
+
5
+ Effective date: 2026-11-04
6
+
7
+ This is a custom source-available license. It is not an OSI-approved open-source
8
+ license. By installing, running, modifying, or distributing the Software as
9
+ permitted below, you agree to these terms.
10
+
11
+ 1. Definitions
12
+
13
+ "Software" means FUSE and the source code, object code, documentation, and
14
+ other files owned by VIGIL-IoT and expressly made available under this license.
15
+ It excludes third-party components, assets, data, and dependencies identified
16
+ as subject to separate terms. Those separate terms continue to apply.
17
+
18
+ "Official PyPI Distribution" means an unmodified source distribution or wheel
19
+ for the package named "vigil-fuse", uploaded to PyPI by VIGIL-IoT or by a
20
+ publisher authorized by VIGIL-IoT.
21
+
22
+ "PyPI Services" means the Python Package Index service operated at pypi.org,
23
+ its service providers, and facilities that operate a PyPI-compatible cache or
24
+ mirror.
25
+
26
+ "You" means the person or organization using the Software. If you use the
27
+ Software for an organization, that organization is the licensee. Its employees
28
+ and contractors may use the Software only on its behalf and under these terms.
29
+
30
+ 2. Permission to use
31
+
32
+ VIGIL-IoT grants you a worldwide, royalty-free, non-exclusive,
33
+ non-transferable license to download and make the copies reasonably necessary
34
+ to install, run, test, back up, and privately modify the Software.
35
+
36
+ You may use the Software for personal, educational, research, internal
37
+ business, and other commercial purposes. You may use, share, and publish the
38
+ analysis outputs produced by the Software. You may run the Software as part of
39
+ a hosted service, provided that you do not provide third parties with a copy of
40
+ the Software or a modified version.
41
+
42
+ You may modify the Software for your own private or internal use. You may not
43
+ publish or share those modifications, patches, or derivative versions.
44
+
45
+ 3. PyPI distribution permission
46
+
47
+ VIGIL-IoT authorizes itself and publishers it has authorized to publish
48
+ Official PyPI Distributions. For each Official PyPI Distribution, VIGIL-IoT
49
+ grants the Python Software Foundation, its service providers, PyPI users, and
50
+ operators of PyPI-compatible mirrors a worldwide, royalty-free,
51
+ non-exclusive license to reproduce, host, cache, distribute, transmit, display,
52
+ perform, publish, and make available unmodified copies of the Software through
53
+ PyPI Services. These permissions allow PyPI Services to operate, cache, mirror,
54
+ and archive the package, and allow users to download, install, run, test, back
55
+ up, and redistribute unmodified package copies through PyPI Services.
56
+
57
+ The permission to redistribute is limited to unmodified copies of an Official
58
+ PyPI Distribution, through PyPI Services, without a fee for the Software
59
+ itself. This permission does not authorize redistribution through another
60
+ package registry, source repository, container registry, or download service.
61
+ It does not authorize modified or derivative versions, repackaging, or removal
62
+ of copyright notices or this license. This section is the only exception to
63
+ the restrictions in section 4.
64
+
65
+ 4. Restrictions
66
+
67
+ Except for the limited permission in section 3 or separate written permission
68
+ from VIGIL-IoT, you may not:
69
+
70
+ - distribute, publish, sublicense, sell, rent, lease, transfer, or otherwise
71
+ provide a copy of the Software to another person or organization;
72
+ - upload or mirror the Software, or a modified version, to a public or private
73
+ package registry, source repository, container registry, or download service;
74
+ - publish, share, or distribute a modified or derivative version, including a
75
+ fork or patch set; or
76
+ - remove or alter copyright notices or this license.
77
+
78
+ The permission to make installation, execution, backup, and private
79
+ modification copies in section 2 does not permit sharing those copies except
80
+ as expressly allowed in section 3.
81
+
82
+ This license does not grant permission to use VIGIL-IoT, VIGIL, or FUSE names,
83
+ logos, or trademarks to imply endorsement or affiliation.
84
+
85
+ 5. Ownership
86
+
87
+ VIGIL-IoT retains ownership of the Software. This license grants only the
88
+ permissions stated above. It does not transfer copyright or any other
89
+ ownership rights to you.
90
+
91
+ 6. Termination
92
+
93
+ Your permissions under this license end if you materially violate its terms.
94
+ They resume if VIGIL-IoT expressly reinstates them in writing.
95
+
96
+ 7. Warranty and liability
97
+
98
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
99
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
100
+ FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT. IN NO EVENT SHALL
101
+ VIGIL-IoT OR THE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES, OR OTHER
102
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT, OR OTHERWISE, ARISING FROM,
103
+ OUT OF, OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
104
+ SOFTWARE.
105
+
106
+ 8. Other permissions
107
+
108
+ Any permission outside this license must be granted in writing by VIGIL-IoT.
@@ -0,0 +1,164 @@
1
+ Metadata-Version: 2.4
2
+ Name: vigil-fuse
3
+ Version: 0.3.0
4
+ Summary: FUSE, the Firmware & Unified Security Engine, a VIGIL Project
5
+ License-Expression: LicenseRef-VIGIL-FUSE-PyPI-Restricted-Use
6
+ Project-URL: Repository, https://github.com/VIGIL-IoT/VIGIL-FUSE
7
+ Project-URL: Issues, https://github.com/VIGIL-IoT/VIGIL-FUSE/issues
8
+ Keywords: embedded security,firmware analysis,IoT,static analysis
9
+ Classifier: Development Status :: 3 - Alpha
10
+ Classifier: Environment :: Console
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: Intended Audience :: Information Technology
13
+ Classifier: Operating System :: OS Independent
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3.11
16
+ Classifier: Programming Language :: Python :: 3.12
17
+ Classifier: Programming Language :: Python :: 3.13
18
+ Classifier: Programming Language :: Python :: 3.14
19
+ Classifier: Topic :: Security
20
+ Classifier: Topic :: Software Development :: Quality Assurance
21
+ Requires-Python: >=3.11
22
+ Description-Content-Type: text/markdown
23
+ License-File: LICENSE
24
+ Provides-Extra: esp-idf
25
+ Requires-Dist: PyYAML<7,>=6; extra == "esp-idf"
26
+ Provides-Extra: test
27
+ Requires-Dist: jsonschema<5,>=4.23; extra == "test"
28
+ Requires-Dist: psutil<8,>=7.2; extra == "test"
29
+ Requires-Dist: pytest<10,>=9.0.3; extra == "test"
30
+ Requires-Dist: PyYAML<7,>=6; extra == "test"
31
+ Provides-Extra: dev
32
+ Requires-Dist: build<2,>=1.2; extra == "dev"
33
+ Requires-Dist: coverage[toml]<8,>=7.6; extra == "dev"
34
+ Requires-Dist: jsonschema<5,>=4.23; extra == "dev"
35
+ Requires-Dist: mypy<3,>=2.4.1; extra == "dev"
36
+ Requires-Dist: pip-audit<3,>=2.10; extra == "dev"
37
+ Requires-Dist: psutil<8,>=7.2; extra == "dev"
38
+ Requires-Dist: PyYAML<7,>=6; extra == "dev"
39
+ Requires-Dist: pytest<10,>=9.0.3; extra == "dev"
40
+ Requires-Dist: pytest-cov<8,>=6; extra == "dev"
41
+ Requires-Dist: ruff<1,>=0.11; extra == "dev"
42
+ Requires-Dist: twine<7,>=6; extra == "dev"
43
+ Requires-Dist: types-psutil<8,>=7.2; extra == "dev"
44
+ Requires-Dist: types-PyYAML<7,>=6; extra == "dev"
45
+ Dynamic: license-file
46
+
47
+ # FUSE
48
+
49
+ ## Firmware & Unified Security Engine
50
+
51
+ **A [VIGIL](https://github.com/VIGIL-IoT) Project**
52
+
53
+ FUSE is a CLI-first analysis tool for embedded and IoT project repositories. It checks selected source and configuration files, inventories hardware and firmware candidates, reads selected build metadata, and can run optional dependency or firmware analyzers. Reports include evidence and explicit coverage so a static signal is not mistaken for a confirmed vulnerability.
54
+
55
+ [![CI](https://img.shields.io/github/actions/workflow/status/VIGIL-IoT/VIGIL-FUSE/ci.yml?branch=main&label=CI)](https://github.com/VIGIL-IoT/VIGIL-FUSE/actions/workflows/ci.yml)
56
+ [![Latest release](https://img.shields.io/github/v/release/VIGIL-IoT/VIGIL-FUSE)](https://github.com/VIGIL-IoT/VIGIL-FUSE/releases)
57
+ [![Python 3.11+](https://img.shields.io/badge/python-3.11%2B-3776AB?logo=python&logoColor=white)](pyproject.toml)
58
+ [![License: VIGIL-FUSE Restricted Use](https://img.shields.io/badge/license-VIGIL--FUSE%20Restricted%20Use-7c3aed)](LICENSE)
59
+
60
+ **Alpha · 0.3.0**
61
+
62
+ ## Start here
63
+
64
+ Requires Python 3.11 or newer. The native scanner has no runtime dependencies.
65
+
66
+ ```sh
67
+ pipx install vigil-fuse==0.3.0
68
+ vigil-fuse doctor
69
+ vigil-fuse scan path/to/embedded-project --plan
70
+ vigil-fuse scan path/to/embedded-project --output-dir .fuse-results
71
+ ```
72
+
73
+ A normal scan writes `findings.json`, `findings.txt`, and `findings.sarif` to `.fuse-results/`. Start with `--plan` to review selected inputs, supported stages, limits, and available tools before scanning.
74
+
75
+ See the [usage guide](docs/usage.md) for setup, scan options, optional analyzers, and report review.
76
+
77
+ ## How a scan works
78
+
79
+ ![FUSE scan flow from a selected local project through bounded discovery, native checks, context inventory, optional analyzers, normalized findings, and local reports](docs/figures/fuse-scan-flow.svg)
80
+
81
+ [Open the standalone diagram source](site/diagrams/fuse-scan-flow.html).
82
+
83
+ Native rules analyze selected text without importing or executing project code. FUSE does not flash devices, contact device services, or prove that a static signal is reachable in a deployed product. Optional external analyzers run on the host by default. Explicit Docker mode uses local digest-pinned images, read-only inputs, bounded output capture, no network by default, and resource limits. The report directory is never bind-mounted, and nested report paths are hidden behind bounded temporary storage. Host mode remains unsandboxed.
84
+
85
+ ![FUSE trust boundaries: untrusted project input, local analysis, and optional analyzers running on the host or in explicit Docker isolation](docs/figures/fuse-trust-boundaries.svg)
86
+
87
+ The diagram shows the difference between default host execution and the explicitly configured Docker option. [Open its editable source](docs/diagrams/fuse-trust-boundaries.html).
88
+
89
+ ## Understand a finding
90
+
91
+ Severity describes potential impact. Confidence describes the strength of the evidence. Applicability and validation are separate fields. FUSE does not combine these into a single risk score.
92
+
93
+ ![Conceptual FUSE finding model showing separate severity and confidence fields](docs/figures/fuse-finding-model.svg)
94
+
95
+ The figure starts from the illustrative `FUSE001` record in the [finding format](docs/finding-schema.md). It is a teaching example, not a scan result or a physical FUSE device. [Open the interactive version](site/diagrams/fuse-finding-model.html).
96
+
97
+ ## Current scope
98
+
99
+ - Seven conservative native rules for credential-like literals, private-key markers, TLS verification bypasses, plaintext HTTP and MQTT endpoints, and two ESP-IDF image-validation settings.
100
+ - Hardware and firmware candidate inventories. These report recognized files and metadata, not hardware or firmware security assessments.
101
+ - Optional Ghidra 12.2 Headless Analyzer support for selected ELF, PE, Mach-O, or explicitly mapped raw binaries. It writes bounded evidence and keeps static endpoint references as unvalidated candidates.
102
+ - Selected ESP-IDF, Zephyr, PlatformIO, compilation database, and GitHub Actions metadata checks.
103
+ - Optional Syft and OSV-Scanner dependency analysis, Binwalk firmware signature identification, and Gitleaks history checks.
104
+ - Text, schema-versioned JSON, SARIF, CycloneDX inventory, scan coverage, evidence, and remediation guidance.
105
+
106
+ See [supported inputs and limits](src/vigil_fuse/support-matrix.json), [firmware analysis](docs/firmware-analysis.md), [optional Ghidra analysis](docs/ghidra-analysis.md), [hardware analysis](docs/hardware-analysis.md), and [known limitations](docs/limitations.md) for exact boundaries. FUSE does not provide compiler-semantic C/C++ analysis, general firmware extraction, device testing, or hardware-in-the-loop validation.
107
+
108
+ ## Measured scan sample
109
+
110
+ The same pinned four-scope cohort was scanned on GitHub-hosted Linux, Windows, and macOS runners with one warm-up and three measured runs per scope.
111
+
112
+ | Selected scope | Linux | Windows | macOS | Coverage |
113
+ | --- | ---: | ---: | ---: | --- |
114
+ | Apache Mynewt Core | 7.586 s | 5.490 s | 6.508 s | 3,354 / 3,355, partial |
115
+ | Mbed TLS | 1.544 s | 0.948 s | 1.234 s | 121 / 121, complete |
116
+ | OpenThread | 2.629 s | 1.930 s | 2.047 s | 909 / 909, complete |
117
+ | ESP-IoT-Solution | 5.760 s | 4.791 s | 4.877 s | 3,886 / 3,888, partial |
118
+
119
+ These timings include 20 ms memory sampling and are descriptive samples from one hosted runner per OS, not a controlled speed ranking. Mynewt Core and ESP-IoT-Solution had oversized selected files skipped on every platform. The linked report also records sampled process-tree RSS. See the [method, limitations, and raw reports](docs/experiments/repository-scan-performance-matrix-2026-10-31.md).
120
+
121
+ ## Relationship to the VIGIL-IoT suite
122
+
123
+ FUSE is a VIGIL Project. Within the wider [VIGIL-IoT suite](https://github.com/VIGIL-IoT), it inspects candidate weaknesses while SPECTRA-32 can reproduce selected cases in a controlled lab, evaluate mitigations, and measure overhead. Findings remain candidates until the relevant behavior is validated.
124
+
125
+ ## Documentation
126
+
127
+ - [Architecture and data flow](docs/architecture.md)
128
+ - [Compatibility and CI evidence](docs/compatibility.md)
129
+ - [Finding fields and JSON schema](docs/finding-schema.md)
130
+ - [Rules and fixture requirements](docs/rule-development.md)
131
+ - [Configuration and integrations](docs/integrations.md)
132
+ - [Ghidra analysis and its limits](docs/ghidra-analysis.md) · [Third-party credits](docs/THIRD_PARTY_CREDITS.md)
133
+ - [Ghidra pipeline figure](site/diagrams/fuse-ghidra-pipeline.html) · [Controlled Ghidra benchmark](docs/experiments/ghidra-adapter-2026-11-03.md)
134
+ - [Threat model](docs/threat-model.md) · [Limitations](docs/limitations.md)
135
+ - [Methodology](docs/methodology.md) · [Traceability](docs/traceability.md)
136
+ - [Benchmark method and evidence](docs/benchmarks.md) · [Synthetic scan baseline](reports/benchmark/scan-performance.json) · [Pinned repository performance report](reports/benchmark/repository-scan-performance.json) · [Cross-platform report set](docs/experiments/repository-scan-performance-matrix-2026-10-31.md)
137
+ - [Repository scan reports](reports/repository-scans/README.md) · [Evaluation notes](docs/experiments/pilot-scan-2026-10.md)
138
+ - [Development roadmap](docs/roadmap.md) · [Release process](docs/release-process.md)
139
+ - [Repository audit and maturity evidence](docs/REPOSITORY_AUDIT.md) · [AI skills and specialist tools reference](docs/AI_SKILLS_REFERENCE.md) · [Research source ledger](docs/research-sources.md)
140
+ - [Project site](site/) · [Website maintenance notes](docs/website.md)
141
+
142
+ ## Develop
143
+
144
+ ```sh
145
+ python -m pip install -e ".[dev]"
146
+ python -m pytest -q
147
+ python -m ruff check src tests scripts
148
+ python -m mypy
149
+ python scripts/validate_docs.py
150
+ ```
151
+
152
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for repository setup and [rule development](docs/rule-development.md) for the vulnerable fixture, secure fixture, and expected-result workflow.
153
+
154
+ ## License status
155
+
156
+ FUSE is source-available under the [VIGIL-FUSE Restricted Use License, version 1.1](LICENSE). It permits personal and commercial use, private modifications, and redistribution of unmodified official packages through PyPI and its compatible mirrors for installation and use. It does not permit rehosting through other registries or publishing modified versions without written permission from VIGIL-IoT. This is a custom license, not an OSI-approved open-source license. PyPI publication is not complete, and channel and rights review remain open.
157
+
158
+ An earlier public snapshot included MIT terms at [commit `ec91524`](https://github.com/VIGIL-IoT/VIGIL-FUSE/commit/ec91524). This license does not revoke permissions already granted for copies made available under those earlier terms. Review the license attached to the specific version you use.
159
+
160
+ Because this repository is public on GitHub, GitHub's [Terms of Service](https://docs.github.com/en/site-policy/github-terms/github-terms-of-service) allow users to view and fork it within the service. This license does not disable GitHub's fork feature.
161
+
162
+ ---
163
+
164
+ **FUSE · Firmware & Unified Security Engine · A [VIGIL](https://github.com/VIGIL-IoT) Project**
@@ -0,0 +1,118 @@
1
+ # FUSE
2
+
3
+ ## Firmware & Unified Security Engine
4
+
5
+ **A [VIGIL](https://github.com/VIGIL-IoT) Project**
6
+
7
+ FUSE is a CLI-first analysis tool for embedded and IoT project repositories. It checks selected source and configuration files, inventories hardware and firmware candidates, reads selected build metadata, and can run optional dependency or firmware analyzers. Reports include evidence and explicit coverage so a static signal is not mistaken for a confirmed vulnerability.
8
+
9
+ [![CI](https://img.shields.io/github/actions/workflow/status/VIGIL-IoT/VIGIL-FUSE/ci.yml?branch=main&label=CI)](https://github.com/VIGIL-IoT/VIGIL-FUSE/actions/workflows/ci.yml)
10
+ [![Latest release](https://img.shields.io/github/v/release/VIGIL-IoT/VIGIL-FUSE)](https://github.com/VIGIL-IoT/VIGIL-FUSE/releases)
11
+ [![Python 3.11+](https://img.shields.io/badge/python-3.11%2B-3776AB?logo=python&logoColor=white)](pyproject.toml)
12
+ [![License: VIGIL-FUSE Restricted Use](https://img.shields.io/badge/license-VIGIL--FUSE%20Restricted%20Use-7c3aed)](LICENSE)
13
+
14
+ **Alpha · 0.3.0**
15
+
16
+ ## Start here
17
+
18
+ Requires Python 3.11 or newer. The native scanner has no runtime dependencies.
19
+
20
+ ```sh
21
+ pipx install vigil-fuse==0.3.0
22
+ vigil-fuse doctor
23
+ vigil-fuse scan path/to/embedded-project --plan
24
+ vigil-fuse scan path/to/embedded-project --output-dir .fuse-results
25
+ ```
26
+
27
+ A normal scan writes `findings.json`, `findings.txt`, and `findings.sarif` to `.fuse-results/`. Start with `--plan` to review selected inputs, supported stages, limits, and available tools before scanning.
28
+
29
+ See the [usage guide](docs/usage.md) for setup, scan options, optional analyzers, and report review.
30
+
31
+ ## How a scan works
32
+
33
+ ![FUSE scan flow from a selected local project through bounded discovery, native checks, context inventory, optional analyzers, normalized findings, and local reports](docs/figures/fuse-scan-flow.svg)
34
+
35
+ [Open the standalone diagram source](site/diagrams/fuse-scan-flow.html).
36
+
37
+ Native rules analyze selected text without importing or executing project code. FUSE does not flash devices, contact device services, or prove that a static signal is reachable in a deployed product. Optional external analyzers run on the host by default. Explicit Docker mode uses local digest-pinned images, read-only inputs, bounded output capture, no network by default, and resource limits. The report directory is never bind-mounted, and nested report paths are hidden behind bounded temporary storage. Host mode remains unsandboxed.
38
+
39
+ ![FUSE trust boundaries: untrusted project input, local analysis, and optional analyzers running on the host or in explicit Docker isolation](docs/figures/fuse-trust-boundaries.svg)
40
+
41
+ The diagram shows the difference between default host execution and the explicitly configured Docker option. [Open its editable source](docs/diagrams/fuse-trust-boundaries.html).
42
+
43
+ ## Understand a finding
44
+
45
+ Severity describes potential impact. Confidence describes the strength of the evidence. Applicability and validation are separate fields. FUSE does not combine these into a single risk score.
46
+
47
+ ![Conceptual FUSE finding model showing separate severity and confidence fields](docs/figures/fuse-finding-model.svg)
48
+
49
+ The figure starts from the illustrative `FUSE001` record in the [finding format](docs/finding-schema.md). It is a teaching example, not a scan result or a physical FUSE device. [Open the interactive version](site/diagrams/fuse-finding-model.html).
50
+
51
+ ## Current scope
52
+
53
+ - Seven conservative native rules for credential-like literals, private-key markers, TLS verification bypasses, plaintext HTTP and MQTT endpoints, and two ESP-IDF image-validation settings.
54
+ - Hardware and firmware candidate inventories. These report recognized files and metadata, not hardware or firmware security assessments.
55
+ - Optional Ghidra 12.2 Headless Analyzer support for selected ELF, PE, Mach-O, or explicitly mapped raw binaries. It writes bounded evidence and keeps static endpoint references as unvalidated candidates.
56
+ - Selected ESP-IDF, Zephyr, PlatformIO, compilation database, and GitHub Actions metadata checks.
57
+ - Optional Syft and OSV-Scanner dependency analysis, Binwalk firmware signature identification, and Gitleaks history checks.
58
+ - Text, schema-versioned JSON, SARIF, CycloneDX inventory, scan coverage, evidence, and remediation guidance.
59
+
60
+ See [supported inputs and limits](src/vigil_fuse/support-matrix.json), [firmware analysis](docs/firmware-analysis.md), [optional Ghidra analysis](docs/ghidra-analysis.md), [hardware analysis](docs/hardware-analysis.md), and [known limitations](docs/limitations.md) for exact boundaries. FUSE does not provide compiler-semantic C/C++ analysis, general firmware extraction, device testing, or hardware-in-the-loop validation.
61
+
62
+ ## Measured scan sample
63
+
64
+ The same pinned four-scope cohort was scanned on GitHub-hosted Linux, Windows, and macOS runners with one warm-up and three measured runs per scope.
65
+
66
+ | Selected scope | Linux | Windows | macOS | Coverage |
67
+ | --- | ---: | ---: | ---: | --- |
68
+ | Apache Mynewt Core | 7.586 s | 5.490 s | 6.508 s | 3,354 / 3,355, partial |
69
+ | Mbed TLS | 1.544 s | 0.948 s | 1.234 s | 121 / 121, complete |
70
+ | OpenThread | 2.629 s | 1.930 s | 2.047 s | 909 / 909, complete |
71
+ | ESP-IoT-Solution | 5.760 s | 4.791 s | 4.877 s | 3,886 / 3,888, partial |
72
+
73
+ These timings include 20 ms memory sampling and are descriptive samples from one hosted runner per OS, not a controlled speed ranking. Mynewt Core and ESP-IoT-Solution had oversized selected files skipped on every platform. The linked report also records sampled process-tree RSS. See the [method, limitations, and raw reports](docs/experiments/repository-scan-performance-matrix-2026-10-31.md).
74
+
75
+ ## Relationship to the VIGIL-IoT suite
76
+
77
+ FUSE is a VIGIL Project. Within the wider [VIGIL-IoT suite](https://github.com/VIGIL-IoT), it inspects candidate weaknesses while SPECTRA-32 can reproduce selected cases in a controlled lab, evaluate mitigations, and measure overhead. Findings remain candidates until the relevant behavior is validated.
78
+
79
+ ## Documentation
80
+
81
+ - [Architecture and data flow](docs/architecture.md)
82
+ - [Compatibility and CI evidence](docs/compatibility.md)
83
+ - [Finding fields and JSON schema](docs/finding-schema.md)
84
+ - [Rules and fixture requirements](docs/rule-development.md)
85
+ - [Configuration and integrations](docs/integrations.md)
86
+ - [Ghidra analysis and its limits](docs/ghidra-analysis.md) · [Third-party credits](docs/THIRD_PARTY_CREDITS.md)
87
+ - [Ghidra pipeline figure](site/diagrams/fuse-ghidra-pipeline.html) · [Controlled Ghidra benchmark](docs/experiments/ghidra-adapter-2026-11-03.md)
88
+ - [Threat model](docs/threat-model.md) · [Limitations](docs/limitations.md)
89
+ - [Methodology](docs/methodology.md) · [Traceability](docs/traceability.md)
90
+ - [Benchmark method and evidence](docs/benchmarks.md) · [Synthetic scan baseline](reports/benchmark/scan-performance.json) · [Pinned repository performance report](reports/benchmark/repository-scan-performance.json) · [Cross-platform report set](docs/experiments/repository-scan-performance-matrix-2026-10-31.md)
91
+ - [Repository scan reports](reports/repository-scans/README.md) · [Evaluation notes](docs/experiments/pilot-scan-2026-10.md)
92
+ - [Development roadmap](docs/roadmap.md) · [Release process](docs/release-process.md)
93
+ - [Repository audit and maturity evidence](docs/REPOSITORY_AUDIT.md) · [AI skills and specialist tools reference](docs/AI_SKILLS_REFERENCE.md) · [Research source ledger](docs/research-sources.md)
94
+ - [Project site](site/) · [Website maintenance notes](docs/website.md)
95
+
96
+ ## Develop
97
+
98
+ ```sh
99
+ python -m pip install -e ".[dev]"
100
+ python -m pytest -q
101
+ python -m ruff check src tests scripts
102
+ python -m mypy
103
+ python scripts/validate_docs.py
104
+ ```
105
+
106
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for repository setup and [rule development](docs/rule-development.md) for the vulnerable fixture, secure fixture, and expected-result workflow.
107
+
108
+ ## License status
109
+
110
+ FUSE is source-available under the [VIGIL-FUSE Restricted Use License, version 1.1](LICENSE). It permits personal and commercial use, private modifications, and redistribution of unmodified official packages through PyPI and its compatible mirrors for installation and use. It does not permit rehosting through other registries or publishing modified versions without written permission from VIGIL-IoT. This is a custom license, not an OSI-approved open-source license. PyPI publication is not complete, and channel and rights review remain open.
111
+
112
+ An earlier public snapshot included MIT terms at [commit `ec91524`](https://github.com/VIGIL-IoT/VIGIL-FUSE/commit/ec91524). This license does not revoke permissions already granted for copies made available under those earlier terms. Review the license attached to the specific version you use.
113
+
114
+ Because this repository is public on GitHub, GitHub's [Terms of Service](https://docs.github.com/en/site-policy/github-terms/github-terms-of-service) allow users to view and fork it within the service. This license does not disable GitHub's fork feature.
115
+
116
+ ---
117
+
118
+ **FUSE · Firmware & Unified Security Engine · A [VIGIL](https://github.com/VIGIL-IoT) Project**
@@ -0,0 +1,100 @@
1
+ [build-system]
2
+ requires = ["setuptools>=77.0.3"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "vigil-fuse"
7
+ dynamic = ["version"]
8
+ description = "FUSE, the Firmware & Unified Security Engine, a VIGIL Project"
9
+ readme = "README.md"
10
+ requires-python = ">=3.11"
11
+ dependencies = []
12
+ license = "LicenseRef-VIGIL-FUSE-PyPI-Restricted-Use"
13
+ license-files = ["LICENSE"]
14
+ keywords = ["embedded security", "firmware analysis", "IoT", "static analysis"]
15
+ classifiers = [
16
+ "Development Status :: 3 - Alpha",
17
+ "Environment :: Console",
18
+ "Intended Audience :: Developers",
19
+ "Intended Audience :: Information Technology",
20
+ "Operating System :: OS Independent",
21
+ "Programming Language :: Python :: 3",
22
+ "Programming Language :: Python :: 3.11",
23
+ "Programming Language :: Python :: 3.12",
24
+ "Programming Language :: Python :: 3.13",
25
+ "Programming Language :: Python :: 3.14",
26
+ "Topic :: Security",
27
+ "Topic :: Software Development :: Quality Assurance",
28
+ ]
29
+
30
+ [project.optional-dependencies]
31
+ esp-idf = ["PyYAML>=6,<7"]
32
+ test = ["jsonschema>=4.23,<5", "psutil>=7.2,<8", "pytest>=9.0.3,<10", "PyYAML>=6,<7"]
33
+ dev = [
34
+ "build>=1.2,<2",
35
+ "coverage[toml]>=7.6,<8",
36
+ "jsonschema>=4.23,<5",
37
+ "mypy>=2.4.1,<3",
38
+ "pip-audit>=2.10,<3",
39
+ "psutil>=7.2,<8",
40
+ "PyYAML>=6,<7",
41
+ "pytest>=9.0.3,<10",
42
+ "pytest-cov>=6,<8",
43
+ "ruff>=0.11,<1",
44
+ "twine>=6,<7",
45
+ "types-psutil>=7.2,<8",
46
+ "types-PyYAML>=6,<7",
47
+ ]
48
+
49
+ [project.urls]
50
+ Repository = "https://github.com/VIGIL-IoT/VIGIL-FUSE"
51
+ Issues = "https://github.com/VIGIL-IoT/VIGIL-FUSE/issues"
52
+
53
+ [project.scripts]
54
+ vigil-fuse = "vigil_fuse.cli:main"
55
+
56
+ [tool.setuptools.dynamic]
57
+ version = { attr = "vigil_fuse.__version__" }
58
+
59
+ [tool.setuptools.packages.find]
60
+ where = ["src"]
61
+
62
+ [tool.setuptools.package-data]
63
+ vigil_fuse = ["schemas/*.json", "resources/ghidra/*.java", "support-matrix.json"]
64
+
65
+ [tool.ruff]
66
+ target-version = "py311"
67
+ line-length = 100
68
+
69
+ [tool.ruff.lint]
70
+ select = ["E4", "E7", "E9", "F"]
71
+
72
+ [tool.mypy]
73
+ python_version = "3.11"
74
+ files = [
75
+ "src/vigil_fuse",
76
+ "scripts/benchmark_scan.py",
77
+ "scripts/benchmark_repository_cohort.py",
78
+ "scripts/prepare_repository_benchmark_cohort.py",
79
+ "scripts/benchmark_process.py",
80
+ "scripts/build_repository_scan_dashboard.py",
81
+ "scripts/install_ci_analyzers.py",
82
+ "scripts/verify_binwalk_adapter.py",
83
+ "scripts/verify_esp_idf_build_context.py",
84
+ "scripts/evaluate_sard_fuse001_cohort.py",
85
+ "scripts/evaluate_sard_fuse001_catalogue.py",
86
+ "scripts/compare_repository_scan_snapshots.py",
87
+ "scripts/benchmark_ghidra_adapter.py",
88
+ ]
89
+ mypy_path = "src"
90
+ explicit_package_bases = true
91
+ strict = true
92
+
93
+ [tool.coverage.run]
94
+ branch = true
95
+ relative_files = true
96
+ source = ["vigil_fuse"]
97
+
98
+ [tool.coverage.report]
99
+ show_missing = true
100
+ skip_covered = true
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,3 @@
1
+ """FUSE: Firmware & Unified Security Engine, a VIGIL Project."""
2
+
3
+ __version__ = "0.3.0"
@@ -0,0 +1,3 @@
1
+ from .cli import main
2
+
3
+ raise SystemExit(main())