Du bist nicht angemeldet. Der Zugriff auf einige Boards wurde daher deaktiviert.

#1 28. Januar 2014 12:56

czarnowski
kennt CMS/ms
Registriert: 18. Oktober 2012
Beiträge: 457

An important vulnerability was discovered in the CMSMS 1.11.x series

Das Teil wurde bereits am 6.12. publiziert:

http://secunia.com/advisories/53920/

Man hat es von der DEV Seite wohl erst jetzt mit bekommen.

Offline

#2 28. Januar 2014 15:27

faglork
arbeitet mit CMS/ms
Ort: Fränkische Schweiz
Registriert: 15. Dezember 2010
Beiträge: 1.152
Webseite

Re: An important vulnerability was discovered in the CMSMS 1.11.x series

Naja.

"Successful exploitation of this vulnerability requires "Modify Events" permissions."

Das heisst der Angriff muss von intern erfolgen. Wenn das der Fall ist, nützt dir auch ein Fix nichts - gegen böswillige Backend-User kann man kaum was machen.

Servus,
Alex

Offline

#3 28. Januar 2014 18:53

czarnowski
kennt CMS/ms
Registriert: 18. Oktober 2012
Beiträge: 457

Re: An important vulnerability was discovered in the CMSMS 1.11.x series

Korrekt - aber wie ist es denn mit einem indirekten Angriff und es keinen böswilligen Backend-User gibt  sondern nur einen infizierten PC ?

Offline

#4 28. Januar 2014 19:20

Andynium
Moderator
Ort: Dohna / SN / Deutschland
Registriert: 13. September 2010
Beiträge: 7.018
Webseite

Re: An important vulnerability was discovered in the CMSMS 1.11.x series

Nein, diese Lücke ist es IMHO nicht.

Dazu gab es bereits im Dezember einen Thread auf der .org und da hatte man aus den von Faglork benannten Gründen auf einen Fix verzichtet.

Zudem wäre wohl die Kombination PC-Nutzer &  CMSMS - Nutzer mit der entsprechenden Berechtigung extrem speziell, so dass sich die Frage nach dem Nutzen eines solchen Hacks stellt.

Offline

#5 28. Januar 2014 20:44

czarnowski
kennt CMS/ms
Registriert: 18. Oktober 2012
Beiträge: 457

Re: An important vulnerability was discovered in the CMSMS 1.11.x series

Auch wenn es noch eine andere Lücke geben sollte.
Schadsoftware macht es sich ganz einfach - verändert einfach alle POST oder auch GET und das war's.
Ob da nun jemand gerade mal Rechte auf irgend etwas hat  ist reiner Zufall - tritt der aber ein ist auch der Schaden da.

Offline

#6 28. Januar 2014 21:24

Andynium
Moderator
Ort: Dohna / SN / Deutschland
Registriert: 13. September 2010
Beiträge: 7.018
Webseite

Re: An important vulnerability was discovered in the CMSMS 1.11.x series

cyberman schrieb:

Dazu gab es bereits im Dezember einen Thread auf der .org und da hatte man aus den von Faglork benannten Gründen auf einen Fix verzichtet.

http://forum.cmsmadesimple.org/viewtopi … ulnerab%2A

Offline

#7 29. Januar 2014 23:49

mike-r
arbeitet mit CMS/ms
Registriert: 21. Dezember 2010
Beiträge: 898
Webseite

Re: An important vulnerability was discovered in the CMSMS 1.11.x series

czarnowski schrieb:

Schadsoftware macht es sich ganz einfach - verändert einfach alle POST oder auch GET und das war's.

Oh, das is ja ma ne ganz neue Geschichte!!11eins


Unablässige Tools für's Webdevelopement/ Fehlerfindung: CSS Validierungsservice, Bildschirmlineal, Firebug, Tidy, Deutsche CSS-Referenz

Offline

#8 29. Januar 2014 11:25

