File: //opt/BCLinux/bse/secure_check/c30_softwareBugs
#!/bin/bash
#=======================================================
InsertSection "check the software vulnerabilities"
if [ $CHECK_SYS_VULNER -eq 1 ]; then
check_software(){
cve_db=$rundir/db/nvd.db
#echo "CVE db path: $cve_db"
#rpm_assembly=$rundir/db/rpm_assembly.db
rpm_assembly=$RPM_ASSEMBLY #待检测的rpm包的集合,如果觉得检查的包不够,则可以向此文件中增加
#获取系统所有rpm包的版本
rpms=$(rpm -qa | egrep -v 'devel|debug|lib|utils|plugin|tools' | sed 's/-[0-9].*//g' | sort | uniq )
#获取用户自定义的需要检查的rpm包的集合。如果觉得检查的包不够,则可以向此文件中增加
#wait_check_rpms=$( egrep -v '^$|^#' $rpm_assembly)
wait_check_rpms=$rpm_assembly
#用于存放获取的系统的实际的版本
tmp_rpmverion=$(mktemp)
> $tmp_rpmverion
#执行此模块功能,将用户指定的需要检测的rpm包的实际版本获取到,并存入:tmp_rpmverion 中。
#存放格式为:name version
#------------------------------------------------------
#for i in $rpms
for i in $wait_check_rpms
do
rpm -q $i > /dev/null 2>&1
if [ $(echo $?) -eq 0 ];then
{
echo -e "${i}\c" >> $tmp_rpmverion
rpm_ver=$(rpm -q $i | egrep -o '\-[0-9].*')
echo -e " ${rpm_ver}" >> $tmp_rpmverion
}
else
echo "Notify: This system has no ${i}."
fi
done
# remove unneed characters in rpm_version.txt file
#sed -i 's/\(.el[0-9]_[0-9]\)//g' $tmp_rpmverion #保留el7_3这种,因为数据库中也有此版本号
#sed -i 's/\(.el[0-9]\)//g' $tmp_rpmverion #保留el7版本号信息
sed -i 's/\(.x86_64\)//g' $tmp_rpmverion
sed -i 's/\(.noarch\)//g' $tmp_rpmverion
sed -i 's/\(.bclinux\)//g' $tmp_rpmverion
sed -i 's/\(.centos\)//g' $tmp_rpmverion
sed -i 's/\( -\)\([0-9]\)/ \2/g' $tmp_rpmverion
sed -i 's/ /\!space/g' $tmp_rpmverion
#------------------------------------------------------
#echo -e "\n\nStarting check system packages vulnerabilities."
for i in $(cat $tmp_rpmverion)
do
rpm_name=$(echo $i | sed 's/\!space/ /g' | cut -d " " -f1)
rpm_vers=$(echo $i | sed 's/\!space/ /g' | cut -d " " -f2)
#改进:使用rpmdev-sort命令来进行比较,DB_Query_CVES是直接查询数据库,并删除与当前软件包版本相同的行,避免后续比较有残留信息。
DB_Query_CVES=$(sqlite3 ${cve_db} "SELECT VERSION,ID FROM PRODUCTS WHERE PRODUCT = '$rpm_name' \
and VENDOR = '$vendor';" | sed '/'${rpm_vers}'|/d' )
# 在查询的数据库结果后追加 ${rpm-version}--- 这一行,用tr使其一行一个信息,之后用rpmdev-sort比较,并输出---之后的所有行
BugINFO=$(echo ${DB_Query_CVES} ${rpm_vers}--- | tr " " "\n" | rpmdev-sort | sed '/---/,$!d;//d' )
BugsCount=$(echo ${BugINFO} | awk -F " " '{print NF}')
#如果BugINFO值的长度超过0,则sql检索到了数据,存在漏洞。
if [ $(echo ${#BugINFO}) -gt 0 ];then
echo "c30 ${rpm_name}" >> $RESULT_FILE
echo "" >> $RESULT_FILE
logtext "WRN_C30: Attention: ${rpm_name} has ${BugsCount} vulnerabilities"
logtext "Suggestion: $(loadtext TXT_SUG_C30)"
logtext "Package ${rpm_name}-${rpm_vers} vulnerabilities: "
# CVE_SUMMARY CVE_PACKAGE FIX_VERSION
for xx in ${BugINFO}; do #record the cve info to logfile, it can be used by report mode.
CVE_ID=$(echo $xx | cut -d '|' -f 2)
FIX_VERSION=$(echo $xx | cut -d '|' -f 1)
QUERY_NVD_TABLE=$(sqlite3 ${cve_db} "select a.ID,a.SCORE,a.VECTOR,a.ACCESS_COMP,b.RHSA,b.PRODUCT,b.VERSION,a.SUMMARY from NVD a,PRODUCTS b where a.ID = b.ID and a.ID='$CVE_ID' and b.PRODUCT='$rpm_name' and b.VENDOR='$vendor';" | sed 's/ /!space!/g')
#CVE_SUMMARY=$( echo $QUERY_NVD_TABLE | cut -d "|" -f2 )
#logtext "${CVE_ID}: ${CVE_SUMMARY} ${rpm_name} ${FIX_VERSION}"
#echo $CVE_ID: $QUERY_NVD_TABLE
for multi in $QUERY_NVD_TABLE #if more than one line, should output one by one
do
logtext "$(echo $multi | sed 's/!space!/ /g' )"
logtext ""
done
done
logtext ""
Display --indent 2 --text "- Checking software: ${rpm_name}... " --result WARNING --color RED
Display --indent 2 --text "Attention: ${rpm_name} has ${BugsCount} vulnerabilities, please update"
AddHP 0 1
else
Display --indent 2 --text "- Checking software: ${rpm_name}... " --result OK --color GREEN
AddHP 1 1
fi
echo ""
done
rm -rf $tmp_rpmverion
}
case ${OS_DISTRO} in
"8" | "\"8\"")
vendor=rhel8
yum install -y sqlite
check_software
;;
"7" | "\"7\"")
#SOFT_LOG_FILE=$(find soft_changelog/rhel-7/ -type f)
vendor=rhel7
check_software
;;
"6" | "\"6\"")
#SOFT_LOG_FILE=$(find soft_changelog/rhel-6/ -type f)
vendor=rhel6
check_software
;;
"\"20.09\"" |"20.12")
vendor=openEuler
check_software
;;
*)
Display --indent 2 --text "- System isn't RHEL Distro, skip checking... " --result SKIPPED --color YELLOW
AddHP 1 1
;;
esac
else
Display --indent 2 --text "- Skip check system vulnerabilities due to config file... " --result SKIPPING --color YELLOW
fi