1
0
mirror of https://github.com/postgres/postgres.git synced 2025-06-27 23:21:58 +03:00

Secure Unix-domain sockets of "make check" temporary clusters.

Any OS user able to access the socket can connect as the bootstrap
superuser and in turn execute arbitrary code as the OS user running the
test.  Protect against that by placing the socket in the temporary data
directory, which has mode 0700 thanks to initdb.  Back-patch to 8.4 (all
supported versions).  The hazard remains wherever the temporary cluster
accepts TCP connections, notably on Windows.

Attempts to run "make check" from a directory with a long name will now
fail.  An alternative not sharing that problem was to place the socket
in a subdirectory of /tmp, but that is only secure if /tmp is sticky.
The PG_REGRESS_SOCK_DIR environment variable is available as a
workaround when testing from long directory paths.

As a convenient side effect, this lets testing proceed smoothly in
builds that override DEFAULT_PGSOCKET_DIR.  Popular non-default values
like /var/run/postgresql are often unwritable to the build user.

Security: CVE-2014-0067
This commit is contained in:
Noah Misch
2014-03-29 00:52:56 -04:00
parent 733c2a48c9
commit 61017ea214
2 changed files with 44 additions and 22 deletions

View File

@ -58,21 +58,14 @@ gmake check
<warning>
<para>
This test method starts a temporary server, which is configured to accept
any connection originating on the local machine. Any local user can gain
database superuser privileges when connecting to this server, and could
in principle exploit all privileges of the operating-system user running
the tests. Therefore, it is not recommended that you use <literal>gmake
check</> on machines shared with untrusted users. Instead, run the tests
after completing the installation, as described in the next section.
</para>
<para>
On Unix-like machines, this danger can be avoided if the temporary
server's socket file is made inaccessible to other users, for example
by running the tests in a protected chroot. On Windows, the temporary
server opens a locally-accessible TCP socket, so filesystem protections
cannot help.
On systems lacking Unix-domain sockets, notably Windows, this test method
starts a temporary server configured to accept any connection originating
on the local machine. Any local user can gain database superuser
privileges when connecting to this server, and could in principle exploit
all privileges of the operating-system user running the tests. Therefore,
it is not recommended that you use <literal>gmake check</> on an affected
system shared with untrusted users. Instead, run the tests after
completing the installation, as described in the next section.
</para>
</warning>
@ -111,6 +104,17 @@ gmake MAX_CONNECTIONS=10 check
</screen>
runs no more than ten tests concurrently.
</para>
<para>
To protect your operating system user account, the test driver places the
server's socket in a relative subdirectory inaccessible to other users.
Since most systems constrain the length of socket paths well
below <literal>_POSIX_PATH_MAX</>, testing may fail to start from a
directory with a long name. Work around this problem by pointing
the <envar>PG_REGRESS_SOCK_DIR</> environment variable to a substitute
socket directory having a shorter path. On a multi-user system, give that
directory mode <literal>0700</>.
</para>
</sect2>
<sect2>