On 2026-05-14 21:41:39, Adrian Bunk wrote:
On Sat, May 09, 2026 at 08:41:13AM +0200, Peter Wienemann wrote:
Package: release.debian.org
Severity: normal
Tags: trixie
X-Debbugs-Cc: [email protected], [email protected]
Control: affects -1 + src:sogo
User: [email protected]
Usertags: pu

[ Reason ]
This applies a security fix introduced by upstream release
5.12.7 to version 5.12.1 distributed with Trixie. I am not aware of any
CVE identifier for it. Upstream recommends to update immediately
provided one of the following setups is used [0]:

1. At least one user source is a PostgreSQL database.

2. a) At least one user source is an SQL database (MariaDB or PostgreSQL)
    b) Passwords are stored in plain text
...

https://security-tracker.debian.org/tracker/CVE-2026-46445

As Adrian pointed out CVEs were assigned to the issues addressed by the proposed change in the meantime - more precisely two CVEs:

https://security-tracker.debian.org/tracker/CVE-2026-46445
https://security-tracker.debian.org/tracker/CVE-2026-46446

I attach an updated debdiff which includes the CVE information.

Best regards

Peter

P. S.: In the meantime a new SOGo version (5.12.8) was released with even more security fixes:

https://www.sogo.nu/news/2026/sogo-v5128-released.html
diff -Nru sogo-5.12.1/debian/changelog sogo-5.12.1/debian/changelog
--- sogo-5.12.1/debian/changelog        2025-12-31 11:33:39.000000000 +0100
+++ sogo-5.12.1/debian/changelog        2026-05-16 21:48:19.000000000 +0200
@@ -1,3 +1,15 @@
+sogo (5.12.1-3+deb13u2) trixie; urgency=medium
+
+  * Non-maintainer upload.
+  * Add patch to fix the following vulnerabilities:
+    - CVE-2026-46445: SQL injection vulnerability when at least one user
+      source is a PostgreSQL database
+    - CVE-2026-46446: SQL injection vulnerability when at least one user
+      source is an SQL database (MariaDB or PostgreSQL) and passwords are
+      stored in plain text
+
+ -- Peter Wienemann <[email protected]>  Sat, 16 May 2026 21:48:19 +0200
+
 sogo (5.12.1-3+deb13u1) trixie; urgency=high
 
   * Non-maintainer upload by the Security Team.
