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

mode patchdiff ai claude_cli haiku
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
Use quotes for exact: "SQL injection" · Operators: hello AND bye, admin OR root, -error, NOT warning
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