Analysis Report Folder Analysis cache/wp-simple-firewall_21.0.9 → cache/wp-simple-firewall_21.0.10 - CVE-2025-15370

Shared security patch analysis results

AI Used: claude_cli haiku
Share this analysis
CVE Security Analysis & Writeups

Comprehensive security analysis generated by AI for each confirmed CVE match. Click on a CVE to view the detailed writeup including vulnerability background, technical details, patch analysis, and PoC guide.

CVE-2025-15370
AI-Generated Analysis
Use quotes for exact: \"SQL injection\" | Operators: hello AND bye, admin OR root, -error, NOT warning
Showing 0 to 0 of 0 results
icwp-wpsf.php AI: No vulnerabilities
--- cache/wp-simple-firewall_21.0.9/icwp-wpsf.php	2026-01-16 00:19:52.695170285 +0000+++ cache/wp-simple-firewall_21.0.10/icwp-wpsf.php	2026-01-16 00:20:17.640737252 +0000@@ -3,7 +3,7 @@  * Plugin Name: Shield Security  * Plugin URI: https://clk.shldscrty.com/2f  * Description: Powerful, Easy-To-Use #1 Rated WordPress Security System- * Version: 21.0.9+ * Version: 21.0.10  * Text Domain: wp-simple-firewall  * Domain Path: /languages  * Author: Shield Security
AI Analysis
```
Vulnerability Existed: no
No vulnerabilities detected - Version Bump Only
File: icwp-wpsf.php [Line 6]

Old Code:
* Version: 21.0.9

Fixed Code:
* Version: 21.0.10

Explanation:
This diff contains only a version number increment in the plugin header metadata. There are no code changes, logic modifications, or security-related patches in this diff. Version bumps alone do not constitute security fixes or introduce vulnerabilities. This is a routine version update with no security implications.
```
CVE Analysis Results:
CVE-2025-15370: No
View CVE Description
The Shield: Blocks Bots, Protects Users, and Prevents Security Breaches plugin for WordPress is vulnerable to Insecure Direct Object Reference in all versions up to, and including, 21.0.9 via the MfaGoogleAuthToggle class due to missing validation on a user controlled key. This makes it possible for authenticated attackers, with Subscriber-level access and above, to disable Google Authenticator for any user.
src/lib/functions/functions.php AI: No vulnerabilities
--- cache/wp-simple-firewall_21.0.9/src/lib/functions/functions.php	2026-01-16 00:19:52.727172297 +0000+++ cache/wp-simple-firewall_21.0.10/src/lib/functions/functions.php	2026-01-16 00:20:17.704741271 +0000@@ -1,39 +1,39 @@-<?php declare( strict_types=1 );
-
-use FernleafSystems\Wordpress\Plugin\Shield\Functions;
-
-if ( \function_exists( 'shield_security_get_plugin' ) ) {
-	return;
-}
-
-function shield_security_get_plugin() :ICWP_WPSF_Shield_Security {
-	return Functions\get_plugin();
-}
-
-function shield_get_visitor_scores( $IP = null ) :array {
-	return Functions\get_visitor_scores( $IP );
-}
-
-function shield_get_visitor_score( $IP = null ) :int {
-	return Functions\get_visitor_score( $IP );
-}
-
-/**
- * @param null $IP - defaults to current visitor
- * @throws \Exception
- */
-function shield_test_ip_is_bot( $IP = null ) :bool {
-	return Functions\test_ip_is_bot( $IP );
-}
-
-function shield_get_ip_state( string $ip = '' ) :string {
-	return Functions\get_ip_state( $ip );
-}
-
-function shield_fire_event( string $event ) {
-	Functions\fire_event( $event );
-}
-
-function shield_start_scans( array $scans ) {
-	Functions\start_scans( $scans );
+<?php declare( strict_types=1 );++use FernleafSystems\Wordpress\Plugin\Shield\Functions;++if ( \function_exists( 'shield_security_get_plugin' ) ) {+	return;+}++function shield_security_get_plugin() :ICWP_WPSF_Shield_Security {+	return Functions\get_plugin();+}++function shield_get_visitor_scores( $IP = null ) :array {+	return Functions\get_visitor_scores( $IP );+}++function shield_get_visitor_score( $IP = null ) :int {+	return Functions\get_visitor_score( $IP );+}++/**+ * @param null $IP - defaults to current visitor+ * @throws \Exception+ */+function shield_test_ip_is_bot( $IP = null ) :bool {+	return Functions\test_ip_is_bot( $IP );+}++function shield_get_ip_state( string $ip = '' ) :string {+	return Functions\get_ip_state( $ip );+}++function shield_fire_event( string $event ) {+	Functions\fire_event( $event );+}++function shield_start_scans( array $scans ) {+	Functions\start_scans( $scans ); }\ No newline at end of file
AI Analysis
Vulnerability Existed: no

Explanation:
This diff shows only line ending changes (CRLF to LF conversion) with no modifications to the actual code logic, function signatures, or security-sensitive operations. All functions remain identical in their implementation:

- Function signatures and return types are unchanged
- No input validation, sanitization, or security checks were added or removed
- No potentially vulnerable code patterns are present in either version
- The functions are simple wrappers that delegate to the `Functions` namespace

The line ending normalization is a code style/formatting change with no security implications. There are no vulnerabilities in the old code that were fixed, nor are any new vulnerabilities introduced.
CVE Analysis Results:
CVE-2025-15370: No
View CVE Description
The Shield: Blocks Bots, Protects Users, and Prevents Security Breaches plugin for WordPress is vulnerable to Insecure Direct Object Reference in all versions up to, and including, 21.0.9 via the MfaGoogleAuthToggle class due to missing validation on a user controlled key. This makes it possible for authenticated attackers, with Subscriber-level access and above, to disable Google Authenticator for any user.
src/lib/src/ActionRouter/Actions/BaseAction.php AI: No vulnerabilities
--- cache/wp-simple-firewall_21.0.9/src/lib/src/ActionRouter/Actions/BaseAction.php	2026-01-16 00:19:52.727172297 +0000+++ cache/wp-simple-firewall_21.0.10/src/lib/src/ActionRouter/Actions/BaseAction.php	2026-01-16 00:20:17.704741271 +0000@@ -154,14 +154,10 @@ 	 * @return self For method chaining 	 */ 	public function setActionOverride( string $overrideKey, $value ) :self {-		// Initialize action_overrides array if it doesn't exist-		if ( !isset( $this->action_data[ 'action_overrides' ] ) ) {-			$this->action_data[ 'action_overrides' ] = [];-		}--		// Set the override value-		$this->action_data[ 'action_overrides' ][ $overrideKey ] = $value;-+		$this->action_data[ 'action_overrides' ] = \array_merge(+			\is_array( $this->action_data[ 'action_overrides' ] ?? null ) ? $this->action_data[ 'action_overrides' ] : [],+			[ $overrideKey => $value ]+		); 		return $this; 	} 
AI Analysis
Vulnerability Existed: no
No CWE violation identified - Code refactoring without security impact
- File: src/lib/src/ActionRouter/Actions/BaseAction.php
- Lines: 157-165

Old Code:
```php
// Initialize action_overrides array if it doesn't exist
if ( !isset( $this->action_data[ 'action_overrides' ] ) ) {
    $this->action_data[ 'action_overrides' ] = [];
}

// Set the override value
$this->action_data[ 'action_overrides' ][ $overrideKey ] = $value;
```

Fixed Code:
```php
$this->action_data[ 'action_overrides' ] = \array_merge(
    \is_array( $this->action_data[ 'action_overrides' ] ?? null ) ? $this->action_data[ 'action_overrides' ] : [],
    [ $overrideKey => $value ]
);
```

Explanation:
This change is a code refactoring that improves robustness but does not address or introduce a security vulnerability. The old code used conditional initialization followed by direct assignment. The new code uses `array_merge()` with a null coalescing operator and type check to accomplish the same result more safely.

From a security perspective:
- Both implementations perform the same logical operation: storing a key-value pair in an array
- No input validation is performed in either version (the `$overrideKey` and `$value` parameters are not validated or sanitized)
- The new version is actually slightly more defensive by checking if the existing array is actually an array before merging
- Neither version introduces or fixes CWE-78 (OS Command Injection), CWE-89 (SQL Injection), CWE-79 (Cross-site Scripting), or other OWASP top vulnerabilities

This is a safe refactoring that maintains security posture while improving code clarity and handling edge cases more defensively.
CVE Analysis Results:
CVE-2025-15370: No
View CVE Description
The Shield: Blocks Bots, Protects Users, and Prevents Security Breaches plugin for WordPress is vulnerable to Insecure Direct Object Reference in all versions up to, and including, 21.0.9 via the MfaGoogleAuthToggle class due to missing validation on a user controlled key. This makes it possible for authenticated attackers, with Subscriber-level access and above, to disable Google Authenticator for any user.
src/lib/src/ActionRouter/Actions/MfaLoginFlowBase.php AI: No vulnerabilities
--- /dev/null+++ cache/wp-simple-firewall_21.0.10/src/lib/src/ActionRouter/Actions/MfaLoginFlowBase.php@@ -0,0 +1,20 @@+<?php declare( strict_types=1 );++namespace FernleafSystems\Wordpress\Plugin\Shield\ActionRouter\Actions;++use FernleafSystems\Wordpress\Plugin\Shield\ActionRouter\Actions\Traits\AuthNotRequired;+use FernleafSystems\Wordpress\Plugin\Shield\ActionRouter\Actions\Traits\LoginWpUserConsumer;++/**+ * Base class for MFA actions that run during the login flow.+ *+ * These actions:+ * - Do NOT require authentication (user is in the middle of logging in)+ * - REQUIRE a valid login_nonce tied to the target user+ * - Use login_wp_user parameter with login_nonce validation+ */+abstract class MfaLoginFlowBase extends BaseAction {++	use AuthNotRequired;+	use LoginWpUserConsumer;+}
AI Analysis
Let me analyze the provided diff for security vulnerabilities.

Based on the code diff provided, here is my security analysis:

---

**Vulnerability Analysis for MfaLoginFlowBase.php**

Vulnerability Existed: **no**

**CWE-434 (Unrestricted Upload of File with Dangerous Type) / CWE-639 (Authorization Bypass Through User-Controlled Key) - File: src/lib/src/ActionRouter/Actions/MfaLoginFlowBase.php - Lines 1-20**

Old Code: N/A (new file)

Fixed Code:
```php
<?php declare( strict_types=1 );

namespace FernleafSystems\Wordpress\Plugin\Shield\ActionRouter\Actions;

use FernleafSystems\Wordpress\Plugin\Shield\ActionRouter\Actions\Traits\AuthNotRequired;
use FernleafSystems\Wordpress\Plugin\Shield\ActionRouter\Actions\Traits\LoginWpUserConsumer;

abstract class MfaLoginFlowBase extends BaseAction {
	use AuthNotRequired;
	use LoginWpUserConsumer;
}
```

Explanation:
This is a new base class for MFA login flow actions. The code appears to be a **security improvement** rather than a vulnerability fix. The class properly:
1. Uses strict type declarations (`declare(strict_types=1)`)
2. Implements proper trait usage for authentication and user handling
3. Explicitly documents that it does NOT require authentication (appropriate for login flow)
4. Notes that it REQUIRES valid `login_nonce` validation tied to the target user
5. Uses a dedicated trait (`LoginWpUserConsumer`) for user parameter handling with nonce validation

**No vulnerabilities exist** in this new code. This represents a **secure implementation pattern** for MFA actions during the login flow, with proper separation of concerns through traits and explicit documentation of security requirements.

---
CVE Analysis Results:
CVE-2025-15370: No
View CVE Description
The Shield: Blocks Bots, Protects Users, and Prevents Security Breaches plugin for WordPress is vulnerable to Insecure Direct Object Reference in all versions up to, and including, 21.0.9 via the MfaGoogleAuthToggle class due to missing validation on a user controlled key. This makes it possible for authenticated attackers, with Subscriber-level access and above, to disable Google Authenticator for any user.
src/lib/src/ActionRouter/Actions/MfaPasskeyAuthenticationStart.php AI: 2 vulnerabilities 2 false positives
--- cache/wp-simple-firewall_21.0.9/src/lib/src/ActionRouter/Actions/MfaPasskeyAuthenticationStart.php	2026-01-16 00:19:52.731172548 +0000+++ cache/wp-simple-firewall_21.0.10/src/lib/src/ActionRouter/Actions/MfaPasskeyAuthenticationStart.php	2026-01-16 00:20:17.704741271 +0000@@ -2,27 +2,22 @@  namespace FernleafSystems\Wordpress\Plugin\Shield\ActionRouter\Actions; -use FernleafSystems\Wordpress\Plugin\Shield\ActionRouter\Actions\Traits\AuthNotRequired;+use FernleafSystems\Wordpress\Plugin\Shield\ActionRouter\Exceptions\ActionException; use FernleafSystems\Wordpress\Plugin\Shield\Modules\LoginGuard\Lib\TwoFactor\Provider\Passkey; -class MfaPasskeyAuthenticationStart extends MfaUserConfigBase {--	use AuthNotRequired;+class MfaPasskeyAuthenticationStart extends MfaLoginFlowBase {  	public const SLUG = 'mfa_passkey_auth_start';  	protected function exec() {- 		$response = [ 			'success'     => false, 			'page_reload' => false 		]; -		$user = $this->getActiveWPUser();-		if ( empty( $user ) ) {-			$response[ 'message' ] = __( 'User must be logged-in.', 'wp-simple-firewall' );-		}-		else {+		try {+			$user = $this->getLoginWPUser();+ 			$available = self::con()->comps->mfa->getProvidersAvailableToUser( $user ); 			/** @var Passkey $provider */ 			$provider = $available[ Passkey::ProviderSlug() ] ?? null;@@ -31,19 +26,27 @@ 				$response[ 'message' ] = __( "Passkeys aren't available for this user.", 'wp-simple-firewall' ); 			} 			else {-				try {-					$response = [-						'success'     => true,-						'challenge'   => $provider->startNewAuth(),-						'page_reload' => false-					];-				}-				catch ( \Exception $e ) {-					$response[ 'message' ] = __( "There was a problem preparing the Passkey Auth Challenge.", 'wp-simple-firewall' );-				}+				$response = [+					'success'     => true,+					'challenge'   => $provider->startNewAuth(),+					'page_reload' => false+				]; 			} 		}+		catch ( ActionException $e ) {+			$response[ 'message' ] = $e->getMessage();+		}+		catch ( \Exception $e ) {+			$response[ 'message' ] = __( 'There was a problem preparing the Passkey Auth Challenge.', 'wp-simple-firewall' );+		}  		$this->response()->action_response_data = $response; 	}++	protected function getRequiredDataKeys() :array {+		return [+			'login_wp_user',+			'login_nonce',+		];+	} }\ No newline at end of file
AI Analysis
I'll analyze this code diff for security vulnerabilities.

Vulnerability Existed: yes
FALSE POSITIVE
**Authentication Bypass / Broken Access Control - CWE-287** - src/lib/src/ActionRouter/Actions/MfaPasskeyAuthenticationStart.php - Lines 2-10

Old Code:
```php
use FernleafSystems\Wordpress\Plugin\Shield\ActionRouter\Actions\Traits\AuthNotRequired;

class MfaPasskeyAuthenticationStart extends MfaUserConfigBase {
	use AuthNotRequired;
```

Fixed Code:
```php
use FernleafSystems\Wordpress\Plugin\Shield\ActionRouter\Exceptions\ActionException;

class MfaPasskeyAuthenticationStart extends MfaLoginFlowBase {
```

Explanation:
The old code used the `AuthNotRequired` trait on a class extending `MfaUserConfigBase`, which would allow unauthenticated access to MFA passkey authentication start functionality. The fix changes the inheritance to `MfaLoginFlowBase` and removes the `AuthNotRequired` trait, requiring proper authentication. This is further reinforced by the addition of required data keys validation (`getRequiredDataKeys()` method) that enforces `login_wp_user` and `login_nonce` parameters.

---

Vulnerability Existed: yes
FALSE POSITIVE
**Insufficient Input Validation - CWE-20** - src/lib/src/ActionRouter/Actions/MfaPasskeyAuthenticationStart.php - Lines 17-22

Old Code:
```php
$user = $this->getActiveWPUser();
if ( empty( $user ) ) {
	$response[ 'message' ] = __( 'User must be logged-in.', 'wp-simple-firewall' );
}
else {
```

Fixed Code:
```php
try {
	$user = $this->getLoginWPUser();
```

Explanation:
The old code called `getActiveWPUser()` with a simple empty check. The fixed code uses `getLoginWPUser()` within a try-catch block that catches `ActionException`, indicating that `getLoginWPUser()` performs more rigorous validation (likely verifying login nonce and user credentials). This prevents potential injection or spoofing of the user object by enforcing stricter validation through the parent class's authentication mechanisms.
CVE Analysis Results:
CVE-2025-15370: No
View CVE Description
The Shield: Blocks Bots, Protects Users, and Prevents Security Breaches plugin for WordPress is vulnerable to Insecure Direct Object Reference in all versions up to, and including, 21.0.9 via the MfaGoogleAuthToggle class due to missing validation on a user controlled key. This makes it possible for authenticated attackers, with Subscriber-level access and above, to disable Google Authenticator for any user.
src/lib/src/ActionRouter/Actions/MfaPasskeyAuthenticationVerify.php AI: 1 vulnerabilities 1 false positive
--- cache/wp-simple-firewall_21.0.9/src/lib/src/ActionRouter/Actions/MfaPasskeyAuthenticationVerify.php	2026-01-16 00:19:52.731172548 +0000+++ cache/wp-simple-firewall_21.0.10/src/lib/src/ActionRouter/Actions/MfaPasskeyAuthenticationVerify.php	2026-01-16 00:20:17.704741271 +0000@@ -8,14 +8,14 @@ /**  * Not currently used  */-class MfaPasskeyAuthenticationVerify extends MfaUserConfigBase {+class MfaPasskeyAuthenticationVerify extends MfaLoginFlowBase {  	use AuthNotRequired;  	public const SLUG = 'mfa_passkey_auth_verify';  	protected function exec() {-		$available = self::con()->comps->mfa->getProvidersAvailableToUser( $this->getActiveWPUser() );+		$available = self::con()->comps->mfa->getProvidersAvailableToUser( $this->getLoginWPUser() ); 		/** @var Passkey $provider */ 		$provider = $available[ Passkey::ProviderSlug() ]; 
AI Analysis
I'll analyze this code diff for security vulnerabilities.

```
Vulnerability Existed: yes
FALSE POSITIVE
Incorrect User Context Access - CWE-863 - src/lib/src/ActionRouter/Actions/MfaPasskeyAuthenticationVerify.php Lines 10-18

Old Code:
class MfaPasskeyAuthenticationVerify extends MfaUserConfigBase {
    ...
    protected function exec() {
        $available = self::con()->comps->mfa->getProvidersAvailableToUser( $this->getActiveWPUser() );

Fixed Code:
class MfaPasskeyAuthenticationVerify extends MfaLoginFlowBase {
    ...
    protected function exec() {
        $available = self::con()->comps->mfa->getProvidersAvailableToUser( $this->getLoginWPUser() );

Explanation:
This fix addresses an authorization vulnerability (CWE-863: Improper Authorization) in the MFA passkey authentication verification flow. The original code inherited from MfaUserConfigBase and called getActiveWPUser(), which retrieves the currently authenticated user. However, during the login/MFA verification flow, this is incorrect - the code should be checking the user attempting to log in (getLoginWPUser()), not the currently active user. By changing the parent class to MfaLoginFlowBase and using getLoginWPUser(), the fix ensures that MFA verification checks are performed against the correct user context. This prevents potential privilege escalation or authentication bypass where an authenticated user could verify MFA for another user's login attempt.
```
CVE Analysis Results:
CVE-2025-15370: No
View CVE Description
The Shield: Blocks Bots, Protects Users, and Prevents Security Breaches plugin for WordPress is vulnerable to Insecure Direct Object Reference in all versions up to, and including, 21.0.9 via the MfaGoogleAuthToggle class due to missing validation on a user controlled key. This makes it possible for authenticated attackers, with Subscriber-level access and above, to disable Google Authenticator for any user.
src/lib/src/ActionRouter/Actions/Render/Components/IpAnalyse/Base.php AI: No vulnerabilities
--- cache/wp-simple-firewall_21.0.9/src/lib/src/ActionRouter/Actions/Render/Components/IpAnalyse/Base.php	2026-01-16 00:19:52.735172799 +0000+++ cache/wp-simple-firewall_21.0.10/src/lib/src/ActionRouter/Actions/Render/Components/IpAnalyse/Base.php	2026-01-16 00:20:17.720742276 +0000@@ -9,9 +9,7 @@ class Base extends Render\BaseRender {  	protected function getRequiredDataKeys() :array {-		return [-			'ip'-		];+		return [ 'ip' ]; 	}  	protected function getTimeAgo( int $ts ) :string {
AI Analysis
Vulnerability Existed: no
No Vulnerability Detected - Code Formatting Change - src/lib/src/ActionRouter/Actions/Render/Components/IpAnalyse/Base.php - Lines 12-14

Old Code:
```php
return [
    'ip'
];
```

Fixed Code:
```php
return [ 'ip' ];
```

Explanation:
This diff represents a code formatting change only. The array is being condensed from a multi-line format to a single-line format. There is no change to the functionality, logic, or security posture of the code. The return statement still returns an array with the same 'ip' key, and there are no modifications to how data is validated, sanitized, or processed. No security vulnerability has been introduced or fixed in this change.
CVE Analysis Results:
CVE-2025-15370: No
View CVE Description
The Shield: Blocks Bots, Protects Users, and Prevents Security Breaches plugin for WordPress is vulnerable to Insecure Direct Object Reference in all versions up to, and including, 21.0.9 via the MfaGoogleAuthToggle class due to missing validation on a user controlled key. This makes it possible for authenticated attackers, with Subscriber-level access and above, to disable Google Authenticator for any user.
src/lib/src/ActionRouter/Actions/Render/Components/Scans/ItemAnalysis/BaseComponent.php AI: No vulnerabilities
--- /dev/null+++ cache/wp-simple-firewall_21.0.10/src/lib/src/ActionRouter/Actions/Render/Components/Scans/ItemAnalysis/BaseComponent.php@@ -0,0 +1,17 @@+<?php declare( strict_types=1 );++namespace FernleafSystems\Wordpress\Plugin\Shield\ActionRouter\Actions\Render\Components\Scans\ItemAnalysis;++use FernleafSystems\Wordpress\Plugin\Shield\ActionRouter\Actions\Render\Components\Scans\BaseScans;+use FernleafSystems\Wordpress\Plugin\Shield\Scans\Afs\ResultItem;++abstract class BaseComponent extends BaseScans {++	protected function getScanItem() :ResultItem {+		return $this->action_data[ 'scan_item' ];+	}++	protected function getRequiredDataKeys() :array {+		return [ 'scan_item' ];+	}+}
AI Analysis
I'll analyze this code diff for security vulnerabilities.

Vulnerability Existed: no

**No CWE-Applicable Vulnerabilities Identified**

Old Code:
File did not exist (new file)

Fixed Code:
```php
<?php declare( strict_types=1 );

namespace FernleafSystems\Wordpress\Plugin\Shield\ActionRouter\Actions\Render\Components\Scans\ItemAnalysis;

use FernleafSystems\Wordpress\Plugin\Shield\ActionRouter\Actions\Render\Components\Scans\BaseScans;
use FernleafSystems\Wordpress\Plugin\Shield\Scans\Afs\ResultItem;

abstract class BaseComponent extends BaseScans {

	protected function getScanItem() :ResultItem {
		return $this->action_data[ 'scan_item' ];
	}

	protected function getRequiredDataKeys() :array {
		return [ 'scan_item' ];
	}
}
```

Explanation:
This is a new abstract base class that serves as a component for rendering scan item analysis. The code does not introduce security vulnerabilities:

1. **Type Safety**: Uses strict types declaration (`declare(strict_types=1)`) and return type hints, which provides type safety.
2. **Access Control**: Methods are protected, restricting access appropriately within the inheritance hierarchy.
3. **Data Validation**: The `getRequiredDataKeys()` method enforces that required data keys must be present (inherited validation from parent class `BaseScans`).
4. **No Dynamic Execution**: No eval, shell execution, or dynamic code execution.
5. **No Data Exposure**: No direct output of unsanitized data; data is returned as a typed object (`ResultItem`).
6. **Inheritance Pattern**: Properly extends a base class, following the established architecture pattern.

The code follows secure coding practices typical of a WordPress security plugin's internal architecture.
CVE Analysis Results:
CVE-2025-15370: No
View CVE Description
The Shield: Blocks Bots, Protects Users, and Prevents Security Breaches plugin for WordPress is vulnerable to Insecure Direct Object Reference in all versions up to, and including, 21.0.9 via the MfaGoogleAuthToggle class due to missing validation on a user controlled key. This makes it possible for authenticated attackers, with Subscriber-level access and above, to disable Google Authenticator for any user.
src/lib/src/ActionRouter/Actions/Render/Components/Scans/ItemAnalysis/Container.php AI: 1 vulnerabilities 1 false positive
--- cache/wp-simple-firewall_21.0.9/src/lib/src/ActionRouter/Actions/Render/Components/Scans/ItemAnalysis/Container.php	2026-01-16 00:19:52.739173051 +0000+++ cache/wp-simple-firewall_21.0.10/src/lib/src/ActionRouter/Actions/Render/Components/Scans/ItemAnalysis/Container.php	2026-01-16 00:20:17.728742778 +0000@@ -2,16 +2,31 @@  namespace FernleafSystems\Wordpress\Plugin\Shield\ActionRouter\Actions\Render\Components\Scans\ItemAnalysis; +use FernleafSystems\Wordpress\Plugin\Shield\ActionRouter\Actions\Render\Components\Scans\BaseScans;+use FernleafSystems\Wordpress\Plugin\Shield\ActionRouter\Exceptions\ActionException;+use FernleafSystems\Wordpress\Plugin\Shield\Modules\HackGuard\Scan\Results\Retrieve\RetrieveItems;+use FernleafSystems\Wordpress\Plugin\Shield\Scans\Afs\ResultItem; use FernleafSystems\Wordpress\Services\Services; -class Container extends Base {+class Container extends BaseScans {  	public const SLUG = 'scanitemanalysis_container'; 	public const TEMPLATE = '/wpadmin_pages/insights/scans/modal/scan_item_analysis/modal_content.twig';  	protected function getRenderData() :array { 		$con = self::con();-		$item = $this->getScanItem();+		try {+			/** @var ResultItem $item */+			$item = ( new RetrieveItems() )->byID( (int)$this->action_data[ 'rid' ] );+		}+		catch ( \Exception $e ) {+			throw new ActionException( 'Not a valid scan item record' );+		}++		$fragment = $item->path_fragment;+		if ( empty( $fragment ) ) {+			throw new ActionException( 'Non-file scan items are not supported yet.' );+		}  		$fullPath = empty( $item->path_full ) ? path_join( ABSPATH, $item->path_fragment ) : $item->path_full; 		return [@@ -55,4 +70,10 @@ 			], 		]; 	}++	protected function getRequiredDataKeys() :array {+		return [+			'rid'+		];+	} }\ No newline at end of file
AI Analysis
```
Vulnerability Existed: yes
FALSE POSITIVE
Path Traversal / Arbitrary File Access - CWE-22 - src/lib/src/ActionRouter/Actions/Render/Components/Scans/ItemAnalysis/Container.php (Lines 18-28, 33)

Old Code:
$item = $this->getScanItem();
$fullPath = empty( $item->path_full ) ? path_join( ABSPATH, $item->path_fragment ) : $item->path_full;

Fixed Code:
try {
    /** @var ResultItem $item */
    $item = ( new RetrieveItems() )->byID( (int)$this->action_data[ 'rid' ] );
}
catch ( \Exception $e ) {
    throw new ActionException( 'Not a valid scan item record' );
}

$fragment = $item->path_fragment;
if ( empty( $fragment ) ) {
    throw new ActionException( 'Non-file scan items are not supported yet.' );
}

$fullPath = empty( $item->path_full ) ? path_join( ABSPATH, $item->path_fragment ) : $item->path_full;

Explanation:
The old code retrieved a scan item using `$this->getScanItem()` without explicit validation that the item ID came from trusted input. The fixed code addresses this by:
1. Explicitly validating the scan item ID via `RetrieveItems()->byID()` which performs database validation
2. Adding exception handling to ensure only valid scan item records are processed
3. Adding a check to ensure the path_fragment is not empty before processing
4. Adding `getRequiredDataKeys()` method to explicitly declare 'rid' as a required input parameter

This prevents unauthorized access to arbitrary file paths by ensuring the requested scan item actually exists in the database and has the expected structure before path construction.
```
CVE Analysis Results:
CVE-2025-15370: No
View CVE Description
The Shield: Blocks Bots, Protects Users, and Prevents Security Breaches plugin for WordPress is vulnerable to Insecure Direct Object Reference in all versions up to, and including, 21.0.9 via the MfaGoogleAuthToggle class due to missing validation on a user controlled key. This makes it possible for authenticated attackers, with Subscriber-level access and above, to disable Google Authenticator for any user.
src/lib/src/ActionRouter/Actions/Render/Components/Scans/ItemAnalysis/Content.php AI: No vulnerabilities
--- cache/wp-simple-firewall_21.0.9/src/lib/src/ActionRouter/Actions/Render/Components/Scans/ItemAnalysis/Content.php	2026-01-16 00:19:52.739173051 +0000+++ cache/wp-simple-firewall_21.0.10/src/lib/src/ActionRouter/Actions/Render/Components/Scans/ItemAnalysis/Content.php	2026-01-16 00:20:17.728742778 +0000@@ -6,7 +6,7 @@ use FernleafSystems\Wordpress\Services\Services; use FernleafSystems\Wordpress\Services\Utilities\File\ConvertLineEndings; -class Content extends Base {+class Content extends BaseComponent {  	public const SLUG = 'scanitemanalysis_content'; 	public const TEMPLATE = '/wpadmin_pages/insights/scans/modal/scan_item_analysis/file_content.twig';
AI Analysis
I'll analyze this code diff for security vulnerabilities.

**Analysis Result:**

Vulnerability Existed: no

This diff shows a class inheritance change from `Base` to `BaseComponent` in a PHP file. This is a refactoring change that updates the parent class being extended.

**Security Assessment:**

This change does not introduce, fix, or relate to any security vulnerabilities. It is purely a structural/architectural refactoring:

- The change simply updates which parent class `Content` inherits from
- No security-relevant code is added, removed, or modified
- No authentication, authorization, input validation, output encoding, or other security mechanisms are affected
- This appears to be a class hierarchy reorganization, possibly part of a larger refactoring effort

**Conclusion:**

No security vulnerabilities exist in this diff. This is a benign refactoring change with no security implications.
CVE Analysis Results:
CVE-2025-15370: No
View CVE Description
The Shield: Blocks Bots, Protects Users, and Prevents Security Breaches plugin for WordPress is vulnerable to Insecure Direct Object Reference in all versions up to, and including, 21.0.9 via the MfaGoogleAuthToggle class due to missing validation on a user controlled key. This makes it possible for authenticated attackers, with Subscriber-level access and above, to disable Google Authenticator for any user.
src/lib/src/ActionRouter/Actions/Render/Components/Scans/ItemAnalysis/Diff.php AI: No vulnerabilities
--- cache/wp-simple-firewall_21.0.9/src/lib/src/ActionRouter/Actions/Render/Components/Scans/ItemAnalysis/Diff.php	2026-01-16 00:19:52.739173051 +0000+++ cache/wp-simple-firewall_21.0.10/src/lib/src/ActionRouter/Actions/Render/Components/Scans/ItemAnalysis/Diff.php	2026-01-16 00:20:17.728742778 +0000@@ -8,7 +8,7 @@ use FernleafSystems\Wordpress\Services\Utilities\Integrations\WpHashes\Util\Diff as DiffUtil; use FernleafSystems\Wordpress\Services\Utilities\WpOrg; -class Diff extends Base {+class Diff extends BaseComponent {  	public const SLUG = 'scanitemanalysis_diff'; 	public const TEMPLATE = '/wpadmin_pages/insights/scans/modal/scan_item_analysis/file_diff.twig';
AI Analysis
I'll analyze this code diff for security vulnerabilities.

```
Vulnerability Existed: no
No vulnerabilities detected - File: src/lib/src/ActionRouter/Actions/Render/Components/Scans/ItemAnalysis/Diff.php [Line 11]
Old Code:
class Diff extends Base {

Fixed Code:
class Diff extends BaseComponent {

Explanation:
This change is a class inheritance modification, changing the parent class from `Base` to `BaseComponent`. This is a refactoring change that does not introduce or fix any security vulnerabilities. The change simply updates which base class is being extended. There are no changes to:
- Input validation or sanitization
- Output encoding or escaping
- Authentication or authorization logic
- Cryptographic operations
- File operations or path traversal vectors
- Database query handling
- External API calls or data handling

This is a straightforward code organization change with no security implications.
```
CVE Analysis Results:
CVE-2025-15370: No
View CVE Description
The Shield: Blocks Bots, Protects Users, and Prevents Security Breaches plugin for WordPress is vulnerable to Insecure Direct Object Reference in all versions up to, and including, 21.0.9 via the MfaGoogleAuthToggle class due to missing validation on a user controlled key. This makes it possible for authenticated attackers, with Subscriber-level access and above, to disable Google Authenticator for any user.
src/lib/src/ActionRouter/Actions/Render/Components/Scans/ItemAnalysis/History.php AI: No vulnerabilities
--- cache/wp-simple-firewall_21.0.9/src/lib/src/ActionRouter/Actions/Render/Components/Scans/ItemAnalysis/History.php	2026-01-16 00:19:52.739173051 +0000+++ cache/wp-simple-firewall_21.0.10/src/lib/src/ActionRouter/Actions/Render/Components/Scans/ItemAnalysis/History.php	2026-01-16 00:20:17.732743029 +0000@@ -5,7 +5,7 @@ use FernleafSystems\Wordpress\Plugin\Shield\Modules\HackGuard\Scan\Results\Retrieve\RetrieveItems; use FernleafSystems\Wordpress\Services\Services; -class History extends Base {+class History extends BaseComponent {  	public const SLUG = 'scanitemanalysis_history'; 	public const TEMPLATE = '/wpadmin_pages/insights/scans/modal/scan_item_analysis/file_history.twig';
AI Analysis
Vulnerability Existed: no
No Security Vulnerability Identified - Class Inheritance Change
File: src/lib/src/ActionRouter/Actions/Render/Components/Scans/ItemAnalysis/History.php [Line 8]

Old Code:
```php
class History extends Base {
```

Fixed Code:
```php
class History extends BaseComponent {
```

Explanation:
This is a class inheritance change from `Base` to `BaseComponent`. This is a refactoring/code organization change, not a security fix. The change updates which parent class is being extended, which could improve code structure or fix inheritance issues, but does not address any security vulnerabilities. Without visibility into the actual implementations of `Base` and `BaseComponent` classes, there is no indication that either class had security issues or that this change mitigates any known vulnerability. This appears to be a simple maintenance refactor.
CVE Analysis Results:
CVE-2025-15370: No
View CVE Description
The Shield: Blocks Bots, Protects Users, and Prevents Security Breaches plugin for WordPress is vulnerable to Insecure Direct Object Reference in all versions up to, and including, 21.0.9 via the MfaGoogleAuthToggle class due to missing validation on a user controlled key. This makes it possible for authenticated attackers, with Subscriber-level access and above, to disable Google Authenticator for any user.
src/lib/src/ActionRouter/Actions/Render/Components/Scans/ItemAnalysis/Info.php AI: No vulnerabilities
--- cache/wp-simple-firewall_21.0.9/src/lib/src/ActionRouter/Actions/Render/Components/Scans/ItemAnalysis/Info.php	2026-01-16 00:19:52.739173051 +0000+++ cache/wp-simple-firewall_21.0.10/src/lib/src/ActionRouter/Actions/Render/Components/Scans/ItemAnalysis/Info.php	2026-01-16 00:20:17.732743029 +0000@@ -8,7 +8,7 @@ use FernleafSystems\Wordpress\Services\Services; use FernleafSystems\Wordpress\Services\Utilities\WpOrg\Wp\Repo; -class Info extends Base {+class Info extends BaseComponent {  	public const SLUG = 'scanitemanalysis_info'; 	public const TEMPLATE = '/wpadmin_pages/insights/scans/modal/scan_item_analysis/file_info.twig';
AI Analysis
I'll analyze this code diff for security vulnerabilities.

Vulnerability Existed: no

Explanation:
This diff shows a single change: renaming the parent class from `Base` to `BaseComponent` on line 11. This is a refactoring/class inheritance change, not a security fix.

Analysis:
- The change updates the class declaration from `class Info extends Base` to `class Info extends BaseComponent`
- This appears to be a namespace or class hierarchy refactoring
- There are no security-relevant changes in this diff:
  - No input validation modifications
  - No authentication/authorization changes
  - No encryption or cryptographic changes
  - No output encoding modifications
  - No access control changes
  - No injection vulnerability fixes

The diff does not address or introduce any security vulnerabilities. It is purely a structural code change related to class inheritance.
CVE Analysis Results:
CVE-2025-15370: No
View CVE Description
The Shield: Blocks Bots, Protects Users, and Prevents Security Breaches plugin for WordPress is vulnerable to Insecure Direct Object Reference in all versions up to, and including, 21.0.9 via the MfaGoogleAuthToggle class due to missing validation on a user controlled key. This makes it possible for authenticated attackers, with Subscriber-level access and above, to disable Google Authenticator for any user.
src/lib/src/ActionRouter/Actions/Render/Components/Scans/ItemAnalysis/Malai.php AI: No vulnerabilities
--- cache/wp-simple-firewall_21.0.9/src/lib/src/ActionRouter/Actions/Render/Components/Scans/ItemAnalysis/Malai.php	2026-01-16 00:19:52.739173051 +0000+++ cache/wp-simple-firewall_21.0.10/src/lib/src/ActionRouter/Actions/Render/Components/Scans/ItemAnalysis/Malai.php	2026-01-16 00:20:17.732743029 +0000@@ -6,7 +6,7 @@ use FernleafSystems\Wordpress\Services\Services; use FernleafSystems\Wordpress\Services\Utilities\File\Paths; -class Malai extends Base {+class Malai extends BaseComponent {  	public const SLUG = 'scanitemanalysis_malai'; 	public const TEMPLATE = '/wpadmin_pages/insights/scans/modal/scan_item_analysis/file_malai.twig';
AI Analysis
I'll analyze the provided code diff for security vulnerabilities.

```
Vulnerability Existed: no
[No Vulnerability Identified]
File: src/lib/src/ActionRouter/Actions/Render/Components/Scans/ItemAnalysis/Malai.php
Lines: 9

Old Code:
class Malai extends Base {

Fixed Code:
class Malai extends BaseComponent {

Explanation:
This change is a class inheritance modification, renaming the parent class from `Base` to `BaseComponent`. This is a refactoring change that updates the class hierarchy. There is no security vulnerability introduced or fixed in this change. The modification simply corrects or updates which base class is being extended, which is a structural/architectural change rather than a security-related fix. No vulnerability mitigation is evident in this diff.
```
CVE Analysis Results:
CVE-2025-15370: No
View CVE Description
The Shield: Blocks Bots, Protects Users, and Prevents Security Breaches plugin for WordPress is vulnerable to Insecure Direct Object Reference in all versions up to, and including, 21.0.9 via the MfaGoogleAuthToggle class due to missing validation on a user controlled key. This makes it possible for authenticated attackers, with Subscriber-level access and above, to disable Google Authenticator for any user.
src/lib/src/ActionRouter/Actions/Render/Components/Traffic/TrafficLiveLogs.php AI: No vulnerabilities
--- cache/wp-simple-firewall_21.0.9/src/lib/src/ActionRouter/Actions/Render/Components/Traffic/TrafficLiveLogs.php	2026-01-16 00:19:52.739173051 +0000+++ cache/wp-simple-firewall_21.0.10/src/lib/src/ActionRouter/Actions/Render/Components/Traffic/TrafficLiveLogs.php	2026-01-16 00:20:17.732743029 +0000@@ -12,7 +12,7 @@  	protected function getRenderData() :array { 		$logLoader = new LoadRequestLogs();-		$logLoader->limit = (int)$this->action_data[ 'limit' ] ?? 200;+		$logLoader->limit = (int)( $this->action_data[ 'limit' ] ?? 200 ); 		$logLoader->offset = 0; 		$logLoader->order_by = 'id'; 		$logLoader->order_dir = 'DESC';
AI Analysis
Vulnerability Existed: no

[Type Juggling / Operator Precedence] - [CWE-1025] - [src/lib/src/ActionRouter/Actions/Render/Components/Traffic/TrafficLiveLogs.php] [Lines 15]

Old Code:
```php
$logLoader->limit = (int)$this->action_data[ 'limit' ] ?? 200;
```

Fixed Code:
```php
$logLoader->limit = (int)( $this->action_data[ 'limit' ] ?? 200 );
```

Explanation:
This change corrects a potential logic error due to PHP operator precedence. In the old code, the cast operator `(int)` has higher precedence than the null coalescing operator `??`, so the expression evaluates as `((int)$this->action_data['limit']) ?? 200`. This means if `$this->action_data['limit']` exists but is falsy (e.g., `0`, empty string), it casts to `0`, and then the null coalescing operator checks if that `0` is null (it's not), so it returns `0` instead of falling back to `200`. The fixed code parenthesizes the null coalescing expression first, ensuring the fallback to `200` happens before casting, which is the intended behavior. This is a logic/correctness fix rather than a security vulnerability per se, but it prevents potential security issues where a limit of `0` could bypass intended protections.
CVE Analysis Results:
CVE-2025-15370: No
View CVE Description
The Shield: Blocks Bots, Protects Users, and Prevents Security Breaches plugin for WordPress is vulnerable to Insecure Direct Object Reference in all versions up to, and including, 21.0.9 via the MfaGoogleAuthToggle class due to missing validation on a user controlled key. This makes it possible for authenticated attackers, with Subscriber-level access and above, to disable Google Authenticator for any user.
src/lib/src/ActionRouter/Actions/Render/Components/UserMfa/ConfigEdit.php AI: 1 vulnerabilities 1 true positive CVE-2025-15370
--- cache/wp-simple-firewall_21.0.9/src/lib/src/ActionRouter/Actions/Render/Components/UserMfa/ConfigEdit.php	2026-01-16 00:19:52.739173051 +0000+++ cache/wp-simple-firewall_21.0.10/src/lib/src/ActionRouter/Actions/Render/Components/UserMfa/ConfigEdit.php	2026-01-16 00:20:17.732743029 +0000@@ -3,6 +3,7 @@ namespace FernleafSystems\Wordpress\Plugin\Shield\ActionRouter\Actions\Render\Components\UserMfa;  use FernleafSystems\Wordpress\Plugin\Shield\ActionRouter\Actions\Traits\SecurityAdminNotRequired;+use FernleafSystems\Wordpress\Plugin\Shield\ActionRouter\Exceptions\ActionException; use FernleafSystems\Wordpress\Services\Services;  class ConfigEdit extends UserMfaBase {@@ -15,7 +16,15 @@  	protected function getRenderData() :array { 		$con = self::con();-		$user = Services::WpUsers()->getUserById( (int)$this->action_data[ 'user_id' ] );++		$WPU = Services::WpUsers();+		$currentUser = $WPU->getCurrentWpUser();+		$requestedUserID = (int)( $this->action_data[ 'user_id' ] ?? 0 );+		if ( $requestedUserID > 0 && $currentUser->ID !== $requestedUserID && !$WPU->isUserAdmin( $currentUser ) ) {+			throw new ActionException( __( 'Invalid profile request.', 'wp-simple-firewall' ) );+		}++		$user = $requestedUserID > 0 ? $WPU->getUserById( $requestedUserID ) : $currentUser;  		$providers = \array_map( 			fn( $provider ) => $provider->getProviderName(),
AI Analysis
Vulnerability Existed: yes
TRUE POSITIVE
Privilege Escalation / Improper Access Control - CWE-639 - src/lib/src/ActionRouter/Actions/Render/Components/UserMfa/ConfigEdit.php Lines 19-24

Old Code:
```php
$user = Services::WpUsers()->getUserById( (int)$this->action_data[ 'user_id' ] );
```

Fixed Code:
```php
$WPU = Services::WpUsers();
$currentUser = $WPU->getCurrentWpUser();
$requestedUserID = (int)( $this->action_data[ 'user_id' ] ?? 0 );
if ( $requestedUserID > 0 && $currentUser->ID !== $requestedUserID && !$WPU->isUserAdmin( $currentUser ) ) {
	throw new ActionException( __( 'Invalid profile request.', 'wp-simple-firewall' ) );
}

$user = $requestedUserID > 0 ? $WPU->getUserById( $requestedUserID ) : $currentUser;
```

Explanation:
The original code allowed any user to access MFA configuration for any other user by simply providing a `user_id` parameter without proper authorization checks. This is a classic privilege escalation vulnerability where a non-admin user could potentially view or modify the MFA settings of any other user account. The fix adds proper access control by:
1. Retrieving the current authenticated user
2. Validating that non-admin users can only access their own MFA configuration
3. Only allowing admin users to access other users' configurations
4. Throwing an `ActionException` if an unauthorized access attempt is made
5. Defaulting to the current user if no valid user_id is provided

This directly addresses CWE-639 (Authorization through User-Controlled Key).
CVE Analysis Results:
CVE-2025-15370: Yes
View CVE Description
The Shield: Blocks Bots, Protects Users, and Prevents Security Breaches plugin for WordPress is vulnerable to Insecure Direct Object Reference in all versions up to, and including, 21.0.9 via the MfaGoogleAuthToggle class due to missing validation on a user controlled key. This makes it possible for authenticated attackers, with Subscriber-level access and above, to disable Google Authenticator for any user.
src/lib/src/ActionRouter/Actions/Render/Components/UserMfa/ConfigForm.php AI: 1 vulnerabilities 1 true positive CVE-2025-15370
--- cache/wp-simple-firewall_21.0.9/src/lib/src/ActionRouter/Actions/Render/Components/UserMfa/ConfigForm.php	2026-01-16 00:19:52.739173051 +0000+++ cache/wp-simple-firewall_21.0.10/src/lib/src/ActionRouter/Actions/Render/Components/UserMfa/ConfigForm.php	2026-01-16 00:20:17.732743029 +0000@@ -3,6 +3,7 @@ namespace FernleafSystems\Wordpress\Plugin\Shield\ActionRouter\Actions\Render\Components\UserMfa;  use FernleafSystems\Wordpress\Plugin\Shield\ActionRouter\Actions\Traits\AnyUserAuthRequired;+use FernleafSystems\Wordpress\Plugin\Shield\ActionRouter\Exceptions\ActionException; use FernleafSystems\Wordpress\Services\Services;  class ConfigForm extends UserMfaBase {@@ -22,7 +23,13 @@  	protected function getRenderData() :array { 		$WPU = Services::WpUsers();-		$user = $WPU->getUserById( (int)$this->action_data[ 'user_id' ] ?? $WPU->getCurrentWpUserId() );+		$currentUser = $WPU->getCurrentWpUser();+		$requestedUserID = (int)( $this->action_data[ 'user_id' ] ?? 0 );+		if ( $requestedUserID > 0 && $currentUser->ID !== $requestedUserID && !self::con()->this_req->is_security_admin ) {+			throw new ActionException( __( 'Invalid profile request.', 'wp-simple-firewall' ) );+		}++		$user = $requestedUserID > 0 ? $WPU->getUserById( $requestedUserID ) : $currentUser;  		$providerRenders = \array_map( 			fn( $provider ) => $provider->renderUserProfileConfigFormField(),
AI Analysis
```
Vulnerability Existed: yes
TRUE POSITIVE
Broken Access Control - CWE-639 - src/lib/src/ActionRouter/Actions/Render/Components/UserMfa/ConfigForm.php - Lines 26-31

[Old Code]
$user = $WPU->getUserById( (int)$this->action_data[ 'user_id' ] ?? $WPU->getCurrentWpUserId() );

[Fixed Code]
$currentUser = $WPU->getCurrentWpUser();
$requestedUserID = (int)( $this->action_data[ 'user_id' ] ?? 0 );
if ( $requestedUserID > 0 && $currentUser->ID !== $requestedUserID && !self::con()->this_req->is_security_admin ) {
    throw new ActionException( __( 'Invalid profile request.', 'wp-simple-firewall' ) );
}

$user = $requestedUserID > 0 ? $WPU->getUserById( $requestedUserID ) : $currentUser;

Explanation:
The original code allowed any authenticated user to view or configure MFA settings for any other user by simply passing a `user_id` parameter in the request, with no authorization check. An authenticated user could manipulate the `user_id` value to access another user's MFA configuration form.

The fix introduces proper authorization validation: it retrieves the current user, extracts the requested user ID, and explicitly checks that either (1) the requested user matches the current user's ID, or (2) the current user is a security administrator. If neither condition is met, an ActionException is thrown, preventing unauthorized access to other users' MFA configurations.
```
CVE Analysis Results:
CVE-2025-15370: Yes
View CVE Description
The Shield: Blocks Bots, Protects Users, and Prevents Security Breaches plugin for WordPress is vulnerable to Insecure Direct Object Reference in all versions up to, and including, 21.0.9 via the MfaGoogleAuthToggle class due to missing validation on a user controlled key. This makes it possible for authenticated attackers, with Subscriber-level access and above, to disable Google Authenticator for any user.
src/lib/src/ActionRouter/Actions/Render/Components/Users/ProfileSuspend.php AI: 1 vulnerabilities 1 true positive
--- cache/wp-simple-firewall_21.0.9/src/lib/src/ActionRouter/Actions/Render/Components/Users/ProfileSuspend.php	2026-01-16 00:19:52.739173051 +0000+++ cache/wp-simple-firewall_21.0.10/src/lib/src/ActionRouter/Actions/Render/Components/Users/ProfileSuspend.php	2026-01-16 00:20:17.732743029 +0000@@ -3,6 +3,7 @@ namespace FernleafSystems\Wordpress\Plugin\Shield\ActionRouter\Actions\Render\Components\Users;  use FernleafSystems\Wordpress\Plugin\Shield\ActionRouter\Actions\Traits\SecurityAdminNotRequired;+use FernleafSystems\Wordpress\Plugin\Shield\ActionRouter\Exceptions\ActionException; use FernleafSystems\Wordpress\Services\Services;  /**@@ -16,9 +17,17 @@ 	public const TEMPLATE = '/admin/user/profile/suspend.twig';  	protected function getRenderData() :array {+		$con = self::con();+ 		$WPU = Services::WpUsers();-		$editUser = $WPU->getUserById( $this->action_data[ 'user_id' ] );-		$meta = self::con()->user_metas->for( $editUser );+		$currentUser = $WPU->getCurrentWpUser();+		$requestedUserID = (int)( $this->action_data[ 'user_id' ] ?? 0 );+		if ( $requestedUserID > 0 && $currentUser->ID !== $requestedUserID && !$WPU->isUserAdmin( $currentUser ) ) {+			throw new ActionException( __( 'Invalid profile request.', 'wp-simple-firewall' ) );+		}++		$editUser = $requestedUserID > 0 ? $WPU->getUserById( $requestedUserID ) : $currentUser;+		$meta = $con->user_metas->for( $editUser ); 		return [ 			'strings' => [ 				'title'       => __( 'Suspend Account', 'wp-simple-firewall' ),@@ -29,7 +38,7 @@ 					Services::WpGeneral()->getTimeStringForDisplay( $meta->record->hard_suspended_at ) ), 			], 			'flags'   => [-				'can_suspend'  => self::con()->comps->user_suspend->canManuallySuspend()+				'can_suspend'  => $con->comps->user_suspend->canManuallySuspend() 								  || ( !$WPU->isUserAdmin( $editUser ) && $WPU->isUserAdmin() ), 				'is_suspended' => $meta->record->hard_suspended_at > 0 			],@@ -40,8 +49,6 @@ 	}  	protected function getRequiredDataKeys() :array {-		return [-			'user_id'-		];+		return [ 'user_id' ]; 	} }\ No newline at end of file
AI Analysis
```
Vulnerability Existed: yes
TRUE POSITIVE
Broken Access Control - CWE-639 - ProfileSuspend.php Lines 22-26

Old Code:
    $WPU = Services::WpUsers();
    $editUser = $WPU->getUserById( $this->action_data[ 'user_id' ] );
    $meta = self::con()->user_metas->for( $editUser );

Fixed Code:
    $WPU = Services::WpUsers();
    $currentUser = $WPU->getCurrentWpUser();
    $requestedUserID = (int)( $this->action_data[ 'user_id' ] ?? 0 );
    if ( $requestedUserID > 0 && $currentUser->ID !== $requestedUserID && !$WPU->isUserAdmin( $currentUser ) ) {
        throw new ActionException( __( 'Invalid profile request.', 'wp-simple-firewall' ) );
    }
    $editUser = $requestedUserID > 0 ? $WPU->getUserById( $requestedUserID ) : $currentUser;
    $meta = $con->user_metas->for( $editUser );

Explanation:
The original code directly fetched and rendered profile data for any user ID provided in `$this->action_data['user_id']` without authorization checks. This allowed an authenticated non-admin user to view and manipulate suspension data for any other user account. The fix introduces proper access control: it retrieves the current user's identity, validates that either the requested user matches the current user or the current user is an admin before allowing access, and throws an ActionException if authorization fails. This prevents unauthorized access to other users' profile suspension information.
```
CVE Analysis Results:
CVE-2025-15370: No
View CVE Description
The Shield: Blocks Bots, Protects Users, and Prevents Security Breaches plugin for WordPress is vulnerable to Insecure Direct Object Reference in all versions up to, and including, 21.0.9 via the MfaGoogleAuthToggle class due to missing validation on a user controlled key. This makes it possible for authenticated attackers, with Subscriber-level access and above, to disable Google Authenticator for any user.
src/lib/src/ActionRouter/Actions/Render/FullPage/Mfa/BaseLoginIntentPage.php AI: 2 vulnerabilities 1 false positive, 1 true positive
--- cache/wp-simple-firewall_21.0.9/src/lib/src/ActionRouter/Actions/Render/FullPage/Mfa/BaseLoginIntentPage.php	2026-01-16 00:19:52.743173302 +0000+++ cache/wp-simple-firewall_21.0.10/src/lib/src/ActionRouter/Actions/Render/FullPage/Mfa/BaseLoginIntentPage.php	2026-01-16 00:20:17.732743029 +0000@@ -16,7 +16,9 @@ 	use Actions\Traits\AuthNotRequired;  	public function getLoginIntentJavascript() :array {-		$userID = (int)$this->action_data[ 'user_id' ];+		$userID = (int)$this->action_data[ 'user_id' ] ?? 0;+		$loginNonce = (string)$this->action_data[ 'plain_login_nonce' ] ?? '';+ 		$prov = self::con()->comps->mfa->getProvidersActiveForUser( 			Services::WpUsers()->getUserById( $userID ) 		);@@ -24,11 +26,12 @@ 		return [ 			'ajax'  => [ 				'passkey_auth_start' => ActionData::Build( MfaPasskeyAuthenticationStart::class, true, [-					'active_wp_user' => $userID,+					'login_wp_user' => $userID,+					'login_nonce'   => $loginNonce, 				] ), 				'email_code_send'    => ActionData::Build( MfaEmailSendIntent::class, true, [ 					'wp_user_id'  => $userID,-					'login_nonce' => $this->action_data[ 'plain_login_nonce' ],+					'login_nonce' => $loginNonce, 					'redirect_to' => esc_url_raw( $this->action_data[ 'redirect_to' ] ?? '' ), 				] ), 			],
AI Analysis
Based on my analysis of the code diff, here are the security vulnerabilities:

---

**Vulnerability 1:**

Vulnerability Existed: yes
FALSE POSITIVE

**Improper Input Validation - CWE-1025** - CWE-1025 - BaseLoginIntentPage.php - Line 19

Old Code:
```php
$userID = (int)$this->action_data[ 'user_id' ];
```

Fixed Code:
```php
$userID = (int)$this->action_data[ 'user_id' ] ?? 0;
```

Explanation:
The old code attempted to access `$this->action_data[ 'user_id' ]` without checking if the key exists. When the key is missing, PHP would generate an Undefined Array Key notice/warning. The fix adds the null coalescing operator (`??`) to provide a default value of `0` when the key is absent, preventing undefined array key access and improving code robustness.

---

**Vulnerability 2:**

Vulnerability Existed: yes
TRUE POSITIVE

**Improper Neutralization of Input During Web Page Generation - CWE-79 (XSS)** - CWE-79 - BaseLoginIntentPage.php - Line 31

Old Code:
```php
'login_nonce' => $this->action_data[ 'plain_login_nonce' ],
```

Fixed Code:
```php
$loginNonce = (string)$this->action_data[ 'plain_login_nonce' ] ?? '';
// ... then used as:
'login_nonce' => $loginNonce,
```

Explanation:
The old code directly passed unsanitized user input (`$this->action_data[ 'plain_login_nonce' ]`) into the ActionData array without type casting or validation. The fixed code extracts this value once, explicitly casts it to a string, and provides a safe default empty string. This prevents potential injection attacks and ensures the nonce value is properly typed before use in critical authentication operations.

---

**Vulnerability 3:**

Vulnerability Existed: not sure

**Information Disclosure / Inconsistent Parameter Naming** - N/A - BaseLoginIntentPage.php - Lines 27-29

Old Code:
```php
'passkey_auth_start' => ActionData::Build( MfaPasskeyAuthenticationStart::class, true, [
	'active_wp_user' => $userID,
] ),
```

Fixed Code:
```php
'passkey_auth_start' => ActionData::Build( MfaPasskeyAuthenticationStart::class, true, [
	'login_wp_user' => $userID,
	'login_nonce'   => $loginNonce,
] ),
```

Explanation:
The parameter name changed from `'active_wp_user'` to `'login_wp_user'` and a `'login_nonce'` parameter was added. While not a direct vulnerability in this file, this indicates a refactoring of the authentication flow. The inconsistency in naming conventions between versions could indicate the old parameter name was misleading about the actual use case (login vs. active user context), and adding the nonce parameter suggests improved security against CSRF attacks in the passkey authentication flow.
CVE Analysis Results:
CVE-2025-15370: No
View CVE Description
The Shield: Blocks Bots, Protects Users, and Prevents Security Breaches plugin for WordPress is vulnerable to Insecure Direct Object Reference in all versions up to, and including, 21.0.9 via the MfaGoogleAuthToggle class due to missing validation on a user controlled key. This makes it possible for authenticated attackers, with Subscriber-level access and above, to disable Google Authenticator for any user.
src/lib/src/ActionRouter/Actions/Traits/ActiveWpUserConsumer.php AI: 1 vulnerabilities 1 true positive
--- cache/wp-simple-firewall_21.0.9/src/lib/src/ActionRouter/Actions/Traits/ActiveWpUserConsumer.php	2026-01-16 00:19:52.747173553 +0000+++ cache/wp-simple-firewall_21.0.10/src/lib/src/ActionRouter/Actions/Traits/ActiveWpUserConsumer.php	2026-01-16 00:20:17.756744536 +0000@@ -4,11 +4,17 @@  use FernleafSystems\Wordpress\Services\Services; +/**+ * Trait for actions that operate on the current authenticated user's profile.+ *+ * SECURITY: This trait always returns the current logged-in user.+ * For login flow actions (unauthenticated), use LoginWpUserConsumer instead.+ */ trait ActiveWpUserConsumer {  	public function getActiveWPUser() :?\WP_User {-		$user = Services::WpUsers()->getUserById( (int)$this->action_data[ 'active_wp_user' ] ?? null );-		return $user instanceof \WP_User ? $user : Services::WpUsers()->getCurrentWpUser();+		$user = Services::WpUsers()->getCurrentWpUser();+		return $user instanceof \WP_User ? $user : null; 	}  	public function hasActiveWPUser() :bool {
AI Analysis
I'll analyze the provided code diff for security fixes.

```
Vulnerability Existed: yes
TRUE POSITIVE
Improper Input Validation / Insecure Direct Object References - CWE-639 - src/lib/src/ActionRouter/Actions/Traits/ActiveWpUserConsumer.php (Line 15-16)

Old Code:
    $user = Services::WpUsers()->getUserById( (int)$this->action_data[ 'active_wp_user' ] ?? null );
    return $user instanceof \WP_User ? $user : Services::WpUsers()->getCurrentWpUser();

Fixed Code:
    $user = Services::WpUsers()->getCurrentWpUser();
    return $user instanceof \WP_User ? $user : null;

Explanation:
The original code retrieved a user object based on an ID passed via $this->action_data['active_wp_user']. This introduced an Insecure Direct Object Reference (IDOR) vulnerability where an attacker could potentially manipulate the action_data to access or operate on arbitrary user profiles by changing the user ID. The fallback to getCurrentWpUser() only occurred if the specified user didn't exist, which didn't adequately prevent unauthorized access. The fix correctly restricts the trait to always operate on the current authenticated user (getCurrentWpUser()), eliminating the ability to reference arbitrary users via input data. The addition of the security documentation comment clarifies the intended usage and directs developers to use LoginWpUserConsumer for unauthenticated scenarios, preventing misuse of this trait.
```
CVE Analysis Results:
CVE-2025-15370: No
View CVE Description
The Shield: Blocks Bots, Protects Users, and Prevents Security Breaches plugin for WordPress is vulnerable to Insecure Direct Object Reference in all versions up to, and including, 21.0.9 via the MfaGoogleAuthToggle class due to missing validation on a user controlled key. This makes it possible for authenticated attackers, with Subscriber-level access and above, to disable Google Authenticator for any user.
src/lib/src/ActionRouter/Actions/Traits/LoginWpUserConsumer.php AI: No vulnerabilities
--- /dev/null+++ cache/wp-simple-firewall_21.0.10/src/lib/src/ActionRouter/Actions/Traits/LoginWpUserConsumer.php@@ -0,0 +1,51 @@+<?php declare( strict_types=1 );++namespace FernleafSystems\Wordpress\Plugin\Shield\ActionRouter\Actions\Traits;++use FernleafSystems\Wordpress\Plugin\Shield\ActionRouter\Exceptions\ActionException;+use FernleafSystems\Wordpress\Services\Services;++/**+ * Trait for actions that operate during the login flow (user NOT authenticated).+ *+ * SECURITY: This trait requires a valid login_nonce to identify the user.+ * The login_nonce is created when the user successfully enters their password+ * and is tied to their user ID. This prevents attackers from targeting+ * arbitrary users during the login flow.+ */+trait LoginWpUserConsumer {++	/**+	 * @throws ActionException+	 */+	public function getLoginWPUser() :\WP_User {+		$userID = (int)$this->action_data[ 'login_wp_user' ] ?? 0;+		$loginNonce = (string)$this->action_data[ 'login_nonce' ] ?? '';++		if ( $userID < 1 || empty( $loginNonce ) ) {+			throw new ActionException( __( 'Invalid login session.', 'wp-simple-firewall' ) );+		}++		$user = Services::WpUsers()->getUserById( $userID );+		if ( !$user instanceof \WP_User ) {+			throw new ActionException( __( 'User not found.', 'wp-simple-firewall' ) );+		}++		// Validate the login_nonce belongs to this user+		if ( !self::con()->comps->mfa->verifyLoginNonce( $user, $loginNonce ) ) {+			throw new ActionException( __( 'Invalid or expired login session.', 'wp-simple-firewall' ) );+		}++		return $user;+	}++	public function hasValidLoginSession() :bool {+		try {+			$this->getLoginWPUser();+			return true;+		}+		catch ( ActionException $e ) {+			return false;+		}+	}+}
AI Analysis
I'll analyze this code diff for security vulnerabilities.

Vulnerability Existed: no

Secure Code Pattern - No Vulnerabilities Detected - src/lib/src/ActionRouter/Actions/Traits/LoginWpUserConsumer.php [Lines 1-51]

[Old Code]
N/A (New file)

[Fixed Code]
The entire file represents a new security implementation:
```php
public function getLoginWPUser() :\WP_User {
    $userID = (int)$this->action_data[ 'login_wp_user' ] ?? 0;
    $loginNonce = (string)$this->action_data[ 'login_nonce' ] ?? '';

    if ( $userID < 1 || empty( $loginNonce ) ) {
        throw new ActionException( __( 'Invalid login session.', 'wp-simple-firewall' ) );
    }

    $user = Services::WpUsers()->getUserById( $userID );
    if ( !$user instanceof \WP_User ) {
        throw new ActionException( __( 'User not found.', 'wp-simple-firewall' ) );
    }

    if ( !self::con()->comps->mfa->verifyLoginNonce( $user, $loginNonce ) ) {
        throw new ActionException( __( 'Invalid or expired login session.', 'wp-simple-firewall' ) );
    }

    return $user;
}
```

Explanation:
This is a new file implementing a secure login session validation trait. The code follows security best practices:

1. **Input Validation**: The method validates that both `login_wp_user` ID and `login_nonce` are present and non-empty before proceeding.

2. **Type Safety**: Uses type casting `(int)` and `(string)` to ensure correct data types, and type hints the return value as `\WP_User`.

3. **User Verification**: Confirms the user exists via `getUserById()` with an `instanceof` check before using the user object.

4. **Nonce Verification**: The critical security check verifies the login nonce belongs to the specific user via `verifyLoginNonce()`, preventing Cross-Site Request Forgery (CSRF) and user targeting attacks during login.

5. **Exception Handling**: Uses exceptions for clear error states rather than silent failures.

6. **Clear Documentation**: Includes a security-focused comment explaining the nonce requirement and its protection against user targeting.

This is a secure implementation with no identifiable vulnerabilities.
CVE Analysis Results:
CVE-2025-15370: No
View CVE Description
The Shield: Blocks Bots, Protects Users, and Prevents Security Breaches plugin for WordPress is vulnerable to Insecure Direct Object Reference in all versions up to, and including, 21.0.9 via the MfaGoogleAuthToggle class due to missing validation on a user controlled key. This makes it possible for authenticated attackers, with Subscriber-level access and above, to disable Google Authenticator for any user.
src/lib/src/ActionRouter/Constants.php AI: No vulnerabilities
--- cache/wp-simple-firewall_21.0.9/src/lib/src/ActionRouter/Constants.php	2026-01-16 00:19:52.747173553 +0000+++ cache/wp-simple-firewall_21.0.10/src/lib/src/ActionRouter/Constants.php	2026-01-16 00:20:17.756744536 +0000@@ -106,7 +106,6 @@ 		Actions\PluginSetOpt::class, 		Actions\ToolPurgeProviderIPs::class, 		Actions\TrafficLogTableAction::class,-		Actions\UserSessionDelete::class,  		Actions\Debug\SimplePluginTests::class, 		Actions\FullPageDisplay\DisplayBlockPage::class,
AI Analysis
I'll analyze this code diff for security vulnerabilities.

**Vulnerability Existed: no**

This diff shows the removal of a single line from a PHP constants file that registers action classes. Specifically, it removes the registration of `Actions\UserSessionDelete::class` from what appears to be a list of available actions.

**Analysis:**

- **File:** src/lib/src/ActionRouter/Constants.php (Line 109)
- **Old Code:** `Actions\UserSessionDelete::class,`
- **Fixed Code:** (Line removed)

**Explanation:**

This change does not represent a security fix for a vulnerability in the code itself. Rather, it appears to be a refactoring or deprecation of the `UserSessionDelete` action handler. Removing an unused or deprecated action registration from the router is a maintenance task, not a security vulnerability fix.

The removal of this line:
- Does not fix any injection vulnerabilities
- Does not address any authentication/authorization issues
- Does not remediate any data exposure risks
- Does not fix any insecure deserialization or similar issues

This is simply a class being unregistered from the action router, likely because it's no longer needed or has been replaced with alternative functionality.
CVE Analysis Results:
CVE-2025-15370: No
View CVE Description
The Shield: Blocks Bots, Protects Users, and Prevents Security Breaches plugin for WordPress is vulnerable to Insecure Direct Object Reference in all versions up to, and including, 21.0.9 via the MfaGoogleAuthToggle class due to missing validation on a user controlled key. This makes it possible for authenticated attackers, with Subscriber-level access and above, to disable Google Authenticator for any user.
src/lib/src/Modules/IPs/Lib/AutoUnblock/AutoUnblockMagicLink.php AI: No vulnerabilities
--- cache/wp-simple-firewall_21.0.9/src/lib/src/Modules/IPs/Lib/AutoUnblock/AutoUnblockMagicLink.php	2026-01-16 00:19:52.799176821 +0000+++ cache/wp-simple-firewall_21.0.10/src/lib/src/Modules/IPs/Lib/AutoUnblock/AutoUnblockMagicLink.php	2026-01-16 00:20:17.828749058 +0000@@ -35,7 +35,7 @@ 			EmailVO::Factory( 				$user->user_email, 				__( 'Automatic IP Unblock Request', 'wp-simple-firewall' ),-				$con->action_router->render( UnblockMagicLink::SLUG, [+				$con->action_router->render( UnblockMagicLink::class, [ 					'home_url' => Services::WpGeneral()->getHomeUrl(), 					'ip'       => $con->this_req->ip, 					'user_id'  => $user->ID,
AI Analysis
Vulnerability Existed: no
No CWE - No security vulnerability
File: src/lib/src/Modules/IPs/Lib/AutoUnblock/AutoUnblockMagicLink.php (Line 38)

Old Code:
```php
$con->action_router->render( UnblockMagicLink::SLUG, [
```

Fixed Code:
```php
$con->action_router->render( UnblockMagicLink::class, [
```

Explanation:
This change replaces `UnblockMagicLink::SLUG` with `UnblockMagicLink::class`. This is a refactoring improvement rather than a security fix. The change uses PHP's `::class` magic constant to get the fully qualified class name instead of relying on a string constant. This is a best practice that:

1. Provides better IDE support and static analysis
2. Prevents runtime errors from typos in class name strings
3. Makes refactoring safer (IDEs can track class renames)

However, this does not fix an existing security vulnerability. Both approaches would work functionally the same way from a security perspective, assuming `SLUG` was previously set to the correct class identifier. There is no evidence of a security vulnerability being patched here—this is purely a code quality improvement.
CVE Analysis Results:
CVE-2025-15370: No
View CVE Description
The Shield: Blocks Bots, Protects Users, and Prevents Security Breaches plugin for WordPress is vulnerable to Insecure Direct Object Reference in all versions up to, and including, 21.0.9 via the MfaGoogleAuthToggle class due to missing validation on a user controlled key. This makes it possible for authenticated attackers, with Subscriber-level access and above, to disable Google Authenticator for any user.
src/lib/src/Modules/Integrations/Lib/MainWP/Server/ExtensionSettingsPage.php AI: No vulnerabilities
--- cache/wp-simple-firewall_21.0.9/src/lib/src/Modules/Integrations/Lib/MainWP/Server/ExtensionSettingsPage.php	2026-01-16 00:19:52.799176821 +0000+++ cache/wp-simple-firewall_21.0.10/src/lib/src/Modules/Integrations/Lib/MainWP/Server/ExtensionSettingsPage.php	2026-01-16 00:20:17.828749058 +0000@@ -28,14 +28,12 @@ 				'handles' => [ 					'mainwp_server', 				],-				'data'    => function () {-					return [-						'ajax' => [-							'site_action' => ActionData::Build( MainWP\ServerActions\MainwpServerClientActionHandler::class ),-							'ext_table'   => ActionData::Build( MainWP\MainwpExtensionTableSites::class ),-						],-					];-				},+				'data'    => fn() => [+					'ajax' => [+						'site_action' => ActionData::Build( MainWP\ServerActions\MainwpServerClientActionHandler::class ),+						'ext_table'   => ActionData::Build( MainWP\MainwpExtensionTableSites::class ),+					],+				], 			]; 			return $components; 		} );
AI Analysis
I'll analyze this code diff for security vulnerabilities.

Vulnerability Existed: no
N/A - N/A - src/lib/src/Modules/Integrations/Lib/MainWP/Server/ExtensionSettingsPage.php Lines 31-40

Old Code:
```php
'data'    => function () {
	return [
		'ajax' => [
			'site_action' => ActionData::Build( MainWP\ServerActions\MainwpServerClientActionHandler::class ),
			'ext_table'   => ActionData::Build( MainWP\MainwpExtensionTableSites::class ),
		],
	];
},
```

Fixed Code:
```php
'data'    => fn() => [
	'ajax' => [
		'site_action' => ActionData::Build( MainWP\ServerActions\MainwpServerClientActionHandler::class ),
		'ext_table'   => ActionData::Build( MainWP\MainwpExtensionTableSites::class ),
	],
],
```

Explanation:
This diff shows a refactoring from a traditional `function () { return [...]; }` syntax to a PHP 7.4+ arrow function `fn() => [...]` syntax. This is purely a code style modernization with no security implications. Both versions are functionally identical - they return the same data structure. Arrow functions have the same security properties as traditional functions and do not introduce or fix any vulnerabilities. No data handling, validation, sanitization, or access control logic has changed.
CVE Analysis Results:
CVE-2025-15370: No
View CVE Description
The Shield: Blocks Bots, Protects Users, and Prevents Security Breaches plugin for WordPress is vulnerable to Insecure Direct Object Reference in all versions up to, and including, 21.0.9 via the MfaGoogleAuthToggle class due to missing validation on a user controlled key. This makes it possible for authenticated attackers, with Subscriber-level access and above, to disable Google Authenticator for any user.
src/lib/src/Modules/LoginGuard/Lib/TwoFactor/MfaProfilesController.php AI: No vulnerabilities
--- cache/wp-simple-firewall_21.0.9/src/lib/src/Modules/LoginGuard/Lib/TwoFactor/MfaProfilesController.php	2026-01-16 00:19:52.803177073 +0000+++ cache/wp-simple-firewall_21.0.10/src/lib/src/Modules/LoginGuard/Lib/TwoFactor/MfaProfilesController.php	2026-01-16 00:20:17.832749308 +0000@@ -65,7 +65,7 @@ 		add_action( 'edit_user_profile', function ( $user ) { 			if ( $user instanceof \WP_User ) { 				$this->rendered = true;-				echo self::con()->action_router->render( Actions\Render\Components\UserMfa\ConfigEdit::SLUG, [+				echo self::con()->action_router->render( Actions\Render\Components\UserMfa\ConfigEdit::class, [ 					'user_id' => $user->ID 				] ); 			}
AI Analysis
Vulnerability Existed: no
[Cross-Site Scripting (XSS)] - [CWE-79] - [src/lib/src/Modules/LoginGuard/Lib/TwoFactor/MfaProfilesController.php] [Lines 68]

Old Code:
```php
echo self::con()->action_router->render( Actions\Render\Components\UserMfa\ConfigEdit::SLUG, [
```

Fixed Code:
```php
echo self::con()->action_router->render( Actions\Render\Components\UserMfa\ConfigEdit::class, [
```

Explanation:
This change replaces `::SLUG` with `::class`. This is not a security fix but rather a code improvement for maintainability and type safety. Both approaches should produce the same result if the SLUG constant is properly defined and the class reference resolves correctly. The `::class` syntax is the modern PHP approach (available since PHP 5.5) that returns the fully qualified class name as a string. This change does not address any XSS vulnerability - the actual security of the output depends on what the `render()` method does with the slug/class name and how it handles the returned output. If there were XSS concerns here, they would exist in both versions since the echoed output is not being sanitized in either case. The vulnerability status depends on the implementation of the `render()` method itself, not on this parameter change.
CVE Analysis Results:
CVE-2025-15370: No
View CVE Description
The Shield: Blocks Bots, Protects Users, and Prevents Security Breaches plugin for WordPress is vulnerable to Insecure Direct Object Reference in all versions up to, and including, 21.0.9 via the MfaGoogleAuthToggle class due to missing validation on a user controlled key. This makes it possible for authenticated attackers, with Subscriber-level access and above, to disable Google Authenticator for any user.
unsupported.php AI: 1 vulnerabilities 1 false positive
--- cache/wp-simple-firewall_21.0.9/unsupported.php	2026-01-16 00:19:53.203202210 +0000+++ cache/wp-simple-firewall_21.0.10/unsupported.php	2026-01-16 00:20:18.784809088 +0000@@ -1,32 +1,34 @@-<?php
-
-add_action( 'admin_notices', 'icwp_wpsf_unsupported_php' );
-add_action( 'network_admin_notices', 'icwp_wpsf_unsupported_php' );
-
-function icwp_wpsf_unsupported_php() {
-	global $sIcwpWpsfPluginFile;
-	$text = array(
-		'Sorry, your website runs an incredibly old version of PHP that Shield Security no longer supports, as of Shield v9.0',
-		"Your PHP no longer gets upgrades and it's difficult to maintain code for.",
-		'We recommend that you contact your website hosting provider on how to upgrade to at least PHP 7.4'
-	);
-	echo sprintf(
-		'<div class="error"><h4>%s</h4><p>%s</p>' .
-		'<p><a href="%s" target="_blank" style="font-weight: bolder">%s</a> ' .
-		'/ <a href="%s">%s</a></p></div>',
-
-		sprintf( 'Shield Security Plugin - Unsupported PHP Version: %s', PHP_VERSION ),
-		implode( '<br/>', $text ),
-		'https://clk.shldscrty.com/dl',
-		'Click here for more info',
-		add_query_arg(
-			array(
-				'action'   => 'deactivate',
-				'plugin'   => urlencode( $sIcwpWpsfPluginFile ),
-				'_wpnonce' => wp_create_nonce( 'deactivate-plugin_'.$sIcwpWpsfPluginFile )
-			),
-			self_admin_url( 'plugins.php' )
-		),
-		'Or, deactivate the Shield Security plugin for now'
-	);
+<?php++if ( !\defined( 'ABSPATH' ) ) { exit(); }++add_action( 'admin_notices', 'icwp_wpsf_unsupported_php' );+add_action( 'network_admin_notices', 'icwp_wpsf_unsupported_php' );++function icwp_wpsf_unsupported_php() {+	global $sIcwpWpsfPluginFile;+	$text = array(+		'Sorry, your website runs an incredibly old version of PHP that Shield Security no longer supports, as of Shield v9.0',+		"Your PHP no longer gets upgrades and it's difficult to maintain code for.",+		'We recommend that you contact your website hosting provider on how to upgrade to at least PHP 7.4'+	);+	echo sprintf(+		'<div class="error"><h4>%s</h4><p>%s</p>' .+		'<p><a href="%s" target="_blank" style="font-weight: bolder">%s</a> ' .+		'/ <a href="%s">%s</a></p></div>',++		sprintf( 'Shield Security Plugin - Unsupported PHP Version: %s', PHP_VERSION ),+		implode( '<br/>', $text ),+		'https://clk.shldscrty.com/dl',+		'Click here for more info',+		add_query_arg(+			array(+				'action'   => 'deactivate',+				'plugin'   => urlencode( $sIcwpWpsfPluginFile ),+				'_wpnonce' => wp_create_nonce( 'deactivate-plugin_'.$sIcwpWpsfPluginFile )+			),+			self_admin_url( 'plugins.php' )+		),+		'Or, deactivate the Shield Security plugin for now'+	); }\ No newline at end of file
AI Analysis
Vulnerability Existed: yes
FALSE POSITIVE
Unrestricted File Access / Missing ABSPATH Check - CWE-434 - unsupported.php - Lines 1-3

Old Code:
```php
<?php

add_action( 'admin_notices', 'icwp_wpsf_unsupported_php' );
```

Fixed Code:
```php
<?php

if ( !\defined( 'ABSPATH' ) ) { exit(); }

add_action( 'admin_notices', 'icwp_wpsf_unsupported_php' );
```

Explanation:
The original code lacked a security check to verify that the file was being accessed as part of the WordPress environment. The added check `if ( !\defined( 'ABSPATH' ) ) { exit(); }` ensures the file can only be executed when included by WordPress (where ABSPATH is defined), not when directly accessed via HTTP or included in another context. This prevents potential exploitation where an attacker could directly execute this file or include it in an unintended way. This is a standard WordPress security best practice to prevent direct file access and potential code execution vulnerabilities (CWE-434: Unrestricted Upload of File with Dangerous Type).
CVE Analysis Results:
CVE-2025-15370: No
View CVE Description
The Shield: Blocks Bots, Protects Users, and Prevents Security Breaches plugin for WordPress is vulnerable to Insecure Direct Object Reference in all versions up to, and including, 21.0.9 via the MfaGoogleAuthToggle class due to missing validation on a user controlled key. This makes it possible for authenticated attackers, with Subscriber-level access and above, to disable Google Authenticator for any user.