CVE-2023-3218: Race Condition within a Thread (CWE-366)
value: Race Condition within a Thread in GitHub repository it-novum/openitcockpit prior to 4.6.5.
CWE description: If two threads of execution use a resource simultaneously, there exists the possibility that resources may be used while invalid, in turn making the state of execution undefined.
CVSS v3 base score: 4.4
Published: 2023-06-13T11:15Z
Repository: https://github.com/it-novum/openitcockpit
Language: PHP
Files changed: config/Migrations/20230606131052_UniqueIndexForIsUnique.php, plugins/GrafanaModule/config/Migrations/20230606131738_UniqueIndexForIsUnique.php
Commit date: 2023-06-06 16:07:29 +0200
Commit message: ITC-3014 Add unique index to MySQL tables to avoid race condition #1517

Diff: diff --git a/config/Migrations/20230606131052_UniqueIndexForIsUnique.php b/config/Migrations/20230606131052_UniqueIndexForIsUnique.php
new file mode 100644
index 000000000..a37baf5b2
--- /dev/null
+++ b/config/Migrations/20230606131052_UniqueIndexForIsUnique.php
@@ -0,0 +1,90 @@
+<?php
+// Copyright (C) <2015>  <it-novum GmbH>
+//
+// This file is dual licensed
+//
+// 1.
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, version 3 of the License.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+//
+// 2.
+//  If you purchased an openITCOCKPIT Enterprise Edition you can use this file
+//  under the terms of the openITCOCKPIT Enterprise Edition license agreement.
+//  License agreement and license key will be shipped with the order
+//  confirmation.
+
+declare(strict_types=1);
+
+use Migrations\AbstractMigration;
+
+/**
+ * Class UniqueIndexForIsUnique
+ *
+ * Created via:
+ * oitc migrations create UniqueIndexForIsUnique
+ *
+ * Run migration:
+ * oitc migrations migrate
+ *
+ */
+class UniqueIndexForIsUnique extends AbstractMigration {
+    /**
+     * Change Method.
+     *
+     * More information on this method is available here:
+     * https://book.cakephp.org/phinx/0/en/migrations.html#the-change-method
+     * @return void
+     */
+    public function change(): void {
+
+        if ($this->hasTable('agentchecks')) {
+            $this->table('agentchecks')
+                ->addIndex(
+                    [
+                        'name',
+                    ],
+                    ['unique' => true]
+                )
+                ->update();
+        }
+
+        if ($this->hasTable('macros')) {
+            $this->table('macros')
+                ->addIndex(
+                    [
+                        'name',
+                    ],
+                    ['unique' => true]
+                )
+                ->update();
+        }
+
+        if ($this->hasTable('users')) {
+            $this->table('users')
+                ->addIndex(
+                    [
+                        'email',
+                    ],
+                    ['unique' => true]
+                )
+                ->addIndex(
+                    [
+                        'email',
+                        'ldap_dn'
+                    ],
+                    ['unique' => true]
+                )
+                ->update();
+        }
+
+    }
+}
diff --git a/plugins/GrafanaModule/config/Migrations/20230606131738_UniqueIndexForIsUnique.php b/plugins/GrafanaModule/config/Migrations/20230606131738_UniqueIndexForIsUnique.php
new file mode 100644
index 000000000..0ce1ec8c4
--- /dev/null
+++ b/plugins/GrafanaModule/config/Migrations/20230606131738_UniqueIndexForIsUnique.php
@@ -0,0 +1,60 @@
+<?php
+// Copyright (C) <2015>  <it-novum GmbH>
+//
+// This file is dual licensed
+//
+// 1.
+//	This program is free software: you can redistribute it and/or modify
+//	it under the terms of the GNU General Public License as published by
+//	the Free Software Foundation, version 3 of the License.
+//
+//	This program is distributed in the hope that it will be useful,
+//	but WITHOUT ANY WARRANTY; without even the implied warranty of
+//	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//	GNU General Public License for more details.
+//
+//	You should have received a copy of the GNU General Public License
+//	along with this program.  If not, see <http://www.gnu.org/licenses/>.
+//
+
+// 2.
+//	If you purchased an openITCOCKPIT Enterprise Edition you can use this file
+//	under the terms of the openITCOCKPIT Enterprise Edition license agreement.
+//	License agreement and license key will be shipped with the order
+//	confirmation.
+
+declare(strict_types=1);
+
+use Migrations\AbstractMigration;
+
+/**
+ * Class UniqueIndexForIsUnique
+ *
+ * Created via:
+ * oitc migrations create -p GrafanaModule UniqueIndexForIsUnique
+ *
+ * Run migration:
+ * oitc migrations migrate -p GrafanaModule
+ *
+ */
+class UniqueIndexForIsUnique extends AbstractMigration {
+    /**
+     * Change Method.
+     *
+     * More information on this method is available here:
+     * https://book.cakephp.org/phinx/0/en/migrations.html#the-change-method
+     * @return void
+     */
+    public function change(): void {
+        if ($this->hasTable('grafana_userdashboards')) {
+            $this->table('grafana_userdashboards')
+                ->addIndex(
+                    [
+                        'name',
+                    ],
+                    ['unique' => true]
+                )
+                ->update();
+        }
+    }
+}

