Changelog for 7.6.7 (v7-stable)
Version 7.6.7 [v7.6-stable] 2014-10-02
- bugfix: the fix for CVE-2014-3634 did not handle all cases
 This is corrected now. See also: CVE-2014-3683
- fixed a build problem on some platforms
 Thanks to Olaf for the patch
- behaviour change: “msg” of messages with invalid PRI set to “rawmsg”
 When the PRI is invalid, the rest of the header cannot be valid. So
 we move all of it to MSG and do not try to parse it out. Note that
 this is not directly related to the security issue but rather done
 because it makes most sense.
remote syslog PRI vulnerability – CVE: CVE-2014-3683
remote syslog PRI vulnerability
 ===============================
CVE: CVE-2014-3683
Status of this report
 ———————
 FINAL
 Updated 2014-10-06: effect on sysklogd milder than in initial assesment
Reporter
 ——-
 mancha 
 Rainer Gerhards 
Affected
 ——–
 – rsyslog, most probably all versions (checked v3-stable and above)
 – sysklogd (checked most recent versions)
Short Description
 —————–
 While preparing a fix for CVE-2014-3634 for sysklogd, mancha discovered and
 privately reported that the initial rsyslog fix set was incomplete. It did
 not cover cases where PRI values > MAX_INT caused integer overflows
 resulting in negative values.
Root Cause
 ———-
 A while parsing the syslog message’s PRI value, an integer overlow can
 happen (for PRI > MAX_INT), which may cause negative PRI values. The
 solutions provided in CVE-2014-3634 do not handle that case.
Effect in Practice
 ——————
General
 ~~~~~~~
 Almost all distributions do ship rsyslog without remote reception by
 default and almost all distros also put firewall rules into place that
 prevent reception of syslog messages from remote hosts (even if rsyslog
 would be listening). With these defaults, it is impossible to trigger
 the vulnerability in v7 and v8. Older versions may still be vulnerable
 if a malicious user writes to the local log socket.
Even when configured to receive remote message (on a central server),
 it is good practice to protect such syslog servers to accept only
 messages from trusted peers, e.g. within the relay chain. If setup in
 such a way, a trusted peer must be compromised to send malfromed
 messages. This further limits the magnitude of the vulnerability.
If, however, any system is permitted to send data unconditionally to
 the syslogd, a remote attack is possible.
sysklogd
 ~~~~~~~~
This causes no extra problems as CVE-2014-3634 because negative
 PRI values are masked off, so the overflow region is still at a
 maximum of 104 bytes. For more detailsm see CVE-2014-3634.
rsyslogd
 ~~~~~~~~
 Rsyslogd experiences the same problem as sysklogd.
As in CVE-2014-3634, rsyslog v7 and v8 have an elevated risk due to some
 tables lookups used during writing. For details see CVE2014-3634.
 Contrary to CVE-2014-3634, rsyslog v5 is also likely to segfault, if
 and only if the patch for CVE-2014-3634 is applied.
Note that a segfault of rsyslog can cause message loss. There are multiple
 scenarios for this, but likely ones are:
– reception via UDP, where all messages arriving during downtime are lost
 – corruption of disk queue structures, which can lead to loss of all disk
 queue contents (manual recovery is possible).
This list does not try to be complete. Note that disk queue corruption is likely
 to occur in default settings, because the important queue information file (.qi)
 is only written on successful shutdown. Without a valid .qi file, queue message
 files cannot be processed.
How to Exploit
 ————–
 A syslog message with a PRI > MAX_INT needs to be sent and the resulting
 overflow must lead to a negative value. It is usually sufficient
 to send just the PRI as in this example
“<3500000000>”
Severity
 ——–
 Given the fact that multiple changes must be made to default system configurations
 and potential problems we classify the severity of this vulnerability as
MEDIUM
Note that the probability of a successful attack is on LOW. However, the risk of
 message loss is HIGH in those rare instances where an attack is successful. As
 mentioned above, it cannot totally be outruled that remote code injection is
 possible using this vulnerability.
Patches
 ——-
