mirror of
https://git.yoctoproject.org/meta-security
synced 2026-01-11 15:00:34 +00:00
94 lines
2.2 KiB
Bash
94 lines
2.2 KiB
Bash
#!/bin/sh
|
|
#
|
|
# find-chroot utility
|
|
# Copyright (c) 2011 Steve Grubb. ALL RIGHTS RESERVED.
|
|
# sgrubb@redhat.com
|
|
#
|
|
# This software may be freely redistributed under the terms of the GNU
|
|
# public license.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software
|
|
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
#
|
|
# This program looks for apps that use chroot(2) without using chdir(2)
|
|
#
|
|
# To save to file: ./find-chroot | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g" | tee findings.txt
|
|
|
|
libdirs="/lib /lib64 /usr/lib /usr/lib64"
|
|
progdirs="/bin /sbin /usr/bin /usr/sbin /usr/libexec"
|
|
FOUND=0
|
|
|
|
# First param is which list to use, second is search pattern
|
|
scan () {
|
|
if [ "$1" = "1" ] ; then
|
|
dirs=$libdirs
|
|
elif [ "$1" = "2" ] ; then
|
|
dirs=$progdirs
|
|
elif [ "$1" = "3" ] ; then
|
|
dirs=$3
|
|
fi
|
|
|
|
for d in $dirs ; do
|
|
if [ ! -d $d ] ; then
|
|
continue
|
|
fi
|
|
files=`/usr/bin/find $d -name "$2" -type f 2>/dev/null`
|
|
for f in $files
|
|
do
|
|
syms=`/usr/bin/readelf -s $f 2>/dev/null | egrep ' chroot@.*GLIBC'`
|
|
if [ x"$syms" != "x" ] ; then
|
|
syms=`/usr/bin/readelf -s $f 2>/dev/null | egrep ' chdir@.*GLIBC'`
|
|
if [ x"$syms" = "x" ] ; then
|
|
if [ $FOUND = 0 ] ; then
|
|
printf "%-44s%s\n" "FILE" " PACKAGE"
|
|
FOUND=1
|
|
fi
|
|
# Red
|
|
printf "\033[31m%-44s\033[m" $f
|
|
#rpm -qf --queryformat "%{NAME}-%{VERSION}" $f
|
|
rpm -qf --queryformat " %{SOURCERPM}" $f
|
|
echo
|
|
else
|
|
# One last test to see if chdir is within 3
|
|
# lines of chroot
|
|
syms=`objdump -d $f | egrep callq | egrep 'chroot@plt' -A2 | egrep 'chroot|chdir'`
|
|
if [ x"$syms" = "x" ] ; then
|
|
syms=`echo $f | egrep -v 'libc-2|libc.so'`
|
|
if [ x"$syms" != "x" ] ; then
|
|
if [ $FOUND = 0 ] ; then
|
|
printf "%-44s%s\n" "FILE" "PACKAGE"
|
|
FOUND=1
|
|
fi
|
|
printf "\033[31m%-44s\033[m" $f
|
|
rpm -qf --queryformat " %{SOURCERPM}" $f
|
|
echo
|
|
fi
|
|
fi
|
|
fi
|
|
fi
|
|
done
|
|
done
|
|
}
|
|
|
|
if [ $# -eq 1 ] ; then
|
|
if [ -d $1 ] ; then
|
|
scan 3 '*' $1
|
|
else
|
|
echo "Input is not a directory"
|
|
exit 1
|
|
fi
|
|
else
|
|
scan 2 '*'
|
|
scan 1 '*.so'
|
|
fi
|
|
|
|
if [ $FOUND -eq 0 ] ; then
|
|
# Nothing to report, just exit
|
|
echo "No problems found" 1>&2
|
|
exit 0
|
|
fi
|
|
exit 1
|
|
|
|
|