Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 37 additions & 7 deletions .github/workflows/sbom-reusable.yml
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,9 @@ on:
jobs:
sbom:
runs-on: ubuntu-latest
# This job only reads the product tree and uploads an artifact.
permissions:
contents: read
Comment on lines +48 to +49
steps:
- name: Checkout product
uses: actions/checkout@v4
Expand All @@ -53,29 +56,56 @@ jobs:
with:
python-version: '3.x'

# Caller inputs are bound to env and referenced as "$VAR" in the shell.
# Never interpolate ${{ inputs.* }} directly into a run: block: the runner
# substitutes it before the shell parses the script, so a value containing
# shell metacharacters would execute as code (this is a reusable workflow
# shipped to every product repo). env values are not re-parsed by ${{ }}.
- name: Check vendored drift
if: inputs.wolfglass-ref != ''
env:
WOLFGLASS_REF: ${{ inputs.wolfglass-ref }}
VENDORED_PATH: ${{ inputs.vendored-path }}
run: |
git clone --depth 1 --branch "${{ inputs.wolfglass-ref }}" \
git clone --depth 1 --branch "$WOLFGLASS_REF" \
https://github.com/wolfSSL/wolfGlass _wolfglass
python _wolfglass/tools/wolfglass-sync \
--dest "$GITHUB_WORKSPACE" \
--subdir "${{ inputs.vendored-path }}" \
--subdir "$VENDORED_PATH" \
--check

- name: Build SBOM
run: ${{ inputs.build-command }}
env:
BUILD_COMMAND: ${{ inputs.build-command }}
run: |
bash -c "$BUILD_COMMAND"

- name: Validate SBOM
env:
VENDORED_PATH: ${{ inputs.vendored-path }}
NAME_PREFIX: ${{ inputs.name-prefix }}
OUTPUTS: ${{ inputs.outputs }}
run: |
python "${{ inputs.vendored-path }}/validate_sbom.py" \
--name-prefix "${{ inputs.name-prefix }}" ${{ inputs.outputs }}
python "$VENDORED_PATH/validate_sbom.py" \
--name-prefix "$NAME_PREFIX" $OUTPUTS

- name: Assert no host path leak
env:
OUTPUTS: ${{ inputs.outputs }}
run: |
# A published SBOM must not contain build-machine absolute paths.
if grep -REn '"/(home|Users|root)/' ${{ inputs.outputs }}; then
echo "ERROR: absolute host path found in SBOM (scrub failed)." >&2
# grep exit 0 = match (fail), 1 = clean, >=2 = real error (e.g. a glob
# that matched no file): treat only 1 as "clean" so a bad glob can't
# silently report OK.
set +e
out="$(grep -REn '"/(home|Users|root)/' $OUTPUTS)"
rc=$?
Comment on lines +100 to +102
if [ "$rc" -eq 0 ]; then
echo "ERROR: absolute host path found in SBOM (scrub failed):" >&2
echo "$out" >&2
exit 1
elif [ "$rc" -ne 1 ]; then
echo "ERROR: could not scan SBOM outputs (glob '$OUTPUTS' matched no file?)." >&2
exit 1
fi
echo "OK: no host path leak."
Expand Down
4 changes: 4 additions & 0 deletions .github/workflows/selftest.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ jobs:
share/frontends/iar_sbom.py \
share/frontends/zephyr_sbom.py \
central/gen-advisory \
central/test_gen_advisory.py \
provenance/bomsh_verify.py \
tools/wolfglass-sync \
tests/test_gen_sbom.py \
Expand All @@ -38,5 +39,8 @@ jobs:
- name: Run generator unit tests
run: python -m unittest tests/test_gen_sbom.py

- name: Run advisory generator unit tests
run: python -m unittest central/test_gen_advisory.py

