CVE-2026-18438: Templately (WordPress plugin) · Unrestricted File Upload
Affects Templately (WordPress plugin)Source CVE Database V5
Not known to be exploited · CVSS 8.8 High.
Data as of 12 Nov 2026, 23:24 UTC
- EPSS
- 1.3% chance of exploitation in 30 days – higher than 71% of CVEsExploit Prediction Scoring System: the likelihood attackers will use this flaw soon.
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:HExploitation evidence
Disclosed: evidence found.
CVE published 15 Aug 2026
Detectable: no evidence on record.
No public nuclei template indexed
Weaponized: no evidence on record.
No public exploit code indexed in Metasploit or Exploit-DB
Exploited in the wildExploited: no evidence on record.
Not in CISA KEV and no source reports exploitation
Observed by OffSeq MirageSeen by Mirage: no evidence on record.
No attack traffic recorded by OffSeq Mirage sensors
A missing step is not evidence of safety. Sources: cve.org (opens in a new tab), the Metasploit, Exploit-DB and nuclei-templates index as of 13 Nov 2026.
What to do
Affected software
| Product | Affected | Fixed in |
|---|---|---|
| wpdevteamTemplately – Elementor & Gutenberg Template Library: 6500+ Free & Pro Ready Templates And Cloud! | Affected
| Fixed in– |
AI-suggested
Until an official fix is available, restrict contributor-level users from accessing the vulnerable REST API endpoints if possible, and monitor for suspicious file uploads. A complete fix requires updating the plugin to validate file types against the actual destination filename and restricting sensitive REST API routes to administrator-level capabilities.
Description
The Templately – Elementor & Gutenberg Template Library: 6500+ Free & Pro Ready Templates And Cloud! plugin for WordPress is vulnerable to Remote Code Execution in all versions up to, and including, 3.7.1 via the fetch_remote_file function. This is due to a filename validation/destination mismatch in fetch_remote_file, where file type validation is performed against the attacker-controlled Content-Disposition filename rather than the URL-path-derived destination filename. This makes it possible for authenticated attackers, with contributor-level access and above, to execute code on the server. A GIF+PHP polyglot file passes wp_check_filetype_and_ext validation as image/gif via the Content-Disposition filename, while the actual destination path is written with a .php extension derived from the URL path, bypassing the unfiltered_upload capability gate entirely. The affected endpoints are reachable at this privilege level because Templately's entire REST API — including the cloud import endpoints used in this attack (/templately/v1/clouds/upload and /templately/v1/insert) — is authorized only by a current_user_can('delete_posts') check, with no administrator or manage_options capability requirement. The same permission gate also allows a contributor to overwrite the site's global Templately cloud connection via the /templately/v1/login endpoint with global_signin set to true. A complete remediation should both correct fetch_remote_file to validate the file type against the actual destination filename rather than the Content-Disposition header (and avoid deriving the write path from the request URL), and restrict state-changing Templately REST routes to an appropriate administrator-level capability.
References
- wordfence.com/threat-intel/vulnerabilities/id/4e68b2f2-12e4-4ff2-919d-26d6b21acd03?source=cve (opens in a new tab)
- plugins.trac.wordpress.org/browser/templately/tags/3.7.1/includes/Core/Importer/WPImport.php (opens in a new tab)
- plugins.trac.wordpress.org/browser/templately/tags/3.7.1/includes/Core/Importer/WPImport.php (opens in a new tab)
- plugins.trac.wordpress.org/browser/templately/tags/3.7.1/includes/Core/Importer/WPImport.php (opens in a new tab)
- plugins.trac.wordpress.org/browser/templately/tags/3.7.1/includes/Core/Platform/Gutenberg.php (opens in a new tab)
- plugins.trac.wordpress.org/browser/templately/tags/3.7.1/includes/API/Import.php (opens in a new tab)
- plugins.trac.wordpress.org/browser/templately/tags/3.7.1/includes/API/MyClouds.php (opens in a new tab)
- plugins.trac.wordpress.org/browser/templately/tags/3.7.1/includes/API/API.php (opens in a new tab)
- plugins.trac.wordpress.org/browser/templately/tags/3.6.5/includes/Core/Importer/WPImport.php (opens in a new tab)
- plugins.trac.wordpress.org/browser/templately/tags/3.6.5/includes/Core/Importer/WPImport.php (opens in a new tab)
- plugins.trac.wordpress.org/browser/templately/tags/3.6.5/includes/Core/Importer/WPImport.php (opens in a new tab)
- plugins.trac.wordpress.org/browser/templately/tags/3.6.5/includes/Core/Platform/Gutenberg.php (opens in a new tab)
- plugins.trac.wordpress.org/browser/templately/tags/3.6.5/includes/API/Import.php (opens in a new tab)
- plugins.trac.wordpress.org/browser/templately/tags/3.6.5/includes/API/MyClouds.php (opens in a new tab)
- plugins.trac.wordpress.org/browser/templately/tags/3.6.5/includes/API/API.php (opens in a new tab)
- plugins.trac.wordpress.org/changeset?reponame=&new=3636643%40templately%2Ftags%2F3.7.2&old=3624408%40templately%2Ftags%2F3.7.1 (opens in a new tab)
- plugins.trac.wordpress.org/changeset/3636643/templately/trunk/includes/Core/Importer/WPImport.php (opens in a new tab)
- plugins.trac.wordpress.org/changeset?old_path=%2Ftemplately/tags/3.7.1&new_path=%2Ftemplately/tags/3.7.2 (opens in a new tab)