[TLS] RNG state should not cascade across TLS connections
Nick Sullivan <nicholas.sullivan@gmail.com> Mon, 13 July 2026 09:59 UTC
Return-Path: <nicholas.sullivan@gmail.com>
X-Original-To: tls@mail2.ietf.org
Delivered-To: tls@mail2.ietf.org
Received: from localhost (localhost [127.0.0.1]) by mail2.ietf.org (Postfix) with ESMTP id 8FCD0115B76BC for <tls@mail2.ietf.org>; Mon, 13 Jul 2026 02:59:18 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ietf.org; s=ietf1; t=1783936758; bh=2uVXHavgZpur1ly0BvQHWPQsry9sfPfH8D7lzmDjcj8=; h=From:Date:Subject:To; b=PcgMWWXqrxvIm2CFtFaEToD+0vNEgyIaDPwNSevFndq3kCJ6qnq5HTWpJf+ZgwQZS Cp8t2vfr4eD3UOyUputWammNaOAaG8UOFFni7JKOEt52cbj0ovPeZbn9682KPEhVFN k+AZeLgrozsRnL2Fwn0y3Ttwe2KCl2Tm/xppXLY4=
X-Virus-Scanned: amavisd-new at ietf.org
X-Spam-Flag: NO
X-Spam-Score: -2.098
X-Spam-Level:
X-Spam-Status: No, score=-2.098 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, HTML_MESSAGE=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001] autolearn=ham autolearn_force=no
Authentication-Results: mail2.ietf.org (amavisd-new); dkim=pass (2048-bit key) header.d=gmail.com
Received: from mail2.ietf.org ([166.84.6.31]) by localhost (mail2.ietf.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id tKCQ3hxffBGl for <tls@mail2.ietf.org>; Mon, 13 Jul 2026 02:59:18 -0700 (PDT)
Received: from mail-yx1-xb12d.google.com (mail-yx1-xb12d.google.com [IPv6:2607:f8b0:4864:20::b12d]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature ECDSA (P-256) server-digest SHA256) (No client certificate requested) by mail2.ietf.org (Postfix) with ESMTPS id 3F4FD115B75E3 for <TLS@ietf.org>; Mon, 13 Jul 2026 02:59:14 -0700 (PDT)
Received: by mail-yx1-xb12d.google.com with SMTP id 956f58d0204a3-664cdeab266so4497106d50.3 for <TLS@ietf.org>; Mon, 13 Jul 2026 02:59:14 -0700 (PDT)
ARC-Seal: i=1; a=rsa-sha256; t=1783936754; cv=none; d=google.com; s=arc-20260327; b=ZlUYxFWTFcEoiadsT6BHZ/66nDDGlQ3ZOqW/bpUtHyrWm6+TfdEQiRd2C5bo5QU+Jz IV+kFWwx+5XZvSZd1nm+HZr4HSDJOpie4iwKAjvipzPYhAChG95GIjCFUrvG7tI5l8tz hNSeT+h3YmaK+DjQsHCv/UPBLuD0rwTH04FRhM44zLdKGyVeBv1vw2RMw76P8eC/rNVp K4rS3ZfiEvCwEYdln4g1BA8pXybW/KRAmAhm9cnJcm3ImKhTn+p30ykVlZd2J4RT9k4L 3AUy8SwGOHGG9oTAOjxyrh+rYhFIKpmqJ4Pm7k6ra03Akm4M5tvc5iRXzF/Ej33zWORw YR4g==
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20260327; h=to:subject:message-id:date:from:mime-version:dkim-signature; bh=2uVXHavgZpur1ly0BvQHWPQsry9sfPfH8D7lzmDjcj8=; fh=b+CRW//4OQwHixwANO6T4MsGdv9Oya/97uE8FNpGfjU=; b=CudYJyneTdrw7618FYxMo/DtUemOjZbRYD7hSsPKRSANyzHfaU9PP5dEliRJbjThCF MnNd6kkgL0QjfLjMAZcEG3pCsSfn33OzsQdIWtSctEA9C3MJVXblAmJ7vpQ5zPtcRVg2 B7b+k6Qu61F5+GNOcKtYnRkC4UKc0BoX3OI6fG7WE9aQ/uQg7HMnJmftt1xyyuHW4quc 0Q0UEX8n7ryynQEMlq/wWUfR8zpYjcklVu//hJnz25hEBDVmsvM5XpafvGDfAWJqM7UQ RMNfHZKOTxnkEdC4wK8EFChnXJafkTApSk+NJOgWUrrfqQHBMIAJRbtuiTRk8oLrlEpu L2ZQ==; darn=ietf.org
ARC-Authentication-Results: i=1; mx.google.com; arc=none
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1783936754; x=1784541554; darn=ietf.org; h=content-type:to:subject:message-id:date:from:mime-version:from:to :cc:subject:date:message-id:reply-to:content-type; bh=2uVXHavgZpur1ly0BvQHWPQsry9sfPfH8D7lzmDjcj8=; b=lU3rZLqpQaGJa9l5YKQj3UnHxpQARG56XMoxkadL2WCRBdT8+Te5T4M8BVQqVmFpZR 0kEs+tJRJDlxFrqwv1Y2bWqXB1uIYWwJQAIGdRDYg7R9+lU0w2Pej8jvbf3X0bsABePD WyX0F3U+BJzx3TeU1mHXbM7odlnxwc0owl1wH4iOuD3QDDbBk9yc2HGlA7qR7Y7Ef830 lQmGy7MGEkPTAv5sabt0vCi3o9CpOzuEVBwctrQpa+7+YSiVrOAf3amDL/QrzH25M2kx DY5FCjRgP5UO52zoUGlNy1HkUuX6uYyA/11ZVZHTVzLZZeFOUpdZDJr4K1CJYupm06RW f8XA==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783936754; x=1784541554; h=content-type:to:subject:message-id:date:from:mime-version:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=2uVXHavgZpur1ly0BvQHWPQsry9sfPfH8D7lzmDjcj8=; b=clY04fret8JlW2EjoQLEIZemTsNwfvz+94sxEvGsCgQHnhr5Xkg2GJ7SrL/+sQZeo4 euUBZ/xbAXaCc0z/xZXYm04OMltP3t1v0wMLg1xpX2VbG70ATswiEbP63sGlHpByLzdc wkDYJiW8L6+Mt3T19O74xkLA3+LoelDPcPPloPymz0ybRgyRq6LecgURU/Q3yby7W9Sx +ZiE0993iow69cs/qvmHMsg/zAMaDg33rLBnzZZz8uM/pGCJ5GaWB7FD1Ll/ziiyWhAp CqsZKqsiK9ZBOgyNBvQSWeRW3JTjrQc3vdBVcTXCQ/2iKLCYBrR/tuHCB1bpGrCsK+5/ UP2A==
X-Gm-Message-State: AOJu0YwRTl5kJl0Bx5lMuU0s0G9z21hpNc8L4gDBTQ8ooOQ/PZ3GTITU 6x3MKhdxyFBW3+Z8A72gc8Jan2Q2ISK015zzgNS/H+/L6rlMhZLcjTxiSyCpElxbbkR7ktgTbJO oToIxtviAWxDJ45JPahHhv1LtHFHTUOLS0OnAzdtjZ9wo
X-Gm-Gg: AfdE7clSWyZ3OuPqwjm/WBRFuW6Mpyai5kLMrlBNDPk17MK9CD3Dx8VWjFfGwwE3WRO xGtCGQyFt+dDICNkR97Ah6fy/iSBL9+sc7IyHswDIhO+VyvKzUNq+p2kQ6ENTwQ4/ozp23PftB0 A07Nrsg2n3szBjq2bsOeXU7W0dq9r7oM6jK8JtcerS7m14uJwFa06LlshowdNiunKOIgxg606Xb mHxnH6fDIMvCclOB7d5TP+0KpTtZ4iPm80HWGOPo3o7Z7GvaXcTYt1h/0sf4Wse13+tmb3rLdyf N/VTSsM5GVbrjqE1PzYnol6soVWUPCf2faL+GMyb2HXhc0VxSksP955TzPzEl+xosEWbbPLTLAy oyvJn6mkT1d1geXXv8RkE3UlM+A5tPg==
X-Received: by 2002:a05:690e:1343:b0:667:d824:b569 with SMTP id 956f58d0204a3-667d824bf02mr6125443d50.57.1783936753595; Mon, 13 Jul 2026 02:59:13 -0700 (PDT)
MIME-Version: 1.0
From: Nick Sullivan <nicholas.sullivan@gmail.com>
Date: Mon, 13 Jul 2026 10:59:02 +0100
X-Gm-Features: AVVi8Ce3HjscGpEta-wQCddDMA1LyPcIlPDExiQREeXpQTCEV_JW8tFVzkUCTX4
Message-ID: <CAOjisRz13O2swG+vmjjR9wKJg845OauTxDcY9EJa2ovh3kjSiA@mail.gmail.com>
To: "tls@ietf.org" <TLS@ietf.org>
Content-Type: multipart/alternative; boundary="0000000000007ffb5306567b24d2"
Message-ID-Hash: 32JCFAGDX7RTDTCSBXQWFNXFVUXM7IHL
X-Message-ID-Hash: 32JCFAGDX7RTDTCSBXQWFNXFVUXM7IHL
X-MailFrom: nicholas.sullivan@gmail.com
X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-tls.ietf.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header
X-Mailman-Version: 3.3.9rc6
Precedence: list
Subject: [TLS] RNG state should not cascade across TLS connections
List-Id: "This is the mailing list for the Transport Layer Security working group of the IETF." <tls.ietf.org>
Archived-At: <https://mailarchive.ietf.org/arch/msg/tls/DzCh4dF6CLFBcbkQmMk0sujXWo0>
List-Archive: <https://mailarchive.ietf.org/arch/browse/tls>
List-Help: <mailto:tls-request@ietf.org?subject=help>
List-Owner: <mailto:tls-owner@ietf.org>
List-Post: <mailto:tls@ietf.org>
List-Subscribe: <mailto:tls-join@ietf.org>
List-Unsubscribe: <mailto:tls-leave@ietf.org>
Hi TLSWG, Pulling this up from a deep subthread so it doesn't get lost. There are two distinct attacks against a state-recoverable DRBG worth naming separately. Both work the same way: one exposure of RNG output lets the attacker walk state forward and predict every subsequent draw from the same DRBG. Scenario 1: passive eavesdropper. Recovery vector is a wire nonce like ServerHello.Random. Applies to both KEMs and DH. Scenario 2: adversary client. Recovery vector is `m`, which the adversary recovers by decapsulating the server's ciphertext. Applies to KEMs only, not to DH. Scenario 2 applies to KEMs but not DH because the FO transform requires the decapsulator to recover the encapsulator's `m`. DH's peer sees only `a·G` behind ECDLP. No raw randomness ever crosses. This is a KEM-abstraction property, not ML-KEM-specific. The attacker in Scenario 2 needs to make enough connections to your server to accumulate the `m` values needed to recover DRBG state. For a Dual_EC-shape DRBG a single 32-byte `m` is enough. Other state-recoverable constructions may require more. What both scenarios share: once DRBG state is recovered, the attacker passively decrypts every subsequent connection to that server from just the network flow. Every user, every session, decrypted from the wire without touching the server again. This continues until the DRBG reseeds. For a stack that does not explicitly reseed, that means for the life of the process. Predicted `m` plus observed `ek` gives the KEM shared secret directly. This is the mechanism behind the 2015 Juniper ScreenOS Dual_EC incident, which put passive VPN decryption within reach of whoever held the trapdoor to the substituted Q constant. Nothing about ML-KEM makes it immune to the same mechanism. That cascade is the actual concern. How the server arranges its DRBGs determines which scenario the attacker would take. Under a shared DRBG (ServerHello.Random and `m` from the same source), Scenario 1 is available to any passive observer without an active connection. This is Ben Kaduk's point. Splitting the DRBGs closes Scenario 1 but leaves Scenario 2 as the primary path against the DRBG that feeds `m`. David Benjamin has argued that the fix belongs at the RNG layer, not at ML-KEM or inside TLS. That seems right. Use a DRBG whose output does not reveal its state (duh), and which provides post-compromise recovery (via reseeding from fresh entropy by design, or via per-connection reinitialization at the caller). Either way, any state exposure is bounded in time. This approach is KEM-generic and applies beyond ML-KEM. Runnable PoCs for both scenarios are trivial to construct. Let me know if I have this summary right. Nick
- [TLS] RNG state should not cascade across TLS con… Nick Sullivan
- [TLS] Re: RNG state should not cascade across TLS… John Mattsson
- [TLS] Re: RNG state should not cascade across TLS… John Mattsson
- [TLS] Re: RNG state should not cascade across TLS… Jacob Appelbaum
- [TLS] Re: RNG state should not cascade across TLS… Jacob Appelbaum
- [TLS] Re: RNG state should not cascade across TLS… John Mattsson
- [TLS] Re: RNG state should not cascade across TLS… Simon Josefsson
- [TLS] Re: RNG state should not cascade across TLS… Jacob Appelbaum
- [TLS] Re: RNG state should not cascade across TLS… Nick Sullivan
- [TLS] Re: RNG state should not cascade across TLS… Jacob Appelbaum
- [TLS] Re: RNG state should not cascade across TLS… Jacob Appelbaum