Cybersecurity research · Tokyo

ba-cybersecurity.comResearch by Nobuo Otoi

Verifying Internet standards · IETF SUIT, draft-ietf-suit-update-management-16

A firmware version condition for a final release also accepted its pre-releases: draft-ietf-suit-update-management-16, Section 4.4

Status · Fixed in -17Posted · 1 Nov 2026, SUIT listRevision -17 · 2 Nov 2026

SUIT manifests tell small devices which firmware versions an update applies to, by comparing arrays of integers. In revision -16 the rule for pre-releases let a condition written for a final release match that release's alpha and beta builds as well. The author confirmed the error within a day and the next revision changes the encoding.

The problem

Section 4.4 of the draft compares the version asserted by a component with an array of integers in the manifest, integer by integer, and stops "after all integers in the array defined by the manifest have been consumed". Section 4.4.1 encodes a pre-release with a negative indicator, for example 1.2.3-alpha.4 = [1,2,3,-3,4], and says this lets pre-releases "compare correctly with final releases".

Put together: for the condition Equal [1,2,3] and a component at 1.2.3-alpha.4, the comparison finds 1 = 1, 2 = 2, 3 = 3, the manifest's array is consumed, and the condition matches. A condition meant for release 1.2.3 also accepts its alpha; Greater or Equal [1,2,3] accepts it the same way, and Lesser [1,2,3] does not, although Semantic Versioning 2.0.0 (a normative reference of the draft) ranks 1.2.3-alpha.4 below 1.2.3.

How it was shown

The case above needs only the draft text. Further cases, a possible wording for a fix, and two checks accompany it: in Lean 4 the rule as written is modelled, the cases are checked by decide, and the proposed wording is proved to agree with SemVer precedence for arrays of any length and any values; in Python, every pair of 858 arrays under the five operators (3,680,820 combinations) is compared, and the draft text differs from SemVer in 49,365 of them, the proposed wording in none.

No cryptographic mechanism is broken, no attack on a deployed device was tried, and implementations were not tested.

Check it by hand

§4.4.1 1.2.3-alpha.4 = [1,2,3,-3,4] §4.4 comparison "stops after all integers in the array defined by the manifest have been consumed" Equal [1,2,3] against 1.2.3-alpha.4 1 = 1, 2 = 2, 3 = 3, array consumed, stop draft matches SemVer §11 1.2.3-alpha.4 is lower than 1.2.3

Draft -16 §4.4 · SemVer §11 · Minimal.lean

Response

The case was posted to the SUIT working group list on 1 Nov 2026. The same day (UTC) an author of the draft replied that the reading is correct, that the current encoding together with the stopping rule allows a condition intended for a final release to accept its pre-releases, and that this is an error in the draft. Rather than changing the comparison rule, the author proposed changing the encoding: three release integers are always present, a fourth integer gives the release stage (0 for a final release, negative for a pre-release), and a pre-release ends with the marker −24, so that 1.2.3 becomes [1,2,3,0] and 1.2.3-alpha.4 becomes [1,2,3,-3,4,-24].

That proposal was checked the next day: a model of 1,728 complete versions, every pair under the five operators (14,929,920 combinations), gives no disagreement with SemVer precedence, and a Lean 4 theorem shows the same for complete versions with any values and any number of identifiers. Two remaining edge cases were noted on the list (short selectors still match pre-releases by design; a component shorter than the manifest has no defined outcome).

Revision -17 of the draft, dated 2 Nov 2026, contains the new encoding rules in Section 4.4.1.

Cite as

Nobuo Otoi (ba-cybersecurity.com). A Hand-Checkable Case and Lean Proofs on Version Comparison in draft-ietf-suit-update-management-16. 2026. https://ba-cybersecurity.com/research/suit-version-comparison/.

@misc{otoi2026suit,
  author       = {Otoi, Nobuo},
  title        = {A Hand-Checkable Case and Lean Proofs on Version Comparison in draft-ietf-suit-update-management-16},
  year         = {2026},
  howpublished = {\url{https://ba-cybersecurity.com/research/suit-version-comparison/}},
  note         = {Code and proofs: https://github.com/otoinobuo/suit-verify}
}

List post 1 Nov 2026 · Author's reply 1 Nov 2026 (UTC) · Draft -17 published 2 Nov 2026 · This page: updated 7 Nov 2026 · Permanent address: https://ba-cybersecurity.com/research/suit-version-comparison/