Исправление безопасности SUPEE-10752 - Возможные проблемы?

14

Новое исправление безопасности для Magento 1, устраняющее 25 проблем APPSEC

https://magento.com/security/patches/supee-10752

Какие общие проблемы вы должны остерегаться при применении этого патча?

SUPEE-10752, Magento Commerce 1.14.3.9 и Open Source 1.9.3.9 содержат множество улучшений безопасности, которые помогают закрыть аутентифицированное удаленное выполнение кода администратором (RCE), подделку межсайтовых запросов (CSRF) и другие уязвимости.

Информация обо всех изменениях в выпусках 1.14.3.9 и 1.9.3.9 доступна в примечаниях к выпуску Magento Commerce и Magento Open Source.

Патчи и обновления доступны для следующих версий Magento:

Magento Commerce 1.9.0.0-1.14.3.9: SUPEE-10752 или обновление до Magento Commerce 1.14.3.9.

Magento Open Source 1.5.0.0-1.9.3.9: SUPEE-10752 или обновление до Magento Open Source 1.9.3.9.

Люк Роджерс
источник
Обнаружена
Шреник,

Ответы:

19

Как упомянуто в официальных документах Magento :

Конфликты во время установки исправления SUPEE-10752 чаще всего вызваны установкой версии 1 предыдущего исправления ( SUPEE-10570v1 ).

Обязательно удалите SUPEE-10570v1 и установите SUPEE-10570v2 до установки нового SUPEE-10752.

Meetanshi
источник
11

Указанные ниже файлы изменены / созданы после применения патча

app/code/core/Mage/Admin/Model/User.php
app/code/core/Mage/Adminhtml/Block/Catalog/Product/Composite/Fieldset/Options.php
app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Options/Option.php
app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Filter/Datetime.php
app/code/core/Mage/Adminhtml/Model/LayoutUpdate/Validator.php
app/code/core/Mage/Adminhtml/controllers/Catalog/CategoryController.php
app/code/core/Mage/Adminhtml/controllers/Catalog/ProductController.php
app/code/core/Mage/Adminhtml/controllers/Cms/Wysiwyg/ImagesController.php
app/code/core/Mage/Adminhtml/controllers/Cms/WysiwygController.php
app/code/core/Mage/Adminhtml/controllers/CustomerController.php
app/code/core/Mage/Adminhtml/controllers/System/StoreController.php
app/code/core/Mage/Catalog/Model/Product.php
app/code/core/Mage/Catalog/Model/Resource/Category/Tree.php
app/code/core/Mage/Checkout/Model/Api/Resource/Customer.php
app/code/core/Mage/Checkout/Model/Type/Onepage.php
app/code/core/Mage/Checkout/controllers/CartController.php
app/code/core/Mage/Core/Helper/Http.php
app/code/core/Mage/Core/Model/Session/Abstract/Varien.php
app/code/core/Mage/Customer/Helper/Data.php
app/code/core/Mage/Customer/Model/Resource/Customer.php
app/code/core/Mage/Customer/controllers/AccountController.php
app/code/core/Mage/Log/Model/Visitor.php
app/code/core/Mage/Usa/Helper/Data.php
app/code/core/Mage/Usa/Model/Shipping/Carrier/Abstract/Backend/Abstract.php
app/code/core/Mage/Usa/Model/Shipping/Carrier/Ups/Backend/Freemethod.php
app/code/core/Mage/Usa/Model/Shipping/Carrier/Ups/Backend/OriginShipment.php
app/code/core/Mage/Usa/Model/Shipping/Carrier/Ups/Backend/Type.php
app/code/core/Mage/Usa/etc/system.xml
app/code/core/Zend/Filter/PregReplace.php
app/code/core/Zend/Validate/EmailAddress.php
app/design/adminhtml/default/default/template/bundle/product/edit/bundle/option.phtml

app/design/adminhtml/default/default/template/system/shipping/ups.phtml
app/design/frontend/base/default/template/downloadable/catalog/product/links.phtml
app/design/frontend/base/default/template/downloadable/checkout/cart/item/default.phtml
app/design/frontend/base/default/template/downloadable/checkout/onepage/review/item.phtml
app/design/frontend/base/default/template/downloadable/sales/order/items/renderer/downloadable.phtml
app/design/frontend/rwd/default/template/downloadable/checkout/cart/item/default.phtml
app/design/frontend/rwd/default/template/downloadable/checkout/onepage/review/item.phtml
app/design/frontend/rwd/default/template/downloadable/sales/order/items/renderer/downloadable.phtml
app/locale/en_US/Mage_Catalog.csv
app/locale/en_US/Mage_Usa.csv
cron.php
js/tiny_mce/plugins/media/.htaccess
lib/Varien/Image/Adapter/Gd2.php

Для EE Edition следующие файлы добавляются кроме CE

app/code/core/Enterprise/CatalogEvent/Block/Adminhtml/Event/Grid.php
app/code/core/Enterprise/GiftRegistry/Block/Adminhtml/Giftregistry/Edit/Attribute/Attribute.php
app/code/core/Enterprise/GiftRegistry/Model/Attribute/Processor.php
app/code/core/Enterprise/Invitation/Block/Adminhtml/Invitation/Grid.php
app/code/core/Enterprise/Logging/Block/Adminhtml/Details/Renderer/Diff.php
app/code/core/Enterprise/Reward/Block/Adminhtml/Customer/Edit/Tab/Reward/History/Grid/Column/Renderer/Reason.php
app/code/core/Enterprise/TargetRule/Model/Rule.php
app/code/core/Enterprise/TargetRule/controllers/Adminhtml/TargetruleController.php
app/design/adminhtml/default/default/template/enterprise/cms/page/revision/info.phtml

app/design/frontend/enterprise/default/template/cms/hierarchy/pagination.phtml
app/design/frontend/enterprise/iphone/template/downloadable/checkout/cart/item/default.phtml
app/design/frontend/enterprise/iphone/template/downloadable/checkout/onepage/review/item.phtml
app/design/frontend/rwd/enterprise/template/cms/hierarchy/pagination.phtml

