Patch de sécurité SUPEE-10752 - Problèmes possibles?


14

Un nouveau correctif de sécurité est disponible pour Magento 1, corrigeant 25 problèmes APPSEC

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

Quels problèmes courants devez-vous surveiller lors de l'application de ce correctif?

SUPEE-10752, Magento Commerce 1.14.3.9 et Open Source 1.9.3.9 contiennent plusieurs améliorations de sécurité qui aident à fermer l'exécution de code à distance de l'utilisateur Admin authentifié (RCE), la falsification de demande intersite (CSRF) et d'autres vulnérabilités.

Des informations sur toutes les modifications apportées aux versions 1.14.3.9 et 1.9.3.9 sont disponibles dans les notes de version de Magento Commerce et Magento Open Source.

Des correctifs et des mises à niveau sont disponibles pour les versions suivantes de Magento:

Magento Commerce 1.9.0.0-1.14.3.9: SUPEE-10752 ou mise à niveau vers Magento Commerce 1.14.3.9.

Magento Open Source 1.5.0.0-1.9.3.9: SUPEE-10752 ou mise à niveau vers Magento Open Source 1.9.3.9.


Problème rencontré détaillé ici - magento.stackexchange.com/questions/248229/…
Shrenik

Réponses:


19

Comme mentionné par les documents officiels de Magento :

Les conflits lors de l'installation du correctif SUPEE-10752 sont le plus souvent causés par l' installation de la version 1 du correctif précédent ( SUPEE-10570v1 ).

Veuillez vous assurer de retirer SUPEE-10570v1 et d'installer SUPEE-10570v2 avant d'installer le nouveau SUPEE-10752.


11

Les fichiers ci-dessous sont modifiés / créés après l'application du patch

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

Pour EE Edition, les fichiers ci-dessous sont ajoutés autres que 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

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');
+    }
+

app / code / core / Mage / Adminhtml / Block / Widget / Grid / Column / Filter / 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));
     }
-
 }

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

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

app / code / core / Mage / Adminhtml / controllers / Catalog / ProductController.php

+                $product->validate();

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());

app / code / core / Mage / Adminhtml / controllers / CustomerController.php

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

app / code / core / Mage / Adminhtml / controllers / System / StoreController.php

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

app / code / core / Mage / Catalogue / 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).'));
+                            }
+                        }

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

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

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

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

N'importe qui remplace le fichier onepage.php, veuillez mettre à jour le fichier.

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);

Pour la validation de la clé ajoutée, veuillez vérifier que votre formulaire de panier contient une clé de formulaire

app / code / core / Mage / Checkout / controllers / CartController.php

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

app / code / core / Mage / Core / 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));
+        }
+

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;
+        }

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

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_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()) {

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;
+    }
 }

cron.php

cron.php: poignée d'exception dans le fichier cron.php

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

lib / Varien / Image / Adapter / Gd2.php

GD2: retourne le type MIME réel.

+        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 / plugins / media / .htaccess

Si vous utilisez nginx au lieu d'Apache, assurez-vous de mettre à jour votre configuration pour dupliquer cette modification.

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

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 = '';
+}

Les nouveaux fichiers ajoutés / mis à jour sont les suivants:

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

Fichiers Escapehtml:

Fichiers frontaux de produits téléchargeables: toute personne utilisant un produit téléchargeable doit mettre à jour les fichiers dans vos fichiers de thème.

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

Vérifier le code

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

Remplacer par

<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

Vérifier le code

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

Remplacer par

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

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

Vérifier le code

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

Remplacer par

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

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

Vérifier le code

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

Remplacer par

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

app / design / frontend / default / iphone / template / downloadable / checkout / onepage / review / item.phtml Vérifier le code

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

Remplacer par

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

app / design / frontend / rwd / default / template / downloadable / checkout / cart / item / default.phtml Vérifier le code

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

Remplacer par

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

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

Vérifier le code

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

Remplacer par

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

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

Vérifier le code

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

Remplacer par

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

Autres fichiers Escapehtml:

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

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

app / design / frontend / enterprise / default / template / cms / hierarchy / 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>