Fixed code: <?php
// Copyright (C) <2015>  <it-novum GmbH>
//
// This file is dual licensed
//
// 1.
//  This program is free software: you can redistribute it and/or modify
//  it under the terms of the GNU General Public License as published by
//  the Free Software Foundation, version 3 of the License.
//
//  This program is distributed in the hope that it will be useful,
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//  GNU General Public License for more details.
//
//  You should have received a copy of the GNU General Public License
//  along with this program.  If not, see <http://www.gnu.org/licenses/>.
//
// 2.
//  If you purchased an openITCOCKPIT Enterprise Edition you can use this file
//  under the terms of the openITCOCKPIT Enterprise Edition license agreement.
//  License agreement and license key will be shipped with the order
//  confirmation.

declare(strict_types=1);

use Migrations\AbstractMigration;

/**
 * Class UniqueIndexForIsUnique
 *
 * Created via:
 * oitc migrations create UniqueIndexForIsUnique
 *
 * Run migration:
 * oitc migrations migrate
 *
 */
class UniqueIndexForIsUnique extends AbstractMigration {
    /**
     * Change Method.
     *
     * More information on this method is available here:
     * https://book.cakephp.org/phinx/0/en/migrations.html#the-change-method
     * @return void
     */
    public function change(): void {

        if ($this->hasTable('agentchecks')) {
            $this->table('agentchecks')
                ->addIndex(
                    [
                        'name',
                    ],
                    ['unique' => true]
                )
                ->update();
        }

        if ($this->hasTable('macros')) {
            $this->table('macros')
                ->addIndex(
                    [
                        'name',
                    ],
                    ['unique' => true]
                )
                ->update();
        }

        if ($this->hasTable('users')) {
            $this->table('users')
                ->addIndex(
                    [
                        'email',
                    ],
                    ['unique' => true]
                )
                ->addIndex(
                    [
                        'email',
                        'ldap_dn'
                    ],
                    ['unique' => true]
                )
                ->update();
        }

    }
}
<?php
// Copyright (C) <2015>  <it-novum GmbH>
//
// This file is dual licensed
//
// 1.
//	This program is free software: you can redistribute it and/or modify
//	it under the terms of the GNU General Public License as published by
//	the Free Software Foundation, version 3 of the License.
//
//	This program is distributed in the hope that it will be useful,
//	but WITHOUT ANY WARRANTY; without even the implied warranty of
//	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//	GNU General Public License for more details.
//
//	You should have received a copy of the GNU General Public License
//	along with this program.  If not, see <http://www.gnu.org/licenses/>.
//

// 2.
//	If you purchased an openITCOCKPIT Enterprise Edition you can use this file
//	under the terms of the openITCOCKPIT Enterprise Edition license agreement.
//	License agreement and license key will be shipped with the order
//	confirmation.

declare(strict_types=1);

use Migrations\AbstractMigration;

/**
 * Class UniqueIndexForIsUnique
 *
 * Created via:
 * oitc migrations create -p GrafanaModule UniqueIndexForIsUnique
 *
 * Run migration:
 * oitc migrations migrate -p GrafanaModule
 *
 */
class UniqueIndexForIsUnique extends AbstractMigration {
    /**
     * Change Method.
     *
     * More information on this method is available here:
     * https://book.cakephp.org/phinx/0/en/migrations.html#the-change-method
     * @return void
     */
    public function change(): void {
        if ($this->hasTable('grafana_userdashboards')) {
            $this->table('grafana_userdashboards')
                ->addIndex(
                    [
                        'name',
                    ],
                    ['unique' => true]
                )
                ->update();
        }
    }
}