You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
A strap serial hidden in a hex payload walks past every redaction rule #1833
It cannot see an identifier that arrives as hex, because it is reading hex digits rather than the
ASCII those bytes decode to.
That is not theoretical. On a WHOOP 5/MG, event 0x6D(109) carries the strap serial as plain ASCII
inside its payload:
payload=142e1c0001d36e3d1c12a35742423541503035333938353 20000
\x14.\x1c\x00\x01\xd3n=\x1c\x12\xa3WBB5AP0539852\x00\x00
^^^^^^^^^^^^^ serial
Any diagnostic that dumps that payload puts the serial into the strap log — the file people are asked to
attach to a public issue. The MAC rule works (device=FD:••:••:••:••:4A in a real capture), so the log looks redacted while an identifier passes through in a different encoding.
Apple logs hex too — commandResponsePayloadHex for the alarm readback, and the frame=<full frame hex> added for the clock diagnostic on diag(clock): read the strap's answer instead of asserting it (#1823) #1824. LiveState.redactPii has the same text-only shape, so
the same blind spot exists there and is not fixed by this issue's change.
The fix taken
Decode each payload=/frame= hex run, find printable ASCII stretches, and mask the bytes of any run
shaped like a serial — leaving the rest of the dump intact. Blanket-truncating the payload would defeat
the reason these dumps exist: the payload is exactly where an undocumented field would be found.
Landed on Android with the event census. The Apple twin is still open — LiveState.redactPii needs
the same treatment before another hex-dumping diagnostic is added there.
Worth noting
The serial in the example above is real, and it reached a public PR description through exactly this
route before anyone noticed. The redaction is not optional decoration; it is the thing that makes "please
attach your strap log" a safe request.
One small thing I noticed while checking my own PRs for leftover identifiers, for your call: the doc comment on PII_WHOOP_SERIAL_IN_HEX_RE (or its neighbour — the /** A WHOOP serial as it appears in a payload … (e.g. WBB5AP0539852). */ line in WhoopBleClient.kt) uses the serial from my #1825 capture as its worked example. It is the live one from my strap.
No harm done and I'm not asking for anything — a serial in a regex comment is a long way from a strap log. Just flagging it in case you'd rather the example be an obviously synthetic one (WBB5AP0000001 is what I used in the fixtures), since this is the code that exists to keep them out.
Activity
ble: redact a serial hidden inside a hex payload (ryanbr#1833)
ble: redact a hex-hidden serial on Apple too (#1834)
ble: unstack redactStrapLogPii's doc (doc-comments gate)
test centre: log every pushed strap EVENT under the Connection domain (…
Bump to 11.1.1 for a testing build
(+) devices: show the battery pack's charge, from an event the strap …
Zebsi235 commentedon Sep 6, 2026
One small thing I noticed while checking my own PRs for leftover identifiers, for your call: the doc comment on
PII_WHOOP_SERIAL_IN_HEX_RE(or its neighbour — the/** A WHOOP serial as it appears in a payload … (e.g. WBB5AP0539852). */line inWhoopBleClient.kt) uses the serial from my #1825 capture as its worked example. It is the live one from my strap.No harm done and I'm not asking for anything — a serial in a regex comment is a long way from a strap log. Just flagging it in case you'd rather the example be an obviously synthetic one (
WBB5AP0000001is what I used in the fixtures), since this is the code that exists to keep them out.evoveotech commentedon Sep 10, 2026
Verified fixed: Hex payload serial redaction is implemented on both platforms (Swift:
Strand/BLE/FrameRouter.swiftlines 339-341, Kotlin:WhoopBleClient.ktlines 1649, 1693, 1715) with tests (PiiRedactionTests.swift,HexPayloadRedactionTests.swift,PiiRedactionTest.kt).fix(oura): exempt oura-raw.jsonl from the WHOOP-serial hex redaction …