Приложение / код / ​​ядро ​​/ Mage / Admin / Модель / User.php

+            $sessionUser = $this->getSession()->getUser();
+            if ($sessionUser && $sessionUser->getId() == $this->getId()) {
+                $this->getSession()->setUserPasswordChanged(true);
+            }


+    /**
+     * @return Mage_Admin_Model_Session
+     */
+    protected function getSession()
+    {
+        return  Mage::getSingleton('admin/session');
+    }
+

Приложение / код / ​​ядро ​​/ Маг / Adminhtml / блок / Втулка / Сетка / колонки / Фильтр / Datetime.php

                     $this->getLocale()->getDateTimeFormat(Mage_Core_Model_Locale::FORMAT_TYPE_SHORT)
                 );
             }
-            return $value;
+            return $this->escapeHtml($value);
         }

-        return parent::getEscapedValue($index);
+        return $this->escapeHtml(parent::getEscapedValue($index));
     }
-
 }

Приложение / код / ​​ядро ​​/ Mage / Adminhtml / Контроллеры / Каталог / CategoryController.php

+            if (isset($data['general']['path'])) {
+                unset($data['general']['path']);
+            }

Приложение / код / ​​ядро ​​/ Mage / Adminhtml / Контроллеры / Каталог / ProductController.php

+                $product->validate();

приложение / код / ​​ядро ​​/ Mage / Adminhtml / контроллеры / Cms / Wysiwyg / ImagesController.php

+            $this->getResponse()->setHeader('Content-type', $image->getMimeTypeWithOutFileType());

приложение / код / ​​ядро ​​/ Mage / Adminhtml / контроллеры / Cms / WysiwygController.php

+        $this->getResponse()->setHeader('Content-type', $image->getMimeTypeWithOutFileType());

приложение / код / ​​ядро ​​/ Mage / Adminhtml / контроллеры / CustomerController.php

+                    $customer->setPasswordCreatedAt(time());

приложение / код / ​​ядро ​​/ Mage / Adminhtml / контроллеры / System / StoreController.php

+   /**
+     * Controller predispatch method
+     *
+     * @return Mage_Adminhtml_Controller_Action
+     */
+    public function preDispatch()
+    {
+        $this->_setForcedFormKeyActions(array('deleteWebsitePost', 'deleteGroupPost', 'deleteStorePost'));
+        return parent::preDispatch();
+    }

Приложение / код / ​​ядро ​​/ Mage / Каталог / Модель / product.php

+                        if (!empty($option['file_extension'])) {
+                            $fileExtension = $option['file_extension'];
+                            if (0 !== strcmp($fileExtension, Mage::helper('core')->removeTags($fileExtension))) {
+                                Mage::throwException(Mage::helper('catalog')->__('Invalid custom option(s).'));
+                            }
+                        }

Приложение / код / ​​ядро ​​/ Mage / Каталог / Модель / Resource / Категория / Tree.php

+            if (!preg_match("#^[0-9\/]+$#", $item['path'])) {
+                $item['path'] = '';
+            }

Приложение / код / ​​ядро ​​/ Mage / Checkout / Модель / Api / Resource / Customer.php

+        $customer->setPasswordCreatedAt(time());

Любой, кто переопределяет файл onepage.php, обновите его.

Приложение / код / ​​ядро ​​/ Mage / Checkout / Модель / тип / Onepage.php

  +        $passwordCreatedTime = $this->_checkoutSession->getData('_session_validator_data')['session_expire_timestamp']
    +            - Mage::getSingleton('core/cookie')->getLifetime();
    +        $customer->setPasswordCreatedAt($passwordCreatedTime);

Для проверки ключа добавлено. Пожалуйста, проверьте, что в форме корзины есть ключ формы.

приложение / код / ​​ядро ​​/ Mage / Оформить заказ / контроллеры / CartController.php

+        if (!$this->_validateFormKey()) {
+            $this->_redirect('*/*/');
+            return;
+        }
+

Приложение / код / ​​ядро ​​/ Mage / Ядро / Helper / Http.php

