SecurityPatch 9652: Возможные проблемы после применения SUPEE-9652
Magento выпустила исправление безопасности SUPEE-9652
для Magento 1.x CE и EE
Я просто хочу знать каковы возможные проблемы после применения этого исправления безопасности и каковы новые изменения в этом исправлении безопасности?
4 answers
Это супер крошечный патч, вот разница:
diff --git lib/Zend/Mail/Transport/Sendmail.php lib/Zend/Mail/Transport/Sendmail.php
index b24026b..9323f58 100644
--- lib/Zend/Mail/Transport/Sendmail.php
+++ lib/Zend/Mail/Transport/Sendmail.php
@@ -119,14 +119,19 @@ class Zend_Mail_Transport_Sendmail extends Zend_Mail_Transport_Abstract
);
}
- set_error_handler(array($this, '_handleMailErrors'));
- $result = mail(
- $this->recipients,
- $this->_mail->getSubject(),
- $this->body,
- $this->header,
- $this->parameters);
- restore_error_handler();
+ // Sanitize the From header
+ if (!Zend_Validate::is(str_replace(' ', '', $this->parameters), 'EmailAddress')) {
+ throw new Zend_Mail_Transport_Exception('Potential code injection in From header');
+ } else {
+ set_error_handler(array($this, '_handleMailErrors'));
+ $result = mail(
+ $this->recipients,
+ $this->_mail->getSubject(),
+ $this->body,
+ $this->header,
+ $this->parameters);
+ restore_error_handler();
+ }
}
if ($this->_errstr !== null || !$result) {
Однако Питер О'Каллаган (единственный и неповторимый), похоже, обнаружил ошибку. Он мягко поделился со мной деталями и сказал, что я могу поделиться ими с вами здесь, так что вот оно:
Лучшее, что я могу сказать, значение
$this->params
всегда будет иметь префикс-f
в момент добавления проверки (она передается в конструктор в момент добавления пути возврата). Поэтому в тот момент, когда это прошло для проверки, если я настроил свою электронную почту[email protected]
, значение, которое на самом деле проверяется, равно[email protected]
, кажется скорее случайностью, чем намерением, чтобы это произошло для проверки в качестве адреса электронной почты. Если бы мой адрес электронной почты был"example"@example.com
, то он стал бы-f"example"@example.com
, что не подтвердится. Кстати,str_replace
кажется совершенно излишним в этом вопросе , учитывая, что пробел AFAIK может использоваться только в сочетании с кавычками, а электронные письма с кавычками не будут подтверждаться с помощью-f
префикс. На самом деле , если бы не было префикса, то str_replace и validate не были бы полезны, потому что"foo bar"@example.com
и"foobar"@example.com
оба проверяют, поскольку последнее никогда ничему не присваивается после замены, электронное письмо все равно будет отправлено с использованием первого значения, которое, по-видимому, все еще будет уязвимым.
Две другие вещи, которые следует иметь в виду:
- Версия исправления CE также содержит "EE_1.14.3.1", указанную в качестве версии. Это не влияет применяя, просто добавляет неправильную версию в
app/etc/applied.patches.list
, это кажется немного странным. (источник: https://twitter.com/JohnHughes1984/status/829050203139358720) - Если у вас отключены настройки электронной почты (см. Здесь: https://magento.com/security/news/new-zend-framework-1-security-vulnerability ), с этим нет никакой спешки, НО вам придется это сделать, потому что для любого нового исправления потребуется установить это (так как они идут друг на друга).
Сторона примечание
Соответствующий новый выпуск Magento CE 1.9.3.2 также включает обновление года комментариев об авторских правах (с 2016 по 2017 год), поэтому почти все файлы Magento были обновлены, и разница выглядит огромной
Небольшой совет по обновлению; после копирования новой версии поверх существующей установки запустите git diff -w --stat=400 | grep -v " 2 +”
, чтобы быстро просмотреть различия, которые содержат больше изменений, чем просто изменение уведомления об авторских правах.
Исправление безопасности 9652 влияет только на следующий файл:
/lib/Zend/Mail/Transport/Sendmail.php
Для таких, как я, кто задается вопросом, что делать без доступа SSH: редактировать файл/lib/Zend/Mail/Transport/Sendmail.php
Начиная со строки 122 и далее, замените это:
set_error_handler(array($this, '_handleMailErrors'));
$result = mail(
$this->recipients,
$this->_mail->getSubject(),
$this->body,
$this->header,
$this->parameters);
restore_error_handler();
С помощью этого:
// Sanitize the From header
if (!Zend_Validate::is(str_replace(' ', '', $this->parameters), 'EmailAddress')) {
throw new Zend_Mail_Transport_Exception('Potential code injection in From header');
} else {
set_error_handler(array($this, '_handleMailErrors'));
$result = mail(
$this->recipients,
$this->_mail->getSubject(),
$this->body,
$this->header,
$this->parameters);
restore_error_handler();
}