dans app / code / core / Mage / Checkout / controllers / CartController.php, sur quelle page de paiement voyez-vous généralement une erreur de clé de formulaire?
Icon

1
Je ne vois aucune erreur de clé de formulaire. si quelqu'un remplace le fichier par défaut / template / checkout / cart.phtml et la clé de formulaire manquée. il redirigera la page d'accueil et non par erreur. c'est une liste de contrôle. si une erreur se produit, veuillez vérifier la clé du formulaire :). Merci d'avoir posé des questions :)
Rama Chandran M

1
Je ne pense pas qu'il soit très utile de publier tous les diffs de patch ici. Je suis plus intéressé par les problèmes réels possibles ...
7ochem

1
Merci pour votre commentaire. Je pense que c'est utile pour les autres car il est facile de trouver quels sont les fichiers modifiés et quels sont les changements de code de base. Exemple d'application / design / frontend / rwd / default / template / downloadable / checkout / onepage / review / item.phtml supposons que nous remplaçons dans votre thème changez simplement le code facilement aussi c'est plus comme une liste de contrôle.
Rama Chandran M

8

La modification de la filterméthode surchargée dans Zend_Filter_PregReplaceest naïve et suppose qu'il $this->_matchPatterns'agit toujours d'une chaîne. Cette propriété est ensuite fournie comme premier argument de preg_replace. En réalité, un tableau est également un argument parfaitement valable. Ce fait est en fait utilisé par plusieurs Zend_Filterclasses de base (telles que Zend_Filter_Word_SeparatorToCamelCase). Ainsi, toute extension / branche de code qui utilise ce filtre ou l'un de ses dérivés, avec un argument tableau pour _matchPattern, commencera à être lancée Warning: substr() expects parameter 1 to be a string, array given.

Un exemple grossier de ce qu'il devrait probablement faire serait quelque chose comme:

