pgsql: libpq: Prepare for protocol grease during 19beta - Mailing list pgsql-committers

From Jacob Champion
Subject pgsql: libpq: Prepare for protocol grease during 19beta
Date
Msg-id E1voQy7-001Wl6-2v@gemulon.postgresql.org
Whole thread Raw
List pgsql-committers
libpq: Prepare for protocol grease during 19beta

The main reason that libpq doesn't request protocol version 3.2 by
default is because other proxy/server implementations don't implement
the negotiation. This is a bit of a chicken-and-egg problem: We don't
bump the default version that libpq requests, but other implementations
may not be incentivized to implement version negotiation if their users
never run into issues.

One established practice to combat this is to flip Postel's Law on its
head, by sending parameters that the server cannot possibly support. If
the server fails the handshake instead of correctly negotiating, then
the problem is surfaced naturally. If the server instead claims to
support the bogus parameters, then we fail the connection to make the
lie obvious. This is called "grease" (or "greasing"), after the GREASE
mechanism in TLS that popularized the concept:

    https://www.rfc-editor.org/rfc/rfc8701.html

This patch reserves 3.9999 as an explicitly unsupported protocol version
number and `_pq_.test_protocol_negotiation` as an explicitly unsupported
protocol extension. A later commit will send these by default in order
to stress-test the ecosystem during the beta period; that commit will
then be reverted before 19 RC1, so that we can decide what to do with
whatever data has been gathered.

The _pq_.test_protocol_negotiation change here is intentionally docs-
only: after its implementation is reverted, the parameter should remain
reserved.

Extracted/adapted from a patch by Jelte Fennema-Nio.

Author: Jelte Fennema-Nio <postgres@jeltef.nl>
Co-authored-by: Jacob Champion <jacob.champion@enterprisedb.com>
Discussion: https://postgr.es/m/DDPR5BPWH1RJ.1LWAK6QAURVAY%40jeltef.nl

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/d8d7c5dc8f74506d35c7e8242be997fd5cf388eb

Modified Files
--------------
doc/src/sgml/protocol.sgml          | 23 +++++++++++++++++++++++
src/include/libpq/pqcomm.h          | 10 ++++++++++
src/interfaces/libpq/fe-protocol3.c | 14 +++++++++++++-
3 files changed, 46 insertions(+), 1 deletion(-)


pgsql-committers by date:

Previous
From: Tom Lane
Date:
Subject: pgsql: First-draft release notes for 18.2.
Next
From: Jacob Champion
Date:
Subject: pgsql: Protect against small overread in SASLprep validation