czarnowski
kennt CMS/ms
Registriert: 18. Oktober 2012
Beiträge: 457

Re: An important vulnerability was discovered in the CMSMS 1.11.x series

mike-r schrieb:

Oh, das is ja ma ne ganz neue Geschichte!!11eins

Typisches Beiwerk von mike-r - kann offenbar nichts anderes.

@cyberman

Es geht um ein paar Zeilen - script ist bekannt:

[== PHP ==]
$action = "";
	$module = "";
	$event = "";
	$handler = "";
	if( isset( $_POST['add'] ) )
	{
		// we're adding some funky event handler
		if( isset( $_POST['module'] ) && $_POST['module'] != '' )
		{
		$module = $_POST['module'];
		}
		if( isset( $_POST['event'] ) && $_POST['event'] != '' )
		{
		$event = $_POST['event'];
		}
		if( isset( $_POST['handler'] ) )
		{
		// handler is set, we just have to try to set it
		$handler = $_POST['handler'];
		}
		if( $module && $event && $handler )
		{

		if( substr( $handler, 0, 2 ) == "m:" )
		{
			$handler = substr( $handler, 2 );
			Events::AddEventHandler( $module, $event, false, $handler );
		}
		else
		{
			Events::AddEventHandler( $module, $event, $handler );
		}
		}
	}
	else
	{
	  $cur_order = -1;
	
	  // we're processing an up/down or delete
	  if( isset( $_GET['action'] ) && $_GET['action'] != '' )
	    {
	      $action = $_GET['action'];
	    }
	  if( isset( $_GET['module'] ) && $_GET['module'] != '' )
	    {
	      $module = $_GET['module'];
	    }
	  if( isset( $_GET['event'] ) && $_GET['event'] != '' )
	    {
	      $event = $_GET['event'];
	    }
	  if( isset( $_GET['handler'] ) && $_GET['handler'] != '' )
	    {
	      $handler = $_GET['handler'];
	    }
	  if( isset( $_GET['order'] ) && $_GET['order'] != '' )
	    {
	      $cur_order = $_GET['order'];
	    }
	  

Da muss nur die GET oder POST Zuweisung über ein Filter gesetzt werden - Arbeitszeit von ein paar Minuten.
Das hätte CG in der Zeit wo er das http://forum.cmsmadesimple.org/viewtopi … ulnerab%2A mit dem drumherum und angeblichen Prüfungen gemacht hat 100 x erledigen können.

Offline

#9 29. Januar 2014 12:31

czarnowski
kennt CMS/ms
Registriert: 18. Oktober 2012
Beiträge: 457

Re: An important vulnerability was discovered in the CMSMS 1.11.x series

Hier das korrigierte Script admin/editevent.php - Aufwand 30 Sekunden

[== php ==]
<?php
#CMS - CMS Made Simple
#(c)2004 by Ted Kulp (wishy@users.sf.net)
#This project's homepage is: http://www.cmsmadesimple.org
#
#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; either version 2 of the License, or
#(at your option) any later version.
#
#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, write to the Free Software
#Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#
#$Id: listtags.php 2772 2006-05-17 02:25:27Z wishy $

$CMS_ADMIN_PAGE=1;

require_once("../include.php");
$urlext='?'.CMS_SECURE_PARAM_NAME.'='.$_SESSION[CMS_USER_KEY];
$gCms = cmsms();
$db = $gCms->GetDb();

$userid = get_userid();
$access = check_permission($userid, "Modify Events");

function display_error( $text )
{
  echo "<div class=\"pageerrorcontainer\"><p class=\"pageerror\">$text</p></div>\n";
}

check_login();

include_once("header.php");

$downImg = $themeObject->DisplayImage('icons/system/arrow-d.gif', lang('down'),'','','systemicon');
$upImg = $themeObject->DisplayImage('icons/system/arrow-u.gif', lang('up'),'','','systemicon');
$deleteImg = $themeObject->DisplayImage('icons/system/delete.gif', lang('delete'),'','','systemicon');


echo "<div class=\"pagecontainer\">\n";
echo "<div class=\"pageoverflow\">\n";
echo $themeObject->ShowHeader('editeventhandler');
echo "</div>\n";

if ($access)
{
	$action = "";
	$module = "";
	$event = "";
	$handler = "";
	if( isset( $_POST['add'] ) )
	{
		// we're adding some funky event handler
		if( isset( $_POST['module'] ) && $_POST['module'] != '' )
		{
		$module = cleanValue($_POST['module']);
		}
		if( isset( $_POST['event'] ) && $_POST['event'] != '' )
		{
		$event = cleanValue($_POST['event']);
		}
		if( isset( $_POST['handler'] ) )
		{
		// handler is set, we just have to try to set it
		$handler = cleanValue($_POST['handler']);
		}
		if( $module && $event && $handler )
		{

		if( substr( $handler, 0, 2 ) == "m:" )
		{
			$handler = substr( $handler, 2 );
			Events::AddEventHandler( $module, $event, false, $handler );
		}
		else
		{
			Events::AddEventHandler( $module, $event, $handler );
		}
		}
	}
	else
	{
	  $cur_order = -1;
	
	  // we're processing an up/down or delete
	  if( isset( $_GET['action'] ) && $_GET['action'] != '' )
	    {
	      $action = cleanValue($_GET['action']);
	    }
	  if( isset( $_GET['module'] ) && $_GET['module'] != '' )
	    {
	      $module = cleanValue($_GET['module']);
	    }
	  if( isset( $_GET['event'] ) && $_GET['event'] != '' )
	    {
	      $event = cleanValue($_GET['event']);
	    }
	  if( isset( $_GET['handler'] ) && $_GET['handler'] != '' )
	    {
	      $handler = cleanValue($_GET['handler']);
	    }
	  if( isset( $_GET['order'] ) && $_GET['order'] != '' )
	    {
	      $cur_order = cleanValue($_GET['order']);
	    }
	  
	  switch( $action )
	    {
	    case 'up':
	      // move an item up (decrease the order)
	      // increases the previous order, and decreases the current handler id
	      if( $handler == "" || $module == "" || $event == "" || $action == "" ||
		  ($cur_order == "" && $action != "delete") )
		{
		  display_error( lang("missingparams" ) );
		}
	      
	      // Get the event id
	      $q = "SELECT event_id FROM ".cms_db_prefix().'event_handlers WHERE handler_id = ?';
	      $event_id = $db->GetOne($q,array($handler));

	      // Get the previous handler id
	      $q = 'SELECT handler_id FROM '.cms_db_prefix().'event_handlers WHERE handler_order = ?
                    AND event_id = ?';
	      $prev_id = $db->GetOne($q,array($cur_order -1,$event_id));

	      if( $prev_id )
		{
		  $q = "UPDATE ".cms_db_prefix()."event_handlers SET handler_order = (handler_order - 1)
					where handler_id = ?";
		  $db->Execute( $q, array( $handler ) );
		  
		  $q = "UPDATE ".cms_db_prefix()."event_handlers SET handler_order = (handler_order + 1)
					where handler_id = ?";
		  $db->Execute( $q, array( $prev_id ) );
		}
	      break;
	      
	    case 'down':
	      // move an item down (increase the order)
	      // move an item up (decrease the order)
	      // increases the previous order, and decreases the current handler id
	      if( $handler == "" || $module == "" || $event == "" || $action == "" ||
		  ($cur_order == "" && $action != "delete") )
		{
		  display_error( lang("missingparams" ) );
		}
	      
	      // Get the event id
	      $q = "SELECT event_id FROM ".cms_db_prefix().'event_handlers WHERE handler_id = ?';
	      $event_id = $db->GetOne($q,array($handler));

	      // Get the next handler id
	      $q = 'SELECT handler_id FROM '.cms_db_prefix().'event_handlers WHERE handler_order = ?
                    AND event_id = ?';
	      $next_id = $db->GetOne($q,array($cur_order + 1,$event_id));
	      if( $next_id )
		{
		  $q = "UPDATE ".cms_db_prefix()."event_handlers SET handler_order = (handler_order + 1)
					where handler_id = ?";
		  $db->Execute( $q, array( $handler ) );
		  
		  $q = "UPDATE ".cms_db_prefix()."event_handlers SET handler_order = (handler_order - 1)
					where handler_id = ?";
		  $db->Execute( $q, array( $next_id ) );
		}
	      break;
	      
	    case 'delete':
	      {
		if( $handler == "" || $module == "" || $event == "" || $action == "" ||
		    ($cur_order == "" && $action != "delete") )
		  {
		    display_error( lang("missingparams" ) );
		  }
		
		// get the details about the handler
		$q = "SELECT * FROM ".cms_db_prefix()."event_handlers WHERE
						handler_id = ?";
		$dbresult = $db->Execute( $q, array( $handler ) );
		if( $dbresult && $dbresult->RecordCount() )
			{
			$row = $dbresult->FetchRow();
			$event_id = $row['event_id'];
	
			// delete a handler
			$q = "DELETE FROM ".cms_db_prefix()."event_handlers WHERE
						handler_id = ?";
			$dbresult = $db->Execute( $q, array( $handler ) );
	
			// re-order the events
			$q = "UPDATE ".cms_db_prefix()."event_handlers SET handler_order = (handler_order - 1)
						WHERE handler_order > ? AND event_id = ?";
			$dbresult = $db->Execute( $q, array( $cur_order, $event_id ) );
			}
		}
		break;
			
		default:
		// unknown or unset action
		break;
		} // switch
	}
		
	// get the event description
	$usertagops = $gCms->GetUserTagOperations();
	
	$description = '';
	$modulename = '';
	if ($module == 'Core') {
		$description = Events::GetEventDescription($event);
		$modulename = lang('core');
	}
	else
	{
	  $objinstance = cms_utils::get_module($module);
	  $description = $objinstance->GetEventDescription($event);
	  $modulename  = $objinstance->GetFriendlyName();
	}
	
	// and now get the list of handlers for this event
	$handlers = Events::ListEventHandlers( $module, $event );
	
	// and the list of all available handlers
	$allhandlers = array();
	// we get the list of user tags, and add them to the list
	$usertags = $usertagops->ListUserTags();
	foreach( $usertags as $key => $value )
	{
	  $allhandlers[$value] = $value;
	}

	// and the list of modules, and add them
	$allmodules = ModuleOperations::get_instance()->GetInstalledModules();
	foreach( $allmodules as $key )
	{
	  if( $key == $modulename ) continue;
	  $modobj = ModuleOperations::get_instance()->get_module_instance($key);
	  if( $modobj && $modobj->HandlesEvents() )
	    {
	      $allhandlers[$key] = 'm:'.$key;
	    }
	}
	
	echo "<div class=\"pageoverflow\">\n";
	echo "<p class=\"pagetext\">".lang("module_name").":</p>\n";
	echo "<p class=\"pageinput\">".$modulename."</p>\n";
	echo "</div>\n";
	echo "<div class=\"pageoverflow\">\n";
	echo "<p class=\"pagetext\">".lang("event_name").":</p>\n";
	echo "<p class=\"pageinput\">".$event."</p>\n";
	echo "</div>\n";
	echo "<div class=\"pageoverflow\">\n";
	echo "<p class=\"pagetext\">".lang("event_description").":</p>\n";
	echo "<p class=\"pageinput\">".$description."</p>\n";
	echo "</div>\n";
	
	echo "<br/><table cellspacing=\"0\" class=\"pagetable\">\n";
	echo "<thead>\n";
	echo "  <tr>\n";
	echo "    <th>".lang('order')."</th>\n";
	echo "    <th>".lang('user_tag')."</th>\n";
	echo "    <th>".lang('module')."</th>\n";
	echo "    <th class=\"pageicon\">&nbsp;</th>\n";
	echo "    <th class=\"pageicon\">&nbsp;</th>\n";
	echo "    <th class=\"pageicon\">&nbsp;</th>\n";
	echo "  </tr>\n";
	echo "</thead>\n";
	
	$rowclass = "row1";
	if( $handlers != false )
	{
		echo "<tbody>\n";
		$idx = 0;
		$url = "editevent.php".$urlext."&amp;module=".$module."&amp;event=".$event;
		foreach( $handlers as $onehandler )
		{
		echo "<tr class=\"$rowclass\">\n";
		echo "  <td>".$onehandler['handler_order']."</td>\n";
		echo "  <td>".$onehandler['tag_name']."</td>\n";
		echo "  <td>".$onehandler['module_name']."</td>\n";
		if( $idx != 0 ) 
		{
			echo "  <td><a href=\"".$url."&amp;action=up&amp;order=".$onehandler['handler_order']."&amp;handler=".$onehandler['handler_id']."\">$upImg</a></td>\n";
		}
		else
		{
			echo "<td>&nbsp;</td>";
		}
		if( $idx + 1 != count($handlers) )
		{
			echo "  <td><a href=\"".$url."&amp;action=down&amp;order=".$onehandler['handler_order']."&amp;handler=".$onehandler['handler_id']."\">$downImg</a></td>\n";
		}
		else
		{
			echo "<td>&nbsp;</td>";
		}
		if( $onehandler['removable'] == 1 )
		{
			echo "  <td><a href=\"".$url."&amp;action=delete&amp;order=".$onehandler['handler_order']."&amp;handler=".$onehandler['handler_id']."\">$deleteImg</a></td>\n";
		}
		else
		{
			echo "  <td>&nbsp;</td>\n";
		}
		echo "</tr>\n";
	
		$idx++;
		}

	}
    else{
    	echo "<tbody>\n";
        echo "<tr>\n";
        echo "<td>&nbsp;</td>";
        echo "</tr>\n";
    }
    echo "</tbody>\n";
	echo "</table>\n";
	
	echo "<br/><form action=\"editevent.php\" method=\"post\">\n";
        echo "<div>\n";
        echo '<input type="hidden" name="'.CMS_SECURE_PARAM_NAME.'" value="'.$_SESSION[CMS_USER_KEY].'" />'."\n";
	echo '<input type="hidden" name="action" value="create" />'."\n";
        echo "</div>\n";
	echo "<select name=\"handler\">\n";
	foreach( $allhandlers as $key => $value )
	{
	echo "<option value=\"$value\">$key</option>\n";
	}
	echo "</select>\n";
	echo "<input type=\"hidden\" name=\"module\" value=\"$module\" />\n";
	echo "<input type=\"hidden\" name=\"event\" value=\"$event\" />\n";
	echo "<input type=\"submit\" name=\"add\" value=\"".lang('add')."\" />";
	echo "</form>\n";
	echo "<p class=\"pageback\"><a class=\"pageback\" href=\"".$themeObject->BackUrl()."\">&#171; ".lang('back')."</a></p>\n";
	
	echo "</div>\n";
}
else
{
	display_error(lang('noaccessto', array(lang('editeventhandler'))));
}
include_once("footer.php");

?>

Offline

#10 29. Januar 2014 12:37

NaN
Moderator
Ort: Halle (Saale)
Registriert: 09. November 2010
Beiträge: 4.437

Re: An important vulnerability was discovered in the CMSMS 1.11.x series

Es geht um ein paar Zeilen

Die Sicherheitslücke von der hier die Rede ist, ist eine ganz andere.
Denn der von Dir gepostete Code wird nur ausgeführt, wenn man mit entsprechenden Rechten im Backend eingeloggt ist.
Kann also nur von Backendusern selbst ausgenutzt werden.


Module: GBFilePicker, AdvancedContent
Sicherheit: Beispiel .htaccess-Datei
CMSms 1.12 unter PHP 7:
cmsms-1.12.3.zip (inoffiziell - komplett inkl. Installer)
CMSms 1.12 unter PHP 8:
cmsms-1.12.4.zip (inoffiziell - komplett inkl. Installer)

Offline

#11 29. Januar 2014 12:41

czarnowski
kennt CMS/ms
Registriert: 18. Oktober 2012
Beiträge: 457

Re: An important vulnerability was discovered in the CMSMS 1.11.x series


Gemeldet und benannt  von Secunia, von CG behandelt aber nicht erledigt  laut cyberman unter http://forum.cmsmadesimple.org/viewtopi … ulnerab%2A  und das bezieht sich genau auf diese Lücke die ich nun mit den kleineren Änderungen hier geschlossen habe.

Das mit den Backendusern ist klar aber die Auslösung erfolgt via Schadsoftware ohne Einfluss des Backendusers wenn er denn glücklicher Besitzer der Schadsoftware ist.

Die Angriffsmöglichkeit ist eine allgemeine und keine auf Cmsms gemünzt.

Wenn die auf dem Server wirksame Schadsoftware gut ist kann die problemlos auch Rechte abschalten und andere Dinge ausführen  , dann aber wäre es ein gezielter Angriff gegen Cmsms Installationen.

Beitrag geändert von czarnowski (29. Januar 2014 12:47)

Offline

#12 29. Januar 2014 12:53

NaN
Moderator
Ort: Halle (Saale)
Registriert: 09. November 2010
Beiträge: 4.437

Re: An important vulnerability was discovered in the CMSMS 1.11.x series

Die Ankündigung "An important vulnerability was discovered in the CMSMS 1.11.x series" bezieht sich auf eine andere Sicherheitslücke, als die von Dir hier genannte. Sie bezieht sich auf mögliche SQL Injections.

Denn das, was Du hier "geschlossen" hast, ist keine "important vulnerability" sondern wurde von Secunia selbst als "less critical" eingestuft. Von dieser Lücke ist aber in dieser Ankündigung nicht die Rede.


Module: GBFilePicker, AdvancedContent
Sicherheit: Beispiel .htaccess-Datei
CMSms 1.12 unter PHP 7:
cmsms-1.12.3.zip (inoffiziell - komplett inkl. Installer)
CMSms 1.12 unter PHP 8:
cmsms-1.12.4.zip (inoffiziell - komplett inkl. Installer)

Offline

#13 29. Januar 2014 13:13

czarnowski
kennt CMS/ms
Registriert: 18. Oktober 2012
Beiträge: 457

Re: An important vulnerability was discovered in the CMSMS 1.11.x series

Da reden wir jeweils vorbei ich meine nicht den Hinweis zu der neuerlichen Meldung das dürfte doch wohl klar sein. Cyberman hat es zumindest verstanden und in die richtige Bahn geschoben.

Und es ist keineswegs less critical denn genau das Problem - Übernahme von ungefilterten  $_POST bzw. $_GET Inhalten sind über 200 x im Source Code von CMSMS zu finden.

Da reden wir genau genommen über sich stets wiederholende Kardinalfehler der da wäre - übernehme NIE ungefilterte Daten aus $_POST $_GET oder $_REQUEST.

Werden damit DB Tabellen gefüllt sind dort theoretisch auch überall SQL Incections möglich.

Auch in den Fällen muss nur ein Rechner eines Anwenders mit jeweiligen Rechten befallen sein der das ausnutzt.


SQL Injections aber sind immer zielgerichtete Angriffe - also gegen den Titel selbst und sind daher eher seltener.

Beitrag geändert von czarnowski (29. Januar 2014 13:13)

Offline