diff -Nru sogo-5.12.1/debian/patches/CVE-2026-46445_CVE-2026-46446.patch 
sogo-5.12.1/debian/patches/CVE-2026-46445_CVE-2026-46446.patch
--- sogo-5.12.1/debian/patches/CVE-2026-46445_CVE-2026-46446.patch      
1970-01-01 01:00:00.000000000 +0100
+++ sogo-5.12.1/debian/patches/CVE-2026-46445_CVE-2026-46446.patch      
2026-05-16 21:48:19.000000000 +0200
@@ -0,0 +1,176 @@
+From: Hivert Quentin <[email protected]>
+Date: Tue, 24 Mar 2026 15:26:37 +0100
+Subject: fix(sql): use proper sql adaptor for usr source
+
+Origin: upstream, 
https://github.com/Alinto/sogo/commit/1f7e5d2b2c2047c44a6a9e05f73c36491cb96d21.diff
+---
+ SoObjects/SOGo/SQLSource.m | 70 ++++++++++++++++++++++++++++++++--------------
+ 1 file changed, 49 insertions(+), 21 deletions(-)
+
+diff --git a/SoObjects/SOGo/SQLSource.m b/SoObjects/SOGo/SQLSource.m
+index 93e8a81..2a4a950 100644
+--- a/SoObjects/SOGo/SQLSource.m
++++ b/SoObjects/SOGo/SQLSource.m
+@@ -225,9 +225,16 @@
+  */
+ - (NSString *) _encryptPassword: (NSString *) plainPassword
+ {
+-  NSString *pass;
++  NSString *pass, *passwordScheme;
+   NSString* result;
+ 
++  // if ([_userPasswordAlgorithm caseInsensitiveCompare: @"none"] == 
NSOrderedSame ||
++  //     [_userPasswordAlgorithm caseInsensitiveCompare: @"plain"] == 
NSOrderedSame ||
++  //     [_userPasswordAlgorithm caseInsensitiveCompare: @"cleartext"] == 
NSOrderedSame)
++  // {
++  //   pass = [pass stringByReplacingString: @"'"  withString: @"''"];
++  // }
++
+   pass = [plainPassword asCryptedPassUsingScheme: _userPasswordAlgorithm
+                                          keyPath: _keyPath];
+ 
+@@ -272,6 +279,7 @@
+               grace: (int *) _grace
+   disablepasswordPolicyCheck: (BOOL) _disablepasswordPolicyCheck
+ {
++  EOAdaptor *adaptor;
+   EOAdaptorChannel *channel;
+   EOQualifier *qualifier;
+   GCSChannelManager *cm;
+@@ -281,11 +289,13 @@
+ 
+   rc = NO;
+ 
+-  _login = [_login stringByReplacingString: @"'"  withString: @"''"];
+   cm = [GCSChannelManager defaultChannelManager];
+   channel = [cm acquireOpenChannelForURL: _viewURL];
+   if (channel)
+     {
++      EOAdaptorContext *adaptorCtx;
++      adaptorCtx = [channel adaptorContext];
++      adaptor = [adaptorCtx adaptor];
+       if (_loginFields)
+         {
+           NSMutableArray *qualifiers;
+@@ -324,7 +334,8 @@
+                                               nil];
+           [qualifier autorelease];
+         }
+-      [qualifier appendSQLToString: sql];
++      [qualifier appendSQLToString: sql
++                       withAdaptor: adaptor];
+ 
+       ex = [channel evaluateExpressionX: sql];
+       if (!ex)
+@@ -430,9 +441,11 @@
+ {
+   BOOL didChange, isOldPwdOk, isPolicyOk;
+   EOAdaptorChannel *channel;
++  EOAdaptor *adaptor;
++  EOQualifier *qualifier_login, *qualifier_pwd;
+   GCSChannelManager *cm;
+   NSException *ex;
+-  NSString *sqlstr;
++  NSMutableString *sqlstr;
+ 
+   *perr = -1;
+   isOldPwdOk = NO;
+@@ -455,16 +468,28 @@
+         return NO;
+ 
+       // Save new password
+-      login = [login stringByReplacingString: @"'"  withString: @"''"];
++      // login = [login stringByReplacingString: @"'"  withString: @"''"];
+       cm = [GCSChannelManager defaultChannelManager];
+       channel = [cm acquireOpenChannelForURL: _viewURL];
+       if (channel)
+         {
+-          sqlstr = [NSString stringWithFormat: (@"UPDATE %@"
+-                                                @" SET c_password = '%@'"
+-                                                @" WHERE c_uid = '%@'"),
+-                             [_viewURL gcsTableName], encryptedPassword, 
login];
+-
++          EOAdaptorContext *adaptorCtx;
++          adaptorCtx = [channel adaptorContext];
++          adaptor = [adaptorCtx adaptor];
++          sqlstr = [NSMutableString stringWithFormat: @"UPDATE %@ SET ",
++                                              [_viewURL gcsTableName]];
++                
++          qualifier_pwd = [[EOKeyValueQualifier alloc] initWithKey: 
@"c_password"
++                                              operatorSelector: 
EOQualifierOperatorEqual
++                                                         value: 
encryptedPassword];
++          [qualifier_pwd appendSQLToString: sqlstr
++                          withAdaptor: adaptor];
++          [sqlstr appendString: @" WHERE "];
++          qualifier_login = [[EOKeyValueQualifier alloc] initWithKey: @"c_uid"
++                                              operatorSelector: 
EOQualifierOperatorEqual
++                                                         value: login];
++          [qualifier_login appendSQLToString: sqlstr
++                          withAdaptor: adaptor];
+           ex = [channel evaluateExpressionX: sqlstr];
+           if (!ex)
+             {
+@@ -998,7 +1023,9 @@
+                           inDomain: (NSString *)domain
+                              limit: (int)limit
+ {
++  EOAdaptor *adaptor;
+   EOAdaptorChannel *channel;
++  EOQualifier *qualifier;
+   NSEnumerator *criteriaList;
+   NSMutableArray *fields, *results;
+   GCSChannelManager *cm;
+@@ -1014,12 +1041,14 @@
+       channel = [cm acquireOpenChannelForURL: _viewURL];
+       if (channel)
+         {
++          EOAdaptorContext *adaptorCtx;
++          adaptorCtx = [channel adaptorContext];
++          adaptor = [adaptorCtx adaptor];
+           fields = [NSMutableArray array];
+           if ([filter length])
+             {
+-              lowerFilter = [filter lowercaseString];
+-              lowerFilter = [lowerFilter asSafeSQLLikeString];
+-              filterFormat = [NSString stringWithFormat: @"LOWER(%%@) LIKE 
'%%%%%@%%%%'", lowerFilter];
++              filter = [[filter asSafeSQLString] stringByReplacingString: 
@"\%" withString: @"%%"];
++              filterFormat = [NSString stringWithFormat: @"(%%@ 
isCaseInsensitiveLike: '*%@*')", filter];
+               if (criteria)
+                 criteriaList = [criteria objectEnumerator];
+               else
+@@ -1044,7 +1073,9 @@
+           if ([fields count])
+             {
+               qs = [[[fields uniqueObjects] stringsWithFormat: filterFormat] 
componentsJoinedByString: @" OR "];
+-              [sql appendString: qs];
++              qualifier = [EOQualifier qualifierWithQualifierFormat: qs];
++              [qualifier appendSQLToString: sql
++                             withAdaptor: adaptor];
+             }
+           else
+             [sql appendString: @"1 = 1"];
+@@ -1108,7 +1139,7 @@
+                           andSortOrdering: (EOSortOrdering *) ordering
+                                  inDomain: (NSString *) domain
+ {
+-  static EOAdaptor *adaptor = nil;
++  EOAdaptor *adaptor;
+   NSException *ex;
+   NSMutableArray *results;
+   NSMutableString *sql;
+@@ -1123,12 +1154,9 @@
+       channel = [cm acquireOpenChannelForURL: _viewURL];
+       if (channel)
+         {
+-          if (!adaptor)
+-            {
+-              EOAdaptorContext *adaptorCtx;
+-              adaptorCtx = [channel adaptorContext];
+-              adaptor = [adaptorCtx adaptor];
+-            }
++          EOAdaptorContext *adaptorCtx;
++          adaptorCtx = [channel adaptorContext];
++          adaptor = [adaptorCtx adaptor];
+           sql = [NSMutableString stringWithFormat: @"SELECT c_name FROM %@ 
WHERE (", [_viewURL gcsTableName]];
+ 
+           if (qualifier)
diff -Nru sogo-5.12.1/debian/patches/series sogo-5.12.1/debian/patches/series
--- sogo-5.12.1/debian/patches/series   2025-12-31 11:33:39.000000000 +0100
+++ sogo-5.12.1/debian/patches/series   2026-05-16 21:48:19.000000000 +0200
@@ -17,3 +17,4 @@
 upstream_use_openid_libcurl.patch
 CVE-2025-63499.patch
 CVE-2025-63498.patch
+CVE-2026-46445_CVE-2026-46446.patch

Attachment: OpenPGP_signature.asc
Description: OpenPGP digital signature

Reply via email to