-                if ($this->_getRequest()->getServer($var, false)) {
+                if ($var != 'REMOTE_ADDR' && $this->_getRequest()->getServer($var, false)) {

+        if (strpos($this->_remoteAddr, ',') !== false) {
+            $ipList = explode(',', $this->_remoteAddr);
+            $this->_remoteAddr = trim(reset($ipList));
+        }
+

Приложение / код / ​​ядро ​​/ Mage / Ядро / Модель / Session / Конспект / Varien.php

+    const VALIDATOR_PASSWORD_CREATE_TIMESTAMP   = 'password_create_timestamp';

+    /**
+     * Use password creation timestamp in validator key
+     *
+     * @return bool
+     */
+    public function useValidateSessionPasswordTimestamp()
+    {
+        return true;
+    }
+

+        if ($this->useValidateSessionPasswordTimestamp()
+            && isset($validatorData[self::VALIDATOR_PASSWORD_CREATE_TIMESTAMP])
+            && isset($sessionData[self::VALIDATOR_SESSION_EXPIRE_TIMESTAMP])
+            && $validatorData[self::VALIDATOR_PASSWORD_CREATE_TIMESTAMP]
+            > $sessionData[self::VALIDATOR_SESSION_EXPIRE_TIMESTAMP] - $this->getCookie()->getLifetime()
+        ) {
+            return false;
+        }

+        if (isset($this->_data['visitor_data']['customer_id'])) {
+            $parts[self::VALIDATOR_PASSWORD_CREATE_TIMESTAMP] =
+                Mage::helper('customer')->getPasswordTimestamp($this->_data['visitor_data']['customer_id']);
+        }
+

Приложение / код / ​​ядро ​​/ Mage / Клиент / Helper / Data.php

+    /**
+     * Get customer password creation timestamp or customer account creation timestamp
+     *
+     * @param $customerId
+     * @return int
+     */
+    public function getPasswordTimestamp($customerId)
+    {
+        /** @var $customer Mage_Customer_Model_Customer */
+        $customer = Mage::getModel('customer/customer')
+            ->setWebsiteId(Mage::app()->getStore()->getWebsiteId())
+            ->load((int)$customerId);
+        $passwordCreatedAt = $customer->getPasswordCreatedAt();
+
+        return is_null($passwordCreatedAt) ? $customer->getCreatedAtTimestamp() : $passwordCreatedAt;
+    }
+

Приложение / код / ​​ядро ​​/ Mage / Клиент / Модель / Resource / Customer.php

-        $customer->setPassword($newPassword);
+        $customer->setPassword($newPassword)->setPasswordCreatedAt(time());
+        $this->saveAttribute($customer, 'password_created_at');
app/code/core/Mage/Customer/controllers/AccountController.php

+                $customer->setPasswordCreatedAt(time());



-        if (!$this->getCustomerId() && $customer = $observer->getEvent()->getCustomer()) {
+        if ($customer = $observer->getEvent()->getCustomer()) {

> app/code/core/Mage/Log/Model/Visitor.php

    -        if (!$this->getCustomerId() && $customer = $observer->getEvent()->getCustomer()) {
    +        if ($customer = $observer->getEvent()->getCustomer()) {

Приложение / код / ​​ядро ​​/ Mage / США / Helper / Data.php

+
+    /**
+     * Validate ups type value
+     *
+     * @param $valueForCheck string ups type value for check
+     *
+     * @return bool
+     */
+    public function validateUpsType($valueForCheck) {
+        $result = false;
+        $sourceModel = Mage::getSingleton('usa/shipping_carrier_ups_source_type');
+        foreach ($sourceModel->toOptionArray() as $allowedValue) {
+            if (isset($allowedValue['value']) && $allowedValue['value'] == $valueForCheck) {
+                $result = true;
+                break;
+            }
+        }
+        return $result;
+    }
 }

cron.php

cron.php: дескриптор исключения в файле cron.php

-Mage::app('admin')->setUseSessionInUrl(false);
+try {
+    Mage::app('admin')->setUseSessionInUrl(false);
+} catch (Exception $e) {
+    Mage::printException($e);
+    exit;
+}

Библиотека / Varien / Image / адаптер / Gd2.php

GD2: вернуть реальный тип пантомимы.

+        header("Content-type: ".$this->getMimeTypeWithOutFileType());

+
+    /**
+     * Gives real mime-type with not considering file type field
+     *
+     * @return string
+     */
+    public function getMimeTypeWithOutFileType()
+    {
+        return $this->_fileMimeType;
+    }
 }

JS / tiny_mce / плагины / СМИ / .htaccess

Если вы используете nginx вместо Apache, убедитесь, что вы обновили свою конфигурацию, чтобы дублировать это изменение.

+<IfModule mod_rewrite.c>
+    <Files moxieplayer.swf>
+        RewriteEngine on
+        RewriteCond %{QUERY_STRING} !^$
+        RewriteRule ^(.*)$ %{REQUEST_URI}? [R=301,L]
+    </Files>
+</IfModule>

приложение / дизайн / adminhtml / по умолчанию / по умолчанию / шаблон / система / перевозки / ups.phtml

+if (!in_array($storedOriginShipment, array_keys($orShipArr))) {
+    $storedOriginShipment = '';
+}

+if ($storedFreeShipment != '' && !in_array($storedFreeShipment, array_keys($defShipArr))) {
+    $storedFreeShipment = '';
+}

+if (!Mage::helper('usa')->validateUpsType($storedUpsType)) {
+    $storedUpsType = '';
+}

Способ доставки недавно добавленных / обновленных файлов:

app/code/core/Mage/Usa/Helper/Data.php
app/code/core/Mage/Usa/Model/Shipping/Carrier/Abstract/Backend/Abstract.php
app/code/core/Mage/Usa/Model/Shipping/Carrier/Ups/Backend/Freemethod.php
app/code/core/Mage/Usa/Model/Shipping/Carrier/Ups/Backend/OriginShipment.php
app/code/core/Mage/Usa/Model/Shipping/Carrier/Ups/Backend/Type.php

Escapehtml файлы:

Загружаемые файлы веб-интерфейса продукта. Если вы используете загружаемый продукт, обновите файлы в файлах темы.

приложение / дизайн / интерфейс / базы / по умолчанию / шаблон / загружаемое / Каталог / продукта / links.phtml

Проверьте код

<dt><label<?php if ($_isRequired) echo ' class="required"' ?>><?php if ($_isRequired) echo '<em>*</em>' ?><?php echo
    > $this->getLinksTitle() ?></label></dt>

Заменить

<dt><label<?php if ($_isRequired) echo ' class="required"' ?>><?php if ($_isRequired) echo '<em>*</em>' ?><?php echo
    > $this->escapeHtml($this->getLinksTitle()); ?></label></dt>

приложение / дизайн / интерфейс / базы / по умолчанию / шаблон / загружаемые / выписка / корзина / товар / default.phtml

Проверьте код

<dt><?php echo $this->getLinksTitle() ?></dt>

Заменить

 <dt><?php echo $this->escapeHtml($this->getLinksTitle()); ?></dt>

приложение / дизайн / интерфейс / базы / по умолчанию / шаблон / загружаемое / продажа / заказать / детали / визуализатор / downloadable.phtml

Проверьте код

<dt><?php echo $this->getLinksTitle() ?></dt>

Заменить

<dt><?php echo $this->escapeHtml($this->getLinksTitle()); ?></dt>

приложение / дизайн / интерфейс / по умолчанию / iphone / шаблон / загружаемое / выписка / корзина / товар / default.phtml

Проверьте код

<dt><?php echo $this->getLinksTitle() ?></dt>

Заменить

<dt><?php echo $this->escapeHtml($this->getLinksTitle()); ?></dt>

app / design / frontend / default / iphone / template / downloadable / оформить заказ / onepage / review / item.phtml Проверить код

`<dt><?php echo $this->getLinksTitle() ?></dt>`

Заменить

`<dt><?php echo $this->escapeHtml($this->getLinksTitle()); ?></dt>`

app / design / frontend / rwd / default / template / downloadable / checkout / cart / item / default.phtml Проверить код

`<dt><?php echo $this->getLinksTitle() ?></dt>`

Заменить

`<dt><?php echo $this->escapeHtml($this->getLinksTitle()); ?></dt>`

приложение / дизайн / интерфейс / RWD / по умолчанию / шаблон / загружаемое / выписка / OnePage / обзор / item.phtml

Проверьте код

<dt><?php echo $this->getLinksTitle() ?></dt>

Заменить

<dt><?php echo $this->escapeHtml($this->getLinksTitle()); ?></dt>

приложение / дизайн / интерфейс / RWD / по умолчанию / шаблон / загружаемое / продажа / заказать / детали / визуализатор / downloadable.phtml

Проверьте код

<dt><?php echo $this->getLinksTitle() ?></dt>

Заменить

<dt><?php echo $this->escapeHtml($this->getLinksTitle()); ?></dt>

Другие Escapehtml файлы:

Приложение / код / ​​ядро ​​/ Mage / Adminhtml / Block / Каталог / продукта / Composite / Fieldset / Options.php

+        if (!empty($option['file_extension'])) {
+            $option['file_extension'] = $this->escapeHtml($option['file_extension']);
+        }

Приложение / код / ​​ядро ​​/ Mage / Adminhtml / Block / Каталог / продукта / Редактировать / Tab / Параметры / Option.php

-                    $value['file_extension'] = $option->getFileExtension();
+                    $value['file_extension'] = $this->escapeHtml($option->getFileExtension());

приложение / дизайн / интерфейс / предприятия / по умолчанию / шаблон / CMS / иерархия / pagination.phtml

-    <li><a title="<?php echo $this->escapeHtml($node->getLabel())?>" href="<?php echo $node->getUrl()?>"><?php echo $this->getNodeLabel($node)?></a></li>

+    <li><a title="<?php echo $this->escapeHtml($node->getLabel())?>" href="<?php echo $node->getUrl()?>"><?php echo $this->escapeHtml($this->getNodeLabel($node)); ?></a></li>
Рама Чандран М
источник
в app / code / core / Mage / Checkout / controllers / CartController.php, на какой странице оформления заказа вы обычно видите ошибку Form-key?
Иконка
1
Я не вижу никакой ошибки ключа формы. если кто-то переопределяет файл по умолчанию / template / checkout / cart.phtml и пропустил ключ формы. он будет через домашнюю страницу перенаправления не через ошибку. это контрольный список. если произошла ошибка, проверьте форму ключа :). Спасибо, что задали вопросы :)
Рама Чандран М
1
Я не думаю, что здесь очень полезно размещать все различия патчей. Меня больше интересуют актуальные возможные проблемы ...
июня,
1
Спасибо за ваш комментарий. Я чувствую, что это полезно для других, потому что легко найти, какие файлы были изменены и какие изменения в основном коде. Пример app / design / frontend / rwd / default / template / downloadable / checkout / onepage / review / item.phtml. Предположим, мы переопределяем вашу тему, просто измените код, просто сделав это, и он больше похож на контрольный список.
Рама Чандран М
8

Модификация перегруженного filterметода в Zend_Filter_PregReplaceнаивна и предполагает, что $this->_matchPatternэто всегда строка. Это свойство впоследствии предоставляется в качестве первого аргумента для preg_replace. На самом деле, массив также является совершенно допустимым аргументом. Этот факт фактически используется несколькими основными Zend_Filterклассами (такими как Zend_Filter_Word_SeparatorToCamelCase). Таким образом, любое расширение / ветвь кода, который использует этот фильтр или одну из его производных с аргументом массива _matchPattern, начнет генерировать Warning: substr() expects parameter 1 to be a string, array given.

Грубый пример того, что он, вероятно, должен сделать, будет что-то вроде:

/**
 * Perform regexp replacement as filter
 *
 * @param  string $value
 * @return string
 */
public function filter($value)
{
    if ($this->_matchPattern == null) {
        #require_once 'Zend/Filter/Exception.php';
        throw new Zend_Filter_Exception(get_class($this) . ' does not have a valid MatchPattern set.');
    }

    $patterns = is_array($this->_matchPattern) ? $this->_matchPattern : array($this->_matchPattern);
    foreach ($patterns as $pattern) {
        if ($this->_containsEvalModifier($pattern)) {
            throw new Zend_Filter_Exception(get_class($this) . ' uses deprecated modifier "/e".');
        }
    }

    return preg_replace($this->_matchPattern, $this->_replacement, $value);
}

/**
 * Check if the modifiers contains the eval flag.
 *
 * @param  string $value
 * @return bool
 */
protected function _containsEvalModifier($pattern)
{
    $firstDelimiter = substr($pattern, 0, 1);
    $partsOfRegex = explode($firstDelimiter, $pattern);
    $modifiers = array_pop($partsOfRegex);

    return ($modifiers != str_replace('e', '', $modifiers));
}

Хотя я еще не провел тщательного тестирования этого.

РЕДАКТИРОВАТЬ: Стоит отметить, что хотя предложенное решение должно предотвратить ошибки, технически реализация все еще немного наивна и склонна к ложным срабатываниям. Предполагается, что разделитель регулярных выражений, отделяющий шаблон от модификаторов, такой же, как в начале строки. Технически это не должно иметь место, поскольку PHP поддерживает различные разделители в стиле скобок. Следовательно, действительный ввод {hello}isбудет определять модификаторы hello}is(а не фактические модификаторы is) и, следовательно, будет выдавать исключение, даже если шаблон на самом деле не содержит eмодификатор.

Питер О'Каллаган
источник
5

1.7.0.2 Ошибка версии: после установки патча и перехода на одну страницу оформления заказа (общая проверка Magento) получите эту ошибку

Ошибка разбора: синтаксическая ошибка, неожиданная

app / code / core / Mage / Checkout / Model / Type / Onepage.php на линии 691

При изменении патча ошибка исчезает.

Если углубиться в этот вопрос, я обнаружил, что патч добавил следующую строку в файл onepage.php.

$passwordCreatedTime = $this->_checkoutSession->getData('_session_validator_data')['session_expire_timestamp']
            - Mage::getSingleton('core/cookie')->getLifetime();
        $customer->setPasswordCreatedAt($passwordCreatedTime);

РЕШЕНИЕ: благодаря @FabianSchmengler

ОБНОВЛЕНИЕ до PHP версии 5.4 и выше!

Икона
источник
Я также применил оригинал патча, это будет $ passwordCreatedTime = $ this -> _ checkoutSession-> getData ('_ session_validator_data') ['session_expire_timestamp'] - Mage :: getSingleton ('core / cookie') -> getLifetime (); следующая строка (новая строка создана / добавлена) - Mage :: getSingleton ('core / cookie') -> getLifetime (); созданная причина проблемы
Рама Чандран М
@RamaChandranM Да! Вы получаете ту же ошибку PARSE? Также какую версию вы используете?
Иконка
1
да я проверю еще один проект и предоставить более подробную информацию Ав :)
Рама Chandran M
2
@ Значок патча для совместимости с PHP 5.4. Я долго не касался установки 1.7, но ожидал, что она будет работать и на 5.6, попробуй.
Фабиан Шменглер
1
@icon, вы можете пока игнорировать уведомления об устаревании, это станет актуальным, когда вы обновитесь до PHP 7
Фабиан Шменглер,
2