sysklogd
 ~~~~~~~~
 A patch for version 1.5 is available at:
 http://sf.net/projects/mancha/files/sec/sysklogd-1.5_CVE-2014-3634.diff
rsyslog
 ~~~~~~~
 Patches are available for versions known to be in wide-spread use.
Version 8.4.2 is not vulnerable. Version 7.6.7, while no longer being project
 supported, received a patch and is also not vulnerable.
Versions 8.4.1 and 7.6.6 do NOT handle integer overflows and resulting negative
 PRI values correctly. So upgrading to them is NOT a sufficient solution. All
 older v7 and v8 versions are vulnerable.
The rsyslog project also provides patches for older versions 5 and 3. This is
 purely a convenience to those that still run these very outdated versions.
 Note that these patches address the segfault issue. They do NOT offer all features
 of the v7/8 series, as this would require considerate code changes. Most
 importantly, the “invld” facility is not available in the v3 patch. Also,
 the dead-version patches do not try to assing a specific severity to messages
 with invalid PRI values nor do they prevent parsing those messages. In general,
 it is suggested to upgrade to the currently supported version 8.4.2.
All patches and downloads can be found on http://www.rsyslog.com
Special thanks to mancha for his suggestions on how to fix the problem. The
 core idea went into the rsyslog patches.
remote syslog PRI vulnerability – CVE: CVE-2014-3634
===============================
CVE: CVE-2014-3634
Status of this report
 ———————
 FINAL
Reporter
 ——-
 Rainer Gerhards, rsyslog project lead
Affected
 ——–
 – rsyslog, most probably all versions (checked 5.8.6+)
 – sysklogd (checked most recent versions)
 – potentially others (see root cause)
Root Cause
 ———-
 Note: rsyslogd was forked from sysklogd, and the root cause applies to
 both. For simplicity, here I use sysklogd as this is the base code.
The system header file /usr/include/*/syslog.h contains the following definitions
#define    LOG_NFACILITIES    24    /* current number of facilities */
 #define    LOG_FACMASK    0x03f8    /* mask to extract facility part */
 /* facility of pri */
 #define    LOG_FAC(p)    (((p) & LOG_FACMASK) >> 3)
[This is from Ubuntu 12.04LTS, but can be found similarly in most, if
 not all, distributions].
The define LOG_NFACILITIES is used by sysklogd to size arrays for facility
 processing. In sysklogd, an array for selector matching is using this. Rsyslog
 has additional array. The macro LOG_FAC() is used to extract the facility from
 a syslog PRI [RFC3164, RFC 5424]. Its result is used to address the arrays.
 Unfortunately, the LOG_FACMASK permits PRI values up to 0x3f8 (1016 dec). This
 translates to 128 facilities. Consequently, for PRI values above 191 the
 LOG_NFACILITIES arrays are overrun.
Other applications may have similar problems, as LOG_NFACILITES “sounds” like
 the max value that LOG_FAC() can return. It would probably make sense to
 check why there is a difference between LOG_NFACILITES and LOG_FACMASK, and
 if this really needs to stay. A proper fix would probably be to make LOG_FAC
 return a valid (maybe special) facility if an invalid one is provided. This
 is the route taken in rsyslog patches.
Effect in Practice
 ——————
General
 ~~~~~~~
 Almost all distributions do ship rsyslog without remote reception by
 default and almost all distros also put firewall rules into place that
 prevent reception of syslog messages from remote hosts (even if rsyslog
 would be listening). With these defaults, it is impossible to trigger
 the vulnerability in v7 and v8. Older versions may still be vulnerable
 if a malicious user writes to the local log socket.
Even when configured to receive remote message (on a central server),
 it is good practice to protect such syslog servers to accept only
 messages from trusted peers, e.g. within the relay chain. If setup in
 such a way, a trusted peer must be compromised to send malfromed
 messages. This further limits the magnitude of the vulnerability.
If, however, any system is permitted to send data unconditionally to
 the syslogd, a remote attack is possible.
sysklogd
 ~~~~~~~~
 Sysklogd is mildly affected. Having a quick look at the current git master
 branch, the wrong action may be applied to messages with invalid facility.
