Corrected
My first pass on this issue said agt-core 5.0.0's agentrust-trace<0.3.0 pin looked like a packaging oversight and that lifting it would unblock us. That was wrong on both counts, and the real picture is better in one way and worse in another.
What is actually true
cryptography 48.0.1 carries three advisories. Two are reachable here, through the untrusted cert_chain a claim carries into verify_ak_ek_chain and verify_vcek_chain:
| advisory |
what it is |
fixed in |
reachable |
| 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, we only parse cert bundles |
49.0.0 is enough, and I verified it end to end in a clean venv with agt-core 4.1.0 and cryptography forced to 49.0.0:
cmcp test suite 1041 passed, 22 skipped
CedarBackend evaluate() works, policy decisions unchanged
pip-audit (as CI runs it) No known vulnerabilities found, 1 ignored -> exit 0
So the cap is not load-bearing for anything this package exercises. Take 49.0.0 and CI goes green with the single unreachable advisory already suppressed.
The one thing blocking it
agent-governance-toolkit-core 4.1.0, which is the release pip resolves for us, pins cryptography>=46.0.7,<49.0.
The cap was already lifted upstream, in #3070 (e75972f7, 2026-06-17, a one-line change to <50.0). It missed the 4.x line by 8 days: v4.1.0 was tagged 2026-06-09, and the monorepo moved to 5.0.0 on 2026-06-25. So the fix exists in history and has never shipped in a release we can install.
Why we cannot just take agt-core 5.x
This is the part my first pass got backwards. The agentrust-trace<0.3.0 cap on 5.0.0 was not an oversight: it was added deliberately in #3240, "cap agentrust-trace below 0.3.0 to restore TRACE validation", and it was lifted on main in #3454 to >=0.5.1,<0.6.0. So a release cut from main today would resolve cleanly against our agentrust-trace>=0.5.
But the same line of work deleted the API we depend on. #3444 replaced the v4 policy language with ACS v5 and removed agent_os/policies/backends.py. CedarBackend does not exist on main. PolicyEvaluator in policy/evaluator.py imports it directly:
from agent_os.policies.backends import CedarBackend
So the release that fixes our pin is the same release that breaks our policy evaluation. Asking for a 5.x release is asking to trade a dependency advisory for a broken gateway.
The ask
Backport e75972f7 to the 4.x line and release agt-core 4.1.1 with cryptography>=46.0.7,<50.0. One line, already written and merged on the other line, with the consumer-side evidence above. There is no 4.x maintenance branch today, so it needs a branch from v4.1.0 plus that cherry-pick.
Filed upstream as microsoft/agent-governance-toolkit#3614.
Done when
Separately tracked: the ACS v5 migration this exposed, since staying on agt-core 4.x is not a long-term position.
Worth noting
None of this was visible until #470 fixed pip-audit in CI. It ran with no arguments, hit the editable install of cmcp-runtime first, failed with "Dependency not found on PyPI and could not be audited", and exited before reaching any dependency finding. A security product was carrying a vulnerable pin behind an audit that had never run.
Corrected
My first pass on this issue said agt-core 5.0.0's
agentrust-trace<0.3.0pin looked like a packaging oversight and that lifting it would unblock us. That was wrong on both counts, and the real picture is better in one way and worse in another.What is actually true
cryptography48.0.1 carries three advisories. Two are reachable here, through the untrustedcert_chaina claim carries intoverify_ak_ek_chainandverify_vcek_chain:permittedSubtrees49.0.0 is enough, and I verified it end to end in a clean venv with agt-core 4.1.0 and
cryptographyforced to 49.0.0:So the cap is not load-bearing for anything this package exercises. Take 49.0.0 and CI goes green with the single unreachable advisory already suppressed.
The one thing blocking it
agent-governance-toolkit-core4.1.0, which is the release pip resolves for us, pinscryptography>=46.0.7,<49.0.The cap was already lifted upstream, in #3070 (
e75972f7, 2026-06-17, a one-line change to<50.0). It missed the 4.x line by 8 days: v4.1.0 was tagged 2026-06-09, and the monorepo moved to 5.0.0 on 2026-06-25. So the fix exists in history and has never shipped in a release we can install.Why we cannot just take agt-core 5.x
This is the part my first pass got backwards. The
agentrust-trace<0.3.0cap on 5.0.0 was not an oversight: it was added deliberately in #3240, "cap agentrust-trace below 0.3.0 to restore TRACE validation", and it was lifted on main in #3454 to>=0.5.1,<0.6.0. So a release cut from main today would resolve cleanly against ouragentrust-trace>=0.5.But the same line of work deleted the API we depend on. #3444 replaced the v4 policy language with ACS v5 and removed
agent_os/policies/backends.py.CedarBackenddoes not exist on main.PolicyEvaluatorinpolicy/evaluator.pyimports it directly:So the release that fixes our pin is the same release that breaks our policy evaluation. Asking for a 5.x release is asking to trade a dependency advisory for a broken gateway.
The ask
Backport
e75972f7to the 4.x line and release agt-core 4.1.1 withcryptography>=46.0.7,<50.0. One line, already written and merged on the other line, with the consumer-side evidence above. There is no 4.x maintenance branch today, so it needs a branch fromv4.1.0plus that cherry-pick.Filed upstream as microsoft/agent-governance-toolkit#3614.
Done when
cryptography>=49.0--ignore-vuln CVE-2026-69247comment in.github/workflows/ci.ymlis updated to note the other two are fixedSeparately tracked: the ACS v5 migration this exposed, since staying on agt-core 4.x is not a long-term position.
Worth noting
None of this was visible until #470 fixed
pip-auditin CI. It ran with no arguments, hit the editable install of cmcp-runtime first, failed with "Dependency not found on PyPI and could not be audited", and exited before reaching any dependency finding. A security product was carrying a vulnerable pin behind an audit that had never run.