известная проблема: -

Если ваш пользовательский код или расширение использует Zend/Filter/PregReplace.php с модификатором e, теперь он вернет ошибку из-за возможных проблем с RCE.

Этот патч следует ниже безопасности.

1) Дополнительная смена пароля валидации сеанса администратора

+++ app/code/core/Mage/Admin/Model/User.php

+            $sessionUser = $this->getSession()->getUser();
+            if ($sessionUser && $sessionUser->getId() == $this->getId()) {
+                $this->getSession()->setUserPasswordChanged(true);
+            }

а потом

+    /**
+     * @return Mage_Admin_Model_Session
+     */
+    protected function getSession()
+    {
+        return  Mage::getSingleton('admin/session');
+    }
+

class Mage_Admin_Model_User

+        $oldPassword = $this->getPassword();
     $this->setId(null);
     $this->load($id);
+        $isUserPasswordChanged = $this->getSession()->getUserPasswordChanged();
+        if ($this->getPassword() !== $oldPassword && !$isUserPasswordChanged) {
+            $this->setId(null);
+        } elseif ($isUserPasswordChanged) {
+            $this->getSession()->setUserPasswordChanged(false);
+        }

2) Проверка расширения файла

app/code/core/Mage/Adminhtml/Block/Catalog/Product/Composite/Fieldset/Options.php

