Remediation report
PHP2Shell remediation verification
Health score
GoodNeeds workAt risk
Before 48
Before 31
Before 58
Before 38
Before 92
Scores summarise the checks in this report, weighted 40% security, 25% backups, 20% updates and 15% performance. They describe risk at the recorded time and are not a certification.
1Executive summary
The production web server was running PHP 8.3.35, which is affected by both PHP2Shell vulnerabilities. During the agreed maintenance window we updated PHP to 8.3.36, restarted all PHP-FPM workers and confirmed that the application now serves traffic from the patched runtime. All agreed functional checks passed and no new errors were recorded.
The review also found an end-of-life PHP 7.4 pool outside the agreed scope, a pending kernel reboot and gaps in backup coverage. They do not affect the PHP2Shell fix, but they should be addressed. Each is listed with a priority in the recommendations.
- PHP2Shell status
- Patched
- Functional checks
- 8 of 8 passed
- Downtime
- None observed
- Follow-up actions
- 6, including 2 high priority
2Scope and method
In scope
- One production server,
web-01 - PHP-FPM pool
wwwserving the shop application - PHP CLI used by scheduled tasks
- Agreed checks for login, search, checkout, forms, uploads and scheduled tasks
Out of scope
- PHP 7.4 pool
legacy(reported, not changed) - Database server internals and application code
- Malware or compromise investigation
- Staging and development environments
Method
Read-only inventory over SSH with a time-limited key; package provenance checked against the vendor repository and the PHP advisory; a boot-verified snapshot before any change; the update applied through the system package manager; worker restarts; functional checks with the client’s test accounts. Temporary access was removed at 22:31.
3Server inventory
Recorded at the start of the work window, before any change.
| Hostname | web-01.example-retail.test |
|---|---|
| Role | Production web and application server |
| Hosting | Virtual private server, 4 vCPU, 8 GB memory |
| Operating system | Ubuntu 24.04.3 LTS |
| Running kernel | 6.8.0-85-generic Newer kernel installed, reboot pending |
| Uptime | 142 days |
| Disk | 80 GB system volume, 61% used |
| Web server | nginx 1.24.0 |
| PHP-FPM pools | www (PHP 8.3), legacy (PHP 7.4) |
| Database | MySQL 8.0.43 on a separate managed host |
| PHP package source | ppa:ondrej/php |
| Automatic security updates | Disabled |
| Time synchronisation | Active |
| Monitoring | Uptime check only; no alerts for resources or application errors |
4PHP runtimes
Every PHP binary and pool on the server was identified, including those outside the agreed scope.
| Runtime | Serves | Before | After | Status |
|---|---|---|---|---|
php8.3-fpm / www | Shop application | 8.3.35 | 8.3.36 | Patched |
php8.3-cli | Scheduled tasks | 8.3.35 | 8.3.36 | Patched |
php7.4-fpm / legacy | Archived shop at /old-shop | 7.4.33 | 7.4.33 | Action needed |
PHP 7.4 has been end of life since November 2022 and receives no upstream security fixes. Exposure of the legacy pool could not be ruled out from version evidence alone; see recommendation R1.
Configuration observations
expose_phpis disabled anddisplay_errorsis off in production.- OPcache is enabled with 128 MB of memory, sufficient for the application.
session.upload_progress.enabledis on but not used by the application.- Each pool runs as its own system user with a separate socket.
5Vulnerability status
| Advisory | Affected runtime | Before | After | Evidence |
|---|---|---|---|---|
CVE-2026-109618 | php8.3 | Affected | Fixed | Package changelog and running version |
CVE-2026-109619 | php8.3 | Affected | Fixed | Package changelog and running version |
CVE-2026-109618, CVE-2026-109619 | php7.4 | Not assessed | Not assessed | Outside the agreed scope |
A vendor-backported fix may have a different version number. The actual report uses the relevant vendor advisory. A successful patch verification does not establish that an environment was never compromised.
6Backups and recovery
Backups were reviewed before any change. The update could start only after a verified snapshot existed.
| Backup | Schedule | Last success | Retention | Location | Restore test |
|---|---|---|---|---|---|
| Database dump | Daily, 03:15 | 2026-10-22 03:16 | 14 days | Off-site, encrypted | Never |
| Application files | Daily, 03:40 | 2026-10-22 03:52 | 14 days | Same provider, separate volume | Never |
| Pre-change server snapshot | Taken for this work | 2026-10-22 21:04 | 7 days | Hosting provider | Boot verified |
Findings
- The file backup excludes
/var/www/shop/uploads, where about 6.2 GB of customer documents are stored. - No restore test has been recorded for either scheduled backup. A backup that has never been restored cannot be relied on for recovery.
- Database dumps are encrypted and stored with a different provider, which protects them if the server or hosting account is lost.
Rollback plan for this change
Reinstall the previous PHP packages from the local package cache and reload PHP-FPM, or boot the pre-change snapshot. Estimated recovery time: 15 minutes. Rollback was not needed.
7Change log
| Time | Action | Result |
|---|---|---|
21:00 | Access opened; baseline of versions, services and response times recorded | Completed |
21:04 | Pre-change server snapshot created and boot-verified | Completed |
21:12 | Baseline functional checks run | 8 of 8 passed |
21:18 | PHP 8.3 packages updated from 8.3.35 to 8.3.36 | Completed |
21:20 | PHP-FPM restarted; no workers from the old version remain | Completed |
21:24 | Running version confirmed through the web server and CLI | Completed |
21:31 | Post-change functional checks run | 8 of 8 passed |
21:55 | Error logs and response times monitored for 20 minutes | No new errors |
22:31 | Temporary access key removed and session closed | Completed |
8Post-change verification
| Check | Method | Result |
|---|---|---|
| PHP version served to web requests | Temporary diagnostic script, removed after use | 8.3.36 |
| PHP-FPM workers | Process list and service status | Pass |
| Customer login | Client test account | Pass |
| Administrator login | Client test account | Pass |
| Product search | Three search terms agreed with the client | Pass |
| Checkout | Test order in payment provider test mode | Pass |
| Contact form | Test submission, delivery confirmed by the client | Pass |
| File upload | Test document uploaded and downloaded | Pass |
| Password reset email | Test account, email received | Pass |
| Scheduled tasks | Next scheduled run checked in the logs | Pass |
| Error log | 30 minutes before and after the change compared | No new errors |
| Home page response time | Median of 20 requests | 182 ms → 176 ms |
9Findings and recommendations
Ordered by priority. None of these items blocks the PHP2Shell fix.
| ID | Priority | Finding | Recommendation |
|---|---|---|---|
R1 | High | The PHP 7.4 pool is end of life and may be exposed. | Retire the archived shop or restrict it to authenticated users. If it must stay online, migrate it to a supported PHP version. Quoted separately. |
R2 | High | A newer kernel is installed but not running; the server has not been restarted for 142 days. | Schedule a reboot in the next maintenance window and confirm the running kernel afterwards. |
R3 | Medium | 23 operating-system updates are pending, including OpenSSL and nginx. | Apply them in a planned window and enable automatic security updates. |
R4 | Medium | Backups have never been restore-tested, and the file backup excludes customer uploads. | Add the uploads directory to the file backup and run a documented restore test every quarter. |
R5 | Low | Upload progress tracking is enabled but not used. | Disable session.upload_progress.enabled to reduce the attack surface. |
R6 | Low | Monitoring covers uptime only. | Add alerts for disk space, PHP-FPM saturation and application errors. |
10Evidence and handover
- Environment identifiers and the agreed work window
- Package source, full version and applicable vendor advisory
- Backup reference, change log and process restart evidence
- Agreed functional checks, results and limitations
- Complete command transcript and package changelog excerpts
11Limitations
The report covers the agreed environment and checks at the recorded time. It is not a security certification, a guarantee against future vulnerabilities or a finding that no previous compromise occurred. Suspected compromise requires separate investigation.