How to Check and Log Malicious RPM Installation in 3 Easy Steps


In this article, I will take you through the steps to check and log Malicious RPM Installation in 3 Easy Steps. In Linux, logging is one of the most important functionality which is used to streamline the monitoring of events by maintaining set of log files as record. It is a strong troubleshooting tool which comes first in the picture whenever there is any functionality failure or any error occurs. Analyzing log files is the first thing a developer or an administrator does whenever there is an issue. More about Security Hardening in RHEL.

How to Check and Log Malicious RPM Installation in 3 Easy Steps

How to Check and Log Malicious RPM Installation in 3 Easy Steps

Also Read: How to Install netcat(nc) command on Linux(Ubuntu 18.04/20.04) in 7 Easy Steps

By default Linux provides a centralized repository for storing the log files which can be found in the directory /var/logs and subdirectories. There are log files generated for everything in Linux e.g system, database, kernel, process management, boot etc.  You would find bunch of logs and directories inside this path which may vary from machine to machine depending on the configuration set up.

[root@cyberithub ~]# cd /var/log/
[root@cyberithub log]# ls -lhtr
total 42M
drwxr-xr-x. 2 chrony chrony 4.0K Mar  2  2021 chrony
drwxr-xr-x. 2 root   root   4.0K Jun  2  2021 tuned
drwx------. 2 root   root   4.0K Sep 10 20:17 private
-rw-rw----. 1 root   utmp      0 Sep 10 20:17 btmp
-rw-------. 1 root   root      0 Sep 10 20:18 spooler-20210922
-rw-------. 1 root   root      0 Sep 10 20:18 maillog-20210922
drwxr-xr-x. 2 root   root   4.0K Sep 10 20:21 anaconda
-rw-------. 1 root   root    20K Sep 22 13:24 secure-20210922
-rw-r--r--. 1 root   root   1.6K Sep 22 14:16 hawkey.log-20210922
-rw-------. 1 root   root   6.4K Sep 22 15:01 cron-20210922
-rw-------. 1 root   root    22M Sep 22 15:49 messages-20210922
-rw-------  1 root   root    65K Sep 22 15:50 boot.log-20210922
drwxr-x---. 2 sssd   sssd   4.0K Sep 22 15:50 sssd
-rw-------  1 root   root      0 Sep 22 15:50 spooler
-rw-------  1 root   root      0 Sep 22 15:50 maillog
drwx------. 2 root   root   4.0K Sep 22 22:55 audit
drwx------. 3 root   root   4.0K Nov  2 19:01 samba
drwxr-xr-x  2 root   root   4.0K Feb  2 20:31 supervisor
-rw-r--r--  1 root   root   1.4K Feb  2 22:31 hawkey.log
-rw-r--r--. 1 root   root    66K Feb 22 15:41 dnf.librepo.log
-rw-r--r--. 1 root   root    27K Feb 22 15:41 dnf.rpm.log
-rw-r--r--. 1 root   root   194K Feb 22 15:41 dnf.log
-rw-------. 1 root   root    30K Feb 22 18:23 boot.log
-rw-------  1 root   root   5.3K Feb 22 18:23 cron
-rw-r--r--. 1 root   root    12K Feb 22 18:23 kdump.log
-rw-r-----. 1 root   root    56K Feb 22 18:23 firewalld
-rw-rw-r--. 1 root   utmp    37K Feb 22 18:25 wtmp
-rw-rw-r--. 1 root   utmp   286K Feb 22 18:25 lastlog
-rw-------  1 root   root   5.5K Feb 22 18:25 secure
-rw-------  1 root   root    20M Feb 22 18:25 messages

In Linux, there are system log files and application log files. In this tutorial we will focus on application log files. We will develop a simple application and generate it’s log files. It can be generated in default folder i.e /var/log or we can generated customized log files in different folder. We will generate customized log files in our tutorial.

We will develop a tool which basically will scan the packages installed in our machine and alert for any unwanted packages which might have got installed (mistakenly or as virus) in the log file. Such tools are very crucial to secure and protect our system and applications from any sort of vulnerability. We will require below 3 files to serve our purpose. You can definitely modify the files based on the level of security you want to put to safe guard your applications and system.


Step 1: Create whitelist.csv 

This file will be used to store list of installed rpm packages. If any other package is found installed in the system which is not part of the whitelist, it will be consider as vulnerability and an error will be reported. This will be passed as an input file to script.

Execute “rpm -qa” and store the output in whitelist.csv file like below. It will be a long listed file as it stores all the OS packages as well as application packages.

[root@cyberithub ~]# rpm -qa > whitelist.csv


Step 2: Create Script 

Next we need to create a log functionality script called under /root directory. In this script, we are creating a function called log() which we are going to use in our application script called in next step. Below script will basically check the argument passed with the log function and then add the messages based on message type whether it is ERROR, WARNING and INFO. We will see few of the use cases in below section to understand this further in real time.

[root@cyberithub ~]# vi

function log(){
 if [[ $1 == "-e" ]]; then
  msgType="ERROR: "
 if [[ $1 == "-w" ]]; then
  msgType="WARNING: "
 if [[ $1 == "-i" ]]; then
  msgType="INFO: "
 if [[ $1 == "-p" ]]; then
  echo "$*"

 echo -n "`date +"%Y-%m-%dT%H:%M:%S.%6N%:z"`, $msgType " >> $logFile
 echo "$*" >> $logFile



-e -> To capture error messages
-i ->  To capture info messages
-w -> To capture warning messages
Shift ->  To move the command line argument to one position left
$* -> To capture all the command line arguments passed to the script.


Step 3: Create Script

Functionality of this script is to parse the whitelist.csv file. If any extra installed package is encountered in the machine, it will log the package entry as error in the log file. Next we write the logic for our application and define the log path where log files will get generated. You can enable the debug mode by uncommenting the set -x statement.

We are generating the log files in the folder /var/log/cyberithub/. This path can be changed depending on where we want to store our logs. Create a temporary file /tmp/temp_file which is the requirement for the script execution.

[root@cyberithub ~]# vi

#set -x
. /root/

#Call log function

mkdir -p /var/log/cyberithub/

function package_check(){
 rpm -qa > $TEMPFILE
 while read line
   PACKAGE_NAME=`/bin/echo $line | cut -d';' -f 1`
 done < $CSV_FILE
 if [ -s $TEMPFILE ]
    for i in `cat $TEMPFILE`
    log -e "New Installed Package Found $i..."

log -w "Info message implementation"
log -w "Warning message implementation"

# Check CSV File
if [ ! -f "${CSV_FILE}" ]; then
  log -e "Input file not found"
  exit 1

#Check file type
if [ "${CSV_FILE}" != *.csv  ]; then
  log -e "Input file should be a .csv file"
  exit 1


We need to change the file permission before executing the script.

[root@cyberithub ~]# chmod 755 *

Now install few extra rpm packages on the machine.

[root@cyberithub ~]# yum install net-tools -y
[root@cyberithub ~]# yum install tcpdump -y
[root@cyberithub ~]# yum install telnet -y

Use case 1: When whitelist.csv is not passed as input

[root@cyberithub ~]# ./
[root@cyberithub ~]# cd /var/log/cyberithub/
[root@cyberithub cyberithub]# cat application.log
2022-02-22T19:10:12.151834+05:30, ERROR:  Input file not found


Use case 2: When wrong file format is passed as input

[root@cyberithub ~]# ./ whitelist
[root@ cyberithub ~]# cd /var/log/cyberithub/
[root@ cyberithub cyberithub]# cat application.log
2022-02-22T19:10:12.151834+05:30, ERROR:  Input file not found
2022-02-22T19:14:23.926123+05:30, ERROR:  Input file should be a .csv file


Use case 3: When correct input file is passed

[root@ cyberithub ~]# ./ whitelist.csv
[root@ cyberithub ~]# cd /var/log/cyberithub/
[root@ cyberithub cyberithub]# cat application.log
2022-02-22T19:10:12.151834+05:30, ERROR:  Input file not found
2022-02-22T19:14:23.926123+05:30, ERROR:  Input file should be a .csv file
2022-02-22T19:48:20.905768+05:30, ERROR:  New Installed Package Found telnet-0.17-76.el8.x86_64...
2022-02-22T19:48:20.906775+05:30, ERROR:  New Installed Package Found tcpdump-4.9.3-2.el8.x86_64...
2022-02-22T19:48:20.907791+05:30, ERROR:  New Installed Package Found net-tools-2.0-0.52.20160912git.el8.x86_64...
2022-02-22T19:48:20.909619+05:30, WARNING:  Info message implementation
2022-02-22T19:48:20.910591+05:30, WARNING:  Warning message implementation

Leave a Comment