Files
sencho/security/vex/sencho.openvex.json
T
Anso 3668c71860 feat(security): add SBOM attestations, VEX document, and retire .trivyignore (#790)
* feat(security): add SBOM attestations, VEX document, and retire .trivyignore

Add OpenVEX triage document (security/vex/sencho.openvex.json) for the 5
residual CVEs vendored inside docker/compose v5.1.2 that were carried over
from the previous PR. All 5 are marked not_affected with justifications.

Configure Trivy in both CI and release workflows to consume the VEX document
via trivy.yaml so the same source of truth gates PR scans and release scans.
Delete .trivyignore, which is fully superseded by the VEX file.

Add two new release pipeline steps after image publication:
- CycloneDX 1.6 SBOM via anchore/sbom-action (also installs syft)
- SPDX 2.3 SBOM via syft directly (reuses OCI layer cache from prior step)
Both are attached as cosign OCI referrer attestations (keyless, OIDC-signed)
and uploaded as GitHub Release assets alongside the OpenVEX file.

Bump docker-publish.yml permissions from contents:read to contents:write,
required for softprops/action-gh-release to create Release assets.

Add docs/operations/verifying-images.mdx with copy-paste verification
commands for all supply-chain artifacts: signature, SLSA provenance,
CycloneDX SBOM, SPDX SBOM, OpenVEX, and Rekor entry. Update docs.json
navigation and expand the Supply chain security section in docs/security.mdx.
Add a Verifying Release Artifacts section to SECURITY.md.

* fix(vex): cover otel SDK CVE-2026-39883 in rebuilt Docker CLI binary

The rebuilt Docker CLI v29.4.0 vendors otel/sdk v1.42.0, which still
contains CVE-2026-39883 (BSD kenv PATH hijacking; fixed in v1.43.0).
docker-compose v5.1.2 vendors otel/sdk v1.38.0 separately. The original
VEX statement only covered the compose binary's location and version,
so Trivy's scan of /usr/local/bin/docker was not suppressed.

Add a second subcomponent entry for the CLI binary path with the
correct vendored version. The not_affected justification (BSD-only
code path; we ship linux/amd64 and linux/arm64 only) holds for both
binaries.

* fix(ci): use list form for vulnerability.vex in trivy.yaml

Trivy's config schema requires vulnerability.vex to be a list (mapped
to the multi-value --vex flag). The previous bare-string value was
silently dropped, so the OpenVEX document was never loaded and HIGH
findings already covered by VEX statements still failed the scan.

* fix(ci): mirror VEX CVE in .trivyignore for local-image scan

