Piwik <= 2.14.3 (DisplayTopKeywords) PHP Object Injection Vulnerability


• Affected Versions:

Version 2.14.3 and prior versions.

• Vulnerability Description:

The vulnerability is caused by the DisplayTopKeywords() method defined in the /plugins/Referrers/Controller.php script:

358function DisplayTopKeywords($url = "", $api)
360    // Do not spend more than 1 second fetching the data
361    @ini_set("default_socket_timeout", $timeout = 1);
362    // Get the Keywords data
363    $url = empty($url) ? "http://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"] : $url;
364    $api = $api . "&url=" . urlencode($url);
365    $keywords = @unserialize(file_get_contents($api));

The content retrieved by the file_get_contents() PHP function located at the URL defined in the $api variable is passed directly to the unserialize() PHP function at line 365, and this can be exploited to inject arbitrary objects into the application scope, allowing remote attackers to carry out Server-Side Request Forgery (SSRF) attacks, to include and execute arbitrary PHP code, and possibly other attacks.

Successful exploitation of this vulnerability requires the application running with certain configuration settings allowing to manipulate the value of the $api variable through HTTP headers (like “Host” or “X-Forwarded-Host”).

• Solution:

Update to version 2.15.0 or later.

• Disclosure Timeline:

[27/08/2015] – Vendor notified

[09/09/2015] – Issue fixed on the GitHub repository: http://git.io/vly3D

[06/10/2015] – CVE number requested

[14/10/2015] – CVE number assigned

[22/10/2015] – Version 2.15.0 released https://piwik.org/changelog/piwik-2-15-0

[04/11/2015] – Public disclosure

• CVE Reference:

The Common Vulnerabilities and Exposures project (cve.mitre.org) has assigned the name CVE-2015-7816 to this vulnerability.

• Credits:

Vulnerability discovered by Egidio Romano.