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.
- vigil_fuse-0.3.0/LICENSE +108 -0
- vigil_fuse-0.3.0/PKG-INFO +164 -0
- vigil_fuse-0.3.0/README.md +118 -0
- vigil_fuse-0.3.0/pyproject.toml +100 -0
- vigil_fuse-0.3.0/setup.cfg +4 -0
- vigil_fuse-0.3.0/src/vigil_fuse/__init__.py +3 -0
- vigil_fuse-0.3.0/src/vigil_fuse/__main__.py +3 -0
- vigil_fuse-0.3.0/src/vigil_fuse/analyzer_runtime.py +892 -0
- vigil_fuse-0.3.0/src/vigil_fuse/analyzer_sandbox.py +234 -0
- vigil_fuse-0.3.0/src/vigil_fuse/analyzers.py +28 -0
- vigil_fuse-0.3.0/src/vigil_fuse/baseline.py +708 -0
- vigil_fuse-0.3.0/src/vigil_fuse/build_context.py +520 -0
- vigil_fuse-0.3.0/src/vigil_fuse/cli.py +1849 -0
- vigil_fuse-0.3.0/src/vigil_fuse/config.py +200 -0
- vigil_fuse-0.3.0/src/vigil_fuse/dependency_analyzers.py +575 -0
- vigil_fuse-0.3.0/src/vigil_fuse/esp_idf_lock.py +379 -0
- vigil_fuse-0.3.0/src/vigil_fuse/firmware_analyzer.py +117 -0
- vigil_fuse-0.3.0/src/vigil_fuse/firmware_inventory.py +167 -0
- vigil_fuse-0.3.0/src/vigil_fuse/ghidra_analyzer.py +1085 -0
- vigil_fuse-0.3.0/src/vigil_fuse/github_actions.py +551 -0
- vigil_fuse-0.3.0/src/vigil_fuse/hardware.py +101 -0
- vigil_fuse-0.3.0/src/vigil_fuse/hardware_bom.py +207 -0
- vigil_fuse-0.3.0/src/vigil_fuse/hardware_netlist.py +219 -0
- vigil_fuse-0.3.0/src/vigil_fuse/history_analyzer.py +383 -0
- vigil_fuse-0.3.0/src/vigil_fuse/input_types.py +62 -0
- vigil_fuse-0.3.0/src/vigil_fuse/limits.py +12 -0
- vigil_fuse-0.3.0/src/vigil_fuse/model.py +487 -0
- vigil_fuse-0.3.0/src/vigil_fuse/path_safety.py +52 -0
- vigil_fuse-0.3.0/src/vigil_fuse/platform_context.py +674 -0
- vigil_fuse-0.3.0/src/vigil_fuse/product_context.py +454 -0
- vigil_fuse-0.3.0/src/vigil_fuse/profiles.py +129 -0
- vigil_fuse-0.3.0/src/vigil_fuse/reporting.py +617 -0
- vigil_fuse-0.3.0/src/vigil_fuse/resources/ghidra/FuseExport.java +416 -0
- vigil_fuse-0.3.0/src/vigil_fuse/rule_execution.py +389 -0
- vigil_fuse-0.3.0/src/vigil_fuse/rule_worker.py +57 -0
- vigil_fuse-0.3.0/src/vigil_fuse/rules/__init__.py +1 -0
- vigil_fuse-0.3.0/src/vigil_fuse/rules/base.py +365 -0
- vigil_fuse-0.3.0/src/vigil_fuse/rules/credentials.py +231 -0
- vigil_fuse-0.3.0/src/vigil_fuse/rules/esp_idf_boot_validation.py +68 -0
- vigil_fuse-0.3.0/src/vigil_fuse/rules/esp_idf_deep_sleep_validation.py +71 -0
- vigil_fuse-0.3.0/src/vigil_fuse/rules/plaintext_http.py +105 -0
- vigil_fuse-0.3.0/src/vigil_fuse/rules/plaintext_mqtt.py +61 -0
- vigil_fuse-0.3.0/src/vigil_fuse/rules/private_key.py +47 -0
- vigil_fuse-0.3.0/src/vigil_fuse/rules/registry.py +18 -0
- vigil_fuse-0.3.0/src/vigil_fuse/rules/tls.py +211 -0
- vigil_fuse-0.3.0/src/vigil_fuse/sarif.py +219 -0
- vigil_fuse-0.3.0/src/vigil_fuse/scanner.py +952 -0
- vigil_fuse-0.3.0/src/vigil_fuse/schemas/fuse-report-1.1.schema.json +117 -0
- vigil_fuse-0.3.0/src/vigil_fuse/schemas/fuse-report-1.10.schema.json +1849 -0
- vigil_fuse-0.3.0/src/vigil_fuse/schemas/fuse-report-1.11.schema.json +1854 -0
- vigil_fuse-0.3.0/src/vigil_fuse/schemas/fuse-report-1.2.schema.json +131 -0
- vigil_fuse-0.3.0/src/vigil_fuse/schemas/fuse-report-1.3.schema.json +179 -0
- vigil_fuse-0.3.0/src/vigil_fuse/schemas/fuse-report-1.4.schema.json +225 -0
- vigil_fuse-0.3.0/src/vigil_fuse/schemas/fuse-report-1.5.schema.json +875 -0
- vigil_fuse-0.3.0/src/vigil_fuse/schemas/fuse-report-1.6.schema.json +905 -0
- vigil_fuse-0.3.0/src/vigil_fuse/schemas/fuse-report-1.7.schema.json +1007 -0
- vigil_fuse-0.3.0/src/vigil_fuse/schemas/fuse-report-1.8.schema.json +1590 -0
- vigil_fuse-0.3.0/src/vigil_fuse/schemas/fuse-report-1.9.schema.json +1833 -0
- vigil_fuse-0.3.0/src/vigil_fuse/schemas/ghidra-analysis.schema.json +304 -0
- vigil_fuse-0.3.0/src/vigil_fuse/schemas/ghidra-benchmark.schema.json +111 -0
- vigil_fuse-0.3.0/src/vigil_fuse/support-matrix.json +190 -0
- vigil_fuse-0.3.0/src/vigil_fuse/support.py +180 -0
- vigil_fuse-0.3.0/src/vigil_fuse/target_labels.py +29 -0
- vigil_fuse-0.3.0/src/vigil_fuse/terminal.py +28 -0
- vigil_fuse-0.3.0/src/vigil_fuse/text_safety.py +54 -0
- vigil_fuse-0.3.0/src/vigil_fuse/zephyr_hardening.py +262 -0
- vigil_fuse-0.3.0/src/vigil_fuse.egg-info/PKG-INFO +164 -0
- vigil_fuse-0.3.0/src/vigil_fuse.egg-info/SOURCES.txt +109 -0
- vigil_fuse-0.3.0/src/vigil_fuse.egg-info/dependency_links.txt +1 -0
- vigil_fuse-0.3.0/src/vigil_fuse.egg-info/entry_points.txt +2 -0
- vigil_fuse-0.3.0/src/vigil_fuse.egg-info/requires.txt +24 -0
- vigil_fuse-0.3.0/src/vigil_fuse.egg-info/top_level.txt +1 -0
- vigil_fuse-0.3.0/tests/test_analyzer_conformance_harnesses.py +58 -0
- vigil_fuse-0.3.0/tests/test_analyzer_facade.py +29 -0
- vigil_fuse-0.3.0/tests/test_analyzer_sandbox.py +499 -0
- vigil_fuse-0.3.0/tests/test_analyzer_sandbox_docker.py +71 -0
- vigil_fuse-0.3.0/tests/test_analyzer_tool_installer.py +153 -0
- vigil_fuse-0.3.0/tests/test_analyzers.py +727 -0
- vigil_fuse-0.3.0/tests/test_architecture_contracts.py +160 -0
- vigil_fuse-0.3.0/tests/test_binwalk_adapter_workflow.py +94 -0
- vigil_fuse-0.3.0/tests/test_binwalk_verification.py +235 -0
- vigil_fuse-0.3.0/tests/test_build_and_product_context.py +395 -0
- vigil_fuse-0.3.0/tests/test_cli_embedded_project_integration.py +155 -0
- vigil_fuse-0.3.0/tests/test_compare_repository_scan_snapshots.py +241 -0
- vigil_fuse-0.3.0/tests/test_dependency_policy.py +43 -0
- vigil_fuse-0.3.0/tests/test_docs_validation.py +57 -0
- vigil_fuse-0.3.0/tests/test_esp_idf_build_verifier.py +82 -0
- vigil_fuse-0.3.0/tests/test_extended_inventory.py +550 -0
- vigil_fuse-0.3.0/tests/test_ghidra_analyzer.py +645 -0
- vigil_fuse-0.3.0/tests/test_ghidra_benchmark_schema.py +32 -0
- vigil_fuse-0.3.0/tests/test_hardware.py +22 -0
- vigil_fuse-0.3.0/tests/test_holdout_scan_summary.py +159 -0
- vigil_fuse-0.3.0/tests/test_input_types.py +41 -0
- vigil_fuse-0.3.0/tests/test_mermaid_render.py +82 -0
- vigil_fuse-0.3.0/tests/test_performance_benchmark.py +69 -0
- vigil_fuse-0.3.0/tests/test_platform_context.py +439 -0
- vigil_fuse-0.3.0/tests/test_report_schema.py +159 -0
- vigil_fuse-0.3.0/tests/test_repository_benchmark.py +377 -0
- vigil_fuse-0.3.0/tests/test_repository_path_check.py +29 -0
- vigil_fuse-0.3.0/tests/test_repository_performance_workflow.py +74 -0
- vigil_fuse-0.3.0/tests/test_repository_scan_dashboard.py +55 -0
- vigil_fuse-0.3.0/tests/test_repository_scan_runner.py +142 -0
- vigil_fuse-0.3.0/tests/test_rule_execution.py +336 -0
- vigil_fuse-0.3.0/tests/test_rule_worker.py +96 -0
- vigil_fuse-0.3.0/tests/test_rules.py +492 -0
- vigil_fuse-0.3.0/tests/test_sard_cohort.py +297 -0
- vigil_fuse-0.3.0/tests/test_scanner_reporting.py +969 -0
- vigil_fuse-0.3.0/tests/test_support.py +22 -0
- vigil_fuse-0.3.0/tests/test_target_labels_and_baselines.py +488 -0
- vigil_fuse-0.3.0/tests/test_terminal.py +45 -0
- vigil_fuse-0.3.0/tests/test_zephyr_hardening.py +173 -0
vigil_fuse-0.3.0/LICENSE
ADDED
|
@@ -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
|
+
[](https://github.com/VIGIL-IoT/VIGIL-FUSE/actions/workflows/ci.yml)
|
|
56
|
+
[](https://github.com/VIGIL-IoT/VIGIL-FUSE/releases)
|
|
57
|
+
[](pyproject.toml)
|
|
58
|
+
[](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
|
+

|
|
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
|
+

|
|
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
|
+

|
|
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
|
+
[](https://github.com/VIGIL-IoT/VIGIL-FUSE/actions/workflows/ci.yml)
|
|
10
|
+
[](https://github.com/VIGIL-IoT/VIGIL-FUSE/releases)
|
|
11
|
+
[](pyproject.toml)
|
|
12
|
+
[](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
|
+

|
|
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
|
+

|
|
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
|
+

|
|
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
|