4 Million WordPress Sites affected by Stored Cross-Site Scripting Vulnerability in LiteSpeed Cache Plugin

On August 14, 2023, our Wordfence Threat Intelligence team identified and began the responsible disclosure process for a stored Cross-Site Scripting (XSS) vulnerability in LiteSpeed Cache plugin, which is actively installed on more than 4,000,000 WordPress websites, making it the most popular cache plugin. The vulnerability enables threat actors with contributor-level permissions or higher to inject malicious web scripts into pages using the plugin’s shortcode.

All Wordfence PremiumWordfence Care, and Wordfence Response customers, as well as those still using the free version of our plugin, are protected against any exploits targeting this vulnerability by the Wordfence firewall’s built-in Cross-Site Scripting protection.

We contacted The LiteSpeed Cache Team on August 14, 2023, and we received a response on the same day. After providing full disclosure details, the developer team made a patch on August 16, 2023, and released it to the WordPress repository on October 10, 2023. We would like to commend the LiteSpeed Technologies for their prompt response and timely patch.

We urge users to update their sites with the latest patched version of LiteSpeed Cache, version 5.7 at the time of this writing, as soon as possible.

Vulnerability Summary from Wordfence Intelligence

Description: LiteSpeed Cache <= 5.6 – Authenticated (Contributor+) Stored Cross-Site Scripting via Shortcode
Affected Plugin: LiteSpeed Cache
Plugin Slug: litespeed-cache
Affected Versions: <= 5.6
CVE ID: CVE-2023-4372
CVSS Score: 6.4 (Medium)
CVSS Vector: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:L/I:L/A:N
Researcher/s: Lana Codes
Fully Patched Version: 5.7

The LiteSpeed Cache plugin for WordPress is vulnerable to Stored Cross-Site Scripting via the ‘esi’ shortcode in versions up to, and including, 5.6 due to insufficient input sanitization and output escaping on user supplied attributes. This makes it possible for authenticated attackers with contributor-level and above permissions to inject arbitrary web scripts in pages that will execute whenever a user accesses an injected page.

Technical Analysis

The LiteSpeed Cache is a site acceleration plugin with server-level cache and optimization. It provides a shortcode ([esi]) that can be used to cache blocks with Edge Side Includes technology when added to a WordPress page, if ESI was previously enabled in the settings.

Unfortunately, insecure implementation of the plugin’s shortcode functionality allows for the injection of arbitrary web scripts into these pages. Examining the vulnerable code reveals that the shortcode method in the ESI class does not adequately sanitize the user-supplied ‘cache’ input, and then fails to escape the ‘control’ output derived from the ‘cache’ parameter when it builds the ESI block. This makes it possible to inject attribute-based Cross-Site Scripting payloads via the ‘cache’ attribute.

public function shortcode( $atts ) {
	if ( empty( $atts[ 0 ] ) ) {
		Debug2::debug( '[ESI] ===shortcode wrong format', $atts );
		return 'Wrong shortcode esi format';
	}

	$cache = 'public,no-vary';
	if ( ! empty( $atts[ 'cache' ] ) ) {
		$cache = $atts[ 'cache' ];
		unset( $atts[ 'cache' ] );
	}

	$silence = false;
	if ( ! empty( $atts[ '_ls_silence' ] ) ) {
		$silence = true;
	}

	do_action( 'litespeed_esi_shortcode-' . $atts[ 0 ] );

	// Show ESI link
	return $this->sub_esi_block( 'esi', 'esi-shortcode', $atts, $cache, $silence );
}

The shortcode method in the ESI class

public function sub_esi_block( $block_id, $wrapper, $params = array(), $control = 'private,no-vary', $silence = false, $preserved = false, $svar = false, $inline_param = array() ) {
	if ( empty($block_id) || ! is_array($params) || preg_match('/[^\w-]/', $block_id) ) {
		return false;
	}
$output .= "<esi:include src='$url'";
if ( ! empty( $control ) ) {
	$output .= " cache-control='$control'";
}

The sub_esi_block method snippet in the ESI class

This makes it possible for threat actors to carry out stored XSS attacks. Once a script is injected into a page or post, it will execute each time a user accesses the affected page. While this vulnerability does require that a trusted contributor account is compromised, or a user be able to register as a contributor, successful threat actors could steal sensitive information, manipulate site content, inject administrative users, edit files, or redirect users to malicious websites which are all severe consequences.

Shortcode Exploit Possibilities

Previous versions of WordPress contained a vulnerability that allowed shortcodes supplied by unauthenticated commenters to be rendered in certain configurations. This would make it possible for unauthenticated attackers to exploit this Cross-Site Scripting vulnerability on vulnerable installations. Fortunately, however, a vast majority of sites have been automatically upgraded to a patched release of WordPress as of this writing, which means most site owners do not need to be concerned about this. We still strongly recommend verifying your site has been updated to one of the patched versions of WordPress core found here.

Disclosure Timeline

August 14, 2023 – Wordfence Threat Intelligence team discovers the stored XSS vulnerability in LiteSpeed Cache.
August 14, 2023 – We initiate contact with the plugin vendor asking that they confirm the inbox for handling the discussion.
August 14, 2023 – The vendor confirms the inbox for handling the discussion.
August 14, 2023 – We send over the full disclosure details. The vendor acknowledges the report and begins working on a fix.
August 16, 2023 – The vendor made the patch and sent us the GitHub commit.
October 10, 2023 – The fully patched version, 5.7, is released.

Conclusion

In this blog post, we have detailed a stored XSS vulnerability within the LiteSpeed Cache plugin affecting versions 5.6 and earlier. This vulnerability allows authenticated threat actors with contributor-level permissions or higher to inject malicious web scripts into pages that execute when a user accesses an affected page. The vulnerability has been fully addressed in version 5.7 of the plugin.

We encourage WordPress users to verify that their sites are updated to the latest patched version of LiteSpeed Cache.

All Wordfence users, including those running Wordfence PremiumWordfence Care, and Wordfence Response, as well as sites still running the free version of Wordfence, are fully protected against this vulnerability.

If you know someone who uses this plugin on their site, we recommend sharing this advisory with them to ensure their site remains secure, as this vulnerability poses a significant risk.

For security researchers looking to disclose vulnerabilities responsibly and obtain a CVE ID, you can submit your findings to Wordfence Intelligence and potentially earn a spot on our leaderboard.

Did you enjoy this post? Share it!

Comments

3 Comments
  • Another nice catch by the Wordfence Threat Intelligence team.

    Was there any reason why the patch took almost 2 months to be released? Doesn't seem very timely.

    • Hi Andrew,

      As seen on GitHub, the team quickly patched the vulnerability. This must be mentioned.

      It seemed that the original plan was to release the patch in version 5.6.1. However, for some reason, they only released a later version 5.7. The version 5.6.1 was not released. I would assume this might be because the vulnerability requires ESI to be enabled in the settings, it affects far fewer customers, making it much less likely to be exploitable.

      • Thanks for the answer, I was just wondering!