patches for easier mirroring, to eliminate a special copy, to make www.freebsd.org/security a full copy of security.freebsd.org and be eventually be the same. For now files are just sitting there. The symlinks are missing. Discussed on: www (repository location) Discussed with: simon (so)
272 lines
8.9 KiB
Text
272 lines
8.9 KiB
Text
-----BEGIN PGP SIGNED MESSAGE-----
|
|
|
|
=============================================================================
|
|
FreeBSD-SA-96:20 Security Advisory
|
|
FreeBSD, Inc.
|
|
|
|
Topic: unauthorized access via buffer overruns
|
|
cron, crontab, ppp
|
|
|
|
Category: core
|
|
Module: cron, crontab, ppp
|
|
Announced: 1996-12-16
|
|
Affects: 1.0, 1.1, 2.1.0, 2.1.5, 2.1.6, 2.1.6.1
|
|
Corrected: 2.2-current as of various dates (see below)
|
|
2.1-stable as of various dates (see below)
|
|
FreeBSD only: yes
|
|
|
|
Patches: ftp://freebsd.org/pub/CERT/patches/SA-96:20/
|
|
|
|
=============================================================================
|
|
|
|
I. Background
|
|
|
|
Buffer overrun (aka stack overflow) exploits in system
|
|
supplied and locally installed utilities are commonly
|
|
used by individuals wishing to obtain unauthorized access to
|
|
computer systems. The FreeBSD team has been reviewing and
|
|
fixing the source code pool to eliminate potential exploits
|
|
based on this technique. We've found several such exploits
|
|
(and more have been reported by other sources) and strongly
|
|
suggest that all operators of FreeBSD machines upgrade to
|
|
the latest version of FreeBSD (2.1.6.1 at the time of this
|
|
advisory) if there is a possibility for untrustworthy users
|
|
to have standard user level access to the system.
|
|
|
|
Most of these problems were fixed with the release of
|
|
FreeBSD 2.1.6.1, however the following were not:
|
|
|
|
In August of 1996, exploits were discovered in the
|
|
cron and crontab utilities in FreeBSD. These were fixed
|
|
in the -current source code pool in August of 1996, but
|
|
due to a clerical error, were not repaired in the older
|
|
-stable source code pool used to generate the FreeBSD
|
|
2.1.X distributions until 16-Dec-1996.
|
|
Recently, yet another buffer overrun was discovered
|
|
in the cron and crontab utilities in FreeBSD. The problem
|
|
was corrected on 16-Dec-1996 in both -current and -stable.
|
|
|
|
Also recently, a similar overrun has been discovered in the
|
|
ppp utility. This was fixed in both -current and
|
|
-stable source code pools on 16-Dec-1996.
|
|
|
|
|
|
II. Problem Description
|
|
|
|
The programs in question store user-supplied information
|
|
in internal buffers. There is no range checking on length
|
|
of the data copied into these buffers. A malicious user
|
|
may be able to overflow these buffers through the use of
|
|
command line options or via enviornment variables and
|
|
insert and execute their own code fragment which could
|
|
be used to obtain unauthorized access to the system
|
|
|
|
|
|
III. Impact
|
|
|
|
The programs in question may be subverted to allow an
|
|
unprivileged user to gain root access to the system.
|
|
|
|
These vulnerability can only be exploited by individuals
|
|
with access to the local system.
|
|
|
|
|
|
IV. Workaround
|
|
|
|
Setuid programs invoked by the user may have their setuid
|
|
permissions removed, or their protection attributes modified
|
|
so unprivileged users may not operate them at all.
|
|
This may reduce or eliminate some functionality provided by
|
|
these programs to normal users.
|
|
|
|
To remove setuid privileges:
|
|
|
|
crontab: # chmod ug-s /usr/bin/crontab
|
|
ppp: # chmod ug-s /usr/bin/ppp
|
|
|
|
The cron program is started by the system on every boot.
|
|
This auto-start may be temporarily disabled, and the running
|
|
cron program stopped. However, cron is a valuable system
|
|
utility, so we suggest this as a temporary workaround only.
|
|
|
|
To stop cron from executing on system boot, edit the /etc/rc
|
|
file and change the line:
|
|
echo -n ' cron'; cron
|
|
so it reads:
|
|
# echo -n ' cron'; cron.
|
|
|
|
To turn off a running cron, use the ps program to determine
|
|
the PID of the currently running cron (use "ps") and type:
|
|
|
|
# kill <pid of running cron>
|
|
|
|
V. Solution
|
|
|
|
The following patches fixes the vulnerabilities. It should
|
|
apply cleanly to all FreeBSD 2.1.x systems. It has not been
|
|
tested with FreeBSD 1.x.
|
|
|
|
After applying these patches, recompile and re-install the
|
|
affected utilities.
|
|
|
|
|
|
*** usr.sbin/cron/cron/database.c 1994/08/27 13:43:03 1.1.1.1
|
|
--- usr.sbin/cron/cron/database.c 1996/09/10 03:38:20 1.3
|
|
***************
|
|
*** 112,119 ****
|
|
if (dp->d_name[0] == '.')
|
|
continue;
|
|
|
|
! (void) strcpy(fname, dp->d_name);
|
|
! sprintf(tabname, CRON_TAB(fname));
|
|
|
|
process_crontab(fname, fname, tabname,
|
|
&statbuf, &new_db, old_db);
|
|
--- 112,119 ----
|
|
if (dp->d_name[0] == '.')
|
|
continue;
|
|
|
|
! (void)snprintf(fname, sizeof fname, "%s", dp->d_name);
|
|
! (void)snprintf(tabname, sizeof tabname, CRON_TAB(fname));
|
|
|
|
process_crontab(fname, fname, tabname,
|
|
&statbuf, &new_db, old_db);
|
|
|
|
*** usr.sbin/cron/crontab/crontab.c 1996/04/09 21:23:11 1.3.4.1
|
|
--- usr.sbin/cron/crontab/crontab.c 1996/08/05 00:50:02 1.6
|
|
***************
|
|
*** 167,173 ****
|
|
ProgramName, optarg);
|
|
exit(ERROR_EXIT);
|
|
}
|
|
! (void) strcpy(User, optarg);
|
|
break;
|
|
case 'l':
|
|
if (Option != opt_unknown)
|
|
--- 165,171 ----
|
|
ProgramName, optarg);
|
|
exit(ERROR_EXIT);
|
|
}
|
|
! (void) snprintf(User, sizeof(user), "%s", optarg);
|
|
break;
|
|
case 'l':
|
|
if (Option != opt_unknown)
|
|
***************
|
|
*** 198,204 ****
|
|
} else {
|
|
if (argv[optind] != NULL) {
|
|
Option = opt_replace;
|
|
! (void) strcpy (Filename, argv[optind]);
|
|
} else {
|
|
usage("file name must be specified for replace");
|
|
}
|
|
--- 196,203 ----
|
|
} else {
|
|
if (argv[optind] != NULL) {
|
|
Option = opt_replace;
|
|
! (void) snprintf(Filename, sizeof(Filename), "%s",
|
|
! argv[optind]);
|
|
} else {
|
|
usage("file name must be specified for replace");
|
|
}
|
|
***************
|
|
*** 480,486 ****
|
|
ProgramName, Filename);
|
|
goto done;
|
|
default:
|
|
! fprintf(stderr, "%s: panic: bad switch() in replace_cmd()\n");
|
|
goto fatal;
|
|
}
|
|
remove:
|
|
--- 479,486 ----
|
|
ProgramName, Filename);
|
|
goto done;
|
|
default:
|
|
! fprintf(stderr, "%s: panic: bad switch() in replace_cmd()\n",
|
|
! ProgramName);
|
|
goto fatal;
|
|
}
|
|
remove:
|
|
|
|
--- usr.sbin/cron/lib/env.c 1994/08/27 13:43:02 1.1.1.1
|
|
+++ usr.sbin/cron/lib/env.c 1996/12/16 18:11:57
|
|
@@ -115,7 +115,7 @@
|
|
{
|
|
long filepos;
|
|
int fileline;
|
|
- char name[MAX_TEMPSTR], val[MAX_ENVSTR];
|
|
+ char name[MAX_ENVSTR], val[MAX_ENVSTR];
|
|
int fields;
|
|
|
|
filepos = ftell(f);
|
|
|
|
|
|
--- usr.sbin/ppp/chat.c 1996/06/10 09:41:45 1.4.4.2
|
|
+++ usr.sbin/ppp/chat.c 1996/12/15 20:40:26
|
|
@@ -315,7 +315,7 @@
|
|
}
|
|
cp--;
|
|
}
|
|
- sprintf(tmp, "%s %s", command, cp);
|
|
+ snprintf(tmp, sizeof tmp, "%s %s", command, cp);
|
|
(void) MakeArgs(tmp, &vector);
|
|
|
|
pipe(fids);
|
|
|
|
--- usr.sbin/ppp/systems.c 1995/05/30 03:50:58 1.5
|
|
+++ usr.sbin/ppp/systems.c 1996/12/15 20:40:26
|
|
@@ -75,12 +75,12 @@
|
|
cp = getenv("HOME");
|
|
if (cp) {
|
|
SetUserId();
|
|
- sprintf(line, "%s/.%s", cp, file);
|
|
+ snprintf(line, sizeof line, "%s/.%s", cp, file);
|
|
fp = fopen(line, "r");
|
|
}
|
|
if (fp == NULL) {
|
|
SetPppId();
|
|
- sprintf(line, "%s/%s",_PATH_PPP, file);
|
|
+ snprintf(line, sizeof line, "%s/%s", _PATH_PPP, file);
|
|
fp = fopen(line, "r");
|
|
}
|
|
if (fp == NULL) {
|
|
@@ -115,12 +115,12 @@
|
|
cp = getenv("HOME");
|
|
if (cp) {
|
|
SetUserId();
|
|
- sprintf(line, "%s/.%s", cp, file);
|
|
+ snprintf(line, sizeof line, "%s/.%s", cp, file);
|
|
fp = fopen(line, "r");
|
|
}
|
|
if (fp == NULL) {
|
|
SetPppId(); /* fix from pdp@ark.jr3uom.iijnet.or.jp */
|
|
- sprintf(line, "%s/%s",_PATH_PPP, file);
|
|
+ snprintf(line, sizeof line, "%s/%s", _PATH_PPP, file);
|
|
fp = fopen(line, "r");
|
|
}
|
|
if (fp == NULL) {
|
|
|
|
=============================================================================
|
|
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.2
|
|
|
|
iQCVAwUBMrb4FlUuHi5z0oilAQGCjQP/TcKygSf3CLwfJcPSnsQnc0k5fkF3QZvk
|
|
Lp4K7FTua7M0AHHMn4gjpZEqB0+eqxMEGuZ+VXISSoESWyaOSz+hVLmLU2UZDLO0
|
|
WWZWw3MM3UeWAzLLXwRPTLN0tQlpQJyqPNH1okb4c/Lx9IugN1wcGfbiTnOF3NaC
|
|
d8lhtqcQoi4=
|
|
=zAKC
|
|
-----END PGP SIGNATURE-----
|