From owner-freebsd-security-notifications Thu Jul 4 11:13:20 1996 Return-Path: owner-security-notifications Received: (from root@localhost) by freefall.freebsd.org (8.7.5/8.7.3) id LAA09381 for security-notifications-outgoing; Thu, 4 Jul 1996 11:13:20 -0700 (PDT) Received: (from guido@localhost) by freefall.freebsd.org (8.7.5/8.7.3) id LAA09367; Thu, 4 Jul 1996 11:13:16 -0700 (PDT) Message-Id: <199607041813.LAA09367@freefall.freebsd.org> X-Authentication-Warning: freefall.freebsd.org: guido set sender to security-officer@freebsd.org using -f To: freebsd-security-notifications@freebsd.org, freebsd-announce@freebsd.org Cc: freebsd-security@freebsd.org, first-teams@first.org From: FreeBSD Security Officer Reply-To: security-officer@freebsd.org Subject: FreeBSD Security Advisory: FreeBSD-SA-96:15.ppp Date: Mon, 4 Jul 1996 11:10:00 -0700 (PDT) Sender: owner-security-notifications@freebsd.org X-Loop: FreeBSD.org Precedence: bulk -----BEGIN PGP SIGNED MESSAGE----- ============================================================================= FreeBSD-SA-96:15 Security Advisory FreeBSD, Inc. Topic: security compromise from ppp Category: core Module: ppp Announced: 1996-06-25 Affects: FreeBSD 2.0.5, 2.1, 2.1-stable, and 2.2-current Corrected: 2.1-stable and 2.2-current as of 1996-06-10 FreeBSD only: unknown Patches: ftp://freebsd.org/pub/CERT/patches/SA-96:15/ ============================================================================= I. Background FreeBSD ships a userland ppp program that can be used by users to set up ppp connections. This program is also known as ijppp. The ppp program has a vulnerability that allows any user to run commands under root privileges. II. Problem Description The ppp program does not properly manage user privileges, allowing users to run any program with root privileges. III. Impact This vulnerability can only be exploited by users with a valid account on the local system to easily obtain superuser access. IV. Workaround One may simply disable the setuid bit on all copies of the ppp program. This will close the vulnerability but will only allow the superuser to set up ppp connections. As root, execute the commands: # chmod 555 /usr/sbin/ppp then verify that the setuid permissions of the files have been removed. The permissions array should read "-r-xr-xr-x" as shown here: # ls -l /usr/sbin/ppp -r-xr-xr-x 1 root bin 86016 Nov 16 1995 /usr/sbin/ppp V. Solution Patches are available which eliminate this vulnerability. The following patch should be applied to the system sources and ppp should be rebuilt and reinstalled. The first patch is against the FreeBSD 2.1 and FreeBSD-stable source tree. The second patch is for FreeBSD-current (version before 1996-06-10). Apply the patch, then (being superuser): # cd /usr/src/usr.sbin/ppp # make depend # make all # make install Index: command.c =================================================================== RCS file: /home/ncvs/src/usr.sbin/ppp/command.c,v retrieving revision 1.5.4.3 retrieving revision 1.5.4.4 diff -u -r1.5.4.3 -r1.5.4.4 --- command.c 1996/02/05 17:02:52 1.5.4.3 +++ command.c 1996/06/10 09:41:49 1.5.4.4 @@ -17,7 +17,7 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * $Id: command.c,v 1.5.4.3 1996/02/05 17:02:52 dfr Exp $ + * $Id: command.c,v 1.5.4.4 1996/06/10 09:41:49 ache Exp $ * */ #include @@ -187,9 +187,14 @@ * We are running setuid, we should change to * real user for avoiding security problems. */ - setgid( getgid() ); - setuid( getuid() ); - + if (setgid(getgid()) < 0) { + perror("setgid"); + exit(1); + } + if (setuid(getuid()) < 0) { + perror("setuid"); + exit(1); + } TtyOldMode(); if(argc > 0) execvp(argv[0], argv); Index: chat.c =================================================================== RCS file: /home/ncvs/src/usr.sbin/ppp/chat.c,v retrieving revision 1.4.4.1 retrieving revision 1.4.4.2 diff -u -r1.4.4.1 -r1.4.4.2 --- chat.c 1995/10/06 11:24:31 1.4.4.1 +++ chat.c 1996/06/10 09:41:45 1.4.4.2 @@ -18,7 +18,7 @@ * Columbus, OH 43221 * (614)451-1883 * - * $Id: chat.c,v 1.4.4.1 1995/10/06 11:24:31 davidg Exp $ + * $Id: chat.c,v 1.4.4.2 1996/06/10 09:41:45 ache Exp $ * * TODO: * o Support more UUCP compatible control sequences. @@ -331,6 +331,15 @@ nb = open("/dev/tty", O_RDWR); dup2(nb, 0); LogPrintf(LOG_CHAT, "exec: %s\n", command); + /* switch back to original privileges */ + if (setgid(getgid()) < 0) { + LogPrintf(LOG_CHAT, "setgid: %s\n", strerror(errno)); + exit(1); + } + if (setuid(getuid()) < 0) { + LogPrintf(LOG_CHAT, "setuid: %s\n", strerror(errno)); + exit(1); + } pid = execvp(command, vector); LogPrintf(LOG_CHAT, "execvp failed for (%d/%d): %s\n", pid, errno, command); exit(127); Patch for FreeBSd-current before 1996-06-10: Index: command.c =================================================================== RCS file: /home/ncvs/src/usr.sbin/ppp/command.c,v retrieving revision 1.17 retrieving revision 1.18 diff -u -r1.17 -r1.18 --- command.c 1996/05/11 20:48:22 1.17 +++ command.c 1996/06/09 20:40:58 1.18 @@ -17,7 +17,7 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * $Id: command.c,v 1.17 1996/05/11 20:48:22 phk Exp $ + * $Id: command.c,v 1.18 1996/06/09 20:40:58 ache Exp $ * */ #include @@ -190,9 +190,14 @@ * We are running setuid, we should change to * real user for avoiding security problems. */ - setgid( getgid() ); - setuid( getuid() ); - + if (setgid(getgid()) < 0) { + perror("setgid"); + exit(1); + } + if (setuid(getuid()) < 0) { + perror("setuid"); + exit(1); + } TtyOldMode(); if(argc > 0) execvp(argv[0], argv); Index: chat.c =================================================================== RCS file: /home/ncvs/src/usr.sbin/ppp/chat.c,v retrieving revision 1.10 retrieving revision 1.11 diff -u -r1.10 -r1.11 --- chat.c 1996/05/11 20:48:20 1.10 +++ chat.c 1996/06/09 20:40:56 1.11 @@ -18,7 +18,7 @@ * Columbus, OH 43221 * (614)451-1883 * - * $Id: chat.c,v 1.10 1996/05/11 20:48:20 phk Exp $ + * $Id: chat.c,v 1.11 1996/06/09 20:40:56 ache Exp $ * * TODO: * o Support more UUCP compatible control sequences. @@ -393,6 +393,15 @@ nb = open("/dev/tty", O_RDWR); dup2(nb, 0); LogPrintf(LOG_CHAT_BIT, "exec: %s\n", command); + /* switch back to original privileges */ + if (setgid(getgid()) < 0) { + LogPrintf(LOG_CHAT_BIT, "setgid: %s\n", strerror(errno)); + exit(1); + } + if (setuid(getuid()) < 0) { + LogPrintf(LOG_CHAT_BIT, "setuid: %s\n", strerror(errno)); + exit(1); + } pid = execvp(command, vector); LogPrintf(LOG_CHAT_BIT, "execvp failed for (%d/%d): %s\n", pid, errno, command); exit(127); ============================================================================= FreeBSD, Inc. Web Site: http://www.freebsd.org/ Confidential contacts: security-officer@freebsd.org PGP Key: ftp://freebsd.org/pub/CERT/public_key.asc Security notifications: security-notifications@freebsd.org Security public discussion: security@freebsd.org Notice: Any patches in this document may not apply cleanly due to modifications caused by digital signature or mailer software. Please reference the URL listed at the top of this document for original copies of all patches if necessary. ============================================================================= -----BEGIN PGP SIGNATURE----- Version: 2.6.3ia Charset: noconv iQCVAwUBMdFeplUuHi5z0oilAQFc5AP9Fq3hOVm/AeE6wJvmXlBdMlwF3W+752V8 V/F2OmFro60mgKZ/WHSHMJqMesCh5+VKRuUYGQ+YTJMb9wFY0zvVa6s6kS+cR680 kIV4sLXj5CjKGR6JZ0EavT6zMEE2EgiqUwGNxS1M52j4lvcTpFTh3cCs4smSncly LOposIY9r5c= =IZIn -----END PGP SIGNATURE-----