Martin Schulze wrote: > > Thijs Kinkhorst wrote: > > > > Another security problem has been found in mantis. Insufficient > > > > input sanitising of the t_core_path parameter may be exploited to > > > > perform > > > > arbitrary file inclusion. Please see > > > > http://secunia.com/secunia_research/2005-46/advisory/ for details. > > > > > > Hello Moritz, > > > > > > Thank you for your report. I've prepared an NMU for all the recent > > > security problems in Mantis which is now awaiting review by my sponsor. > > > > I assume you've prepared packages of 0.19.3? > > This would address the SQL injection issue and the other XSS in view_all_set > > as well, which are both not yet in the BTS. > > > > The latest issues have been assigned CVE-2005-333[6789], BTW. > > Do you have an idea which of them affect woody/sarge?
All affect Sarge. 0.19.2 -> 0.19.3 only contains the security fixes plus a minor non-security bug fix, so it should be rather easy to extract the patches. I've attached a white-space-cleaned interdiff. More could be stripped, but I'm not entirely sure which code is related to " [bugtracker] System warning in login_page.php when no new installation (vboctor)" (this is the only non-security change listed, but I'm not sure which one it is) Woody seems unaffected, but 3337 should be double-checked in a real-life environment. CVE-2005-3339: (mantis bug 6097) The vulnerable code is not present. CVE-2005-3338: (mantis bug 5247) The vulnerable code isn't present, either. CVE-2005-3337: (mantis bugs 5959, 5751) Access to the bug description of 5959 is restricted, but view_all_set.php is not present in Woody's version, so it shouldn't be vulnerable. The XSS from 5751 can only be triggered through code from bug_actiongroup_page.php, which is not present in Woody, but might have an equivalent in 0.17. I couldn't find it with grep, but it should again be tested in a production mantis environment, as the bug contains a demo page with the XSS. CVE-2005-3336: (mantis bug 6275) This one is denied as well, but judging from the interdiff the injection would take place in lost_pwd.php and that code isn't present in 0.17 CVE-2005-3335: (mantis bug 6273) Denied again, but with the information from the original Secunia advisory I'm sure Woody isn't affected either, as the vulnerable functionality isn't present in 0.17. Cheers, Moritz
diff -Nawur mantis-0.19.2/bug_actiongroup_page.php mantis-0.19.3/bug_actiongroup_page.php --- mantis-0.19.2/bug_actiongroup_page.php 2004-11-22 14:36:50.000000000 +0100 +++ mantis-0.19.3/bug_actiongroup_page.php 2005-09-25 15:33:48.000000000 +0200 @@ -114,7 +114,7 @@ foreach( $f_bug_arr as $t_bug_id ) { $t_class = sprintf( "row-%d", ($t_i++ % 2) + 1 ); $t_bug_rows .= sprintf( "<tr bgcolor=\"%s\"> <td>%s</td> <td>%s</td> </tr>\n" - , get_status_color( bug_get_field( $t_bug_id, 'status' ) ), string_get_bug_view_link( $t_bug_id ), bug_get_field( $t_bug_id, 'summary' ) + , get_status_color( bug_get_field( $t_bug_id, 'status' ) ), string_get_bug_view_link( $t_bug_id ), string_attribute( bug_get_field( $t_bug_id, 'summary' ) ) ); echo '<input type="hidden" name="bug_arr[]" value="' . $t_bug_id . '" />' . "\n"; } diff -Nawur mantis-0.19.2/bug_sponsorship_list_view_inc.php mantis-0.19.3/bug_sponsorship_list_view_inc.php --- mantis-0.19.2/bug_sponsorship_list_view_inc.php 2004-07-21 14:38:36.000000000 +0200 +++ mantis-0.19.3/bug_sponsorship_list_view_inc.php 2005-09-22 12:53:56.000000000 +0200 @@ -6,13 +6,15 @@ # See the files README and LICENSE for details # -------------------------------------------------------- - # $Id: bug_sponsorship_list_view_inc.php,v 1.10 2004/07/21 12:38:36 vboctor Exp $ + # $Id: bug_sponsorship_list_view_inc.php,v 1.10.8.1 2005/09/22 10:53:57 vboctor Exp $ # -------------------------------------------------------- ?> <?php # This include file prints out the list of users sponsoring the current # bug. $f_bug_id must be set to the bug id + $t_core_path = config_get( 'core_path' ); + require_once( $t_core_path . 'sponsorship_api.php' ); require_once( $t_core_path . 'collapse_api.php' ); diff -Nawur mantis-0.19.2/core/authentication_api.php mantis-0.19.3/core/authentication_api.php --- mantis-0.19.2/core/authentication_api.php 2004-08-14 17:26:20.000000000 +0200 +++ mantis-0.19.3/core/authentication_api.php 2005-09-25 15:27:24.000000000 +0200 @@ -135,7 +135,7 @@ # -------------------- # Allows scripts to login using a login name or ( login name + password ) function auth_attempt_script_login( $p_username, $p_password = null ) { - global $g_script_login_cookie; + global $g_script_login_cookie, $g_cache_current_user_id; $t_user_id = user_get_id_by_name( $p_username ); @@ -161,6 +161,9 @@ # set the cookies $g_script_login_cookie = $t_user['cookie_string']; + # cache user id for future reference + $g_cache_current_user_id = $t_user_id; + return true; } @@ -341,19 +344,26 @@ # -------------------- # Return the current user login cookie string, - # if no user is logged in and anonymous login is enabled, returns cookie for anonymous user + # note that the cookie cached by a script login superceeds the cookie provided by + # the browser. This shouldn't normally matter, except that the password verification uses + # this routine to bypass the normal authentication, and can get confused when a normal user + # logs in, then runs the verify script. the act of fetching config variables may get the wrong + # userid. # if no user is logged in and anonymous login is enabled, returns cookie for anonymous user # otherwise returns '' (an empty string) function auth_get_current_user_cookie() { global $g_script_login_cookie; + # if logging in via a script, return that cookie + if ( $g_script_login_cookie !== null ) { + return $g_script_login_cookie; + } + + # fetch user cookie $t_cookie_name = config_get( 'string_cookie' ); $t_cookie = gpc_get_cookie( $t_cookie_name, '' ); # if cookie not found, and anonymous login enabled, use cookie of anonymous account. if ( is_blank( $t_cookie ) ) { - if ( $g_script_login_cookie !== null ) { - return $g_script_login_cookie; - } else { if ( ON == config_get( 'allow_anonymous_login' ) ) { $query = sprintf('SELECT id, cookie_string FROM %s WHERE username = "%s"', config_get( 'mantis_user_table' ), config_get( 'anonymous_account' ) ); @@ -365,7 +375,6 @@ } } } - } return $t_cookie; } diff -Nawur mantis-0.19.2/core/current_user_api.php mantis-0.19.3/core/current_user_api.php --- mantis-0.19.2/core/current_user_api.php 2004-11-19 13:29:00.000000000 +0100 +++ mantis-0.19.3/core/current_user_api.php 2005-10-11 14:06:32.000000000 +0200 @@ -78,7 +78,8 @@ # -------------------- # Return true if the currently user is the anonymous user function current_user_is_anonymous() { - return current_user_get_field( 'username' ) == config_get( 'anonymous_account' ); + $t_anonymous_account = config_get( 'anonymous_account' ); + return ( !is_blank( $t_anonymous_account ) && ( current_user_get_field( 'username' ) == $t_anonymous_account ) ); } # -------------------- # Trigger an ERROR if the current user account is protected diff -Nawur mantis-0.19.2/core/email_api.php mantis-0.19.3/core/email_api.php --- mantis-0.19.2/core/email_api.php 2004-10-05 23:10:14.000000000 +0200 +++ mantis-0.19.3/core/email_api.php 2005-09-25 15:50:28.000000000 +0200 @@ -768,20 +768,28 @@ $p_recipients = array( $p_recipients ); } - $result = array(); - foreach ( $p_recipients as $t_recipient ) { - - lang_push( user_pref_get_language( $t_recipient, bug_get_field( $p_bug_id, 'project_id' ) ) ); + $t_project_id = bug_get_field( $p_bug_id, 'project_id' ); + $t_sender_id = auth_get_current_user_id(); + $t_sender = user_get_name( $t_sender_id ); $t_subject = email_build_subject( $p_bug_id ); - $t_sender = current_user_get_field( 'username' ) . ' <' . - current_user_get_field( 'email' ) . '>' ; $t_date = date( config_get( 'normal_date_format' ) ); - $t_header = "\n" . lang_get( 'on' ) . " $t_date, $t_sender " . - lang_get( 'sent_you_this_reminder_about' ) . ":\n\n"; + + $result = array(); + foreach ( $p_recipients as $t_recipient ) { + lang_push( user_pref_get_language( $t_recipient, $t_project_id ) ); $t_email = user_get_email( $t_recipient ); $result[] = user_get_name( $t_recipient ); + + if ( access_has_project_level( config_get( 'show_user_email_threshold' ), $t_project_id, $t_recipient ) ) { + $t_sender_email .= ' <' . current_user_get_field( 'email' ) . '>' ; + } else { + $t_sender_email = ''; + } + $t_header = "\n" . lang_get( 'on' ) . " $t_date, $t_sender $t_sender_email " . + lang_get( 'sent_you_this_reminder_about' ) . ": \n\n"; + $t_contents = $t_header . string_get_bug_view_url_with_fqdn( $p_bug_id, $t_recipient ) . "\n\n$p_message"; diff -Nawur mantis-0.19.2/core/filter_api.php mantis-0.19.3/core/filter_api.php --- mantis-0.19.2/core/filter_api.php 2004-11-19 14:06:30.000000000 +0100 +++ mantis-0.19.3/core/filter_api.php 2005-09-25 15:39:50.000000000 +0200 @@ -753,7 +753,7 @@ ?> <br /> - <form method="post" name="filters" action="<?php PRINT $t_action; ?>"> + <form method="post" name="filters" action="<?php PRINT htmlentities($t_action); ?>"> <input type="hidden" name="type" value="5" /> <?php if ( $p_for_screen == false ) { @@ -761,10 +761,10 @@ PRINT '<input type="hidden" name="offset" value="0" />'; } ?> - <input type="hidden" name="sort" value="<?php PRINT $t_sort ?>" /> - <input type="hidden" name="dir" value="<?php PRINT $t_dir ?>" /> - <input type="hidden" name="page_number" value="<?php PRINT $p_page_number ?>" /> - <input type="hidden" name="view_type" value="<?php PRINT $t_view_type ?>" /> + <input type="hidden" name="sort" value="<?php PRINT htmlentities($t_sort) ?>" /> + <input type="hidden" name="dir" value="<?php PRINT htmlentities($t_dir) ?>" /> + <input type="hidden" name="page_number" value="<?php PRINT htmlentities($p_page_number) ?>" /> + <input type="hidden" name="view_type" value="<?php PRINT htmlentities($t_view_type) ?>" /> <table class="width100" cellspacing="1"> <?php diff -Nawur mantis-0.19.2/lost_pwd.php mantis-0.19.3/lost_pwd.php --- mantis-0.19.2/lost_pwd.php 2004-10-25 21:45:04.000000000 +0200 +++ mantis-0.19.3/lost_pwd.php 2005-09-22 13:11:34.000000000 +0200 @@ -27,9 +27,12 @@ $f_email = email_append_domain( $f_email ); email_ensure_valid( $f_email ); + $c_username = db_prepare_string( $f_username ); + $c_email = db_prepare_string( $f_email ); + $t_user_table = config_get( 'mantis_user_table' ); - $query = 'SELECT id FROM ' . $t_user_table . ' WHERE username = \'' . $f_username . '\' and email = \'' . $f_email . '\''; + $query = 'SELECT id FROM ' . $t_user_table . ' WHERE username = \'' . $c_username . '\' and email = \'' . $c_email . '\''; $result = db_query( $query ); if ( 0 == db_num_rows( $result ) ) {