Skip to content

v7.2.2 — Verification Soundness & Safety Hardening

Choose a tag to compare

@rahuldass19 rahuldass19 released this 09 Oct 13:02
· 42 commits to main since this release
75149ec

v7.2.2 — Verification Soundness & Safety Hardening

Fail-closed security release. No new capability, no breaking wire changes. Upgrade from any >= 6.0.0, <= 7.2.1 deployment is recommended.

Four coordinated security advisories are addressed in this release. Advisory pages (with CVEs) are published on the repository Security tab.

Security fixes

  • Local SDK math verification — SymPy allow-list bypass.
    The local SDK's SymPy expression validator inspected only a call's direct arguments, so a string literal nested inside a container (e.g. a tuple or list) could reach SymPy's string-evaluation path and run names outside the allow-list. The validator is now the authoritative string gate: a string literal is allowed only as a direct argument of a safe-string constructor, and is rejected everywhere else. (qwed_sdk/qwed_local.py)

  • Logic verification soundness — false VERIFIED.
    The Z3 constraint evaluator accepted Python boolean operators (and/or/not) and chained comparisons on symbolic objects, which do not build a Z3 formula and could silently change the constraint. The DSL compiler also auto-created variables from quoted string literals. Both could yield a VERIFIED verdict that did not follow from the input. Boolean operators and chained comparisons are now rejected (use the And/Or/Not builders), and string literals are rejected in the DSL. (src/qwed_new/core/safe_evaluator.py, src/qwed_new/core/dsl/compiler.py)

  • Large-number math verification — precision loss.
    verify_math evaluated expressions at SymPy's default 15 significant digits, so values with more digits were rounded before comparison — an incorrect claim could be marked VERIFIED and a correct one rejected. Comparison now uses a precision scaled to the operands, with exact handling for integers. (src/qwed_new/core/verifier.py)

  • Computational-cost bounds — denial of service.
    The math parser skipped its cost gates for implicit-multiplication input, and the logic/DSL engines had no bound on statically-known integer powers, so a short request could exhaust a worker. Cost gates now run on such input, and integer powers are bounded in both engines. (src/qwed_new/core/safe_parser.py, src/qwed_new/core/safe_evaluator.py, src/qwed_new/core/dsl/compiler.py)

Upgrade

All install coordinates carry the fix:

  • PyPI: qwed==7.2.2
  • npm: @qwed-ai/sdk@7.2.2
  • crates.io: qwed = "7.2.2"
  • Docker: qwedai/qwed-verification:7.2.2

No API or wire-format changes. Drop-in upgrade from 7.x.

Full changelog: see CHANGELOG.md.