Skip to content

fix(security): close fail-open paths in four example verifiers, add ClusterFuzzLite - #128

Merged
imran-siddique merged 1 commit into
mainfrom
fix/security-quality-sweep-2026-09-25
Sep 25, 2026
Merged

imran-siddique merged 1 commit into
mainfrom
fix/security-quality-sweep-2026-09-25

Conversation

@imran-siddique

Copy link
Copy Markdown
Member

Every bug below was reproduced with a failing test before the fix.

industrial-embodied-ai

  • controller.py: a NaN max_speed_mps compared false against both bounds and the controller accepted the motion. json.loads takes a bare NaN, so it arrives over the wire. An integer past the float range raised OverflowError instead of SafetyRejected. Tests: test_non_finite_speed_is_rejected, test_speed_too_large_for_float_is_rejected.
  • validate_artifacts.py: every check was an assert. Under python -O a tampered system-prompt.txt printed "valid" on all four lines. Now explicit checks, and every top-level manifest field must be in signed_fields (an injected unsigned field used to pass). Checked by hand with -O against a tampered copy; test_validate_artifacts.py pins the no-assert property.

agentic-commerce-accountability verify_purchase.py accepted a negative, zero, float or boolean amount, a NaN ceiling, a string allow-list (membership became a substring test), and runtime evidence from an agent other than the grant's delegate. Four new tests.

embodied-action-receipts verify_receipts.py: the lenient base64 decoder let !!!! or extra padding inside a signature still verify. Malformed fixtures escaped as KeyError, TypeError or binascii.Error; they now return invalid/malformed. Three new tests.

ca2a-delegation called verify_chain without trusted_root_issuers, which the library documents as structural only. A chain an attacker signs from their own key passed. The scenario now pins the platform root. Test: test_chain_from_an_untrusted_root_is_rejected.

Docs. The healthcare and financial-services READMEs said PHI and mnpi data only flow through attested runtimes. The Cedar rule fires only on attestation_platform == "unknown", and the committed dev-mode records show four PHI calls allowed on software-only. The text now says what the rule does. ards/README.md no longer says every TRACE record proves a TEE run.

Scorecard

Tests: 49 before, 60 after, all passing across the seven unittest jobs. actionlint 1.7.12 clean.

Generated with Claude Code

…rFuzzLite

controller.py accepted a NaN speed and let OverflowError escape.
validate_artifacts.py checked everything with assert, so python -O passed
tampered artifacts, and it accepted unsigned top-level manifest fields.
verify_purchase.py accepted non-positive or non-integer amounts, a NaN
ceiling, string allow-lists and evidence from a runtime other than the
grant's delegate. verify_receipts.py accepted signatures with junk base64
characters and crashed on malformed fixtures. The cA2A scenario verified
chains without a trusted root. Each has a regression test.

README fixes: the attestation gate in healthcare and financial-services
fires only on "unknown", not on software-only; ards no longer says every
TRACE record proves a TEE run; ca2a documents the root check.

Adds ClusterFuzzLite with three targets (Scorecard FuzzingID #26) and a
hashed lock for the receipts CI job (PinnedDependencies #49).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@imran-siddique
imran-siddique requested review from a team and carloshvp as code owners September 25, 2026 21:05
@imran-siddique
imran-siddique merged commit c5d7634 into main Sep 25, 2026
21 checks passed
@imran-siddique
imran-siddique deleted the fix/security-quality-sweep-2026-09-25 branch September 25, 2026 21:38
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