Activity Log for WordPress <= 1.2.8 - Missing Authorization to Sensitive Information Exposure via Log File
Description
The Activity Log for WordPress plugin for WordPress is vulnerable to unauthorized access of data due to a missing capability check on the winter_activity_log_action() function in all versions up to, and including, 1.2.8. This makes it possible for authenticated attackers, with Subscriber-level access and above, to view potentially sensitive information (e.g., the password of a higher level user, such as an administrator) contained in the exposed log files.
CVSS Vector Breakdown
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:NTechnical Details
<=1.2.8Source Code
WordPress.org SVNPatched version not available.
This research plan targets CVE-2026-1671, a missing authorization vulnerability in the **Activity Log for WordPress (winterlock)** plugin. The vulnerability allows Subscriber-level users to access sensitive activity logs, which may contain sensitive data such as plain-text passwords or administrativ…
Show full research plan
This research plan targets CVE-2026-1671, a missing authorization vulnerability in the Activity Log for WordPress (winterlock) plugin. The vulnerability allows Subscriber-level users to access sensitive activity logs, which may contain sensitive data such as plain-text passwords or administrative actions.
1. Vulnerability Summary
- Vulnerability: Missing Authorization / Sensitive Information Exposure
- Plugin: Activity Log for WordPress (winterlock)
- Affected Versions: <= 1.2.8
- Vulnerable Function:
winter_activity_log_action() - File Path:
winter-activity-log.php(inferred) orincludes/class-winter-activity-log-admin.php(inferred) - Description: The function
winter_activity_log_action()handles requests to retrieve or download activity log files. It fails to verify if the requesting user has administrative capabilities (e.g.,manage_options) and does not properly restrict access to the file download/viewing mechanism, allowing any authenticated user (Subscriber+) to read the logs.
2. Attack Vector Analysis
- Endpoint:
/wp-admin/admin-ajax.php - Action:
winter_activity_log_action - HTTP Method: POST or GET (usually POST for AJAX)
- Parameters:
action:winter_activity_log_actionwinter_activity_log_nonce: (The nonce name, inferred from standard plugin naming)method: Likely used to specify the operation, e.g.,download_logorview_log(inferred).
- Authentication: Subscriber-level credentials.
- Preconditions: The plugin must have generated at least one log file.
3. Code Flow (Inferred)
- Registration: The plugin registers the AJAX action:
add_action( 'wp_ajax_winter_activity_log_action', 'winter_activity_log_action' ); - Execution: When a Subscriber calls this action,
winter_activity_log_action()is executed. - Missing Check: The function likely checks a nonce but fails to call
current_user_can( 'manage_options' ). - Log Access: The function identifies the path to the log file (often stored in
wp-content/uploads/winter-logs/or similar) and either:- Outputs the file content directly using
readfile(). - Returns a direct URL to the log file which is otherwise protected by
.htaccessbut accessible via the PHP script.
- Outputs the file content directly using
- Sensitive Data: The logs contain details of user logins, profile updates, and settings changes. If the plugin logs the
$_POSTarray during these events, it may include passwords.
4. Nonce Acquisition Strategy
The plugin likely localizes a nonce for the admin dashboard. Since Subscribers can access wp-admin/profile.php or the dashboard, they can retrieve it.
- Identify Shortcode/Page: Check if the plugin enqueues scripts on all admin pages.
- Navigation: Log in as a Subscriber and navigate to
/wp-admin/index.php. - Extraction:
- Look for
wp_localize_scriptoutput in the HTML source. - Common variable names:
winterlock_params,winter_activity_log_obj. - JS Command:
browser_eval("window.winterlock_params?.nonce")orbrowser_eval("window.winter_activity_log_obj?.nonce").
- Look for
5. Exploitation Strategy
Step 1: Authentication
Login as a Subscriber user using the http_request tool to obtain session cookies.
Step 2: Nonce Extraction
Navigate to the WordPress dashboard and extract the nonce using browser_eval.
Step 3: Trigger Log Exposure
Send an AJAX request to retrieve the log content.
Request Template:
- URL:
http://localhost:8080/wp-admin/admin-ajax.php - Method:
POST - Headers:
Content-Type: application/x-www-form-urlencoded - Body:
(Note: The parameteraction=winter_activity_log_action&winter_activity_log_nonce=[NONCE]&method=download_logmethodand its valuedownload_logare inferred based on common patterns; the agent should check the source for the exact parameter name likelog_actionorsub_action.)
Step 4: Parse Sensitive Data
Inspect the response body. Look for logged entries related to user logins or profile updates.
Example log format: [Date] [User] [Action] [Data: {"user_pass": "..."}]
6. Test Data Setup
- Install Plugin: Activity Log for WordPress <= 1.2.8.
- Create Users:
- Administrator:
admin_user/admin_password123 - Subscriber:
sub_user/sub_password123
- Administrator:
- Generate Activity:
- As Administrator, go to "Settings" and change a value.
- As Administrator, create a new user or update your own profile. This ensures the log file is populated with "sensitive" data.
- Plugin Config: Ensure "Log POST Data" or similar is enabled if the plugin offers it, as this is the primary source of the "password" exposure mentioned in the description.
7. Expected Results
- The
admin-ajax.phprequest returns a200 OKstatus. - The response body contains the raw contents of an activity log file.
- The log file contains details of actions performed by the Administrator, which should be invisible to a Subscriber.
8. Verification Steps
- Verify via WP-CLI:
- Check that the file exists on disk:
wp eval "echo get_upload_iframe_src('winter-logs');"(Path discovery). - Compare the content received via the AJAX exploit with the content on disk:
cat /var/www/html/wp-content/uploads/winter-logs/activity.log.
- Check that the file exists on disk:
- Confirm Lack of Auth:
- Search the plugin code for the AJAX handler:
grep -r "winter_activity_log_action" . - Confirm the absence of
current_user_canwithin the function body.
- Search the plugin code for the AJAX handler:
9. Alternative Approaches
- Direct Path Traversal: If the
methodparameter takes a filename, check for path traversal (e.g.,../../../../wp-config.php). - Log Export Action: If there is a "Export to CSV" feature, it might use a different action like
winter_activity_log_export. - Frontend Exposure: Check if the plugin registers
wp_ajax_nopriv_winter_activity_log_action, which would upgrade this to an Unauthenticated Information Exposure (though the CVE states Subscriber+).
Summary
The Activity Log for WordPress plugin fails to perform a capability check in its winter_activity_log_action() AJAX handler, which allows authenticated users with Subscriber-level access to download or view activity logs. These logs can contain sensitive information, including user activity details and potentially administrative passwords captured during profile updates or settings changes.
Vulnerable Code
// File: winter-activity-log.php (or includes/class-winter-activity-log-admin.php) // The plugin registers the AJAX action for authenticated users without checking capabilities add_action( 'wp_ajax_winter_activity_log_action', 'winter_activity_log_action' ); function winter_activity_log_action() { // A nonce check is likely present, but it does not restrict access by user role if ( ! isset( $_POST['winter_activity_log_nonce'] ) || ! wp_verify_nonce( $_POST['winter_activity_log_nonce'], 'winter_activity_log_action' ) ) { wp_die( 'Security check failed' ); } // Missing: if ( ! current_user_can( 'manage_options' ) ) { wp_die(); } $method = isset( $_POST['method'] ) ? sanitize_text_field( $_POST['method'] ) : ''; if ( $method === 'download_log' ) { $log_file = WINTERLOCK_LOG_DIR . '/activity.log'; if ( file_exists( $log_file ) ) { header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="'.basename($log_file).'"'); readfile( $log_file ); exit; } } }
Security Fix
@@ -10,6 +10,10 @@ function winter_activity_log_action() { check_ajax_referer( 'winter_activity_log_nonce', 'security' ); + if ( ! current_user_can( 'manage_options' ) ) { + wp_die( __( 'You do not have sufficient permissions to access this page.' ) ); + } + $method = isset( $_POST['method'] ) ? sanitize_text_field( $_POST['method'] ) : ''; if ( $method === 'download_log' ) {
Exploit Outline
To exploit this vulnerability, an attacker must first authenticate as a Subscriber. They then navigate to any administrative page (e.g., /wp-admin/profile.php) to extract the security nonce (usually named 'winter_activity_log_nonce' or found within 'winterlock_params') from the page source. Using this nonce, the attacker sends a POST request to /wp-admin/admin-ajax.php with the parameters 'action=winter_activity_log_action', the extracted nonce, and 'method=download_log'. If successful, the server responds with the contents of the activity log file, which may reveal sensitive administrative data.
Check if your site is affected.
Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.