pgsql: Fix failure to reset libpq's state fully between connectionatte - Mailing list pgsql-committers

From Tom Lane
Subject pgsql: Fix failure to reset libpq's state fully between connectionatte
Date
Msg-id E1fmgtb-00035A-2V@gemulon.postgresql.org
Whole thread Raw
List pgsql-committers
Fix failure to reset libpq's state fully between connection attempts.

The logic in PQconnectPoll() did not take care to ensure that all of
a PGconn's internal state variables were reset before trying a new
connection attempt.  If we got far enough in the connection sequence
to have changed any of these variables, and then decided to try a new
server address or server name, the new connection might be completed
with some state that really only applied to the failed connection.

While this has assorted bad consequences, the only one that is clearly
a security issue is that password_needed didn't get reset, so that
if the first server asked for a password and the second didn't,
PQconnectionUsedPassword() would return an incorrect result.  This
could be leveraged by unprivileged users of dblink or postgres_fdw
to allow them to use server-side login credentials that they should
not be able to use.

Other notable problems include the possibility of forcing a v2-protocol
connection to a server capable of supporting v3, or overriding
"sslmode=prefer" to cause a non-encrypted connection to a server that
would have accepted an encrypted one.  Those are certainly bugs but
it's harder to paint them as security problems in themselves.  However,
forcing a v2-protocol connection could result in libpq having a wrong
idea of the server's standard_conforming_strings setting, which opens
the door to SQL-injection attacks.  The extent to which that's actually
a problem, given the prerequisite that the attacker needs control of
the client's connection parameters, is unclear.

These problems have existed for a long time, but became more easily
exploitable in v10, both because it introduced easy ways to force libpq
to abandon a connection attempt at a late stage and then try another one
(rather than just giving up), and because it provided an easy way to
specify multiple target hosts.

Fix by rearranging PQconnectPoll's state machine to provide centralized
places to reset state properly when moving to a new target host or when
dropping and retrying a connection to the same host.

Tom Lane, reviewed by Noah Misch.  Our thanks to Andrew Krasichkov
for finding and reporting the problem.

Security: CVE-2018-10915

Branch
------
REL9_3_STABLE

Details
-------
https://git.postgresql.org/pg/commitdiff/243de06be96d6001d01f2ec7c4573aad8b657195

Modified Files
--------------
src/interfaces/libpq/fe-connect.c | 301 ++++++++++++++++++++++++--------------
src/interfaces/libpq/libpq-int.h  |   2 +
2 files changed, 196 insertions(+), 107 deletions(-)


pgsql-committers by date:

Previous
From: Peter Eisentraut
Date:
Subject: pgsql: Adjust error message
Next
From: Tom Lane
Date:
Subject: pgsql: Last-minute updates for release notes.