WP Manifestindependent plugin directory
manifest / updates / wp-envato-market

Envato Market WP Registry grade B. Medium-severity findings · 2 findingsWP RegistryMedium-severity findings · 2 findingsOpen the reportB #6 in Updates & Deployment

WordPress Theme & Plugin management for the Envato Market.

★ 342stars
7.2krelease downloads
v2.0.14latest · 5mo ago

Install

Download envato-market.zip From the v2.0.7 release on GitHub, May 11, 2022

Upload it under Plugins → Add New Plugin → Upload Plugin, then activate.

Install straight from GitHub with WP-CLI:

wp plugin install https://github.com/envato/wp-envato-market/releases/download/v2.0.7/envato-market.zip
No built-in updater. New versions won't appear under Dashboard → Updates. Install new releases yourself, or let Git Updater track the repository.

WordPress Theme & Plugin management for the Envato Market.

Contributors: valendesigns, dtbaker, aaronrutley
Requires at least: 5.1
Tested up to: 6.1 Stable tag: 2.0.8
License: GPLv2 or later
Website: https://www.envato.com/lp/market-plugin/

Description

The Envato Market plugin can install WordPress themes and plugins purchased from ThemeForest & CodeCanyon by connecting with the Envato Market API using a secure OAuth personal token. Once your themes & plugins are installed WordPress will periodically check for updates, so keeping your items up to date is as simple as a few clicks.

You can add a global token to connect all your items from your account, and/or connect directly with a specific item using a singe-use token & item ID. When the global token and single-use token are set for the same item, the single-use token will be used to communicate with the API.

Installation

The latest version of the Envato Market plugin ZIP file can be downloaded from https://www.envato.com/lp/market-plugin/

Installing the Envato Market plugin.

  1. Download the envato-market.zip to your computer.
  2. Login to WordPress and go to the 'Plugins' menu.
  3. Click 'Add New' and upload the envato-market.zip file, then activate.
  4. Click the 'Envato Market' menu in WordPress and connect to the API.

Alternatively you can manually install the item via FTP

  1. Download the envato-market.zip and unpack the archive.
  2. Upload envato-market to the /wp-content/plugins/ directory.
  3. Activate the plugin through the 'Plugins' menu in WordPress.
  4. Click the 'Envato Market' menu in WordPress and connect to the API.

Required token permissions:

  • View and search Envato sites (default)
  • Download your purchased items
  • List purchases you've made

Support

Please see https://www.envato.com/lp/market-plugin/ for more details.

Change Log

See CHANGELOG.md for the full history of changes.

Releases

8 releases. Each count is every asset in that release; expand a row for the breakdown.

Tag
Published
Assets
Downloads
v2.0.14 latest
May 13, 2026 5mo ago
tag only
—
Mar 9, 2026 7mo ago
tag only
—
Aug 14, 2024 2 years ago
tag only
—
Jul 20, 2023 3 years ago
tag only
—
Mar 2, 2023 3 years ago
tag only
—
May 11, 2022 4 years ago
envato-market.zip
58
Aug 17, 2018 8 years ago
envato-market-2.0.1.zip
4,910
Mar 12, 2018 8 years ago
envato-market-v2.0.0.zip
2,227
B grade

Security

Envato Market 2.0.7 · audited by WP Registry

Medium-severity findings.

1 medium 1 low
Audited release
2.0.7
Findings
2
Worst severity
medium
Content hash
0fe2ac892903678034650754…

Findings

  • medium AJAX item add/remove and healthcheck lack current_user_can (nonce only)

    missing_capability

    wp_ajax_envato_market_add_item, wp_ajax_envato_market_remove_item, and wp_ajax_envato_market_healthcheck are registered for every logged-in user. Each handler's only gate is check_ajax_referer('envato_market', 'nonce'); there is no current_user_can('manage_options') or install_plugins/install_themes. ajax_add_item then sends $_POST['token'] to api.envato.com, stores the token and item id in option envato_market, and rebuilds the theme/plugin update caches. ajax_remove_item deletes matching items from that option. ajax_healthcheck returns php.ini limits, WP_DEBUG, filesystem method, upload-dir writability, and Envato API token scopes. Upstream 2.0.11 changelog: 'Enhance AJAX calls with additional current_user_can security checks' (install_themes && install_plugins on add/healthcheck; delete_plugins && delete_themes on remove). On a default role map this plugin only localizes the nonce on the manage_options admin page, so Subscriber/Customer/Editor cannot scrape _envatoMarket.nonce from this plugin's UI and the nonce check will fail them; the missing capability is still a real authorization gap (nonce is CSRF, not auth) and is the 2.0.11 security fix.

    inc/admin/class-envato-market-admin.php:1173-1184

    Recommendation

    Backport the 2.0.11 checks: after the nonce/method tests, require current_user_can('install_themes') && current_user_can('install_plugins') on add_item and healthcheck, and current_user_can('delete_plugins') && current_user_can('delete_themes') on remove_item (or simply manage_options to match the menu). Reject and 403 otherwise. Prefer get_site_option/set_options consistently when network-activated so ajax_add_item cannot clobber the network token.

  • low Inverted nonce check on init allows unauthenticated deletion of Envato update transients

    csrf

    maybe_delete_transients is hooked to init (priority 11) and therefore runs on every front-end and admin request, including unauthenticated ones. If $_POST['envato_market'] is set, it only wp_die()s when _wpnonce is present AND wp_verify_nonce fails. Omitting _wpnonce skips the check and always calls delete_transients(), which deletes site transients envato_market_themes and envato_market_plugins. Any origin can CSRF this with a simple POST (no cookies required). Blast radius is a cache reset: the next admin settings view or core update check rebuilds those lists via the Envato API (extra API traffic / delayed update cards), not code execution. The same inverted check is still present in later upstream (2.0.14). There is also no current_user_can.

    inc/admin/class-envato-market-admin.php:280-288

    Recommendation

    Fail closed: if ( ! isset($_POST['_wpnonce']) || ! wp_verify_nonce(...) ) { return; } and require current_user_can('manage_options') before delete_transients(). Do not run this on public init for anonymous POSTs; keep it on the settings-save path only.

WP Registry hashes the installable build and reports on that exact bytes-for-bytes copy. Embargoed findings are withheld until they are disclosed, so a clean verdict means nothing public is outstanding. WP Manifest does not audit code itself.