+        if (!empty($option['file_extension'])) {
+            $option['file_extension'] = $this->escapeHtml($option['file_extension']);
+        }

app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Options/Option.php app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Options/Option.php

-                    $value['file_extension'] = $option->getFileExtension();
+                    $value['file_extension'] = $this->escapeHtml($option->getFileExtension());

app/code/core/Mage/Catalog/Model/Product.php

+                        if (!empty($option['file_extension'])) {
+                            $fileExtension = $option['file_extension'];
+                            if (0 !== strcmp($fileExtension, Mage::helper('core')->removeTags($fileExtension))) {
+                                Mage::throwException(Mage::helper('catalog')->__('Invalid custom option(s).'));
+                            }
+                        }

3) Escape Html добавлен для XSS

+++ app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Filter/Datetime.php

-            return $value;
+            return $this->escapeHtml($value);
     }

-        return parent::getEscapedValue($index);
+        return $this->escapeHtml(parent::getEscapedValue($index));

app/design/frontend/base/default/template/downloadable/catalog/product/links.phtml

-        <dt><label<?php if ($_isRequired) echo ' class="required"' ?>><?php if ($_isRequired) echo '<em>*</em>' ?><?php echo $this->getLinksTitle() ?></label></dt>
+        <dt><label<?php if ($_isRequired) echo ' class="required"' ?>><?php if ($_isRequired) echo '<em>*</em>' ?><?php echo $this->escapeHtml($this->getLinksTitle()); ?></label></dt>

app/design/frontend/base/default/template/downloadable/checkout/cart/item/default.phtml

-            <dt><?php echo $this->getLinksTitle() ?></dt>
+            <dt><?php echo $this->escapeHtml($this->getLinksTitle()); ?></dt>

app/design/frontend/base/default/template/downloadable/checkout/onepage/review/item.phtml

-            <dt><?php echo $this->getLinksTitle() ?></dt>
+            <dt><?php echo $this->escapeHtml($this->getLinksTitle()); ?></dt>

app/design/frontend/base/default/template/downloadable/sales/order/items/renderer/downloadable.phtml

-            <dt><?php echo $this->getLinksTitle() ?></dt>
+            <dt><?php echo $this->escapeHtml($this->getLinksTitle()); ?></dt>

app/design/frontend/default/iphone/template/downloadable/checkout/onepage/review/item.phtml

-                <dt><?php echo $this->getLinksTitle() ?></dt>
+                <dt><?php echo $this->escapeHtml($this->getLinksTitle()); ?></dt>

app/design/frontend/rwd/default/template/downloadable/checkout/cart/item/default.phtml

-            <dt><?php echo $this->getLinksTitle() ?></dt>
+            <dt><?php echo $this->escapeHtml($this->getLinksTitle()); ?></dt>

app/design/frontend/rwd/default/template/downloadable/checkout/onepage/review/item.phtml

-            <dt><?php echo $this->getLinksTitle() ?></dt>
+            <dt><?php echo $this->escapeHtml($this->getLinksTitle()); ?></dt>

app/design/frontend/rwd/default/template/downloadable/sales/order/items/renderer/downloadable.phtml

-            <dt><?php echo $this->getLinksTitle() ?></dt>
+            <dt><?php echo $this->escapeHtml($this->getLinksTitle()); ?></dt>

4) XPath выражение для проверки обновления макета

app/code/core/Mage/Adminhtml/Model/LayoutUpdate/Validator.php