Trivy does not emit an OCI purl for locally-built images without a
RepoDigests entry (aquasecurity/trivy#9399), so OpenVEX product
matching against the CI build target sencho:pr-test resolves to no
artifact and every statement is silently dropped. The VEX document
remains the canonical triage record and is still attached as a cosign
attestation on the published image; this file just mirrors the single
CVE that surfaces on the local scan so CI does not block on a finding
already triaged in VEX. Updates the Trivy step comment to document
the relationship between the two files.
2026-04-26 23:21:11 -04:00

121 lines
5.3 KiB
JSON

{
"@context": "https://openvex.dev/ns/v0.2.0",
"@id": "https://github.com/AnsoCode/Sencho/security/vex/sencho.openvex.json",
"author": "Studio Saelix",
"role": "Vendor",
"timestamp": "2026-04-26T00:00:00Z",
"last_updated": "2026-04-26T00:00:00Z",
"version": 1,
"statements": [
{
"vulnerability": {
"@id": "https://www.cve.org/CVERecord?id=CVE-2026-34040",
"name": "CVE-2026-34040",
"description": "Moby/Docker daemon authorization bypass"
},
"products": [
{
"@id": "pkg:oci/sencho",
"subcomponents": [
{
"@id": "pkg:golang/github.com/docker/docker@v28.5.2",
"location": "/usr/local/lib/docker/cli-plugins/docker-compose"
}
]
}
],
"status": "not_affected",
"justification": "vulnerable_code_not_in_execute_path",
"impact_statement": "The authz bypass applies to Docker daemon plugin authorization hooks. docker-compose v5.1.2 statically bundles docker/docker v28.5.2 as a library but never acts as a daemon and never runs authorization hooks. Sencho invokes compose only for up/down/ps operations against local user-authored compose files. The daemon authz code path is not reachable."
},
{
"vulnerability": {
"@id": "https://www.cve.org/CVERecord?id=CVE-2026-33747",
"name": "CVE-2026-33747",
"description": "BuildKit arbitrary file write via untrusted frontend"
},
"products": [
{
"@id": "pkg:oci/sencho",
"subcomponents": [
{
"@id": "pkg:golang/github.com/moby/buildkit@v0.27.1",
"location": "/usr/local/lib/docker/cli-plugins/docker-compose"
}
]
}
],
"status": "not_affected",
"justification": "vulnerable_code_not_in_execute_path",
"impact_statement": "docker-compose v5.1.2 statically bundles buildkit v0.27.1. The arbitrary file write vulnerability is exploitable only when buildkit processes an attacker-controlled frontend (e.g. a malicious Dockerfile image reference). Sencho invokes compose only for up/down/ps operations against user-authored compose files. Compose does not invoke the buildkit frontend execution path in this usage."
},
{
"vulnerability": {
"@id": "https://www.cve.org/CVERecord?id=CVE-2026-33748",
"name": "CVE-2026-33748",
"description": "BuildKit Git URL fragment subdir path traversal"
},
"products": [
{
"@id": "pkg:oci/sencho",
"subcomponents": [
{
"@id": "pkg:golang/github.com/moby/buildkit@v0.27.1",
"location": "/usr/local/lib/docker/cli-plugins/docker-compose"
}
]
}
],
"status": "not_affected",
"justification": "vulnerable_code_not_in_execute_path",
"impact_statement": "The Git URL fragment subdir traversal is exploitable only when buildkit fetches an attacker-controlled Git repository URL as a build context. Sencho invokes compose for up/down/ps against local user-authored compose files only. Compose does not pass Git URLs to buildkit in this usage."
},
{
"vulnerability": {
"@id": "https://www.cve.org/CVERecord?id=CVE-2026-24051",
"name": "CVE-2026-24051",
"description": "OpenTelemetry SDK PATH hijacking on process start"
},
"products": [
{
"@id": "pkg:oci/sencho",
"subcomponents": [
{
"@id": "pkg:golang/go.opentelemetry.io/otel/sdk@v1.38.0",
"location": "/usr/local/lib/docker/cli-plugins/docker-compose"
}
]
}
],
"status": "not_affected",
"justification": "inline_mitigations_already_exist",
"impact_statement": "The PATH hijacking requires an attacker to control the process PATH environment variable before compose starts. The container's PATH is set to /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin at image build time. Both directories are owned by root with mode 755. Unprivileged processes cannot inject malicious binaries into these directories."
},
{
"vulnerability": {
"@id": "https://www.cve.org/CVERecord?id=CVE-2026-39883",
"name": "CVE-2026-39883",
"description": "OpenTelemetry SDK BSD kenv PATH hijacking"
},
"products": [
{
"@id": "pkg:oci/sencho",
"subcomponents": [
{
"@id": "pkg:golang/go.opentelemetry.io/otel/sdk@v1.38.0",
"location": "/usr/local/lib/docker/cli-plugins/docker-compose"
},
{
"@id": "pkg:golang/go.opentelemetry.io/otel/sdk@v1.42.0",
"location": "/usr/local/bin/docker"
}
]
}
],
"status": "not_affected",
"justification": "vulnerable_code_not_present",
"impact_statement": "The BSD kenv PATH hijacking code path executes only on BSD operating systems (FreeBSD, OpenBSD, NetBSD). Sencho publishes linux/amd64 and linux/arm64 images only. The vulnerable code path is never executed in our runtime environment. Both the docker-compose plugin (otel/sdk v1.38.0) and the rebuilt Docker CLI binary (otel/sdk v1.42.0) bundle vulnerable versions; the same justification applies to both."
}
]
}