Cron security hole; admins take note - (nf)
ajs at hpfcla.UUCP
ajs at hpfcla.UUCP
Sat Dec 10 18:44:05 AEST 1983
#N:hpfcla:23400003:000:2291
hpfcla!ajs Dec 8 12:50:00 1983
Subject: cron security hole (system administrators please note)
This is an expansion on an earlier article about breaking into a system
via an insecure cron. It's not enough to just protect crontab and the
directory it lives in. To be completely safe, all portions of all paths
crontab and to all files it executes (including "/" too!) must also be
secure. Otherwise it's possible to use mv(1) (and maybe mkdir(1) at
some level) to substitute a dummy crontab or replace a command executed
by cron. Either way, the result is a Trojan horse program running with
superuser privileges.
I wrote a little shell script which uses awk(1) to help you check all
such paths. The script extracts from crontab everything that looks like
a pathname and lists the sorted, uniq'd list of pathnames and portions
thereof, including "/" and the path to crontab. All you have to do is
skim the output looking for any filename (directory OR command) which is
writable by the general public, or by any user or group which is
accessible by the general public.
Alan Silverstein, Hewlett-Packard Fort Collins Systems Division, Colorado
ucbvax!hplabs!hpfcla!ajs, 303-226-3800 x3053, N 40 31'31" W 105 00'43"
------------ cronck.sh --------------
# Shell script to check security on files referenced by crontab.
# Initialize:
PATH=/bin:/usr/bin
file=/usr/lib/crontab # file to read.
temp=/tmp/cronck$$ # temp file for partial results.
trap "rm -f $temp; trap '' 0; exit" 0 1 2 3
# Find pathnames, emit each part of each path, and sort and uniq results:
echo / $file | # check "/" and file itself.
cat - $file | # plus its contents.
awk '{
split ($0, words); # separate words.
for (w in words) # do each word.
{
word = words[w]; # quick value.
while (index (word, "/")) # contains "/".
{
print word; # print current path.
for (pos = length (word); pos; pos--) # find last "/".
if (substr (word, pos, 1) == "/")
break; # found one.
if (pos < 2) # none or "/xxx" only.
break;
word = substr (word, 1, pos - 1); # trim "/xxx".
}
}
}' |
sort |
uniq >$temp
# Check the list of files (for now just list them as directories):
ls -ld `cat $temp`
----------------- end ---------------
More information about the Comp.unix.wizards
mailing list