Back to blog
Security 4 min read

Automatically upgrade all PHPMailer installs on your server

Patch critical remote code execution vulnerabilities across multiple PHPMailer installations with a single command.

29 December 2016

Critical security vulnerabilities

Kritieke beveiligingskwetsbaarheden

Vulnerabilidades de seguridad críticas

This post addresses CVE-2016-10033 and CVE-2016-10045 — critical remote code execution vulnerabilities in PHPMailer. If you're running PHPMailer < 5.2.20, upgrade immediately.

Deze post behandelt CVE-2016-10033 en CVE-2016-10045 — kritieke remote code execution kwetsbaarheden in PHPMailer. Als je PHPMailer < 5.2.20 draait, upgrade dan onmiddellijk.

Este artículo aborda CVE-2016-10033 y CVE-2016-10045 — vulnerabilidades críticas de ejecución remota de código en PHPMailer. Si estás ejecutando PHPMailer < 5.2.20, actualiza inmediatamente.

The vulnerabilities

Security researcher Dawid Golunski discovered two critical vulnerabilities in PHPMailer that allow remote code execution:

  • CVE-2016-10033: PHPMailer < 5.2.18 Remote Code Execution
  • CVE-2016-10045: PHPMailer < 5.2.20 Remote Code Execution (0day Patch Bypass)

The second vulnerability was a bypass of the initial patch, which is why you need version 5.2.20 or higher to be fully protected.

The problem: multiple installations

If you manage servers hosting multiple PHP applications, you likely have PHPMailer installed in dozens of different locations — each WordPress site, each Laravel project, each custom application. Manually upgrading each one is time-consuming and error-prone.

The solution: automated upgrade script

I created upgrade-phpmailer.sh, a shell script that automatically finds and upgrades all PHPMailer installations on your server. It downloads the latest secure version from GitHub and replaces the core files while creating backups.

Files updated

The script upgrades these three core PHPMailer components:

  • class.phpmailer.php
  • class.pop3.php
  • class.smtp.php

Basic usage

# Download the script
wget https://gist.githubusercontent.com/Magentron/...upgrade-phpmailer.sh

# Make it executable
chmod +x upgrade-phpmailer.sh

# Run on your web directories
./upgrade-phpmailer.sh /var/www /home/*/public_html

Command options

# Dry run - see what would be upgraded without making changes
./upgrade-phpmailer.sh -n /var/www

# Verbose output
./upgrade-phpmailer.sh -v /var/www

# Debug mode
./upgrade-phpmailer.sh -d /var/www

# Custom backup directory
./upgrade-phpmailer.sh -D /backups/phpmailer /var/www

# Specify GitHub branch
./upgrade-phpmailer.sh -B v5.2.21 /var/www

How it works

  1. Finds installations: Recursively searches specified directories for class.phpmailer.php
  2. Creates backups: Copies existing files with .BACKUP extension before replacing
  3. Downloads latest version: Fetches current files from the official PHPMailer GitHub repository
  4. Preserves permissions: Maintains original file ownership and permissions

Verification

After running the script, verify the upgrade by checking the version in the PHPMailer class:

grep "VERSION" /path/to/class.phpmailer.php
# Should show: public $Version = '5.2.21';

Lessons learned

This incident highlights several important security practices:

  • Use Composer: Modern dependency management makes security updates much easier
  • Monitor CVEs: Subscribe to security advisories for libraries you use
  • Automate patching: Have scripts ready for emergency security updates
  • Audit your servers: Know what software is installed and where

Need help with security auditing or patching? Get in touch.

De kwetsbaarheden

Beveiligingsonderzoeker Dawid Golunski ontdekte twee kritieke kwetsbaarheden in PHPMailer die remote code execution mogelijk maken:

  • CVE-2016-10033: PHPMailer < 5.2.18 Remote Code Execution
  • CVE-2016-10045: PHPMailer < 5.2.20 Remote Code Execution (0day Patch Bypass)

De tweede kwetsbaarheid was een bypass van de initiële patch, wat de reden is dat je versie 5.2.20 of hoger nodig hebt om volledig beschermd te zijn.

Het probleem: meerdere installaties

Als je servers beheert die meerdere PHP-applicaties hosten, heb je waarschijnlijk PHPMailer op tientallen verschillende locaties geïnstalleerd — elke WordPress site, elk Laravel project, elke custom applicatie. Het handmatig upgraden van elk ervan is tijdrovend en foutgevoelig.

De oplossing: geautomatiseerd upgrade script

Ik heb upgrade-phpmailer.sh gemaakt, een shell script dat automatisch alle PHPMailer installaties op je server vindt en upgradet. Het downloadt de laatste veilige versie van GitHub en vervangt de core bestanden terwijl het backups maakt.

Bijgewerkte bestanden

Het script upgradet deze drie core PHPMailer componenten:

  • class.phpmailer.php
  • class.pop3.php
  • class.smtp.php

Basisgebruik

# Download het script
wget https://gist.githubusercontent.com/Magentron/...upgrade-phpmailer.sh

# Maak het uitvoerbaar
chmod +x upgrade-phpmailer.sh

# Voer uit op je web directories
./upgrade-phpmailer.sh /var/www /home/*/public_html

