Of 19,000 PHP vulnerabilities, 35 are being exploited. Here they are.
We ranked every PHP engine, Composer and WordPress CVE by real-world exploitation (CISA KEV + EPSS) instead of CVSS. A quarter of 'critical' CVEs have under 1% exploitation probability; the bugs attackers actually use are listed below.
Why we counted
Every PHP dependency scanner we tried sorts findings by CVSS. That produces a wall of red: in this feed 5,708 of 19,264 CVEs are rated high or critical. Nobody fixes 5,708 things, so the list gets ignored, which is worse than no list at all. We wanted to know how much of that red is real.
So we took every advisory phpwarden knows about — 8,599 Composer package advisories, 12,328 WordPress plugin/theme/core advisories and the PHP engine CVEs — and joined each one to two signals of real-world exploitation: CISA's Known Exploited Vulnerabilities catalog (confirmed in-the-wild exploitation) and FIRST's EPSS (a daily-updated probability that a CVE will be exploited in the next 30 days). 17,929 of the 19,264 have an EPSS score.
1. The feed by CVSS severity
This is what a CVSS-sorted scanner sees. 30% of everything is "high" or "critical".
2. The feed by actual exploitation
Exactly 35 of the 19,264 CVEs — 0.18% — are in CISA KEV. Widen the net to "EPSS says ≥10% chance of exploitation in the next 30 days" and you get 667 (3%). At ≥50% it is 226. The number of things a PHP team realistically needs to drop everything for is in the tens, not the thousands.
3. "Critical" is a weak predictor
There are 1,446 CVEs scored 9.0 or higher. 351 of them (24%) have an EPSS below 1% — attackers have shown essentially no interest. Only 270 (19%) clear a 10% EPSS. Meanwhile 156 CVEs with a CVSS under 7.0 ("medium" or lower) have an EPSS of 10% or more, and 5 of the 35 KEV entries are rated medium or carry no CVSS at all.
A few of the 9.0+ CVEs nobody is exploiting, to make the point concrete:
CVE-2019-3809— Moodle Blind SSRF Risk in /badges/mybackpack.php moodle/moodle CVSS 10.0, EPSS 0.84%CVE-2022-45822— Unauth. SQL Injection (SQLi) vulnerability in Advanced Booking Calendar plugin <= 1.7.1 on advanced-booking-calendar (WordPress plugin) CVSS 10.0, EPSS 0.81%CVE-2023-51419— Unrestricted Upload of File with Dangerous Type vulnerability in Bertha.Ai BERTHA AI. Your bertha-ai (WordPress plugin) CVSS 10.0, EPSS 0.63%CVE-2024-50496— Unrestricted Upload of File with Dangerous Type vulnerability in webandprint AR For WordPr ar (WordPress plugin) CVSS 10.0, EPSS 0.51%CVE-2024-8615— The JobSearch WP Job Board plugin for WordPress is vulnerable to arbitrary file uploads du jobsearch-wp-job-board (WordPress plugin) CVSS 10.0, EPSS 0.86%CVE-2025-46337— SQL injection in ADOdb PostgreSQL driver pg_insert_id() method adodb/adodb-php CVSS 10.0, EPSS 0.74%
None of these is "safe" — a patch is still the right answer. But if you have one afternoon, it should not go to these.
4. The 35 that are actually being exploited
Ranked by EPSS. Every row links to its advisory page with affected and fixed versions.
| CVE | What | Affects | Severity | EPSS |
|---|---|---|---|---|
CVE-2017-9841 | Code Injection in PHPUnit | phpunit/phpunit | critical 9.8 | 100% |
CVE-2026-109618 | Upload-progress use-after-free and remote process-memory disclosure | PHP engine | critical 9.2 | 100% |
CVE-2026-109619 | Fatal-error backtrace use-after-free and OPcache type confusion | PHP engine | critical 9.2 | 100% |
CVE-2024-34102 | Magento Open Source affected by an Improper Restriction of XML External Entity Reference ('XXE') vulnerability | magento/community-edition, magento/product-community-edition | critical 9.8 | 100% |
CVE-2018-7600 | A remote code execution vulnerability exists within multiple subsystems of Drupal 7.x and 8.x. This potentiall | drupal/core, drupal/drupal | critical 9.8 | 100% |
CVE-2024-4577 | PHP-CGI argument injection to RCE on Windows via Best-Fit encoding | PHP engine | critical 9.8 | 100% |
CVE-2021-3129 | Unauthenticated remote code execution via insecure file handling in debug mode | facade/ignition | critical 9.8 | 100% |
CVE-2025-32432 | Craft CMS Allows Remote Code Execution | craftcms/cms | critical 10.0 | 100% |
CVE-2019-11043 | PHP-FPM remote code execution via env_path_info buffer underflow | PHP engine | critical 9.8 | 100% |
CVE-2016-10033 | Remote code execution via crafted Sender in the isMail transport | phpmailer/phpmailer | critical 9.8 | 100% |
CVE-2025-49113 | Roundcube Webmail Vulnerable to Authenticated RCE via PHP Object Deserialization | roundcube/roundcubemail | critical 9.9 | 100% |
CVE-2022-24086 | Magento improper input validation vulnerability | magento/community-edition | critical 9.8 | 99% |
CVE-2018-7602 | A remote code execution vulnerability exists within multiple subsystems of Drupal 7.x and 8.x. This potentiall | drupal/core, drupal/drupal | critical 9.8 | 99% |
CVE-2021-21311 | SSRF in adminer | vrana/adminer | high 7.2 | 98% |
CVE-2020-11738 | The Snap Creek Duplicator plugin before 1.3.28 for WordPress (and Duplicator Pro before 3.8.7.1) allows Direct | duplicator (WordPress plugin) | high 7.5 | 98% |
CVE-2024-56145 | Craft CMS has potential RCE when PHP `register_argc_argv` config setting is enabled | craftcms/cms | critical 9.8 | 97% |
CVE-2020-25213 | Unauthenticated arbitrary file upload to RCE via the elFinder connector | wp-file-manager (WordPress plugin) | critical 10.0 | 97% |
CVE-2025-54068 | Livewire is vulnerable to remote command execution during component property update hydration | livewire/livewire | critical 9.8 | 96% |
CVE-2025-54236 | Magento Community Edition Improper Input Validation vulnerability | magento/community-edition, magento/project-community-edition | critical 9.1 | 95% |
CVE-2019-6340 | Some field types do not properly sanitize data from non-form sources. This can lead to arbitrary PHP code exec | drupal/core, drupal/drupal | high 8.1 | 92% |
CVE-2021-32648 | Account Takeover in Octobercms | october/system | high 8.2 | 90% |
CVE-2026-9082 | Drupal core includes a database abstraction API to ensure that queries executed against the database are sanit | drupal/core | critical 9.8 | 89% |
CVE-2020-35489 | Unrestricted file upload via unsanitised filenames (double extension) | contact-form-7 (WordPress plugin) | critical 10.0 | 89% |
CVE-2024-58136 | yiisoft/yii2 Mishandles the Attaching of Behavior Defined by a `__class` Array Key | yiisoft/yii2 | critical 9.0 | 88% |
CVE-2020-11023 | Potential XSS vulnerability in jQuery | components/jquery | medium 6.9 | 85% |
CVE-2020-28949 | Potential file overwrite if archive filename starts with file:// | pear/archive_tar | unknown 0.0 | 85% |
CVE-2018-15133 | Laravel Framework RCE Vulnerability | laravel/framework | high 8.1 | 77% |
CVE-2019-9978 | The social-warfare plugin before 3.5.3 for WordPress has stored XSS via the wp-admin/admin-post.php?swp_debug= | social-warfare (WordPress plugin), social-warfare-pro (WordPress plugin) | medium 6.1 | 73% |
CVE-2020-36193 | Directory Traversal in Archive_Tar | pear/archive_tar | high 7.5 | 71% |
CVE-2024-28000 | Unauthenticated privilege escalation to administrator via weak hash in the crawler | litespeed-cache (WordPress plugin) | critical 9.8 | 68% |
CVE-2020-13671 | *Update November 18: Documented longer list of dangerous file extensions* Drupal core does not properly sanit | drupal/core, drupal/drupal | high 8.8 | 36% |
CVE-2025-23209 | Craft CMS has a potential RCE with a compromised security key | craftcms/cms | high 8.0 | 22% |
CVE-2026-63030 | WordPress 6.9.x before 6.9.5 and 7.0.x before 7.0.2 is affected by a REST API batch endpoint route confusion i | WordPress core | critical 9.8 | 11% |
CVE-2026-60137 | WordPress 6.8.x before 6.8.6, 6.9.x before 6.9.5, and 7.0.x before 7.0.2 does not properly sanitise the author | WordPress core | medium 5.9 | 5% |
CVE-2025-35939 | Craft CMS stores arbitrary content provided by unauthenticated users in session files | craftcms/cms | medium 5.3 | 1% |
Where they cluster
By package: drupal/core (5), PHP engine (4), drupal/drupal (4), craftcms/cms (4), magento/community-edition (3), pear/archive_tar (2), WordPress core (2), phpunit/phpunit (1). CMS cores dominate — Drupal, Craft, Magento, WordPress — because an unauthenticated RCE in a CMS is worth automating at internet scale, and those are exactly the bugs that get automated.
Two of them are dev dependencies
CVE-2017-9841 (phpunit/phpunit) and CVE-2021-3129 (facade/ignition) are in KEV with an EPSS near 100%.
Neither should exist on a production server: PHPUnit's eval-stdin.php and Ignition's debug error page are
only reachable when require-dev packages were deployed. composer install --no-dev in your deploy
step removes an entire class of these, and a scanner that checks whether a vulnerable package is actually
reachable from your code will tell you which of the rest matter.
The PHP engine itself
4 engine CVEs are in KEV: CVE-2026-109618, CVE-2026-109619, CVE-2024-4577, CVE-2019-11043. These are the ones where "which
PHP version are you on" is the whole question — and because PHP backports fixes per branch, the right check is "is 8.2.x
at or above the fixed release for 8.2", not "are you on the latest major". An end-of-life branch has no fixed release at all.
5. Exploited, but not (yet) in KEV
KEV is curated and lags; EPSS moves daily. These have the highest EPSS of anything not in the catalog. If your scanner only knows about KEV, it does not know about these.
| CVE | What | Affects | Severity | EPSS |
|---|---|---|---|---|
CVE-2020-11022 | Potential XSS vulnerability in jQuery | athlon1600/youtube-downloader, components/jquery +1 | medium 6.9 | 99% |
CVE-2022-39986 | RaspAP Command Injection vulnerability | billz/raspap-webgui | critical 9.8 | 99% |
CVE-2022-24637 | Improper Privilege Management in Open Web Analytics | open-web-analytics/open-web-analytics | critical 9.8 | 99% |
CVE-2018-12613 | phpMyAdmin Improper Authentication | phpmyadmin/phpmyadmin | high 8.8 | 98% |
CVE-2023-6553 | The Backup Migration plugin for WordPress is vulnerable to Remote Code Execution in all versions up to, and in | backup-backup (WordPress plugin) | critical 9.8 | 98% |
CVE-2022-21661 | WordPress is a free and open-source content management system written in PHP and paired with a MariaDB databas | WordPress core | high 8.0 | 98% |
CVE-2016-10045 | Remote code execution in PHPMailer | phpmailer/phpmailer | critical 9.8 | 98% |
CVE-2023-0315 | Froxlor vulnerable to Command Injection | froxlor/froxlor | high 8.8 | 98% |
CVE-2019-9194 | elFinder command injection vulnerability in the PHP connector | studio-42/elfinder | critical 9.8 | 97% |
CVE-2020-11530 | A blind SQL injection vulnerability is present in Chop Slider 3, a WordPress plugin. The vulnerability is intr | chop-slider (WordPress plugin) | critical 9.8 | 95% |
6. When the bugs were published
2024 was the biggest year in the feed, driven by WordPress plugin advisories. Volume is not risk: most of the 35 exploited CVEs are years old. Attackers do not need new bugs when old ones still work on unpatched hosts.
What to do with this
- Sort by exploitation, not severity. KEV first, then EPSS, then CVSS. That is the order phpwarden uses, and it is
why its CI mode has a
fail-on: exploitedsetting instead of just a CVSS threshold. - Check reachability. A vulnerable package that nothing in your code calls is a lower priority than one on a
request path.
phpwarden deps composer.lockchecks whether each vulnerable package is referenced. - Deploy without dev dependencies. Two of the most-exploited PHP CVEs on earth only bite if you did not.
- Know your engine branch. 4 of the 35 are PHP itself;
phpwarden scancompares your exact version against the fixed release of your branch.
Check your own project in one command
Zero dependencies, offline, Apache-2.0. Ranks by KEV → EPSS → CVSS and checks reachability.
pipx install phpwarden
phpwarden deps composer.lock # Composer
phpwarden scan # PHP engine on this host
phpwarden wordpress /var/www/html # WordPress core, plugins, themes
Or in CI: uses: primeagent001-bot/phpwarden-action@v1
with fail-on: exploited.
Method and caveats
- Data: the phpwarden feed, version 2026.10.28.1, built from OSV.dev, FriendsOfPHP/security-advisories and NVD (WordPress), enriched with CISA KEV and FIRST EPSS. 19,264 distinct CVEs, 20,935 (package, CVE) pairs. Browse it at /advisories.
- "Critical" means CVSS base score ≥ 9.0 as recorded by the source advisory. 1,051 CVEs have no score.
- EPSS is a probability for the next 30 days, as of the feed date; it changes daily. KEV membership is as of the feed date.
- EPSS and KEV measure exploitation on the internet at large, not in your environment. An unexploited bug on a high-value target is still a bug. The claim here is about priority, not about ignoring anything.
- Regenerate:
scripts/build_blog.pyin the phpwarden repo.