Vulnerability: mailcow is a mailserver suite. Prior to mailcow-dockerized version 2022-06a, an extended privilege vulnerability can be exploited by manipulating the custom parameters regexmess, skipmess, regexflag, delete2foldersonly, delete2foldersbutnot, regextrans2, pipemess, or maxlinelengthcmd to execute arbitrary code. Users should update their mailcow instances with the `update.sh` script in the mailcow root directory to 2022-06a or newer to receive a patch for this issue. As a temporary workaround, the Syncjob ACL can be removed from all mailbox users, preventing changes to those settings.
Vulnerability ID: CVE-2022-31138
CWE: CWE-78
Severity score: 10
Project: https://github.com/mailcow/mailcow-dockerized
Published: 2022-07-11
File: data/web/inc/init_db.inc.php
Commit message: hotfix imapsync
Commit author: FreddleSpl0it

Vulnerable version (before fix):
 function init_db_schema() {   try {     global $pdo;      $db_version = "20052022_0938";      $stmt = $pdo->query("SHOW TABLES LIKE 'versions'");     $num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC)); function init_db_schema() {           "spam_score" => "TINYINT(1) NOT NULL DEFAULT '1'",           "spam_policy" => "TINYINT(1) NOT NULL DEFAULT '1'",           "delimiter_action" => "TINYINT(1) NOT NULL DEFAULT '1'",           "syncjobs" => "TINYINT(1) NOT NULL DEFAULT '1'",           "eas_reset" => "TINYINT(1) NOT NULL DEFAULT '1'",           "sogo_profile_reset" => "TINYINT(1) NOT NULL DEFAULT '0'",           "pushover" => "TINYINT(1) NOT NULL DEFAULT '1'", function init_db_schema() {     }          // Mitigate imapsync pipemess issue     $pdo->query("UPDATE `imapsync` SET `custom_params` = '' WHERE `custom_params` LIKE '%pipemess%' OR `custom_params` LIKE '%pipemes%';");          // Migrate webauthn tfa     $stmt = $pdo->query("ALTER TABLE `tfa` MODIFY COLUMN `authmech` ENUM('yubi_otp', 'u2f', 'hotp', 'totp', 'webauthn')"); 

Fixed version (after fix):
 function init_db_schema() {   try {     global $pdo;      $db_version = "18062022_1153";      $stmt = $pdo->query("SHOW TABLES LIKE 'versions'");     $num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC)); function init_db_schema() {           "spam_score" => "TINYINT(1) NOT NULL DEFAULT '1'",           "spam_policy" => "TINYINT(1) NOT NULL DEFAULT '1'",           "delimiter_action" => "TINYINT(1) NOT NULL DEFAULT '1'",           "syncjobs" => "TINYINT(1) NOT NULL DEFAULT '0'",           "eas_reset" => "TINYINT(1) NOT NULL DEFAULT '1'",           "sogo_profile_reset" => "TINYINT(1) NOT NULL DEFAULT '0'",           "pushover" => "TINYINT(1) NOT NULL DEFAULT '1'", function init_db_schema() {     }          // Mitigate imapsync pipemess issue     $pdo->query("UPDATE `imapsync` SET `custom_params` = ''        WHERE `custom_params` LIKE '%pipemess%'          OR custom_params LIKE '%skipmess%'          OR custom_params LIKE '%delete2foldersonly%'          OR custom_params LIKE '%delete2foldersbutnot%'          OR custom_params LIKE '%regexflag%'          OR custom_params LIKE '%pipemess%'          OR custom_params LIKE '%regextrans2%'          OR custom_params LIKE '%maxlinelengthcmd%';");       // Migrate webauthn tfa     $stmt = $pdo->query("ALTER TABLE `tfa` MODIFY COLUMN `authmech` ENUM('yubi_otp', 'u2f', 'hotp', 'totp', 'webauthn')"); 

Patch:
patch: @@ -3,7 +3,7 @@ function init_db_schema() {
   try {
     global $pdo;
 
-    $db_version = "20052022_0938";
+    $db_version = "18062022_1153";
 
     $stmt = $pdo->query("SHOW TABLES LIKE 'versions'");
     $num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));
@@ -440,7 +440,7 @@ function init_db_schema() {
           "spam_score" => "TINYINT(1) NOT NULL DEFAULT '1'",
           "spam_policy" => "TINYINT(1) NOT NULL DEFAULT '1'",
           "delimiter_action" => "TINYINT(1) NOT NULL DEFAULT '1'",
-          "syncjobs" => "TINYINT(1) NOT NULL DEFAULT '1'",
+          "syncjobs" => "TINYINT(1) NOT NULL DEFAULT '0'",
           "eas_reset" => "TINYINT(1) NOT NULL DEFAULT '1'",
           "sogo_profile_reset" => "TINYINT(1) NOT NULL DEFAULT '0'",
           "pushover" => "TINYINT(1) NOT NULL DEFAULT '1'",
@@ -1228,8 +1228,17 @@ function init_db_schema() {
     }
     
     // Mitigate imapsync pipemess issue
-    $pdo->query("UPDATE `imapsync` SET `custom_params` = '' WHERE `custom_params` LIKE '%pipemess%' OR `custom_params` LIKE '%pipemes%';");
-    
+    $pdo->query("UPDATE `imapsync` SET `custom_params` = '' 
+      WHERE `custom_params` LIKE '%pipemess%' 
+        OR custom_params LIKE '%skipmess%' 
+        OR custom_params LIKE '%delete2foldersonly%' 
+        OR custom_params LIKE '%delete2foldersbutnot%' 
+        OR custom_params LIKE '%regexflag%' 
+        OR custom_params LIKE '%pipemess%' 
+        OR custom_params LIKE '%regextrans2%' 
+        OR custom_params LIKE '%maxlinelengthcmd%';");
+
+
     // Migrate webauthn tfa
     $stmt = $pdo->query("ALTER TABLE `tfa` MODIFY COLUMN `authmech` ENUM('yubi_otp', 'u2f', 'hotp', 'totp', 'webauthn')");
path: data/web/inc/init_db.inc.php