yocto-security-tools
Standalone CVE management tools for Yocto/OpenEmbedded Linux distributions.
Tools
| Tool | Purpose |
|---|---|
| cve-metadata-extractor | Find fix commits for CVEs from multiple public sources (Debian, OSV, CVEList V5, Ubuntu, NVD) |
| cve-corrector | Automate backporting CVE fixes to Yocto recipes using devtool |
| cve-agent | Orchestrate CVE backporting with AI-assisted conflict resolution |
Requirements
- Python 3.9+
- Git
- For
cve-corrector/cve-agent: a sourced Yocto build environment (BBPATHset) - For
cve-agent: an AI backend — kiro-cli (default) or Claude Code (--backend claude), or a custom backend plugin - Optional, for
cve-agent:patchutils(providesinterdiff) — when installed, cve-agent enriches its review diff, console output, and AI context with a concise upstream-vs-backport adaptation delta. When absent, cve-agent falls back to its existing behavior unchanged.
Installation
From PyPI
pip install yocto-security-tools
From source (development)
git clone https://github.com/Ericsson/yocto-security-tools.git
cd yocto-security-tools
pip install -e .
Quick Start
Find CVE fix metadata
# From Yocto cve-summary.json (output of sbom-cve-check)
cve-metadata-extractor --yocto-summary cve-summary.json --output cve-metadata.json
# For a specific CVE
cve-metadata-extractor --cve-id CVE-2024-1234 --cve-component-name openssl
Apply CVE patches
# Source your Yocto build environment first
source oe-init-build-env
# Apply a CVE fix
cve-corrector --cve-id CVE-2024-1234 --cve-info cve-metadata.json
# Resume after manual conflict resolution
cve-corrector --continue
Dependent commit chains. --fix-url is repeatable. A single URL applies
one fix commit (or one pull request's commits); two or more URLs are treated
as one ordered, dependent chain — the caller controls the order, and all
commits must apply or the run stops at a conflict (no falling back to
applying just one of them). Use this when a CVE is fixed by a short series
of follow-up commits on the same branch, e.g. acl's CVE-2026-XXXXX:
cve-corrector --cve-id CVE-2026-XXXXX --recipe acl \
--fix-url https://cgit.git.savannah.nongnu.org/cgit/acl.git/commit/?id=5906d2868ec8d3b08be556153696e6b1122eeeda \
--fix-url https://cgit.git.savannah.nongnu.org/cgit/acl.git/commit/?id=0071c6d1fea0a8a6270333baa85fb609be325c26 \
--fix-url https://cgit.git.savannah.nongnu.org/cgit/acl.git/commit/?id=170dbd3beff9bd5bdab3f72db1a04bf282f6087c
If the chain conflicts partway through, resolve it and resume with
cve-corrector --continue — the remaining commits are applied in the same
order. cve-agent accepts the same repeated --fix-url flag and forwards
it unchanged to cve-corrector.
AI-assisted backporting
# Requires an AI backend CLI: kiro-cli (default) or Claude Code
cve-agent --cve-id CVE-2024-1234 --cve-info cve-metadata.json --trust
# Batch mode
cve-agent --cve-list cves.txt --cve-info cve-metadata.json --trust
# Use the Claude Code backend (install and authenticate the `claude` CLI first)
cve-agent --cve-id CVE-2024-1234 --cve-info cve-metadata.json --backend claude --model sonnet
# Use a custom backend plugin from extra/
cve-agent --cve-id CVE-2024-1234 --cve-info cve-metadata.json --backend my_backend
AI backends. kiro (default) drives kiro-cli;
claude drives the Claude Code claude CLI directly.
The Claude Code backend needs a recent claude on PATH, already authenticated
(Anthropic API key, or Bedrock/Vertex), supporting -p, --permission-mode,
--allowedTools/--disallowedTools, --append-system-prompt, and --add-dir.
Pass --model sonnet|opus|haiku (or a full model id); the default
claude-sonnet-5 is mapped to sonnet. Both backends run under the same
file-scope guard, so the AI can only modify the files the upstream fix touches.
How It Works
graph LR
E["cve-metadata-extractor<br/>Find fix commits"] -->|cve-metadata.json| C["cve-corrector<br/>Apply patches via devtool"]
C -->|exit code + state| A["cve-agent<br/>AI-assisted resolution"]
A -->|subprocess| C
Each tool works independently. Chain them via --cve-info cve-metadata.json.
Supported Input Formats
| Format | Flag | Description |
|---|---|---|
| cve-summary.json | --yocto-summary |
Output from Yocto's sbom-cve-check class |
| Direct CVE ID | --cve-id |
One or more CVE identifiers |
| CVE list file | --cve-list |
Text file with one CVE ID per line (agent only) |
Configuration
The extractor reads configuration from cve_metadata_extractor/config.json by default.
Override with the CVE_EXTRACTOR_CONFIG environment variable.
Storage (XDG Compliant)
| Directory | Default | Override |
|---|---|---|
| Persistent data | ~/.local/share/yocto-security-tools/ |
CVE_TOOLS_DATA_DIR |
| Cache (expendable) | ~/.cache/yocto-security-tools/ |
CVE_TOOLS_CACHE_DIR |
Config Keys
| Key | Default | Description |
|---|---|---|
cvelistv5_url |
GitHub | Git URL to clone CVEList V5 from |
debian_tracker_url |
salsa.debian.org | Git URL for Debian tracker |
nvd_url |
GitHub | Git URL for NVD data |
oe_branches |
["scarthgap"] |
OE branches to check for fix status |
Environment Variables
| Variable | Purpose |
|---|---|
CVE_EXTRACTOR_CONFIG |
Override config.json path |
CVE_TOOLS_DATA_DIR |
Override XDG data directory |
CVE_TOOLS_CACHE_DIR |
Override XDG cache directory |
GITHUB_TOKEN |
GitHub API access (required for PR metadata) |
OPENEMBEDDED_TOKEN |
OE mailing list API |
BBPATH |
Required for cve-corrector/cve-agent (Yocto build env) |
CVE_EXTRA_SOURCES_DIR |
Override plugin directory for extractor |
CVE_EXTRA_BACKENDS_DIR |
Override plugin directory for agent backends |
Plugin System
Add custom CVE data sources or AI backends by dropping .py files in the extra/ directory. See extra/README.md for the plugin development guide.
Quick Example: Custom Source
# extra/my_source.py
from cve_metadata_extractor.sources import CveSource, SOURCE_REGISTRY
class MySource(CveSource):
name = 'my_source'
def is_enabled(self, args): return True
def extract(self, cve_id, stats): return [], [], [], []
SOURCE_REGISTRY.append(MySource())
Development
python3 -m venv venv
source venv/bin/activate
pip install -e ".[dev]"
pytest
See CONTRIBUTING.md for full development guidelines.
License
MIT — see LICENSE
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file yocto_security_tools-1.0.4.tar.gz.
File metadata
- Download URL: yocto_security_tools-1.0.4.tar.gz
- Upload date:
- Size: 141.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
df24b8ce247fe2a29ec1ce06b8d14d765074cdd0ad3b9dc8c892dfed45a23355
|
|
| MD5 |
d64452d2cd138a412ad0c5444ce06f05
|
|
| BLAKE2b-256 |
37c1c127bd89ec2850117c05eedc9e897e44835174a753bc01301200d730d67e
|
Provenance
The following attestation bundles were made for yocto_security_tools-1.0.4.tar.gz:
Publisher:
publish.yml on Ericsson/yocto-security-tools
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
yocto_security_tools-1.0.4.tar.gz -
Subject digest:
df24b8ce247fe2a29ec1ce06b8d14d765074cdd0ad3b9dc8c892dfed45a23355 - Sigstore transparency entry: 2334174743
- Sigstore integration time:
-
Permalink:
Ericsson/yocto-security-tools@4b61247c8bd53d53f06aee9006b3f3d866777802 -
Branch / Tag:
refs/tags/v1.0.4 - Owner: https://github.com/Ericsson
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@4b61247c8bd53d53f06aee9006b3f3d866777802 -
Trigger Event:
release
-
Statement type:
File details
Details for the file yocto_security_tools-1.0.4-py3-none-any.whl.
File metadata
- Download URL: yocto_security_tools-1.0.4-py3-none-any.whl
- Upload date:
- Size: 168.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
94a8ee04e6c73a49b555e87b5c2e3ee94016b8a9d5940d5dfba19de1b8b7df7b
|
|
| MD5 |
789ccb2821d6dabc9ae6c757b86b3016
|
|
| BLAKE2b-256 |
e5fd5f9666771758db5b690458725aa5c390dff59b46506169676b1828ce60e5
|
Provenance
The following attestation bundles were made for yocto_security_tools-1.0.4-py3-none-any.whl:
Publisher:
publish.yml on Ericsson/yocto-security-tools
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
yocto_security_tools-1.0.4-py3-none-any.whl -
Subject digest:
94a8ee04e6c73a49b555e87b5c2e3ee94016b8a9d5940d5dfba19de1b8b7df7b - Sigstore transparency entry: 2334174757
- Sigstore integration time:
-
Permalink:
Ericsson/yocto-security-tools@4b61247c8bd53d53f06aee9006b3f3d866777802 -
Branch / Tag:
refs/tags/v1.0.4 - Owner: https://github.com/Ericsson
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@4b61247c8bd53d53f06aee9006b3f3d866777802 -
Trigger Event:
release
-
Statement type: