Our Proactive Monitoring Caught an Authenticated PHP Object Injection Vulnerability in Autoship Cloud
One of the ways we help to improve the security of WordPress plugins, not just for our customers, but for everyone using them, is the proactive monitoring of changes made to plugins in the Plugin Directory to try to catch serious vulnerabilities. That sometimes leads to us catching a vulnerability of a more limited version of one of those serious vulnerability types, which isn’t as much concern for the average website, but could be utilized in a targeted attack. That happened with the authenticated PHP object injection vulnerability we found in the plugin Autoship Cloud. This vulnerability could have allowed an attacker that had access to a WordPress account that has access to admin pages, which would normally be Subscriber level users and above, to exploit a PHP object injection vulnerability.
Since the check used to spot this is also included in our Plugin Security Checker (which is now accessible through a WordPress plugin of its own), it is another of reminder of how that can help to indicate which plugins are in greater need of security review (for which we do as part of our service as well as separately).
The vulnerability occurred in the function autoship_get_messages(). That function passed the base64 decoded value of the cookie “autoship_messages” through the unserialize() function, which could lead to PHP object injection:
3 4 5 6 7 | function autoship_get_messages() { if ( empty( $_COOKIE['autoship_messages'] ) ) { return array(); } $messages = unserialize( base64_decode( $_COOKIE['autoship_messages'] ) ); |
One of the locations that function gets called is in the function autoship_print_messages():
44 45 46 47 48 49 | function autoship_print_messages() { if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) { return; } $messages = autoship_get_messages(); |
That function runs when admin notices are shown:
68 | add_action( 'admin_notices', 'autoship_print_messages' ); |
After we notified the developer of the plugin they released version 1.0.14, which fixes the vulnerability. Though in a reminder that you can’t rely on changelogs to let you know if a new version of a plugin includes a security fix, the only changelog entry for that version is “Bug fixes.”. The only change made though was to fix the vulnerability. That was done by replacing the use of unserialize() with json_decode():
7 | $messages = json_decode( base64_decode( $_COOKIE['autoship_messages'] ) ); |
and elsewhere in the same file, replacing related usage of serialize() with json_encode():
39 | $messages_cookie = base64_encode( json_encode( $messages ) ); |
Proof of Concept
With our plugin for testing for PHP object injection installed and activated, set the value of the cookie “autoship_messages” to “TzoyMDoicGhwX29iamVjdF9pbmplY3Rpb24iOjA6e30=” and then when you visit an admin page on the website the message “PHP object injection has occurred.” will be shown.
Timeline
- February 12, 2018 – Developer notified.
- February 12, 2018 – Developer responds.
- February 15, 2018 – Version 1.0.14 released, which fixes vulnerability.