On September 22, we discussed a PHP object injection vulnerability that had been fixed in the plugin Appointments, which we had spotted being fixed due to the proactive monitoring of changes made to plugins to try to catch serious vulnerabilities. What was somewhat concerning about the handling of the vulnerability was that the vulnerable code still was in the plugin, though not accessible through it anymore. What had happened is the code originally was contained in one file and then that file’s contents were split among several files, but the old file was never removed. After we notified the developer, that file was removed, but the version number wasn’t changed so those already running 2.2.2 still have the code.
Two companies with a security focus had missed the code was still in the plugin, the developer of the plugin, WPMU DEV, and the discoverer of the vulnerability, Wordfence. That is a good reminder of why providing the details of vulnerabilities that has been fixed is important because even security companies can miss issues related to a vulnerability. That has been the case in multiple instances with the few vulnerabilities that Wordfence has disclosed in the past, including a situation where they told people to update the plugin despite the vulnerability having existed in the most recent version of it. Making those instances more problematic was that Wordfence failed to provide the details that would have easily allowed someone else to check to make sure everything had been properly resolved. Only because we did the work to figure details of those vulnerabilities were we able to spot and help get some additional related vulnerabilities fixed in some of the plugins.
In the post on that vulnerability in Appointments we wondered if Wordfence would handle the situation better, if and when they mentioned that vulnerability:
If they release information on this vulnerability, it will be interesting to see if they handle things better than they did last year.
We now have the answer, they didn’t. They release a post on it and couple of apparent PHP object injection vulnerabilities yesterday and it lacks the details that would have allowed someone to easily see that the same code existed elsewhere in the plugin. Since a PHP object injection vulnerability requires more than just knowing about the vulnerability (you need to be aware of code that can be accessed through the vulnerability), providing more details wouldn’t likely to have done little to increase the risk from disclosing more details.
Considering they are claiming all three vulnerabilities are zero-day vulnerabilities, which are vulnerabilities being exploited before the developer becomes aware of them, some hackers would already be aware of how to exploit them, further reducing the additional risk caused by doing that.
In that past Wordfence has referred to any vulnerability they discovered as a zero-day vulnerability and the post lacks details that would make it clear these all were really zero-day vulnerabilities, so the claim of them all being zero-days seem a bit questionable (though PHP object injection vulnerability are highly likely to be exploited).
The Missing Details Could Be Useful
For one of the other vulnerabilities, in the plugin Flickr Gallery, we also spotted it being fixed through our proactive monitoring. What isn’t mentioned in Wordfence’s post or further discussion of that post is a note added to that plugin alongside the fix for the vulnerability:
This plugin is deprecated, please remove it from your WordPress install.
With the third plugin we didn’t notice a PHP object injection being fixed in it at the time and in looking at the changes so far we haven’t figured out where there would have been a PHP object injection fixed. That vulnerability is supposed to have been fixed in version 184.108.40.206 of the plugin RegistrationMagic-Custom Registration Forms.
In looking over the changes made in that version the only change that directly involves code that could be involved in PHP object injection looks like this in version 220.127.116.11 (in the file /includes/class_rm_dbmanager.php):
$result = maybe_unserialize($wpdb->get_var("Select form_options FROM `$table_name` where `$primary_key` = $form_id"));
In 18.104.22.168 the code has been changed to use a prepared statement in the SQL query in it:
$result = maybe_unserialize($wpdb->get_var($wpdb->prepare("Select form_options FROM `$table_name` where `$primary_key` = %d",$form_id)));
There isn’t an obvious way that would prevent a PHP object injection vulnerability.
The rest of the changes mainly involve using prepared statements for SQL queries and adding a missing function.
As of version 22.214.171.124 there look to be 61 usage of the maybe_unserialize(), so it could be the change made in that version impacts code elsewhere that would have lead to PHP object injection. We are going to have to look closer at the rest of the code to try to figure out what is going on. If you have figured it out, please let us know.
Knowing where a PHP object injection would have been fixed there is important because it could help to get other vulnerabilities fixed, since it would make it more likely that others could spot similar vulnerabilities. For example, the way we noticed the other two vulnerabilities being fixed also led to us identifying 9 unfixed vulnerabilities related to PHP object injection that we disclosed just last month (we noticed additional ones through other methods):
- Cross-Site Request Forgery (CSRF)/PHP Object Injection Vulnerability in Shoppable Images Lite
- PHP Object Injection Vulnerability in DS.DownloadList
- PHP Object Injection Vulnerability in TAKETIN To WP Membership
- Authenticated PHP Object Injection Vulnerability in Post Pay Counter
- Authenticated PHP Object Injection Vulnerability in Media from FTP
- Cross-Site Request Forgery (CSRF)/PHP Object Injection Vulnerability in Ginger – EU Cookie Law
- Authenticated PHP Object Injection Vulnerability in Media Library Assistant
- Cross-site Request Forgery (CSRF)/PHP Object Injection Vulnerability in Media Library Assistant
- PHP Object Injection Vulnerability in Booster for WooCommerce