Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
start-scripts: switch to $PGUSER before opening $PGLOG.
authorNoah Misch <noah@leadboat.com>
Mon, 6 Nov 2017 15:11:10 +0000 (07:11 -0800)
committerNoah Misch <noah@leadboat.com>
Mon, 6 Nov 2017 15:11:13 +0000 (07:11 -0800)
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

contrib/start-scripts/freebsd
contrib/start-scripts/linux
contrib/start-scripts/osx/PostgreSQL

index 758574b427fff77bb8ddf5098758f415647907b1..e37421253d9c3779e94a2097488f0a54a5490a5b 100644 (file)
@@ -44,7 +44,7 @@ test -x $DAEMON ||
 
 case $1 in
     start)
-   su -l $PGUSER -c "$DAEMON -D '$PGDATA' &" >>$PGLOG 2>&1
+   su -l $PGUSER -c "$DAEMON -D '$PGDATA' >>$PGLOG 2>&1 &"
    echo -n ' postgresql'
    ;;
     stop)
@@ -52,7 +52,7 @@ case $1 in
    ;;
     restart)
    su -l $PGUSER -c "$PGCTL stop -D '$PGDATA' -s -m fast -w"
-   su -l $PGUSER -c "$DAEMON -D '$PGDATA' &" >>$PGLOG 2>&1
+   su -l $PGUSER -c "$DAEMON -D '$PGDATA' >>$PGLOG 2>&1 &"
    ;;
     status)
    su -l $PGUSER -c "$PGCTL status -D '$PGDATA'"
index b950cf512c3c519c1813f69af98a7a0ce7422769..023a4ca1e642fcb856c663b9e9cc9f612bcfe437 100644 (file)
@@ -84,7 +84,7 @@ case $1 in
    echo -n "Starting PostgreSQL: "
    test x"$OOM_SCORE_ADJ" != x && echo "$OOM_SCORE_ADJ" > /proc/self/oom_score_adj
    test x"$OOM_ADJ" != x && echo "$OOM_ADJ" > /proc/self/oom_adj
-   su - $PGUSER -c "$DAEMON -D '$PGDATA' &" >>$PGLOG 2>&1
+   su - $PGUSER -c "$DAEMON -D '$PGDATA' >>$PGLOG 2>&1 &"
    echo "ok"
    ;;
   stop)
@@ -97,7 +97,7 @@ case $1 in
    su - $PGUSER -c "$PGCTL stop -D '$PGDATA' -s -m fast -w"
    test x"$OOM_SCORE_ADJ" != x && echo "$OOM_SCORE_ADJ" > /proc/self/oom_score_adj
    test x"$OOM_ADJ" != x && echo "$OOM_ADJ" > /proc/self/oom_adj
-   su - $PGUSER -c "$DAEMON -D '$PGDATA' &" >>$PGLOG 2>&1
+   su - $PGUSER -c "$DAEMON -D '$PGDATA' >>$PGLOG 2>&1 &"
    echo "ok"
    ;;
   reload)
index e7e6aa14939017fb83a26f663201fd2522c06dfb..a2a4c0f00cc566523fd9019e64b107d248c89d6c 100755 (executable)
@@ -85,9 +85,9 @@ StartService () {
     if [ "${POSTGRESQL:=-NO-}" = "-YES-" ]; then
         ConsoleMessage "Starting PostgreSQL database server"
         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
-            sudo -u $PGUSER sh -c "${DAEMON} -D '${PGDATA}' &" >>"$PGLOG" 2>&1
+            sudo -u $PGUSER sh -c "${DAEMON} -D '${PGDATA}' >>\"$PGLOG\" 2>&1 &"
         fi
     fi
 }
@@ -104,9 +104,9 @@ RestartService () {
    sudo -u $PGUSER sh -c "$PGCTL stop -D '${PGDATA}' -s -m fast"
    # should match StartService:
         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
-            sudo -u $PGUSER sh -c "${DAEMON} -D '${PGDATA}' &" >>"$PGLOG" 2>&1
+            sudo -u $PGUSER sh -c "${DAEMON} -D '${PGDATA}' >>\"$PGLOG\" 2>&1 &"
         fi
     else
         StopService