Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package sslh for openSUSE:Factory checked in 
at 2025-06-02 22:00:03
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/sslh (Old)
 and      /work/SRC/openSUSE:Factory/.sslh.new.16005 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "sslh"

Mon Jun  2 22:00:03 2025 rev:16 rq:1281729 version:2.2.4

Changes:
--------
--- /work/SRC/openSUSE:Factory/sslh/sslh.changes        2025-05-08 
18:25:53.166746622 +0200
+++ /work/SRC/openSUSE:Factory/.sslh.new.16005/sslh.changes     2025-06-02 
22:00:24.256832248 +0200
@@ -1,0 +2,10 @@
+Mon Jun  2 05:18:34 UTC 2025 - Michael Vetter <mvet...@suse.com>
+
+- Update to 2.2.4:
+  * Fix CVE-2025-46806 (bsc#1243120) for "Misaligned Memory Accesses
+    in `is_openvpn_protocol()`"
+  * Fix CVE-2025-46807 (bsc#1243122) for "File Descriptor Exhaustion
+    in sslh-select and sslh-ev"
+  * Fix potential parsing of undefined data in syslog probe (no CVE assigned)
+
+-------------------------------------------------------------------
@@ -387 +397 @@
-Thu Feb 25 2010 Christian Debertshaeuser <we...@online.de>
+Thu Feb 25 00:00:00 UTC 2010 - Christian Debertshaeuser <we...@online.de>

Old:
----
  v2.2.3.tar.gz

New:
----
  v2.2.4.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ sslh.spec ++++++
--- /var/tmp/diff_new_pack.I3Uuk5/_old  2025-06-02 22:00:24.772853649 +0200
+++ /var/tmp/diff_new_pack.I3Uuk5/_new  2025-06-02 22:00:24.772853649 +0200
@@ -18,7 +18,7 @@
 
 
 Name:           sslh
-Version:        2.2.3
+Version:        2.2.4
 Release:        0
 Summary:        SSL/SSH multiplexer
 License:        GPL-2.0-or-later

++++++ v2.2.3.tar.gz -> v2.2.4.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/sslh-2.2.3/ChangeLog new/sslh-2.2.4/ChangeLog
--- old/sslh-2.2.3/ChangeLog    2025-05-04 11:47:44.000000000 +0200
+++ new/sslh-2.2.4/ChangeLog    2025-05-28 17:51:04.000000000 +0200
@@ -1,3 +1,15 @@
+v2.2.4:
+       Fix CVE-2025-46806 for "Misaligned Memory Accesses in 
`is_openvpn_protocol()`"
+
+       Fix CVE-2025-46807 for "File Descriptor Exhaustion in sslh-select and 
sslh-ev"
+
+       Fix potential parsing of undefined data in syslog
+       probe (no CVE assigned)
+
+       Thanks to Matthias Gerstner of the SUSE security
+       team for the security review that found these
+       defects!
+
 v2.2.3:
        Reverse older commit: version.h cannot be included
        without breaking the build (everything recompiles
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/sslh-2.2.3/Makefile.in new/sslh-2.2.4/Makefile.in
--- old/sslh-2.2.3/Makefile.in  2025-05-04 11:47:44.000000000 +0200
+++ new/sslh-2.2.4/Makefile.in  2025-05-28 17:51:04.000000000 +0200
@@ -22,7 +22,7 @@
 # itself
 
 ifneq ($(strip $(ENABLE_SANITIZER)),)
-    CFLAGS_SAN=-fsanitize=address -fsanitize=leak -fsanitize=undefined
+    CFLAGS_SAN=-fsanitize=address -fsanitize=leak -fsanitize=undefined 
-fsanitize=alignment
 endif
 
 ifneq ($(strip $(COV_TEST)),)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/sslh-2.2.3/probe.c new/sslh-2.2.4/probe.c
--- old/sslh-2.2.3/probe.c      2025-05-04 11:47:44.000000000 +0200
+++ new/sslh-2.2.4/probe.c      2025-05-28 17:51:04.000000000 +0200
@@ -25,6 +25,7 @@
 #define PCRE2_CODE_UNIT_WIDTH 8
 #include <pcre2.h>
 #endif
+#include <regex.h>
 #include <ctype.h>
 #include "probe.h"
 #include "log.h"
@@ -146,6 +147,7 @@
 #define OVPN_OPCODE_MASK 0xF8
 #define OVPN_CONTROL_HARD_RESET_CLIENT_V1  (0x01 << 3)
 #define OVPN_CONTROL_HARD_RESET_CLIENT_V2  (0x07 << 3)
+#define OVPN_CONTROL_HARD_RESET_CLIENT_V3  (0x0A << 3)
 #define OVPN_HMAC_128 16
 #define OVPN_HMAC_160 20
 #define OVPN_HARD_RESET_PACKET_ID_OFFSET(hmac_size) (9 + hmac_size)
@@ -164,8 +166,12 @@
         if (len < 1)
             return PROBE_NEXT;
 
+        printf("opcode: %d\n", (p[0] & OVPN_OPCODE_MASK) >> 3);
+
         if ((p[0] & OVPN_OPCODE_MASK) != OVPN_CONTROL_HARD_RESET_CLIENT_V1 &&
-            (p[0] & OVPN_OPCODE_MASK) != OVPN_CONTROL_HARD_RESET_CLIENT_V2)
+            (p[0] & OVPN_OPCODE_MASK) != OVPN_CONTROL_HARD_RESET_CLIENT_V2 &&
+            (p[0] & OVPN_OPCODE_MASK) != OVPN_CONTROL_HARD_RESET_CLIENT_V3
+            )
             return PROBE_NEXT;
 
         /* The detection pattern above may not be reliable enough.
@@ -176,12 +182,18 @@
         if (len <= OVPN_HARD_RESET_PACKET_ID_OFFSET(OVPN_HMAC_128) + 
sizeof(uint32_t))
             return PROBE_NEXT;
 
-        if (ntohl(*(uint32_t*)(p + 
OVPN_HARD_RESET_PACKET_ID_OFFSET(OVPN_HMAC_128))) <= 5u)
+        uint32_t i;
+        /* OVPN_HMAC_128 is unaligned, which requires special care e.g. on ARM 
*/
+        memcpy(&i, (p + OVPN_HARD_RESET_PACKET_ID_OFFSET(OVPN_HMAC_128)), 
sizeof(i));
+        i = ntohl(i);
+        if (i <= 5u)
             return PROBE_MATCH;
 
         if (len <= OVPN_HARD_RESET_PACKET_ID_OFFSET(OVPN_HMAC_160) + 
sizeof(uint32_t))
             return PROBE_NEXT;
 
+        memcpy(&i, (p + OVPN_HARD_RESET_PACKET_ID_OFFSET(OVPN_HMAC_160)), 
sizeof(i));
+        i = ntohl(i);
         if (ntohl(*(uint32_t*)(p + 
OVPN_HARD_RESET_PACKET_ID_OFFSET(OVPN_HMAC_160))) <= 5u)
             return PROBE_MATCH;
 
@@ -362,17 +374,38 @@
     return PROBE_MATCH;
 }
 
+/* ******************
+ * is_syslog_protocol 
+ * */
+static regex_t syslog_preg;
+static int configured_syslog_regex = 0;
+
+static void config_syslog_regex(void)
+{
+    /* two patterns for syslog messages:
+     * <12> My message
+     * 15 <12> My message
+     * 12 is 'priority', 1 to 3 digits (RFC4234)
+     * 15 is 'message length', a TCP-only option (RFC6587)
+     */
+    int res = regcomp(&syslog_preg, "^([0-9]{1,3} )?<[0-9]{1,3}>", 
REG_EXTENDED);
+    if (res) {
+        print_message(msg_system_error, "regcomp");
+        exit(1);
+    }
+    configured_syslog_regex = 1;
+}
+
 static int is_syslog_protocol(const char *p, ssize_t len, struct 
sslhcfg_protocols_item* proto)
 {
-    int res, i, j;
+    char buf[len+1];
 
-    res = sscanf(p, "<%d>", &i);
-    if (res == 1) return 1;
+    if (!configured_syslog_regex) config_syslog_regex();
 
-    res = sscanf(p, "%d <%d>", &i, &j);
-    if (res == 2) return 1;
+    strncpy(buf, p, len);
+    buf[len] = 0;
 
-    return 0;
+    return (regexec(&syslog_preg, buf, (size_t)0, NULL, 0) == 0);
 }
 
 static int is_teamspeak_protocol(const char *p, ssize_t len, struct 
sslhcfg_protocols_item* proto)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/sslh-2.2.3/sslh-select.c new/sslh-2.2.4/sslh-select.c
--- old/sslh-2.2.3/sslh-select.c        2025-05-04 11:47:44.000000000 +0200
+++ new/sslh-2.2.4/sslh-select.c        2025-05-28 17:51:04.000000000 +0200
@@ -156,13 +156,15 @@
         /* Check main socket for new connections */
         for (i = 0; i < num_addr_listen; i++) {
             if (FD_ISSET(listen_sockets[i].socketfd, &readfds)) {
-                struct connection* new_cnx = cnx_accept_process(&fd_info, 
&listen_sockets[i]);
-
-                if (fd_out_of_range(new_cnx->q[0].fd))
-                    tidy_connection(new_cnx, &fd_info);
-
                 /* don't also process it as a read socket */
                 FD_CLR(listen_sockets[i].socketfd, &readfds);
+
+                struct connection* new_cnx;
+                while ((new_cnx = cnx_accept_process(&fd_info, 
&listen_sockets[i]))) {
+                    if (fd_out_of_range(new_cnx->q[0].fd))
+                        tidy_connection(new_cnx, &fd_info);
+                }
+
             }
         }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/sslh-2.2.3/t new/sslh-2.2.4/t
--- old/sslh-2.2.3/t    2025-05-04 11:47:44.000000000 +0200
+++ new/sslh-2.2.4/t    2025-05-28 17:51:04.000000000 +0200
@@ -9,7 +9,7 @@
 use strict;
 use IO::Socket::INET6;
 use Test::More qw/no_plan/;
-use Conf::Libconfig;
+use Conf::Libconfig 1.0.3;
 
 my $conf = new Conf::Libconfig;
 $conf->read_file("test.cfg");
@@ -17,7 +17,7 @@
 
 my $no_listen = 8083;  # Port on which no-one listens
 my $pidfile = $conf->lookup_value("pidfile");
-my $sslh_port = $conf->fetch_array("listen")->[0]->{port};
+my $sslh_port = $conf->value("listen")->[0]->{port};
 my $user = (getpwuid $<)[0]; # Run under current username
 
 # Which tests do we run
@@ -84,8 +84,9 @@
 sub test_probe {
     my (%opts) = @_;
 
+    print "test_probe [$opts{expected}] $sslh_port\n";
     my $cnx = new IO::Socket::INET(PeerHost => "localhost:$sslh_port");
-    warn "$!\n" unless $cnx;
+    warn "t: $!\n" unless $cnx;
     return unless $cnx;
 
     my $pattern = $opts{data};
@@ -119,7 +120,7 @@
 sub test_probes {
     my (%in_opts) = @_;
 
-    my @probes = @{$conf->fetch_array("protocols")};
+    my @probes = @{$conf->value("protocols")};
     foreach my $p (@probes) {
         my %protocols = (
             'ssh' => { data => "SSH-2.0 tester" },
@@ -194,7 +195,7 @@
 
 
 # Start an echoserver for each service
-foreach my $s (@{$conf->fetch_array("protocols")}) {
+foreach my $s (@{$conf->value("protocols")}) {
     my $prefix = $s->{name};
 
     $prefix =~ s/^ssl/tls/; # To remove in 1.21
@@ -217,7 +218,7 @@
     my ($sslh_pid, $valgrind);
     if (!($sslh_pid = fork)) {
         my $user = (getpwuid $<)[0]; # Run under current username
-        my $cmd = "./$binary -v 4 -f -u $user -F test.cfg";
+        my $cmd = "./$binary -u $user -F test.cfg";
         #$valgrind = 1;
         #$cmd = "valgrind --leak-check=full $cmd";
         verbose_exec $cmd;
@@ -339,11 +340,11 @@
 }
 
 
-my $ssh_conf = (grep { $_->{name} eq "ssh" } 
@{$conf->fetch_array("protocols")})[0];
+my $ssh_conf = (grep { $_->{name} eq "ssh" } @{$conf->value("protocols")})[0];
 my $ssh_address = $ssh_conf->{host} . ":" .  $ssh_conf->{port};
 
 # Use the last TLS echoserv (no SNI/ALPN)
-my $ssl_conf = (grep { $_->{name} eq "tls" } 
@{$conf->fetch_array("protocols")})[-1];
+my $ssl_conf = (grep { $_->{name} eq "tls" } @{$conf->value 
("protocols")})[-1];
 my $ssl_address = $ssl_conf->{host} . ":" .  $ssl_conf->{port};
 
 

Reply via email to