+    /**
+     * XPath expression for checking layout update
+     *
+     * @var array
+     */
+    protected $_disallowedXPathExpressions = array(
+        '*//template',
+        '*//@template',
+        '//*[@method=\'setTemplate\']',
+        '//*[@method=\'setDataUsingMethod\']//*[text() = \'template\']/../*'
+    );
+

Mage_Adminhtml_Model_LayoutUpdate_Validator

-        if ($templatePaths = $value->xpath('*//template | *//@template | //*[@method=\'setTemplate\']/*')) {
+        if ($templatePaths = $value->xpath($this->_getXpathValidationExpression())) {

Mage_Adminhtml_Model_LayoutUpdate_Validator

+    /**
+     * Returns xPath for validate incorrect path to template
+     *
+     * @return string xPath for validate incorrect path to template
+     */
+    protected function _getXpathValidationExpression() {
+        return implode(" | ", $this->_disallowedXPathExpressions);
+    }
+



+    /**
+     * Returns xPath for validate incorrect path to template
+     *
+     * @return string xPath for validate incorrect path to template
+     */
+    protected function _getXpathValidationExpression() {
+        return implode(" | ", $this->_disallowedXPathExpressions);
+    }
+

app/code/core/Mage/Catalog/Model/Resource/Category/Tree.php

+            if (!preg_match("#^[0-9\/]+$#", $item['path'])) {
+                $item['path'] = '';
+            }

5) Аутентифицированная SQL-инъекция при сохранении категории

app/code/core/Mage/Adminhtml/controllers/Catalog/CategoryController

+            if (isset($data['general']['path'])) {
+                unset($data['general']['path']);
+            }

6) Проверка продукта app/code/core/Mage/Adminhtml/controllers/Catalog/ProductController.php

+                $product->validate();

7) миметип app/code/core/Mage/Adminhtml/controllers/Cms/Wysiwyg/ImagesController.php

+            $this->getResponse()->setHeader('Content-type', $image->getMimeTypeWithOutFileType());

app/code/core/Mage/Adminhtml/controllers/Cms/WysiwygController.php

+        $this->getResponse()->setHeader('Content-type', $image->getMimeTypeWithOutFileType());

lib/Varien/Image/Adapter/Gd2.php

-        header("Content-type: ".$this->getMimeType());
+        header("Content-type: ".$this->getMimeTypeWithOutFileType());


+
+    /**
+     * Gives real mime-type with not considering file type field
+     *
+     * @return string
+     */
+    public function getMimeTypeWithOutFileType()
+    {
+        return $this->_fileMimeType;
+    }

8) Passsword клиента, созданный в app/code/core/Mage/Adminhtml/controllers/CustomerController.php

+                    $customer->setPasswordCreatedAt(time());

app/code/core/Mage/Checkout/Model/Api/Resource/Customer.php

+        $customer->setPasswordCreatedAt(time());

app/code/core/Mage/Checkout/Model/Type/Onepage.php

+        $passwordCreatedTime = $this->_checkoutSession->getData('_session_validator_data')['session_expire_timestamp']
+            - Mage::getSingleton('core/cookie')->getLifetime();
+        $customer->setPasswordCreatedAt($passwordCreatedTime);

app/code/core/Mage/Core/Model/Session/Abstract/Varien.php

+    const VALIDATOR_PASSWORD_CREATE_TIMESTAMP   = 'password_create_timestamp';


+    /**
+     * Use password creation timestamp in validator key
+     *
+     * @return bool
+     */
+    public function useValidateSessionPasswordTimestamp()
+    {
+        return true;
+    }


+        if ($this->useValidateSessionPasswordTimestamp()
+            && isset($validatorData[self::VALIDATOR_PASSWORD_CREATE_TIMESTAMP])
+            && isset($sessionData[self::VALIDATOR_SESSION_EXPIRE_TIMESTAMP])
+            && $validatorData[self::VALIDATOR_PASSWORD_CREATE_TIMESTAMP]
+            > $sessionData[self::VALIDATOR_SESSION_EXPIRE_TIMESTAMP] - $this->getCookie()->getLifetime()
+        ) {
+            return false;
+        }

app/code/core/Mage/Customer/Helper/Data.php

+    /**
+     * Get customer password creation timestamp or customer account creation timestamp
+     *
+     * @param $customerId
+     * @return int
+     */
+    public function getPasswordTimestamp($customerId)
+    {
+        /** @var $customer Mage_Customer_Model_Customer */
+        $customer = Mage::getModel('customer/customer')
+            ->setWebsiteId(Mage::app()->getStore()->getWebsiteId())
+            ->load((int)$customerId);
+        $passwordCreatedAt = $customer->getPasswordCreatedAt();
+
+        return is_null($passwordCreatedAt) ? $customer->getCreatedAtTimestamp() : $passwordCreatedAt;
+    }
+

app/code/core/Mage/Customer/Model/Resource/Customer.php

-        $customer->setPassword($newPassword);
+        $customer->setPassword($newPassword)->setPasswordCreatedAt(time());
     $this->saveAttribute($customer, 'password_hash');
+        $this->saveAttribute($customer, 'password_created_at');

app/code/core/Mage/Customer/controllers/AccountController.php

+                $customer->setPasswordCreatedAt(time());

Mage_Customer_AccountController

+            $customer->setPasswordCreatedAt(time());
         $customer->save();

``

+                $customer->setPasswordCreatedAt(time());

app/code/core/Mage/Log/Model/Visitor.php