A segfault seems unlikely, as the maximum misadressing is 104 bytes of the
 f_pmask table, which is always within properly allocated memory (albeit to
 wrong data items). This can lead to triggering invalid selector lines and
 thus wrongly writing to files or wrongly forwarding to other hosts.
rsyslogd
 ~~~~~~~~
 Rsyslogd experiences the same problem as sysklogd.
However, more severe effects can occur, BUT NOT WITH THE DEFAULT CONFIGURATION.
 The most likely and thus important attack is a remote DoS. Some
 of the additional tables are writable and can cause considerable misadressing.
 This is especially true for versions 7 and 8. In those versions, remote code
 injection may also be possible by a carefully crafted package. It sounds hard
 to do, but it cannot be totally outruled [we did not check this in depth].
A segfault (and thus Dos) has the following preconditions:
 – the rsyslog property “pri-text” must be used, either in
 * templates
 * conditional statements (RainerScript and property-based filters)
 – the property must actually be accessed
 With traditional selector lines, this depends on the facility causing
 a misadressing that leads to reading a 1 from the misaccessed location.
When the preconditions are met, misadressing happens. The code uses a string
 table and a table of string lengths. Depending on memory layout at time of
 misadressing and depending on the actual invalid PRI value, the lookup to
 the string table can lead to a much to long length, which is the used in
 buffer copy calculations. High PRI values close to the max of 1016 potentially
 cause most problems, but we have also seen segfaults with very low invalid
 PRI values.
Note that, as usual in such situations, a segfault may not happen immediately.
 Instad some data structures may be damaged (e.g. from the memory allocator)
 which will later on result in a segfault.
In v5 and below, a segfault is very unlikely, as snprintf() is used to generate
 the pri-text property. As such, no write overrun can happen (but still garbagge
 be contained inside the property). A segfault could theoretically happen if the
 name lookup table indices cause out-of-process misadressing. We could not manage
 to produce a segfault with v5.
Versions 7.6.3 and 7.6.4 already have partial fixes for the issue and will not
 be vulnerable to a segfault (but the mild other issues described).
All other versions 7 and 8 are vulnerable. Version 6 was not checked as it seems
 no longer be used in practice (it was an interim version). No patch for version 6
 will be provided.
Note that a segfault of rsyslog can cause message loss. There are multiple
 scenarios for this, but likely ones are:
– reception via UDP, where all messages arriving during downtime are lost
 – corruption of disk queue structures, which can lead to loss of all disk
 queue contents (manual recovery is possible).
This list does not try to be complete. Note that disk queue corruption is likely
 to occur in default settings, because the important queue information file (.qi)
 is only written on successful shutdown. Without a valid .qi file, queue message
 files cannot be processed.
How to Exploit
 ————–
 A syslog message with an invalid PRI value needs to be sent. It is sufficient
 to send just the PRI as in this example
“<201>”
Any message starting with “<PRI>” where PRI is an integer greater than 191
 can trigger the problem. The maximum offset that can be generated is with
 PRI equal to 1016, as this is the modulus used due to LOG_FACMASK.
Note that messages with
 – PRI > 191  and
 – PRI modulus 1016 <= 191
 will not lead to misadressing but go into the wrong bin.
Messsages with
 – PRI > 191
 – PRI modulus 1016 > 191
 will go into the wrong bin and lead to misadressing.
Severity
 ——–
 Given the triggering scenarios, the fact that multiple changes must be made to
 default system configurations and potential problems we classify the severity
 of this vulnerability as
MEDIUM
Note that the probability of a successful attack is LOW. However, the risk of
 message loss is HIGH in those rare instances where an attack is successful. As
 mentioned above, it cannot totally be outruled that remote code injection is
 possible using this vulnerability.
This vulnerability is at least not publicly know. Based on (no) bug reports, it
 seems unlikely that it is being exploited, but that’s obviously hard to know for
 sure.
Patches
 ——-
 Patches are available for versions known to be in wide-spread use.
Version 8.4.1 is not vulnerable. Version 7.6.6, while no longer being project
 supported received a patch and is also not vulnerable.
New patches for the article available http://www.rsyslog.com/remote-syslog-pri-vulnerability-cve-2014-3683/
