postgres.git / summary / log / commit / refs
commit 4d192fa168cf43c6431bf96941d8c709bb92bf5d
Author: Nathan Bossart <nathan@postgresql.org>
Commit: Noah Misch <noah@leadboat.com>
Date: Mon Aug 10 13:38:05 2026 +0000
Use value of scram_iterations in mock_scram_secret().
Presently, mock_scram_secret() always uses
SCRAM_SHA_256_DEFAULT_ITERATIONS, which poses an observable
response discrepancy hazard when scram_iterations is set to
something else. To fix, use the value of the configuration
parameter instead, and document that unauthenticated users can
discover the existence of roles with passwords created with
different iteration counts.
Reported-by: Radim Marek <radim@boringsql.com>
Author: Nathan Bossart <nathandbossart@gmail.com>
Reviewed-by: Michael Paquier <michael@paquier.xyz>
Reviewed-by: Heikki Linnakangas <hlinnaka@iki.fi>
Reviewed-by: Jacob Champion <champion.p@gmail.com>
Security: CVE-2026-14672
Backpatch-through: 16
doc/src/sgml/config.sgml | 13 +++++++++++++
src/backend/libpq/auth-scram.c | 2 +-
2 files changed, 14 insertions(+), 1 deletion(-)
diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml
index 0a2afe88ea0..1352ae85c10 100644
--- a/doc/src/sgml/config.sgml
+++ b/doc/src/sgml/config.sgml
@@ -1172,6 +1172,19 @@ include_dir 'conf.d'
time of encryption. In order to make use of a changed value, a new
password must be set.
</para>
+ <note>
+ <para>
+ If a role password was created with a different iteration count than
+ the value of <literal>scram_iterations</literal> specified in the
+ <filename>postgresql.conf</filename> file or on the server command
+ line, an unauthenticated user can discern the existence of the role by
+ observing discrepancies in the server's responses to connection
+ attempts. If you find this concerning, ensure that all role passwords
+ are created with <literal>scram_iterations</literal> set to the value
+ specified in the <filename>postgresql.conf</filename> file or on the
+ server command line.
+ </para>
+ </note>
</listitem>
</varlistentry>
diff --git a/src/backend/libpq/auth-scram.c b/src/backend/libpq/auth-scram.c
index 4bac15fc5c1..e8c8352fba8 100644
--- a/src/backend/libpq/auth-scram.c
+++ b/src/backend/libpq/auth-scram.c
@@ -727,7 +727,7 @@ mock_scram_secret(const char *username, pg_cryptohash_type *hash_type,
encoded_salt[encoded_len] = '\0';
*salt = encoded_salt;
- *iterations = SCRAM_SHA_256_DEFAULT_ITERATIONS;
+ *iterations = scram_sha_256_iterations;
/* StoredKey and ServerKey are not used in a doomed authentication */
memset(stored_key, 0, SCRAM_MAX_KEY_LEN);
[parent: a3832a757101]