CVE-2023-23684: WPGraphQL Plugin vulnerable to Server Side Request Forgery (SSRF)
Impact Users with capabilities to upload media (editors and above) are succeptible to SSRF (Server-Side Request Forgery) when executing the createMediaItem Mutation.
Authenticated users making GraphQL requests that execute the createMediaItem could pass executable paths in the mutations filePath argument that could give them unwarranted access to the server.
It's recommended to update to WPGraphQL v1.14.6 or newer. If you're unable to do so, below is a snippet you can add to your functions.php (or similar) that filters the createMediaItem mutation's resolver.
Patches
- v1.14.6 - https://github.com/wp-graphql/wp-graphql/pull/2840
Workarounds If you're unable to upgrade to v1.14.6 or higher, you should be able to use the following snippet in your functions.php to override the vulnerable resolver.
This snippet has been tested as far back as WPGraphQL v0.15
php addfilter( 'graphqlpreresolvefield', function( $nil, $source, $args, $context, \GraphQL\Type\Definition\ResolveInfo $info, $typename, $fieldkey, $field, $fieldresolver ) {
if ( $info->fieldName !== 'createMediaItem' ) { return $nil; }
$input = $args['input'] ?? null;
if ( ! isset( $input['filePath'] ) ) { return $nil; }
$uploadedfileurl = $input['filePath'];
// Check that the filetype is allowed $checkfile = wpcheckfiletype( $uploadedfileurl );
// if the file doesn't pass the check, throw an error if ( ! $checkfile['ext'] || ! $checkfile['type'] || ! wphttpvalidateurl( $uploadedfileurl ) ) { throw new \GraphQL\Error\UserError( sprintf( ( 'Invalid filePath "%s"', 'wp-graphql' ), $input['filePath'] ) ); }
$protocol = wpparseurl( $input['filePath'], PHPURLSCHEME );
// prevent the filePath from being submitted with a non-allowed protocols $allowedprotocols = [ 'https', 'http', 'file' ];
if ( ! inarray( $protocol, $allowedprotocols, true ) ) { throw new \GraphQL\Error\UserError( sprintf( ( 'Invalid protocol. "%1$s". Only "%2$s" allowed.', 'wp-graphql' ), $protocol, implode( '", "', $allowedprotocols ) ) ); }
return $nil;
}, 10, 9 );
References
- https://patchstack.com/database/vulnerability/wp-graphql/wordpress-wp-graphql-plugin-1-14-5-server-side-request-forgery-ssrf-vulnerability
Other sources
Server-Side Request Forgery (SSRF) vulnerability in WPGraphQL.This issue affects WPGraphQL: from n/a through 1.14.5.
WPGraphQL Plugin vulnerable to Server Side Request Forgery (SSRF)
— Packagist
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Upgrade
Upgrade
composer/wp-graphql/wp-graphqlto a version that resolves this vulnerability.Fixed in 1.14.6 - Upgrade
Upgrade
WPGraphQLto a version that resolves this vulnerability.Fixed in 1.14.6 - Compensating control
If unable to upgrade, add the provided graphql_pre_resolve_field filter to functions.php (or similar) to restrict the createMediaItem mutation's filePath to the https, http, and file protocols, validate the URL with wp_http_validate_url(), and require an allowed file type via wp_check_filetype().
Event History
Frequently Asked Questions
What is the vulnerability ID for this WordPress WPGraphQL vulnerability?
The vulnerability ID for this WordPress WPGraphQL vulnerability is CVE-2023-23684.
What is the impact of this vulnerability?
Users with capabilities to upload media are susceptible to Server Side Request Forgery (SSRF) when executing the createMediaItem Mutation.
Which version of WordPress WPGraphQL Plugin is affected by this vulnerability?
WordPress WPGraphQL Plugin version 1.14.5 is affected by this vulnerability.
How severe is this vulnerability?
This vulnerability has a severity score of 6.5, which is categorized as medium.
How can I fix this vulnerability?
To fix this vulnerability, update your WordPress WPGraphQL Plugin to version 1.14.6 or later.