HEX
Server: nginx/1.16.1
System: Linux ecs-04358622 4.19.90-2107.6.0.0100.oe1.bclinux.x86_64 #1 SMP Wed Dec 1 19:59:44 CST 2021 x86_64
User: nginx (994)
PHP: 8.0.0
Disabled: NONE
Upload Files
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