Skip to content

Commit

Permalink
PHP Mailer just needed another patch
Browse files Browse the repository at this point in the history
Sorry for the inconvienience
  • Loading branch information
NorHei committed Dec 28, 2016
1 parent fee3215 commit 1f582e0
Show file tree
Hide file tree
Showing 5 changed files with 55 additions and 13 deletions.
4 changes: 2 additions & 2 deletions wbce/admin/interface/version.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,12 @@
}

// set WBCE version and release tag
define('NEW_WBCE_VERSION', '1.1.9');
define('NEW_WBCE_VERSION', '1.1.10');
if (!defined('WBCE_VERSION')) {
define('WBCE_VERSION', NEW_WBCE_VERSION);
}

define('NEW_WBCE_TAG', '1.1.9');
define('NEW_WBCE_TAG', '1.1.10');
if (!defined('WBCE_TAG')) {
define('WBCE_TAG', NEW_WBCE_TAG);
}
Expand Down
2 changes: 1 addition & 1 deletion wbce/include/phpmailer/VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
5.2.19
5.2.21
56 changes: 49 additions & 7 deletions wbce/include/phpmailer/class.phpmailer.php
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ class PHPMailer
* The PHPMailer Version number.
* @var string
*/
public $Version = '5.2.19';
public $Version = '5.2.21';

/**
* Email priority.
Expand Down Expand Up @@ -1364,19 +1364,24 @@ public function postSend()
*/
protected function sendmailSend($header, $body)
{
if (!empty($this->Sender)) {
// CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
if ($this->Mailer == 'qmail') {
$sendmail = sprintf('%s -f%s', escapeshellcmd($this->Sendmail), escapeshellarg($this->Sender));
$sendmailFmt = '%s -f%s';
} else {
$sendmail = sprintf('%s -oi -f%s -t', escapeshellcmd($this->Sendmail), escapeshellarg($this->Sender));
$sendmailFmt = '%s -oi -f%s -t';
}
} else {
if ($this->Mailer == 'qmail') {
$sendmail = sprintf('%s', escapeshellcmd($this->Sendmail));
$sendmailFmt = '%s';
} else {
$sendmail = sprintf('%s -oi -t', escapeshellcmd($this->Sendmail));
$sendmailFmt = '%s -oi -t';
}
}

// TODO: If possible, this should be changed to escapeshellarg. Needs thorough testing.
$sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);

if ($this->SingleTo) {
foreach ($this->SingleToArray as $toAddr) {
if (!@$mail = popen($sendmail, 'w')) {
Expand Down Expand Up @@ -1422,6 +1427,40 @@ protected function sendmailSend($header, $body)
return true;
}

/**
* Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
*
* Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
* @param string $string The string to be validated
* @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
* @access protected
* @return boolean
*/
protected static function isShellSafe($string)
{
// Future-proof
if (escapeshellcmd($string) !== $string
or !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))
) {
return false;
}

$length = strlen($string);

for ($i = 0; $i < $length; $i++) {
$c = $string[$i];

// All other characters have a special meaning in at least one common shell, including = and +.
// Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
// Note that this does permit non-Latin alphanumeric characters based on the current locale.
if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
return false;
}
}

return true;
}

/**
* Send mail using the PHP mail() function.
* @param string $header The message headers
Expand All @@ -1442,7 +1481,10 @@ protected function mailSend($header, $body)
$params = null;
//This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
$params = sprintf('-f%s', escapeshellarg($this->Sender));
// CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
if (self::isShellSafe($this->Sender)) {
$params = sprintf('-f%s', $this->Sender);
}
}
if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
$old_from = ini_get('sendmail_from');
Expand Down
2 changes: 1 addition & 1 deletion wbce/include/phpmailer/class.pop3.php
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ class POP3
* @var string
* @access public
*/
public $Version = '5.2.19';
public $Version = '5.2.21';

/**
* Default POP3 port number.
Expand Down
4 changes: 2 additions & 2 deletions wbce/include/phpmailer/class.smtp.php
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ class SMTP
* The PHPMailer SMTP version number.
* @var string
*/
const VERSION = '5.2.19';
const VERSION = '5.2.21';

/**
* SMTP line break constant.
Expand Down Expand Up @@ -81,7 +81,7 @@ class SMTP
* @deprecated Use the `VERSION` constant instead
* @see SMTP::VERSION
*/
public $Version = '5.2.19';
public $Version = '5.2.21';

/**
* SMTP server port number.
Expand Down

0 comments on commit 1f582e0

Please sign in to comment.