- name: Run self-test
run: python tests/test_sbom.py
122 changes: 122 additions & 0 deletions advisories/records/CVE-2026-5501.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
{
"dataType": "CVE_RECORD",
"dataVersion": "5.2",
"cveMetadata": {
"cveId": "CVE-2026-5501",
"assignerOrgId": "50d2cd11-d01a-48ed-9441-5bfce9d63b27",
"state": "PUBLISHED",
"assignerShortName": "wolfSSL",
"dateReserved": "2026-04-03T15:46:09.302Z",
"datePublished": "2026-04-10T03:07:39.604Z",
"dateUpdated": "2026-04-22T13:59:28.514Z"
},
"containers": {
"cna": {
"providerMetadata": {
"orgId": "50d2cd11-d01a-48ed-9441-5bfce9d63b27",
"shortName": "wolfSSL",
"dateUpdated": "2026-04-10T03:07:39.604Z"
},
"title": "Improper Certificate Signature Verification in X.509 Chain Validation Allows Forged Leaf Certificates",
"problemTypes": [
{
"descriptions": [
{
"lang": "en",
"cweId": "CWE-295",
"description": "CWE-295 Improper certificate validation",
"type": "CWE"
}
]
}
],
"affected": [
{
"vendor": "wolfSSL",
"product": "wolfSSL",
"modules": [
"wolfSSL_X509_verify_cert"
],
"programFiles": [
"src/x509_str.c"
],
"versions": [
{
"status": "affected",
"version": "0",
"lessThanOrEqual": "5.9.0",
"versionType": "semver"
}
],
"defaultStatus": "unaffected"
}
],
"descriptions": [
{
"lang": "en",
"value": "wolfSSL_X509_verify_cert in the OpenSSL compatibility layer accepts a certificate chain in which the leaf's signature is not checked, if the attacker supplies an untrusted intermediate with Basic Constraints `CA:FALSE` that is legitimately signed by a trusted root. An attacker who obtains any leaf certificate from a trusted CA (e.g. a free DV cert from Let's Encrypt) can forge a certificate for any subject name with any public key and arbitrary signature bytes, and the function returns `WOLFSSL_SUCCESS` / `X509_V_OK`. The native wolfSSL TLS handshake path (`ProcessPeerCerts`) is not susceptible and the issue is limited to applications using the OpenSSL compatibility API directly, which would include integrations of wolfSSL into nginx and haproxy.",
"supportingMedia": [
{
"type": "text/html",
"base64": false,
"value": "wolfSSL_X509_verify_cert in the OpenSSL compatibility layer accepts a certificate chain in which the leaf's signature is not checked, if the attacker supplies an untrusted intermediate with Basic Constraints `CA:FALSE` that is legitimately signed by a trusted root. An attacker who obtains any leaf certificate from a trusted CA (e.g. a free DV cert from Let's Encrypt) can forge a certificate for any subject name with any public key and arbitrary signature bytes, and the function returns `WOLFSSL_SUCCESS` / `X509_V_OK`. The native wolfSSL TLS handshake path (`ProcessPeerCerts`) is not susceptible and the issue is limited to applications using the OpenSSL compatibility API directly, which would include integrations of wolfSSL into nginx and haproxy."
}
]
}
],
"references": [
{
"url": "https://github.com/wolfSSL/wolfssl/pull/10102"
}
],
"metrics": [
{
"format": "CVSS",
"scenarios": [
{
"lang": "en",
"value": "GENERAL"
}
],
"cvssV4_0": {
"attackVector": "NETWORK",
"attackComplexity": "LOW",
"attackRequirements": "NONE",
"privilegesRequired": "NONE",
"userInteraction": "NONE",
"vulnConfidentialityImpact": "HIGH",
"subConfidentialityImpact": "NONE",
"vulnIntegrityImpact": "HIGH",
"subIntegrityImpact": "NONE",
"vulnAvailabilityImpact": "NONE",
"subAvailabilityImpact": "NONE",
"exploitMaturity": "NOT_DEFINED",
"Safety": "NOT_DEFINED",
"Automatable": "NOT_DEFINED",
"Recovery": "NOT_DEFINED",
"valueDensity": "NOT_DEFINED",
"vulnerabilityResponseEffort": "NOT_DEFINED",
"providerUrgency": "NOT_DEFINED",
"version": "4.0",
"baseSeverity": "CRITICAL",
"baseScore": 9.3,
"vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N"
}
}
],
"credits": [
{
"lang": "en",
"value": "Calif.io in collaboration with Claude and Anthropic Research",
"type": "finder"
}
],
"source": {
"discovery": "EXTERNAL"
},
"x_generator": {
"engine": "Vulnogram 1.0.1"
}
}
}
}
122 changes: 122 additions & 0 deletions advisories/records/CVE-2026-5778.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
{
"dataType": "CVE_RECORD",
"dataVersion": "5.2",
"cveMetadata": {
"cveId": "CVE-2026-5778",
"assignerOrgId": "50d2cd11-d01a-48ed-9441-5bfce9d63b27",
"state": "PUBLISHED",
"assignerShortName": "wolfSSL",
"dateReserved": "2026-04-08T08:25:15.400Z",
"datePublished": "2026-04-09T21:45:09.053Z",
"dateUpdated": "2026-04-10T13:53:29.181Z"
},
"containers": {
"cna": {
"providerMetadata": {
"orgId": "50d2cd11-d01a-48ed-9441-5bfce9d63b27",
"shortName": "wolfSSL",
"dateUpdated": "2026-04-09T21:45:09.053Z"
},
"title": "Integer underflow leads to out-of-bounds access in sniffer ChaCha decrypt path.",
"problemTypes": [
{
"descriptions": [
{
"lang": "en",
"cweId": "CWE-191",
"description": "CWE-191 Integer underflow (wrap or wraparound)",
"type": "CWE"
}
]
}
],
"affected": [
{
"vendor": "wolfSSL",
"product": "wolfSSL",
"modules": [
"Packet sniffer"
],
"programFiles": [
"src/sniffer.c"
],
"versions": [
{
"status": "affected",
"version": "0",
"lessThanOrEqual": "5.9.0",
"versionType": "semver"
}
],
"defaultStatus": "unaffected"
}
],
"descriptions": [
{
"lang": "en",
"value": "Integer underflow in wolfSSL packet sniffer <= 5.9.0 allows an attacker to cause a program crash in the AEAD decryption path by injecting a TLS record shorter than the explicit IV plus authentication tag into traffic inspected by ssl_DecodePacket. The underflow wraps a 16-bit length to a large value that is passed to AEAD decryption routines, causing a large out-of-bounds read and crash. An unauthenticated attacker can trigger this remotely via malformed TLS Application Data records.",
"supportingMedia": [
{
"type": "text/html",
"base64": false,
"value": "Integer underflow in wolfSSL packet sniffer &lt;= 5.9.0 allows an attacker to cause a program crash in the AEAD decryption path by injecting a TLS record shorter than the explicit IV plus authentication tag into traffic inspected by ssl_DecodePacket. The underflow wraps a 16-bit length to a large value that is passed to AEAD decryption routines, causing a large out-of-bounds read and crash. An unauthenticated attacker can trigger this remotely via malformed TLS Application Data records."
}
]
}
],
"references": [
{
"url": "https://github.com/wolfSSL/wolfssl/pull/10125"
}
],
"metrics": [
{
"format": "CVSS",
"scenarios": [
{
"lang": "en",
"value": "GENERAL"
}
],
"cvssV4_0": {
"attackVector": "NETWORK",
"attackComplexity": "LOW",
"attackRequirements": "PRESENT",
"privilegesRequired": "NONE",
"userInteraction": "NONE",
"vulnConfidentialityImpact": "NONE",
"subConfidentialityImpact": "NONE",
"vulnIntegrityImpact": "NONE",
"subIntegrityImpact": "NONE",
"vulnAvailabilityImpact": "HIGH",
"subAvailabilityImpact": "NONE",
"exploitMaturity": "NOT_DEFINED",
"Safety": "NOT_DEFINED",
"Automatable": "NOT_DEFINED",
"Recovery": "NOT_DEFINED",
"valueDensity": "NOT_DEFINED",
"vulnerabilityResponseEffort": "NOT_DEFINED",
"providerUrgency": "NOT_DEFINED",
"version": "4.0",
"baseSeverity": "HIGH",
"baseScore": 8.2,
"vectorString": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N"
}
}
],
"credits": [
{
"lang": "en",
"value": "Zou Dikai",
"type": "finder"
}
],
"source": {
"discovery": "EXTERNAL"
},
"x_generator": {
"engine": "Vulnogram 1.0.1"
}
}
}
}
21 changes: 21 additions & 0 deletions advisories/vex-overlay.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"_comment": "Canonical wolfSSL VEX overlay consumed by `make advisory` / `scripts/gen-advisory`. Keyed by CVE id; carries the determinations the CVE Program record cannot express (analysis state, justification, fixed versions, remediation, optional FIPS product, optional build-reachability hedge). Constrained by scripts/advisory-vex-overlay.schema.json. To model a wolfCrypt FIPS module as a separate product, add a \"fips\" block per the format in scripts/advisory-vex-overlay.example.json using the real validated module version and CMVP certificate number (do NOT copy the illustrative placeholder values from the example).",

"CVE-2026-5501": {
"state": "exploitable",
"response": ["update"],
"detail": "Limited to applications using the OpenSSL compatibility API directly (wolfSSL_X509_verify_cert), such as nginx and haproxy integrations. The native wolfSSL TLS handshake path (ProcessPeerCerts) is not susceptible.",
"fixed_versions": ["5.9.1"],
"remediation": "Update to wolfSSL 5.9.1 or later, or avoid relying on wolfSSL_X509_verify_cert in the OpenSSL compatibility layer for chain validation."
},

"CVE-2026-5778": {
"state": "exploitable",
"response": ["update"],
"detail": "Integer underflow in the ChaCha20-Poly1305 decryption path of the packet sniffer.",
"requires_defines": ["WOLFSSL_SNIFFER", "HAVE_CHACHA", "HAVE_POLY1305"],
"default_status": "off",
"fixed_versions": ["5.9.1"],
"remediation": "Update to wolfSSL 5.9.1 or later. Builds without --enable-sniffer are not affected."
}
}
Loading
Loading