Skip to content
Snippets Groups Projects
Commit 6b0b983f authored by Noah Misch's avatar Noah Misch
Browse files

start-scripts: switch to $PGUSER before opening $PGLOG.

By default, $PGUSER has permission to unlink $PGLOG.  If $PGUSER
replaces $PGLOG with a symbolic link, the server will corrupt the
link-targeted file by appending log messages.  Since these scripts open
$PGLOG as root, the attack works regardless of target file ownership.

"make install" does not install these scripts anywhere.  Users having
manually installed them in the past should repeat that process to
acquire this fix.  Most script users have $PGLOG writable to root only,
located in $PGDATA.  Just before updating one of these scripts, such
users should rename $PGLOG to $PGLOG.old.  The script will then recreate
$PGLOG with proper ownership.

Reviewed by Peter Eisentraut.  Reported by Antoine Scemama.

Security: CVE-2017-12172
parent 3f808957
No related branches found
No related tags found
No related merge requests found
...@@ -43,7 +43,7 @@ test -x $DAEMON || ...@@ -43,7 +43,7 @@ test -x $DAEMON ||
case $1 in case $1 in
start) start)
su -l $PGUSER -c "$DAEMON -D '$PGDATA' &" >>$PGLOG 2>&1 su -l $PGUSER -c "$DAEMON -D '$PGDATA' >>$PGLOG 2>&1 &"
echo -n ' postgresql' echo -n ' postgresql'
;; ;;
stop) stop)
...@@ -51,7 +51,7 @@ case $1 in ...@@ -51,7 +51,7 @@ case $1 in
;; ;;
restart) restart)
su -l $PGUSER -c "$PGCTL stop -D '$PGDATA' -s" su -l $PGUSER -c "$PGCTL stop -D '$PGDATA' -s"
su -l $PGUSER -c "$DAEMON -D '$PGDATA' &" >>$PGLOG 2>&1 su -l $PGUSER -c "$DAEMON -D '$PGDATA' >>$PGLOG 2>&1 &"
;; ;;
status) status)
su -l $PGUSER -c "$PGCTL status -D '$PGDATA'" su -l $PGUSER -c "$PGCTL status -D '$PGDATA'"
......
...@@ -91,7 +91,7 @@ case $1 in ...@@ -91,7 +91,7 @@ case $1 in
start) start)
echo -n "Starting PostgreSQL: " echo -n "Starting PostgreSQL: "
test -e "$PG_OOM_ADJUST_FILE" && echo "$PG_MASTER_OOM_SCORE_ADJ" > "$PG_OOM_ADJUST_FILE" test -e "$PG_OOM_ADJUST_FILE" && echo "$PG_MASTER_OOM_SCORE_ADJ" > "$PG_OOM_ADJUST_FILE"
su - $PGUSER -c "$DAEMON_ENV $DAEMON -D '$PGDATA' &" >>$PGLOG 2>&1 su - $PGUSER -c "$DAEMON_ENV $DAEMON -D '$PGDATA' >>$PGLOG 2>&1 &"
echo "ok" echo "ok"
;; ;;
stop) stop)
...@@ -103,7 +103,7 @@ case $1 in ...@@ -103,7 +103,7 @@ case $1 in
echo -n "Restarting PostgreSQL: " echo -n "Restarting PostgreSQL: "
su - $PGUSER -c "$PGCTL stop -D '$PGDATA' -s" su - $PGUSER -c "$PGCTL stop -D '$PGDATA' -s"
test -e "$PG_OOM_ADJUST_FILE" && echo "$PG_MASTER_OOM_SCORE_ADJ" > "$PG_OOM_ADJUST_FILE" test -e "$PG_OOM_ADJUST_FILE" && echo "$PG_MASTER_OOM_SCORE_ADJ" > "$PG_OOM_ADJUST_FILE"
su - $PGUSER -c "$DAEMON_ENV $DAEMON -D '$PGDATA' &" >>$PGLOG 2>&1 su - $PGUSER -c "$DAEMON_ENV $DAEMON -D '$PGDATA' >>$PGLOG 2>&1 &"
echo "ok" echo "ok"
;; ;;
reload) reload)
......
...@@ -80,9 +80,9 @@ StartService () { ...@@ -80,9 +80,9 @@ StartService () {
if [ "${POSTGRESQL:=-NO-}" = "-YES-" ]; then if [ "${POSTGRESQL:=-NO-}" = "-YES-" ]; then
ConsoleMessage "Starting PostgreSQL database server" ConsoleMessage "Starting PostgreSQL database server"
if [ "${ROTATELOGS}" = "1" ]; then if [ "${ROTATELOGS}" = "1" ]; then
sudo -u $PGUSER sh -c "${DAEMON} -D '${PGDATA}' &" 2>&1 | ${LOGUTIL} "${PGLOG}" ${ROTATESEC} & sudo -u $PGUSER sh -c "${DAEMON} -D '${PGDATA}' 2>&1 | ${LOGUTIL} \"${PGLOG}\" ${ROTATESEC} &"
else else
sudo -u $PGUSER sh -c "${DAEMON} -D '${PGDATA}' &" >>"$PGLOG" 2>&1 sudo -u $PGUSER sh -c "${DAEMON} -D '${PGDATA}' >>\"$PGLOG\" 2>&1 &"
fi fi
fi fi
} }
...@@ -99,9 +99,9 @@ RestartService () { ...@@ -99,9 +99,9 @@ RestartService () {
sudo -u $PGUSER sh -c "$PGCTL stop -D '${PGDATA}' -s" sudo -u $PGUSER sh -c "$PGCTL stop -D '${PGDATA}' -s"
# should match StartService: # should match StartService:
if [ "${ROTATELOGS}" = "1" ]; then if [ "${ROTATELOGS}" = "1" ]; then
sudo -u $PGUSER sh -c "${DAEMON} -D '${PGDATA}' &" 2>&1 | ${LOGUTIL} "${PGLOG}" ${ROTATESEC} & sudo -u $PGUSER sh -c "${DAEMON} -D '${PGDATA}' 2>&1 | ${LOGUTIL} \"${PGLOG}\" ${ROTATESEC} &"
else else
sudo -u $PGUSER sh -c "${DAEMON} -D '${PGDATA}' &" >>"$PGLOG" 2>&1 sudo -u $PGUSER sh -c "${DAEMON} -D '${PGDATA}' >>\"$PGLOG\" 2>&1 &"
fi fi
else else
StopService StopService
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment