The RFC 6528 initial-sequence-number implementation in subsys/net/ip/tcp.c derived every TCP ISN from SHA-256(unique_key || four-tuple) plus a uptime-derived offset, where unique_key is a 128-bit secret filled once by sys_csrand_get(). The return value of that call was discarded and the once guard was latched to true even when the call failed. Because sys_csrand_get() leaves the destination buffer untouched on failure (it deliberately propagates the entropy-driver error rather than filling the buffer), a single failed call left unique_key as its all-zero BSS content for the remainder of the boot, with no retry, no log message and no fallback.
A failure of the cryptographic random source is required to reach the weak state — for example -ENODEV/-EIO from the entropy driver in subsys/random/random_entropy_device.c (the in-tree comment notes that the hardware RNG "might still be gathering entropy during early boot situations"), or psa_generate_random() failing in subsys/random/random_psa.c when PSA crypto is not initialised or is backed by a Bluetooth-HCI entropy device that is not yet up. The first TCP connection is what triggers key generation, so a remote peer that reaches a listening port immediately after boot, or that can provoke a reboot, has indirect influence over whether generation coincides with that window. tcp_init_isn() is called for every passive open in tcp_conn_new() and every active open in net_tcp_connect(), so the poisoned key governs all TCP connections for that boot.
With an all-zero key the ISN becomes a public function of the connection four-tuple plus a device-wide time offset. An off-path attacker can compute the hash term offline for any four-tuple and recover the shared time offset from a single observed ISN, after which the ISN the device will pick for other four-tuples is predictable. That defeats exactly the protection RFC 6528 provides: blind TCP connection spoofing against peers that trust the source address, and blind data injection into or reset of connections whose four-tuple can be guessed. Devices whose entropy source never errors were never in the weak state.
The fix moves key generation into a single guarded helper that latches only on success, logs the error otherwise, and makes tcp_init_isn() fall back to sys_rand32_get() — the behaviour already used when CONFIG_NET_TCP_ISN_RFC6528 is disabled — instead of hashing with a known-constant key.
{
"cna_assigner": "zephyr",
"cwe_ids": [
"CWE-330"
],
"osv_generated_from": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/19xxx/CVE-2026-19735.json"
}{
"extracted_events": [
{
"range": [
{
"introduced": "3.7.0"
},
{
"last_affected": "4.4.2"
}
],
"source": "AFFECTED_FIELD",
"strategy": "StandardRange"
},
{
"range": [
{
"fixed": "700888e3ecff8474f4fe7dfa8782b8869053222b"
}
],
"source": "REFERENCES_COMMIT"
}
]
}
"https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2026-19735.json"
[
{
"deprecated": false,
"digest": {
"function_hash": "14757586431641831858801408525229443799",
"length": 667
},
"id": "CVE-2026-19735-3ef264cc",
"signature_type": "Function",
"signature_version": "v1",
"source": "https://github.com/zephyrproject-rtos/zephyr/commit/700888e3ecff8474f4fe7dfa8782b8869053222b",
"target": {
"file": "subsys/net/ip/tcp.c",
"function": "tcpv4_init_isn"
}
},
{
"deprecated": false,
"digest": {
"function_hash": "318505870009283947707148502288293914771",
"length": 608
},
"id": "CVE-2026-19735-880f29ab",
"signature_type": "Function",
"signature_version": "v1",
"source": "https://github.com/zephyrproject-rtos/zephyr/commit/700888e3ecff8474f4fe7dfa8782b8869053222b",
"target": {
"file": "subsys/net/ip/tcp.c",
"function": "tcp_init_isn"
}
},
{
"deprecated": false,
"digest": {
"function_hash": "123084972907976867434533984114973715810",
"length": 666
},
"id": "CVE-2026-19735-bde41f5b",
"signature_type": "Function",
"signature_version": "v1",
"source": "https://github.com/zephyrproject-rtos/zephyr/commit/700888e3ecff8474f4fe7dfa8782b8869053222b",
"target": {
"file": "subsys/net/ip/tcp.c",
"function": "tcpv6_init_isn"
}
},
{
"deprecated": false,
"digest": {
"line_hashes": [
"240719028537106232540406059886394086849",
"28516817426080033145515459768093824294",
"120997338796681465666572722288395181266",
"300297586729054507621561193462788822333",
"43674070613642793909573805718661817566",
"228932791111540318746615380144540514385",
"25618218647856858049848785158168705524",
"91241233156233475716963974001372492065",
"206327748722397498222299095237183395681",
"263433970625321113361961904525760271656",
"157986720406021785438453358983579565395",
"95657695254949771112244189203654399784",
"43674070613642793909573805718661817566",
"228932791111540318746615380144540514385",
"25618218647856858049848785158168705524",
"91241233156233475716963974001372492065",
"206327748722397498222299095237183395681",
"289975980101231424341421003692166503165",
"177069508300481631742076685202034224842",
"115399129693079089968471277695454148466",
"34371382105268544591673415776388801457",
"233404693951274308512806226445287665844",
"48199221039592772567864187525817258471",
"369069943074497317067947852121958041",
"93391981330329380000494811594931096492",
"116894349000299223703116997775634709162",
"63994525366880780973972164478400090667",
"113408454182495588661126072066058341659"
],
"threshold": 0.9
},
"id": "CVE-2026-19735-c1eb74d1",
"signature_type": "Line",
"signature_version": "v1",
"source": "https://github.com/zephyrproject-rtos/zephyr/commit/700888e3ecff8474f4fe7dfa8782b8869053222b",
"target": {
"file": "subsys/net/ip/tcp.c"
}
}
]
"2026-10-28T10:51:08Z"