Date: Wednesday, November 12, 2014 @ 15:58:00
  Author: alucryd
Revision: 122442

FS#42761: mantisbt 1.2.17-4

Added:
  mantisbt/trunk/CVE-2014-7146.patch
  mantisbt/trunk/CVE-2014-8598.patch
Modified:
  mantisbt/trunk/PKGBUILD

---------------------+
 CVE-2014-7146.patch |   65 ++++++++++++++++
 CVE-2014-8598.patch |  203 ++++++++++++++++++++++++++++++++++++++++++++++++++
 PKGBUILD            |   12 ++
 3 files changed, 277 insertions(+), 3 deletions(-)

Added: CVE-2014-7146.patch
===================================================================
--- CVE-2014-7146.patch                         (rev 0)
+++ CVE-2014-7146.patch 2014-11-12 14:58:00 UTC (rev 122442)
@@ -0,0 +1,65 @@
+From bed19db954359043515300c995ebc40ebb97265a Mon Sep 17 00:00:00 2001
+From: Damien Regad <[email protected]>
+Date: Sat, 1 Nov 2014 19:45:47 +0100
+Subject: [PATCH] XML Import: Fix php code injection vulnerability
+
+Egidio Romano discovered a vulnerability in the XML import plugin.
+
+User input passed through the "description" field (and the "issuelink"
+attribute) of the uploaded XML file isn't properly sanitized before
+being used in a call to the preg_replace() function which uses the 'e'
+modifier. This can be exploited to inject and execute arbitrary PHP code
+when the Import/Export plugin is installed.
+
+This fix is a partial backport from a master branch commit which has
+been confirmed as addressing the issue 
(84017535f8718685d755d58af7a39d80f52ffca8)
+excluding changes not relevant to fixing the security issue, including
+subsequent fixes (aea1a348043979e75a6cc021e4a0a7f8d3bb7211,
+4350b4d4f0ee4fba423edcae1cd2117dc1e2d63b).
+
+Fixes #17725 (CVE-2014-7146)
+---
+ plugins/XmlImportExport/ImportXml.php | 29 ++++++++++++++++++++---------
+ 1 file changed, 20 insertions(+), 9 deletions(-)
+
+diff --git a/plugins/XmlImportExport/ImportXml.php 
b/plugins/XmlImportExport/ImportXml.php
+index 590f898..09ccc8d 100644
+--- a/plugins/XmlImportExport/ImportXml.php
++++ b/plugins/XmlImportExport/ImportXml.php
+@@ -102,16 +102,27 @@ public function import( ) {
+ 
+               echo " Done\n";
+ 
+-              $importedIssues = $this->itemsMap_->getall( 'issue' );
+-              printf( "Processing cross-references for %s issues...", count( 
$importedIssues ) );
+-              foreach( $importedIssues as $oldId => $newId ) {
+-                      $bugData = bug_get( $newId, true );
+-
+-                      $bugLinkRegexp = '/(^|[^\w])(' . preg_quote( 
$this->source_->issuelink, '/' ) . ')(\d+)\b/e';
+-                      $replacement = '"\\1" . $this->getReplacementString( 
"\\2", "\\3" )';
++              # replace bug references
++              $t_imported_issues = $this->itemsMap_->getall( 'issue' );
++              printf( 'Processing cross-references for %s issues...', count( 
$t_imported_issues ) );
++              foreach( $t_imported_issues as $t_old_id => $t_new_id ) {
++                      $t_bug = bug_get( $t_new_id, true );
++                      $t_content_replaced = false;
++                      $t_bug_link_regexp = '/(^|[^\w])(' . preg_quote( 
$this->source_->issuelink, '/' ) . ')(\d+)\b/';
++
++                      # replace links in description
++                      preg_match_all( $t_bug_link_regexp, 
$t_bug->description, $t_matches );
++                      if( is_array( $t_matches[3] ) && count( $t_matches[3] ) 
> 0 ) {
++                              $t_content_replaced = true;
++                              foreach ( $t_matches[3] as $t_old_id2 ) {
++                                      $t_bug->description = str_replace( 
$this->source_->issuelink . $t_old_id2, $this->getReplacementString( 
$this->source_->issuelink, $t_old_id2 ), $t_bug->description );
++                              }
++                      }
+ 
+-                      $bugData->description = preg_replace( $bugLinkRegexp, 
$replacement, $bugData->description );
+-                      $bugData->update( true, true );
++                      if( $t_content_replaced ) {
++                              # only update bug if necessary (otherwise last 
update date would be unnecessarily overwritten)
++                              $t_bug->update( true );
++                      }
+               }
+               echo " Done\n";
+       }