-        if (!$this->getCustomerId() && $customer = $observer->getEvent()->getCustomer()) {
+        if ($customer = $observer->getEvent()->getCustomer()) {

9) Изменения ИБП

app/code/core/Mage/Usa/Helper/Data.php

+
+    /**
+     * Validate ups type value
+     *
+     * @param $valueForCheck string ups type value for check
+     *
+     * @return bool
+     */
+    public function validateUpsType($valueForCheck) {
+        $result = false;
+        $sourceModel = Mage::getSingleton('usa/shipping_carrier_ups_source_type');
+        foreach ($sourceModel->toOptionArray() as $allowedValue) {
+            if (isset($allowedValue['value']) && $allowedValue['value'] == $valueForCheck) {
+                $result = true;
+                break;
+            }
+        }
+        return $result;
+    }

ДОБАВЛЕННЫЕ файлы для ИБП

`app/code/core/Mage/Usa/Model/Shipping/Carrier/Abstract/Backend/Abstract.php` 
`app/code/core/Mage/Usa/Model/Shipping/Carrier/Ups/Backend/Freemethod.php`
`app/code/core/Mage/Usa/Model/Shipping/Carrier/Ups/Backend/OriginShipment.php`
`app/code/core/Mage/Usa/Model/Shipping/Carrier/Ups/Backend/Type.php`

Добавлена ​​настройка для этого нового functoinlaity

app/code/core/Mage/Usa/etc/system.xml

+                            <backend_model>usa/shipping_carrier_ups_backend_freemethod</backend_model>

843 строка

+                            <backend_model>usa/shipping_carrier_ups_backend_originShipment</backend_model>

+886

+                            <backend_model>usa/shipping_carrier_ups_backend_type</backend_model>

app/design/adminhtml/default/default/template/system/shipping/ups.phtml

+if (!in_array($storedOriginShipment, array_keys($orShipArr))) {
+    $storedOriginShipment = '';
+}
+if ($storedFreeShipment != '' && !in_array($storedFreeShipment, array_keys($defShipArr))) {
+    $storedFreeShipment = '';
+}
+if (!Mage::helper('usa')->validateUpsType($storedUpsType)) {
+    $storedUpsType = '';
+}
 ?>

10) Добавлен класс Zend

`app/code/core/Zend/Filter/PregReplace.php`
`app/code/core/Zend/Validate/EmailAddress.php`

1> 1) Проверка продукта в комплекте

app/design/adminhtml/default/default/template/bundle/product/edit/bundle/option.phtml

+    <?php $_selection->setSku($this->escapeHtml($_selection->getSku())); ?>

12) Сессия администратора в try catch в cron.php

-Mage::app('admin')->setUseSessionInUrl(false);
+try {
+    Mage::app('admin')->setUseSessionInUrl(false);
+} catch (Exception $e) {
+    Mage::printException($e);
+    exit;
+}
Муртуза Забуавала
источник
2

Похоже, что часть патча htmlEscaping все "getLinksTitle ()". Но они забыли следующие файлы (это основано на 1.8.1).

app/design/frontend/base/default/template/downloadable/checkout/multishipping/item/downloadable.phtml

app/design/frontend/base/default/template/downloadable/email/order/items/creditmemo/downloadable.phtml

app/design/frontend/base/default/template/downloadable/email/order/items/invoice/downloadable.phtml

app/design/frontend/base/default/template/downloadable/email/order/items/order/downloadable.phtml

app/design/frontend/base/default/template/downloadable/sales/order/creditmemo/items/renderer/downloadable.phtml

app/design/frontend/base/default/template/downloadable/sales/order/invoice/items/renderer/downloadable.phtml

app/design/frontend/default/iphone/template/downloadable/sales/order/creditmemo/items/renderer/downloadable.phtml

app/design/frontend/default/iphone/template/downloadable/sales/order/invoice/items/renderer/downloadable.phtml
Рене Шеп
источник
2

Патч не работает на ванильном Magento CE 1.8.0.0

Обновление: добавлено решение ниже.

Проблема:

file app/design/frontend/base/default/template/downloadable/sales/order/items/renderer/downloadable.phtml
Hunk #1 FAILED at 54.

Применены предыдущие патчи:

  • AppSec-212
  • SUPEE-2619
  • SUPEE-2725
  • SUPEE-3941
  • SUPEE-5344
  • SUPEE-5994
  • SUPEE-6237
  • SUPEE-6285
  • SUPEE-6482
  • SUPEE-6788
  • SUPEE-7405
  • SUPEE-7405v.1.1
  • SUPEE-7616
  • SUPEE-8167
  • SUPEE-8788v2
  • SUPEE-8967
  • SUPEE-9652
  • SUPEE-9767v2
  • SUPEE-10336
  • SUPEE-10266
  • SUPEE-10415
  • SUPEE-10570v2

Решение

Исправлено редактированием файла патча. Заменил патч на downloadable.phtmlтот, который в патче, v1.7.0.2в оригинальном файле патча, это строки 1854-1862.

В основном это связано с отступом в файле. Поскольку изменения downloadable.phtmlв V1.7.0.2имеют более отступ.

Решение 2

У меня была похожая проблема, но я смог ее исправить, заново сохранив исходный файл в редакторе, который заставлял конец строки быть LF в стиле Unix, а не CRLF в стиле Windows или Mac CR.

Йерун Вермейлен - MageHost
источник
1

Что касается Мэтта Антли, возможно, они не включили SUPEE-10570v2 из-за этого

Недавно Magento сообщили о проблеме с патчем SUPEE-10570> и версиями Magento 1.9.3.8/1.14.3.8, которая может привести к неспособности клиентов завершить оформление покупки при попытке зарегистрироваться во время проверки. Magento теперь предоставляет обновленное исправление (SUPEE-10570v2), которое> больше не вызывает эту проблему. Однако обратите внимание, что этот новый патч больше не защищает от двух проблем безопасности, связанных с обработкой сеансов с низким риском, от которых патч защищен SUPEE-10570. https://magento.com/security/patches/supee-10570

Насколько я знаю, ошибка проверки была не очень распространена, и поэтому они решили остаться с SUPEE-10570, который защищает от двух проблем безопасности с низким риском ?!

zlep
источник
+1 Это, скорее всего, причина этого, но все же стоит отметить, что если пользователи обновляются и должны были подать заявку, SUPEE-10570v2им придется повторно применить ее.
Мэтт Антли
Как заявил Питер О'Каллаган, изменения с 10570v2 отменены на 10752, поэтому нет необходимости включать первое. Поскольку для 1.9.3.9 нет 10570v2, вы не должны ничего применять. Все рассуждения слабы: почему Magento должен держать свою ветку 1.9.3.9 на другой базе, чем все остальные? Они даже сказали, что будут основывать каждый будущий выпуск и патч на 10570v2.
Понг
Спасибо за комментарии Питер и Понг. Удалите мой ответ, поскольку он вводит в заблуждение, как заявлено вами обоими. Это было не мое намерение, просто то, что я не продумал, когда писал это, и это было то, что я кратко заметил, когда взглянул на него SUPEE-10752и немного подпрыгнул. Еще раз спасибо за комментарии.
Мэтт Антли
1

