REPORT / 01
Analysis Report · Folder Analysis cache/learnpress_4.3.2 → cache/learnpress_4.3.2.1 — CVE-2025-13964
Shared security patch analysis results
02 ·
Lifecycle actions
cancel · resume · skip · regenerate
03 ·
Share this analysis
copy link · embed report
03 ·
CVE Security Analysis & Writeups
ai-generated · per cve
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-13964
NVD
AI-Generated Analysis
05 ·
Findings
filter · search · paginate
Showing 0 to 0 of 0 results
vendor/symfony/css-selector/Parser/Parser.php
AI: 1 vulnerabilities
1 false positive
CVE-2025-13964
--- cache/learnpress_4.3.2/vendor/symfony/css-selector/Parser/Parser.php 2026-01-08 00:36:50.496265486 +0000+++ cache/learnpress_4.3.2.1/vendor/symfony/css-selector/Parser/Parser.php 2026-01-07 00:41:19.793227791 +0000@@ -19,7 +19,7 @@ * CSS selector parser. * * This component is a port of the Python cssselect library,- * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.+ * which is copyright Ian Bicking, @see https://github.com/scrapy/cssselect. * * @author Jean-François Simon <[email protected]> *@@ -27,16 +27,13 @@ */ class Parser implements ParserInterface {- private $tokenizer;+ private Tokenizer $tokenizer; - public function __construct(Tokenizer $tokenizer = null)+ public function __construct(?Tokenizer $tokenizer = null) { $this->tokenizer = $tokenizer ?? new Tokenizer(); } - /**- * {@inheritdoc}- */ public function parse(string $source): array { $reader = new Reader($source);@@ -60,9 +57,7 @@ } } - $joined = trim(implode('', array_map(function (Token $token) {- return $token->getValue();- }, $tokens)));+ $joined = trim(implode('', array_map(fn (Token $token) => $token->getValue(), $tokens))); $int = function ($string) { if (!is_numeric($string)) {@@ -197,7 +192,18 @@ if (!$stream->getPeek()->isDelimiter(['('])) { $result = new Node\PseudoNode($result, $identifier);-+ if ('Pseudo[Element[*]:scope]' === $result->__toString()) {+ $used = \count($stream->getUsed());+ if (!(2 === $used+ || 3 === $used && $stream->getUsed()[0]->isWhiteSpace()+ || $used >= 3 && $stream->getUsed()[$used - 3]->isDelimiter([','])+ || $used >= 4+ && $stream->getUsed()[$used - 3]->isWhiteSpace()+ && $stream->getUsed()[$used - 4]->isDelimiter([','])+ )) {+ throw SyntaxErrorException::notAtTheStartOfASelector('scope');+ }+ } continue; } @@ -242,7 +248,7 @@ } } - if (empty($arguments)) {+ if (!$arguments) { throw SyntaxErrorException::unexpectedToken('at least one argument', $next); }
AI Analysis
I'll analyze this code diff for security vulnerabilities.
Vulnerability Existed: yes
FALSE POSITIVE
CSS Selector Injection / Improper Input Validation - CWE-94 - vendor/symfony/css-selector/Parser/Parser.php Lines 195-207
Old Code:
```php
if (!$stream->getPeek()->isDelimiter(['('])) {
$result = new Node\PseudoNode($result, $identifier);
continue;
}
```
Fixed Code:
```php
if (!$stream->getPeek()->isDelimiter(['('])) {
$result = new Node\PseudoNode($result, $identifier);
if ('Pseudo[Element[*]:scope]' === $result->__toString()) {
$used = \count($stream->getUsed());
if (!(2 === $used
|| 3 === $used && $stream->getUsed()[0]->isWhiteSpace()
|| $used >= 3 && $stream->getUsed()[$used - 3]->isDelimiter([','])
|| $used >= 4
&& $stream->getUsed()[$used - 3]->isWhiteSpace()
&& $stream->getUsed()[$used - 4]->isDelimiter([','])
)) {
throw SyntaxErrorException::notAtTheStartOfASelector('scope');
}
}
continue;
}
```
Explanation:
The old code did not validate the position of the `:scope` pseudo-element in CSS selectors. The `:scope` pseudo-element should only be allowed at the start of a selector or after a comma (in selector lists), but the original parser did not enforce this restriction. An attacker could craft malicious CSS selectors with `:scope` in invalid positions, potentially causing unexpected parser behavior or exploiting downstream processing logic. The fix adds validation to ensure `:scope` appears only in valid positions, preventing CSS selector injection attacks that could bypass security filters or cause unintended DOM manipulation.
---
Vulnerability Existed: no
Improper Null Comparison - CWE-480 - vendor/symfony/css-selector/Parser/Parser.php Line 251
Old Code:
```php
if (empty($arguments)) {
```
Fixed Code:
```php
if (!$arguments) {
```
Explanation:
This is not a security vulnerability but a code quality improvement. The change from `empty($arguments)` to `!$arguments` is functionally equivalent for array validation and is actually more explicit about the intent (checking for a falsy value). This is a best practice refactoring rather than a security fix, though it does make the code slightly more consistent with modern PHP standards.
CVE Analysis Results:
CVE-2025-13964: Yes
View CVE Description
The LearnPress – WordPress LMS Plugin plugin for WordPress is vulnerable to unauthorized modification of data due to a missing capability check on the catch_lp_ajax function in all versions up to, and including, 4.3.2. This makes it possible for unauthenticated attackers to modify course contents by adding/removing/updating/re-ordering sections or modifying section items.
Showing 1 to 1 of 1 results