Added: CVE-2014-8598.patch
===================================================================
--- CVE-2014-8598.patch                         (rev 0)
+++ CVE-2014-8598.patch 2014-11-12 14:58:00 UTC (rev 122442)
@@ -0,0 +1,203 @@
+From 80a15487cda89afb00ce866da8e24d76808dcdb4 Mon Sep 17 00:00:00 2001
+From: Damien Regad <[email protected]>
+Date: Fri, 17 Oct 2014 17:21:25 +0200
+Subject: [PATCH] XML plugin: Add config page with access thresholds
+
+Prior to this, any user of a MantisBT instance with the XML
+Import/Export plugin enabled and knowing the URL to the plugin's import
+page could upload an XML file and insert data without restriction,
+regardless of their access level.
+
+This vulnerability is particularly dangerous when used in combination
+with the one described in issue #17725 (CVE-2014-7146) as it makes for a
+very simple and easily accessible vector for PHP code injection attacks.
+
+There was also no access check when exporting data, which could allow an
+attacker to gain access to confidential information (disclosure of all
+bug-related data, including usernames).
+
+Fixes #17780 (CVE-2014-8598)
+---
+ plugins/XmlImportExport/XmlImportExport.php      | 16 +++++++-
+ plugins/XmlImportExport/lang/strings_english.txt |  7 ++++
+ plugins/XmlImportExport/pages/config.php         | 27 +++++++++++++
+ plugins/XmlImportExport/pages/config_page.php    | 48 ++++++++++++++++++++++++
+ plugins/XmlImportExport/pages/export.php         |  2 +
+ plugins/XmlImportExport/pages/import.php         |  2 +
+ 6 files changed, 101 insertions(+), 1 deletion(-)
+ create mode 100644 plugins/XmlImportExport/pages/config.php
+ create mode 100644 plugins/XmlImportExport/pages/config_page.php
+
+diff --git a/plugins/XmlImportExport/XmlImportExport.php 
b/plugins/XmlImportExport/XmlImportExport.php
+index 63e254e..20ea3c2 100644
+--- a/plugins/XmlImportExport/XmlImportExport.php
++++ b/plugins/XmlImportExport/XmlImportExport.php
+@@ -39,7 +39,7 @@ class XmlImportExportPlugin extends MantisPlugin {
+       function register( ) {
+               $this->name = plugin_lang_get( 'title' );
+               $this->description = plugin_lang_get( 'description' );
+-              $this->page = '';
++              $this->page = "config_page";
+ 
+               $this->version = '1.0';
+               $this->requires = array(
+@@ -54,6 +54,17 @@ function register( ) {
+       /**
+        * Default plugin configuration.
+        */
++      public function config() {
++              return array(
++                      "import_threshold" => ADMINISTRATOR,
++                      "export_threshold" => DEVELOPER,
++              );
++      }
++
++      /**
++       * Plugin hooks
++       * @return array
++       */
+       function hooks( ) {
+               $hooks = array(
+                       'EVENT_MENU_MANAGE' => 'import_issues_menu',
+@@ -67,6 +78,9 @@ function import_issues_menu( ) {
+       }
+ 
+       function export_issues_menu( ) {
++              if( !access_has_project_level( plugin_config_get( 
'export_threshold' ) ) ) {
++                      return array();
++              }
+               return array( '<a href="' . plugin_page( 'export' ) . '">' . 
plugin_lang_get( 'export' ) . '</a>', );
+       }
+ 
+diff --git a/plugins/XmlImportExport/lang/strings_english.txt 
b/plugins/XmlImportExport/lang/strings_english.txt
+index 775ad76..e595228 100644
+--- a/plugins/XmlImportExport/lang/strings_english.txt
++++ b/plugins/XmlImportExport/lang/strings_english.txt
+@@ -35,7 +35,14 @@ $s_plugin_XmlImportExport_description = 'Adds XML based 
import and export capabi
+ $s_plugin_XmlImportExport_import = 'Import issues';
+ $s_plugin_XmlImportExport_export = 'XML Export';
+ 
++$s_plugin_XmlImportExport_config_title = 'XML Import/Export Access Levels 
Configuration';
++$s_plugin_XmlImportExport_import_threshold = 'Import issues';
++$s_plugin_XmlImportExport_export_threshold = 'Export issues';
++
++$s_plugin_XmlImportExport_action_update = 'Update';
++
+ $s_plugin_XmlImportExport_importing_in_project = 'Importing issues in 
project:';
++
+ $s_plugin_XmlImportExport_import_options = 'Import options';
+ 
+ $s_plugin_XmlImportExport_cross_references = 'Cross references';
+diff --git a/plugins/XmlImportExport/pages/config.php 
b/plugins/XmlImportExport/pages/config.php
+new file mode 100644
+index 0000000..19587c8
+--- /dev/null
++++ b/plugins/XmlImportExport/pages/config.php
+@@ -0,0 +1,27 @@
++<?php
++# Copyright (c) 2014  MantisBT Team - [email protected]
++# Licensed under the MIT license
++
++form_security_validate( 'plugin_XmlImportExport_config' );
++access_ensure_global_level( config_get( 'manage_plugin_threshold' ) );
++
++/**
++ * Sets plugin config option if value is different from current/default
++ * @param string $p_name  option name
++ * @param string $p_value value to set
++ * @return void
++ */
++function config_set_if_needed( $p_name, $p_value ) {
++      if ( $p_value != plugin_config_get( $p_name ) ) {
++              plugin_config_set( $p_name, $p_value );
++      }
++}
++
++$t_redirect_url = plugin_page( 'config_page', true );
++
++config_set_if_needed( 'import_threshold' , gpc_get_int( 'import_threshold' ) 
);
++config_set_if_needed( 'export_threshold' , gpc_get_int( 'export_threshold' ) 
);
++
++form_security_purge( 'plugin_XmlImportExport_config' );
++
++print_successful_redirect( $t_redirect_url );
+diff --git a/plugins/XmlImportExport/pages/config_page.php 
b/plugins/XmlImportExport/pages/config_page.php
+new file mode 100644
+index 0000000..7c678af
+--- /dev/null
++++ b/plugins/XmlImportExport/pages/config_page.php
+@@ -0,0 +1,48 @@
++<?php
++# Copyright (c) 2014  MantisBT Team - [email protected]
++# Licensed under the MIT license
++
++access_ensure_global_level( config_get( 'manage_plugin_threshold' ) );
++
++html_page_top();
++//print_manage_menu();
++?>
++
++<br />
++<form action="<?php echo plugin_page( 'config' ) ?>" method="post">
++<?php echo form_security_field( 'plugin_XmlImportExport_config' ) ?>
++<table class="width60" align="center">
++
++<tr>
++<td class="form-title" colspan="2"><?php echo plugin_lang_get("config_title") 
?></td>
++</tr>
++
++<tr <?php echo helper_alternate_class() ?>>
++<td class="category"><?php echo plugin_lang_get( 'import_threshold' ) ?></td>
++<td><select name="import_threshold"><?php
++      print_enum_string_option_list(
++              'access_levels',
++              plugin_config_get( 'import_threshold' )
++      );
++      ?></select></td>
++</tr>
++
++<tr <?php echo helper_alternate_class() ?>>
++<td class="category"><?php echo plugin_lang_get( 'export_threshold' ) ?></td>
++<td><select name="export_threshold"><?php
++      print_enum_string_option_list(
++              'access_levels',
++              plugin_config_get( 'export_threshold' )
++      );
++      ?></select></td>
++</tr>
++
++<tr>
++<td class="center" colspan="2"><input type="submit" value="<?php echo 
plugin_lang_get("action_update") ?>"/></td>
++</tr>
++
++</table>
++</form>
++
++<?php
++html_page_bottom();
+diff --git a/plugins/XmlImportExport/pages/export.php 
b/plugins/XmlImportExport/pages/export.php
+index 061b135..aac3bbf 100644
+--- a/plugins/XmlImportExport/pages/export.php
++++ b/plugins/XmlImportExport/pages/export.php
+@@ -20,6 +20,8 @@
+ 
+ require_once( 'core.php' );
+ 
++access_ensure_project_level( plugin_config_get( 'export_threshold' ) );
++
+ auth_ensure_user_authenticated( );
+ helper_begin_long_process( );
+ 
+diff --git a/plugins/XmlImportExport/pages/import.php 
b/plugins/XmlImportExport/pages/import.php
+index cd7721f..6740727 100644
+--- a/plugins/XmlImportExport/pages/import.php
++++ b/plugins/XmlImportExport/pages/import.php
+@@ -14,6 +14,8 @@
+ # You should have received a copy of the GNU General Public License
+ # along with MantisBT.  If not, see <http://www.gnu.org/licenses/>.
+ 
++access_ensure_project_level( plugin_config_get( 'import_threshold' ) );
++
+ auth_reauthenticate( );
+ 
+ html_page_top( plugin_lang_get( 'import' ) );

Modified: PKGBUILD
===================================================================
--- PKGBUILD    2014-11-12 14:51:56 UTC (rev 122441)
+++ PKGBUILD    2014-11-12 14:58:00 UTC (rev 122442)
@@ -7,7 +7,7 @@
 
 pkgname=mantisbt
 pkgver=1.2.17
-pkgrel=3
+pkgrel=4
 pkgdesc='Web-based issue tracking system'
 arch=('any')
 url='http://www.mantisbt.org/'
@@ -23,14 +23,20 @@
 backup=('etc/webapps/mantisbt/config_inc.php')
 install='mantisbt.install'
 source=("http://downloads.sourceforge.net/mantisbt/mantisbt-${pkgver}.tar.gz";
-        'CVE-2014-8554.patch')
+        'CVE-2014-7146.patch'
+        'CVE-2014-8554.patch'
+        'CVE-2014-8598.patch')
 sha256sums=('4305295a1d3910516b6fa238e03e710c0bb5b30a01b3a908865799096207b243'
-            '3183477bcc3b69fc969b9d9502070816b2f8bd1ec387d02805b1bd901b471908')
+            '5660d838efa89f5cc391df902979faa024a26faa698ab0845a458bf3a5fdcd08'
+            '3183477bcc3b69fc969b9d9502070816b2f8bd1ec387d02805b1bd901b471908'
+            '3bfb9a6e118678f80a244ca13f527d5589da094491e910d95c53dd5c10d048ed')
 
 prepare() {
   cd mantisbt-${pkgver}
 
+  patch -Np1 -i ../CVE-2014-7146.patch
   patch -Np1 -i ../CVE-2014-8554.patch
+  patch -Np1 -i ../CVE-2014-8598.patch
 }
 
 package() {

Reply via email to