/**
 * 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));
}

Bien que je n'aie pas encore fait de test approfondi.

EDIT: Il convient de noter que, bien que la solution proposée ci-dessus devrait éviter les erreurs, la mise en œuvre est toujours techniquement un peu naïve et sujette aux faux positifs. Il suppose que le délimiteur d'expression régulière séparant le modèle des modificateurs est le même que celui au début de la chaîne. Techniquement, cela ne doit pas être le cas puisque PHP prend en charge différents délimiteurs de style de support. Par conséquent, l'entrée valide {hello}isdéterminera les modificateurs hello}is(plutôt que les modificateurs réels de is) et lèvera donc une exception, même si le modèle n'inclut pas réellement le emodificateur.


5

1.7.0.2 Problème de version: après avoir installé le correctif et passé à la vérification d'une page (vérification générique de Magento), obtenez cette erreur

Erreur d'analyse: erreur de syntaxe, inattendue

app / code / core / Mage / Checkout / Model / Type / Onepage.php on line 691

Inverser le patch, l'erreur disparaît.

En approfondissant cette question, j'ai découvert que le correctif a ajouté la ligne suivante au fichier onepage.php.

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

SOLUTION: Merci à @FabianSchmengler

MISE À JOUR DE PHP version 5.4 et plus!


je suis également appliqué le patch d'origine, ce sera $ passwordCreatedTime = $ this -> _ checkoutSession-> getData ('_ session_validator_data') ['session_expire_timestamp'] - Mage :: getSingleton ('core / cookie') -> getLifetime (); ligne suivante (nouvelle ligne créée / ajoutée) - Mage :: getSingleton ('core / cookie') -> getLifetime (); créé la cause du problème
Rama Chandran M

@RamaChandranM Yep! Vous obtenez la même erreur PARSE? Quelle version utilisez-vous également?
Icon

1
oui je vais vérifier un autre projet et fournir plus de détails Ans :)
Rama Chandran M

2
@Icon il y avait un patch pour la compatibilité PHP 5.4. Je n'ai pas touché à une installation 1.7 pendant longtemps, mais je m'attendrais à ce qu'elle fonctionne également sur 5.6, essayez-la.
Fabian Schmengler

1
@icon vous pouvez ignorer les avis de dépréciation pour le moment, cela deviendra pertinent lorsque vous mettrez à jour vers PHP 7
Fabian Schmengler

2

problème connu :-

Si votre code ou extension personnalisé utilise Zend/Filter/PregReplace.ph p avec le modificateur e, il renverra désormais une erreur en raison de possibles problèmes RCE.

Ce correctif suit la sécurité ci-dessous.

1) Modification supplémentaire du mot de passe de validation de la session d'administration

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

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

puis

+    /**
+     * @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) Validation de l'extension de fichier

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 ajouté pour 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) Expression XPath pour vérifier la mise à jour de la mise en page

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) Injection SQL authentifiée lors de l'enregistrement d'une catégorie

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

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

6) Valider le produit app/code/core/Mage/Adminhtml/controllers/Catalog/ProductController.php

+                $product->validate();

7) type MIME 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) Mot de passe client créé à 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) Modifications d'UPS

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;
+    }

Fichiers AJOUTÉS pour UPS

`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`

Ajout du paramètre pour ce nouveau functoinlaity

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

+                            <backend_model>usa/shipping_carrier_ups_backend_freemethod</backend_model>

843 ligne

+                            <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) Classe Zend ajoutée

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

1> 1) Validation du produit Bundle

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

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

12) Session d'administration dans try catch dans cron.php

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

2

On dirait qu'une partie du patch est htmlEscaping all "getLinksTitle ()". Mais ils ont oublié les fichiers suivants (ceci est basé sur 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

Le patch ne fonctionne pas sur vanilla Magento CE 1.8.0.0

Mise à jour: solution ajoutée ci-dessous.

Problème:

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

Patches précédents appliqués:

  • 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

Solution

Corrigé en modifiant le fichier de patch. Remplacé le patch downloadable.phtmlpar celui du patch car v1.7.0.2dans le fichier de patch d'origine ce sont les lignes 1854-1862.

Cela est principalement dû à l'indentation dans le fichier. Comme les changements pour downloadable.phtmlen V1.7.0.2ont plus indenté.

Solution 2

J'ai eu un problème similaire, mais j'ai pu le résoudre en réenregistrant le fichier d'origine dans un éditeur qui a forcé la fin de ligne à être des LF de style Unix, pas des CRLF de style Windows ou des Mac CR.


1

En référence à Matt Antley, peut-être qu'ils n'ont pas inclus SUPEE-10570v2 à cause de cela

Magento a récemment été informé d'un problème avec le correctif SUPEE-10570> et les versions 1.9.3.8/1.14.3.8 de Magento qui pourraient entraîner> l'incapacité des clients à terminer le paiement lorsqu'ils tentent de s'inscrire pendant le paiement. Magento fournit maintenant un correctif mis à jour (SUPEE-10570v2) qui> ne provoque plus ce problème. Notez, cependant, que ce nouveau correctif ne protège plus contre deux problèmes de sécurité liés à la gestion des sessions à faible risque contre lesquels le correctif SUPEE-10570 a été protégé. https://magento.com/security/patches/supee-10570

Pour autant que je sache, le bug de paiement n'était pas très courant et ils ont donc décidé de rester avec SUPEE-10570 qui protège contre les deux problèmes de sécurité à faible risque?!


+1 C'est probablement la raison de cela, mais il convient de noter que si les utilisateurs effectuent une mise à niveau et devaient postuler, SUPEE-10570v2ils devront la réappliquer.
Matt Antley

Comme Peter O'Callaghan l'a déclaré, les modifications de 10570v2 sont annulées par 10752, il n'est donc pas nécessaire d'inclure la première. Puisqu'il n'y a pas de 10570v2 pour 1.9.3.9, vous n'êtes pas censé appliquer quoi que ce soit. L'ensemble du raisonnement est faible: pourquoi Magento devrait-il conserver sa branche 1.9.3.9 sur une base différente de toutes les autres? Ils ont même dit qu'ils baseraient chaque future version et patch sur 10570v2.
pong

Merci pour les commentaires Peter et pong. J'ai retiré ma réponse car elle est trompeuse, comme vous l'avez dit tous les deux. Ce n'était pas mon intention, juste quelque chose auquel je n'avais pas pensé en l'écrivant et que j'ai brièvement remarqué en jetant un œilSUPEE-10752 et en sautant un peu le pistolet. Encore une fois, merci pour les commentaires!
Matt Antley

1

Le patch ne fonctionne pas sur vanilla Magento CE 1.6.0.0

Mise à jour: solution ajoutée ci-dessous.

Problèmes:

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.

Patches précédents appliqués:

  • 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

Résolu

J'ai résolu ce problème en modifiant le fichier correctif. J'ai remplacé les mecs qui causaient les problèmes par ceux du patch pour v1.5.1.0. Dans le fichier de patch d'origine, ce sont les lignes 167-177 et 663-670.


1

Dans EE v1.14.2.4 après avoir appliqué SUPEE-10752, j'ai dû également appliquer le correctif suivant pour résoudre le problème de redirection de la caisse vers la page d'accueil au lieu de la page de réussite:

Fichier: 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;
         }

Le correctif ci-dessus se trouve dans https://magento.com/tech-resources/download sous SUPEE-10570 > invalid_session_fix.patch (0 Mo)


Il fait également la même chose avec CE 1.9.3.6 lorsque php est <5.5, merci pour le correctif
GunJan Mehta

1

J'ai rencontré un problème après ce patch. Je ne peux pas définir "Méthode gratuite" pour "Type UPS" "United Parcel Service XML". Magento génère une erreur lorsqu'une méthode est sélectionnée dans la liste déroulante "Méthode gratuite". Erreur: " Champ" Ups Free Method "a une valeur incorrecte. "

Est-ce que quelqu'un a fait face au même problème et a obtenu la solution?

Merci d'avance!


0

Sur 1.6, le correctif ups.phtml est cassé. Il fait référence à $ storedOriginShipment, $ storedFreeShipment qui ont une faute de frappe en 1.6 ($ stroredOriginShipment et $ stroredFreeShipment). De plus, il fait référence à $ storedUpsType qui n'existe pas du tout en 1.6.


0

Nous avons rencontré un problème sur 1.9.1.0 et 1.9.2.4 (nous n'avons pas testé sur d'autres). Il n'apparaît pas sur tous nos projets, mais il s'est répété sur plusieurs d'entre eux. Nous pensons que cela pourrait affecter les projets sur lesquels SUPEE-10570v1 a été installé à un moment donné.

Après avoir appliqué le correctif, si un utilisateur se connecte, il verra sa page de compte parfaitement bien. Cependant, s'ils essaient de revenir à n'importe quelle autre page du site, la page cessera de répondre et ils verront soit un écran vide soit une 502 Bad Gateway. Cela est dû au fait que PHP entre dans une boucle infinie et soit segfaulting ou être arrêté par ses paramètres .ini.

J'ai réussi à creuser que le problème est une récursion infinie sur la ligne qui charge le $customerdans \app\code\core\Mage\Customer\Helper\Data.php, getPasswordTimestamp().

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

Lorsque vous regardez la trace de la pile de la récursion infinie, il continue de boucler en boucle encore et encore. D'une manière ou d'une autre, il semble que ->load()lesgetPasswordTimestamp() méthode .

La solution de contournement donnée dans /magento//a/235984/67252 fonctionne bien, mais je voudrais savoir ce qui se passe.


0

Après avoir appliqué le patch SUPEE 10752, l'inscription et le paiement prennent la page de succès à la page d'accueil. Aucune suggestion?


-1

Nous avons vu une page vierge à / checkout / * après avoir appliqué SUPEE-10752 et compilé

version: 1.9.1.0

Conditions de déclenchement: application de SUPEE-10752 + activation du compilateur + connexion en tant que client, puis visite / paiement / *

Juste pour clarifier: avec le compilateur désactivé, tout s'est bien passé, avec le compilateur activé, nous ne pouvions voir une page de panier vide que lorsque vous vous connectiez sans aucune entrée de journal (même après avoir activé tous les journaux possibles et le mode développeur).

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.