·
19 commits
to main
since this release
Fixed
- Governance JavaScript evaluation (member ballots and the constitution's
validate,resolveandapplysteps) is now bounded by the samejs_runtime_optionsheap, stack and execution time limits used for application requests, including while loading and initialising the module that contains those functions. A single member can no longer stall or exhaust the primary by supplying module-scope code without a bounded execution window. (#8341, #8346, #8351) - JavaScript application heap, stack, and execution-time limits now cover top-level module initialisation and response conversion, in addition to endpoint handler execution. (#8346)
- Restricted
ccf.gov.validateConstitutionto the constitution'svalidatestep. It is no longer exposed to applications, ballots, or the constitution'sresolveandapplysteps. Evaluating the proposed constitution is now bounded by the caller'sjs_runtime_optionsheap, stack and execution time limits, sharing the remaining execution time of thevalidatestep, rather than running unbounded (#8341). - Failures of the JS interpreter itself (out of memory, stack overflow, or interruption) while evaluating a module's top-level code are now reported as a failure to load that module, rather than being ignored (#8341).
- The JS crypto bindings (
ccf.crypto.wrapKey,ccf.crypto.unwrapKey,ccf.crypto.verifySignature) andsnp_attestation.verifySnpAttestationnow copy eachArrayBufferargument into an owned buffer before running any code that can re-enter JavaScript (property getters,toString/Symbol.toPrimitive, JSON conversion, etc.). Since QuickJS2026-06-04,ArrayBuffer.prototype.transferand.resize()let script free or reallocate the backing store, so the previous pattern of holding a raw pointer returned byJS_GetArrayBufferacross such calls was a use-after-free hazard (#8340, #8349). - An RSA-OAEP
labelpassed toccf.crypto.wrapKeyorccf.crypto.unwrapKeywhich is present but is not anArrayBufferis now reported as aTypeError. Previously it was ignored, but left an exception pending on the interpreter which could surface later as an unrelated failure. An absent,nullor zero-lengthlabelcontinues to mean "no label" (#8349). - Strengthened access checks on JavaScript KV handles, including namespace restrictions in the historical KV (#8318).
- The JS response body copy path no longer trusts the typed array's construction-time length: for a length-tracking
Uint8Arrayover a resizableArrayBufferthat was later shrunk (or a view whosebyteOffsethas fallen outside the current buffer), the copy is now clamped against the backing buffer's real current size, preventing a heap over-read introduced with the QuickJS2026-06-04update (#8340, #8347). - Invalid PEM construction and JSON deserialisation errors no longer include the supplied data, which may contain private key material (#8330).
- Reaching the soft session cap on an unsecured RPC interface no longer terminates the node by attempting a TLS handshake without a certificate. (#8331)
- Transactions from an earlier view are now rejected before entering the replication queue even after the node has stepped down. This prevents rolled-back writes from being replicated after a later election and blocking subsequent replication (#8293, #8295).
- Nodes now retain a peer's reconnect address even when an incoming node-to-node channel was established before its Raft configuration was applied. Previously, losing that connection could prevent outbound consensus messages from reaching the peer and stall elections (#8336).
Changed
- Updated QuickJS to
2026-06-04, with isolated build-time patches for out-of-memory backtrace handling and enforcement of lowered heap limits (#8340). - CBOR parsing now rejects composite (array or map) and tagged values used as map keys anywhere in the decoded document, including nested maps in optional COSE headers (#8297).
Removed
- Removed the exported
evercborCMake target and installedlibevercbor.alibrary. Applications using CCF's public APIs that explicitly depend on this target or link this library directly must remove that dependency. No further build changes are necessary: the replacement CBOR implementation is linked transitively by CCF (#8297).
Fixed
- Transactions with pending writes now correctly validate
foreach,size, andclearobservations of an existing empty KV table made at revision zero. Previously, these observations could be mistaken for no whole-map read dependency (#8320). - The OpenAPI schema for
GET /node/consensusandGET /node/networknow correctly marksdetails.primary_idandprimary_idas nullable, matching theirnullvalue while no primary is known (e.g. between elections). Previously the schema required a non-null string, causing spurious response validation failures (#8344).