Repository navigation
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 aVERIFIEDverdict that did not follow from the input. Boolean operators and chained comparisons are now rejected (use theAnd/Or/Notbuilders), 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_mathevaluated 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.