Skip to content

chore: bump to 0.4.0 and make the CI security audit actually run - #470

Merged
imran-siddique merged 6 commits into
mainfrom
chore/bump-0.4.0-evidence-break
Aug 5, 2026
Merged

chore: bump to 0.4.0 and make the CI security audit actually run#470
imran-siddique merged 6 commits into
mainfrom
chore/bump-0.4.0-evidence-break

Conversation

@imran-siddique

@imran-siddique imran-siddique commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

Follow-up to #469, which is the decision that PR correctly left open. What started as a version bump turned up two more problems, and the third one needs your call before this can merge.

1. Version bump to 0.4.0

#469 put signed platform evidence in gateway.attestation_evidence so the verifier has something to check the TPM quote against. GatewayAddenda is extra="forbid", so a verifier built before that field rejects the claim as CLAIM_MALFORMED, and verify_trace_claim never reads cmcp_version, so there is no negotiation path.

result
0.4.0 verifier, older claim with no evidence fine, fields are optional and trace.runtime is still read as a fallback
pre-0.4.0 verifier, claim from a 0.4.0 gateway CLAIM_MALFORMED on gateway.attestation_evidence

A wire-format addition older readers reject, so minor rather than patch. Claims with no evidence serialize byte-identically to 0.3.0. cmcp_verify.__version__ is untouched, since it ships inside the cmcp-runtime distribution.

2. No version-bump PR could ever have passed CI

All six test jobs failed on the security scan with:

cmcp-runtime Dependency not found on PyPI and could not be audited: cmcp-runtime (0.4.0)

pip-audit with no arguments audits the whole environment including this package's own editable install, and fails whenever the local version is not yet published. --skip-editable drops it and keeps auditing every real dependency.

3. That fix made the audit run for the first time, and it fails

This repository has been carrying a vulnerable cryptography pin behind an audit that never got far enough to report it.

advisory what it is fixed in reachable here
CVE-2026-69249 duplicate self-signed intermediates cause exponential path building 49.0.0 yes
CVE-2026-69248 X.509 verifier accepts wildcard DNS names, escaping permittedSubtrees 49.0.0 yes
CVE-2026-69247 Bleichenbacher oracle in PKCS#7 EnvelopedData decryption 50.0.0 no

The first two are reachable in the way that matters most here: a TRACE claim carries cert_chain as untrusted input, and verify_ak_ek_chain and verify_vcek_chain build paths from it.

And it cannot be fixed from this repository. I tried the floor bump and reverted it, because it produces ResolutionImpossible rather than a secure install:

agt-core 4.0.0 / 4.1.0   cryptography<49.0             <- caps us at 48.x
agt-core 5.0.0           cryptography<50.0             <- would allow 49.0.0
                         agentrust-trace<0.3.0         <- but this repo needs >=0.5

Full analysis in #471, including the upstream ask: agt-core 5.0.0's agentrust-trace<0.3.0 pin looks like a packaging oversight, and lifting it is what unblocks a non-vulnerable cryptography here.

What is in this PR now

  • 0.4.0 in pyproject.toml and cmcp_runtime.__version__, plus the CHANGELOG entry for the verifier break
  • pip-audit --skip-editable
  • a comment on the cryptography pin recording why it cannot move yet

Why it is red, and the decision

The audit now reports honestly, so CI fails on findings that are real. Two ways forward, and it is a risk-acceptance call rather than a technical one:

I have deliberately not suppressed anything. Accepting a reachable vulnerability in the certificate-path code of an attestation verifier is a project-lead decision, not something a bump PR should quietly do.

🤖 Generated with Claude Code

imran-siddique and others added 2 commits August 3, 2026 20:02
#469 added gateway.attestation_evidence so the verifier has something to
check the TPM quote against. GatewayAddenda is extra="forbid", so any
verifier built before that field rejects the claim as CLAIM_MALFORMED,
and verify_trace_claim never reads cmcp_version so there is no
negotiation path. That is a wire-format change older readers reject, so
it is a minor bump, not a patch.

Claims carrying no evidence serialize byte-identically to 0.3.0.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
pip-audit with no arguments audits the whole environment, including the
editable install of cmcp-runtime itself, and fails with "Dependency not
found on PyPI and could not be audited" whenever the local version is
not published. That makes every version-bump PR unmergeable: the bump to
0.4.0 in this PR failed all six test jobs on it.