Command opties

# Dry run - zie wat geüpgraded zou worden zonder wijzigingen te maken
./upgrade-phpmailer.sh -n /var/www

# Verbose output
./upgrade-phpmailer.sh -v /var/www

# Debug modus
./upgrade-phpmailer.sh -d /var/www

# Custom backup directory
./upgrade-phpmailer.sh -D /backups/phpmailer /var/www

# Specificeer GitHub branch
./upgrade-phpmailer.sh -B v5.2.21 /var/www

Hoe het werkt

  1. Vindt installaties: Zoekt recursief in gespecificeerde directories naar class.phpmailer.php
  2. Maakt backups: Kopieert bestaande bestanden met .BACKUP extensie voordat ze vervangen worden
  3. Downloadt laatste versie: Haalt huidige bestanden op van de officiële PHPMailer GitHub repository
  4. Behoudt permissies: Handhaaft originele bestand ownership en permissies

Verificatie

Controleer na het uitvoeren van het script de upgrade door de versie in de PHPMailer class te checken:

grep "VERSION" /path/to/class.phpmailer.php
# Zou moeten tonen: public $Version = '5.2.21';

Geleerde lessen

Dit incident benadrukt verschillende belangrijke beveiligingspraktijken:

  • Gebruik Composer: Modern dependency management maakt security updates veel eenvoudiger
  • Monitor CVEs: Abonneer je op security advisories voor libraries die je gebruikt
  • Automatiseer patching: Heb scripts klaar staan voor nood security updates
  • Audit je servers: Weet welke software waar geïnstalleerd is

Hulp nodig bij security auditing of patching? Neem contact op.

Las vulnerabilidades

El investigador de seguridad Dawid Golunski descubrió dos vulnerabilidades críticas en PHPMailer que permiten la ejecución remota de código:

  • CVE-2016-10033: PHPMailer < 5.2.18 Ejecución Remota de Código
  • CVE-2016-10045: PHPMailer < 5.2.20 Ejecución Remota de Código (Bypass de Parche 0day)

La segunda vulnerabilidad fue un bypass del parche inicial, por lo que necesitas la versión 5.2.20 o superior para estar completamente protegido.

El problema: múltiples instalaciones

Si administras servidores que alojan múltiples aplicaciones PHP, probablemente tengas PHPMailer instalado en docenas de ubicaciones diferentes — cada sitio WordPress, cada proyecto Laravel, cada aplicación personalizada. Actualizar manualmente cada uno consume tiempo y es propenso a errores.

La solución: script de actualización automática

Creé upgrade-phpmailer.sh, un script de shell que encuentra y actualiza automáticamente todas las instalaciones de PHPMailer en tu servidor. Descarga la última versión segura desde GitHub y reemplaza los archivos principales mientras crea copias de seguridad.

Archivos actualizados

El script actualiza estos tres componentes principales de PHPMailer:

  • class.phpmailer.php
  • class.pop3.php
  • class.smtp.php

Uso básico

# Descargar el script
wget https://gist.githubusercontent.com/Magentron/...upgrade-phpmailer.sh

# Hacerlo ejecutable
chmod +x upgrade-phpmailer.sh

# Ejecutar en tus directorios web
./upgrade-phpmailer.sh /var/www /home/*/public_html

Opciones de comando

# Ejecución en seco - ver qué se actualizaría sin hacer cambios
./upgrade-phpmailer.sh -n /var/www

# Salida detallada
./upgrade-phpmailer.sh -v /var/www

# Modo debug
./upgrade-phpmailer.sh -d /var/www

# Directorio de backup personalizado
./upgrade-phpmailer.sh -D /backups/phpmailer /var/www

# Especificar rama de GitHub
./upgrade-phpmailer.sh -B v5.2.21 /var/www

Cómo funciona

  1. Encuentra instalaciones: Busca recursivamente en los directorios especificados class.phpmailer.php
  2. Crea copias de seguridad: Copia los archivos existentes con extensión .BACKUP antes de reemplazarlos
  3. Descarga la última versión: Obtiene los archivos actuales del repositorio oficial de PHPMailer en GitHub
  4. Preserva permisos: Mantiene la propiedad y permisos originales de los archivos

Verificación

Después de ejecutar el script, verifica la actualización comprobando la versión en la clase PHPMailer:

grep "VERSION" /path/to/class.phpmailer.php
# Debería mostrar: public $Version = '5.2.21';

Lecciones aprendidas

Este incidente destaca varias prácticas de seguridad importantes:

  • Usa Composer: La gestión moderna de dependencias hace que las actualizaciones de seguridad sean mucho más fáciles
  • Monitorea CVEs: Suscríbete a avisos de seguridad para las bibliotecas que utilizas
  • Automatiza el parcheo: Ten scripts listos para actualizaciones de seguridad de emergencia
  • Audita tus servidores: Conoce qué software está instalado y dónde

¿Necesitas ayuda con auditoría de seguridad o parcheo? Ponte en contacto.

Related posts