Патч не работает на ванильном Magento CE 1.6.0.0

Обновление: добавлено решение ниже.

Проблемы:

file app/code/core/Mage/Admin/Model/User.php
Hunk #1 FAILED at 127.
...
file app/code/core/Mage/Customer/controllers/AccountController.php
Hunk #2 FAILED at 812.

Применены предыдущие патчи:

  • AppSec-212
  • SUPEE-2631
  • SUPEE-2725
  • SUPEE-5344
  • SUPEE-5994
  • SUPEE-6237
  • SUPEE-6285
  • SUPEE-6482
  • SUPEE-6788
  • SUPEE-7405
  • SUPEE-7405v.1.1
  • SUPEE-8167
  • SUPEE-8788v2
  • SUPEE-8967
  • SUPEE-9652
  • SUPEE-9767v2
  • SUPEE-10266
  • SUPEE-10415
  • SUPEE-10570v2
  • SUPEE-10752

решаемая

Я исправил эту проблему, изменив файл патча. Я заменил блоки, из-за которых возникли проблемы, соответствующими патчами для v1.5.1.0. В исходном файле патча это строки 167-177 и 663-670.

Йерун Вермейлен - MageHost
источник
1

В EE v1.14.2.4 после применения SUPEE-10752 мне также пришлось применить следующий патч, чтобы исправить проблему, когда извлечение перенаправляется на домашнюю страницу вместо страницы успеха:

Файл: invalid_session_fix-2018-03-14-05-10-19.patch

diff --git a/app/code/core/Mage/Core/Model/Session/Abstract/Varien.php b/app/code/core/Mage/Core/Model/Session/Abstract/Varien.php
index 59b3ea8..35155f1 100644
--- a/app/code/core/Mage/Core/Model/Session/Abstract/Varien.php
+++ b/app/code/core/Mage/Core/Model/Session/Abstract/Varien.php
@@ -485,7 +485,7 @@ class Mage_Core_Model_Session_Abstract_Varien extends Varien_Object
             && isset($validatorData[self::VALIDATOR_PASSWORD_CREATE_TIMESTAMP])
             && isset($sessionData[self::VALIDATOR_SESSION_EXPIRE_TIMESTAMP])
             && $validatorData[self::VALIDATOR_PASSWORD_CREATE_TIMESTAMP]
-            > $sessionData[self::VALIDATOR_SESSION_EXPIRE_TIMESTAMP] - $this->getCookie()->getLifetime()
+            > $sessionData[self::VALIDATOR_SESSION_EXPIRE_TIMESTAMP]
         ) {
             return false;
         }

Вышеупомянутое исправление найдено в https://magento.com/tech-resources/download в SUPEE-10570 > invalid_session_fix.patch (0 МБ)

Ричард Фераро
источник
Он также делает то же самое с CE 1.9.3.6, когда php <5.5, спасибо за исправление
GunJan Mehta
1

Я столкнулся с проблемой после этого патча. Я не могу установить «Свободный метод» для «Типа ИБП», «Объединенный пакет услуг XML». Magento выдает ошибку, когда какой-либо метод выбран в раскрывающемся списке «Бесплатный метод». Ошибка: « Поле» Ups Free Method «имеет неправильное значение ».

Кто-нибудь сталкивался с такой же проблемой и получил решение?

Заранее спасибо!

Манджу Чаухан
источник
0

На 1.6 патч ups.phtml сломан. Он ссылается на $ StoreOriginShipment, $ StoreFreeShipment, которые имеют опечатку в 1.6 ($ stroredOriginShipment и $ stroredFreeShipment). Кроме того, он ссылается на $ storeUpsType, который вообще не существует в 1.6.

Карстен
источник
0

Мы столкнулись с проблемой на 1.9.1.0 и 1.9.2.4 (не тестировали на других). Это не появляется на всех наших проектах, но это повторилось на нескольких из них. Мы думаем, что это может повлиять на проекты, в которых в какой-то момент был установлен SUPEE-10570v1.

После применения патча, если пользователь войдет в систему, он прекрасно увидит страницу своего аккаунта. Однако, если они попытаются вернуться на любую другую страницу на сайте, страница перестанет отвечать на запросы и увидит либо пустой экран, либо 502 Bad Gateway. Это происходит из-за того, что PHP заходит в бесконечный цикл и либо вызывает сбои, либо останавливается настройками .ini.

Я сумел раскопать , что проблема является бесконечной рекурсией на линии , которая загружает $customerв \app\code\core\Mage\Customer\Helper\Data.php, getPasswordTimestamp().

$customer = Mage::getModel('customer/customer')
        ->setWebsiteId(Mage::app()->getStore()->getWebsiteId())
        ->load((int)$customerId);

Если посмотреть на трассировку стека бесконечной рекурсии, она снова и снова возвращается к этому. Почему-то кажется, что в ->load()итоге вызывается getPasswordTimestamp()метод.

Обходной путь, указанный в /magento//a/235984/67252, работает нормально, но я хотел бы знать, что происходит.

Jakkara
источник
0

После применения патча SUPEE 10752, Регистрация и Оформление берут страницу успеха на главную страницу. Какие-либо предложения?

Анураг Хандельвал
источник
-1

Мы увидели пустую страницу в / checkout / * после применения SUPEE-10752 и компиляции

версия: 1.9.1.0

Условия запуска: применение SUPEE-10752 + включение компилятора + вход в систему в качестве клиента, затем посещение / проверка / *

Просто для пояснения: с деактивированным компилятором все шло хорошо, с активированным компилятором мы могли видеть только пустую страницу корзины при входе в систему без каких-либо записей журнала (даже после активации всех возможных журналов и режима разработчика).

июнь
источник