--skip-editable drops the local package and keeps auditing every real
dependency.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Unmasked by the pip-audit fix in the previous commit. 48.0.1 carries
three advisories, two of which land on exactly what this package does
with attacker-supplied certificates:

  CVE-2026-69249  duplicate self-signed intermediates cause exponential
                  path building, and a claim's cert_chain is untrusted
                  input to verify_ak_ek_chain
  CVE-2026-69248  the X.509 verifier accepts wildcard DNS names and
                  escapes permittedSubtrees name constraints

Both fixed in 49.0.0, which is reachable under the upstream <50 caps.

The third, CVE-2026-69247, is a Bleichenbacher oracle in PKCS#7
EnvelopedData decryption and needs 50.0.0. We never decrypt PKCS#7: the
only use is load_*_pkcs7_certificates in tee/tpm.py parsing a bundle
from an AIA URL, so the oracle is unreachable. 50.0.0 is also blocked by
agent-governance-toolkit-core (<50.0) and agent-manifest (<50). Ignored
in CI with that reasoning recorded, tracked in #471.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@imran-siddique imran-siddique changed the title chore: bump to 0.4.0 for the evidence transport break chore: bump to 0.4.0, fix the CI audit, and raise cryptography to 49.0 Aug 4, 2026
Raising the floor to 49.0 makes the dependency set unresolvable, so the
previous commit traded a reported vulnerability for a failed install.
The real shape of the problem, now recorded in #471:

  agt-core 4.0.0 / 4.1.0   cryptography<49.0            <- caps us at 48.x
  agt-core 5.0.0           cryptography<50.0            <- would allow 49
                           agentrust-trace<0.3.0        <- but we need >=0.5

The only agt-core release that permits a non-vulnerable cryptography is
incompatible with the agentrust-trace this package requires. So the two
reachable advisories cannot be fixed from this repository at all, and
pretending otherwise with an unsatisfiable pin helps nobody.

Also drops the CVE-2026-69247 ignore. Suppressing findings while the
reachable ones stay unfixed is a risk-acceptance call that belongs to the
project lead, not to a dependency-bump PR.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@imran-siddique imran-siddique changed the title chore: bump to 0.4.0, fix the CI audit, and raise cryptography to 49.0 chore: bump to 0.4.0 and make the CI security audit actually run Aug 4, 2026
CVE-2026-69247 is a Bleichenbacher oracle in PKCS#7 EnvelopedData
decryption. Nothing here decrypts PKCS#7: the only use is
load_*_pkcs7_certificates in tee/tpm.py, parsing a bundle fetched from an
AIA URL. Suppressing it keeps the audit output about real exposure.

CVE-2026-69249 and CVE-2026-69248 stay unsuppressed on purpose. Both are
reachable through the untrusted cert_chain a claim carries into
verify_ak_ek_chain and verify_vcek_chain, so this step stays red until
cryptography>=49.0 becomes installable. #471 tracks the agt-core pin that
blocks it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…muted

pip-audit stays red on CVE-2026-69249 and CVE-2026-69248 because
agt-core 4.1.0 declares cryptography<49.0 and a plain resolve lands on
48.0.1. Both advisories are reachable through the untrusted cert_chain a
claim carries into verify_ak_ek_chain / verify_vcek_chain, so suppressing
them was rejected: a security product should not silence findings that
reach real code paths to get a green tick.

Instead the CI job installs cryptography 49 over the declared cap. That
is safe rather than reckless: #471 records a clean-venv run of agt-core
4.1.0 against cryptography 49.0.0 with the full suite passing (1041) and
CedarBackend evaluating unchanged, so the cap is stale metadata rather
than a real incompatibility. pip's conflict warning is expected.

HONEST LIMIT, stated in the workflow itself: this fixes what CI tests,
not what users get. Until agt-core 4.1.1 ships the cap lift
(microsoft/agent-governance-toolkit#3614), `pip install cmcp` still
resolves cryptography 48.x. The step carries removal instructions for
when 4.1.1 lands, and the audit goes red again if it is removed early.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@imran-siddique
imran-siddique merged commit 4459494 into main Aug 5, 2026
11 checks passed
@imran-siddique
imran-siddique deleted the chore/bump-0.4.0-evidence-break branch August 5, 2026 04:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant