Parche SUPEE-6285, ¿qué ha cambiado?

26

OK, alguien tiene que preguntar esto: hoy, 7/7/2015 se ha lanzado un nuevo parche de seguridad para Magento <1.9.2.

¡actualiza tus tiendas lo antes posible!

¿Pero qué ha cambiado? ¿Existen vulnerabilidades conocidas de los problemas de seguridad cubiertos? ¿Qué es lo peor que pudo haber pasado?

¿Y hay algo que pueda romperse? Al igual que con SUPEE-5994, donde no era posible aplicar el parche si faltaba el directorio de descarga ...

Fabian Schmengler
fuente
44
MUCHO. El archivo de parche solo tiene más de 1,100 líneas con aproximadamente 350 adiciones y 100 eliminaciones. Las ediciones manuales de plantillas deberán realizarse en ~ 8 plantillas frontend si las ha anulado en su paquete / tema
Ben Lessani - Sonassi
55
Aquí hay un buen artículo blog.philwinkle.com/supee-6285-broken-down
Steve Robbins

Respuestas:

36

Como ya se mencionó, las vulnerabilidades parcheadas se describen en detalle en esta página oficial (nuevos documentos comerciales): http://merch.docs.magento.com/ce/user_guide/Magento_Community_Edition_User_Guide.html#magento/patch-releases-2015.html

Resumen

Este paquete incluye protección contra los siguientes problemas relacionados con la seguridad:

  • Fuga de información del cliente a través de RSS y escalada de privilegios
  • Solicitar falsificación en Magento Connect conduce a la ejecución de código
  • Scripting entre sitios en la lista de deseos
  • Scripting de sitios cruzados en el carrito
  • Divulgación de ruta de tienda
  • Permisos en archivos de registro demasiado amplios
  • Scripting entre sitios en Admin
  • Scripting entre sitios en pedidos RSS

Después de parchear algunas tiendas, esto es lo que reuní:

Parches temáticos

Algunos archivos de temas se han parcheado con escapes adicionales para evitar posibles ataques XSS:

  • checkout/cart.phtml
  • checkout/cart/noItems.phtml
  • checkout/onepage/failure.phtml
  • rss/order/details.phtml
  • wishlist/email/rss.phtml

Si su tema (s) contiene alguna de estas plantillas, o si realizó modificaciones directamente base/default(buena suerte, está jodido), entonces necesita parchearlas manualmente:

  1. en las plantillas de pago, reemplace todas las ocurrencias de

    $this->getContinueShoppingUrl()

    con

    Mage::helper('core')->quoteEscape($this->getContinueShoppingUrl())
  2. en wishlist/email/rss.phtml, reemplazar

    $this->helper('wishlist')->getCustomerName()

    con

    Mage::helper('core')->escapeHtml($this->helper('wishlist')->getCustomerName())
  3. En rss/order/details.phtml, reemplazar

    <?php echo $this->__('Customer Name: %s', $_order->getCustomerFirstname()?$_order->getCustomerName():$_order->getBillingAddress()->getName()) ?><br />
    <?php echo $this->__('Purchased From: %s', $_order->getStore()->getGroup()->getName()) ?><br />

    con

    <?php $customerName = $_order->getCustomerFirstname() ? $_order->getCustomerName() : $_order->getBillingAddress()->getName(); ?>
    <?php echo $this->__('Customer Name: %s', Mage::helper('core')->escapeHtml($customerName)) ?><br />
    <?php echo $this->__('Purchased From: %s', Mage::helper('core')->escapeHtml($_order->getStore()->getGroup()->getName())) ?><br />

Permisos

.htaccessLos archivos se han agregado downloader/Magedy downloader/libno permiten el acceso directo a los archivos de origen. Si usa nginx, debe agregar estas reglas para lograr lo mismo (gracias a Ben Lessani para esta):

location /downloader/Maged/ { deny all; }
location /downloader/lib/   { deny all; }

Pero recomiendo excluir downloaderde las implementaciones a un sistema de sistema en vivo de todos modos, en este caso no necesita tomar medidas.

Privilegios de administrador (ACL)

Si usa cuentas de administrador restringidas, es posible que algunos menús de extensiones de terceros ya no funcionen para ellas. La razón es que el valor de retorno predeterminado de Mage_Adminhtml_Controller_Action::_isAllowed()ha cambiado de truea Mage::getSingleton('admin/session')->isAllowed('admin'). Las extensiones que no anulan este método en sus controladores de administrador porque no usan la ACL, ahora necesitan el privilegio "TODOS" .

La única solución es parchear las extensiones y agregar este método a todos sus controladores de administrador:

protected function _isAllowed()
{
    return true;
}

O si realmente tienen un recurso ACL definido en etc/adminhtml.xml:

protected function _isAllowed()
{
    return Mage::getSingleton('admin/session')->isAllowed('ENTER RESOURCE IDENTIFIER HERE');
}

(puede ver que el parche hace lo mismo para Phoenix_Moneybookersversiones anteriores de Magento como 1.7 donde se incluyó esta extensión)

Para obtener una perspectiva más detallada sobre este problema y una explicación sobre cómo definir los recursos de ACL faltantes, consulte: Errores de acceso denegado después de instalar SUPEE-6285

Posibles errores al aplicar el parche

  1. Mensaje:

    can't find file to patch at input line 899
    Perhaps you used the wrong -p or --strip option?
    The text leading up to this was:
    --------------------------
    |diff --git app/design/frontend/default/modern/template/checkout/cart.phtml app/design/frontend/default/modern/template/checkout/cart.phtml
    |index 982ad5a..2bf6b37 100644
    |--- app/design/frontend/default/modern/template/checkout/cart.phtml
    |+++ app/design/frontend/default/modern/template/checkout/cart.phtml
    --------------------------
    File to patch:
    Skip this patch? [y]
    Skipping patch.
    1 out of 1 hunk ignored

    Motivo: el default/moderntema se eliminó de la instalación

    Solución: Agregue app/design/frontend/default/moderndesde una nueva descarga de Magento (debe ser la misma versión que su tienda). También puede usar este espejo: https://github.com/firegento/magento . Luego, después de aplicar el parche con éxito, puede eliminar el tema nuevamente.

  2. Mensaje

    patching file downloader/Maged/.htaccess
    can't find file to patch at input line 915
    Perhaps you used the wrong -p or --strip option?
    The text leading up to this was:
    --------------------------
    |diff --git downloader/Maged/Controller.php downloader/Maged/Controller.php
    |index aa9d705..32755d7 100644
    |--- downloader/Maged/Controller.php
    |+++ downloader/Maged/Controller.php
    --------------------------
    File to patch:
    Skip this patch? [y]
    Skipping patch.
    5 out of 5 hunks ignored
    can't find file to patch at input line 976
    Perhaps you used the wrong -p or --strip option?
    The text leading up to this was:
    --------------------------
    |diff --git downloader/Maged/Model/Session.php downloader/Maged/Model/Session.php
    |index 18020eb..7013c94 100644
    |--- downloader/Maged/Model/Session.php
    |+++ downloader/Maged/Model/Session.php
    --------------------------
    File to patch:
    Skip this patch? [y]
    Skipping patch.
    2 out of 2 hunks ignored
    patching file downloader/lib/.htaccess
    can't find file to patch at input line 1020
    Perhaps you used the wrong -p or --strip option?
    The text leading up to this was:
    --------------------------
    |diff --git downloader/template/connect/packages.phtml downloader/template/connect/packages.phtml
    |index 9cca5a6..f42e74e 100644
    |--- downloader/template/connect/packages.phtml
    |+++ downloader/template/connect/packages.phtml
    --------------------------
    File to patch:
    Skip this patch? [y]
    Skipping patch.
    3 out of 3 hunks ignored
    can't find file to patch at input line 1049
    Perhaps you used the wrong -p or --strip option?
    The text leading up to this was:
    --------------------------
    |diff --git downloader/template/connect/packages_prepare.phtml downloader/template/connect/packages_prepare.phtml
    |index f74c3df..86aa51b 100644
    |--- downloader/template/connect/packages_prepare.phtml
    |+++ downloader/template/connect/packages_prepare.phtml
    --------------------------
    File to patch:
    Skip this patch? [y]
    Skipping patch.
    1 out of 1 hunk ignored
    can't find file to patch at input line 1061
    Perhaps you used the wrong -p or --strip option?
    The text leading up to this was:
    --------------------------
    |diff --git downloader/template/login.phtml downloader/template/login.phtml
    |index 6e4cd2c..dbbeda8 100644
    |--- downloader/template/login.phtml
    |+++ downloader/template/login.phtml
    --------------------------
    File to patch:
    Skip this patch? [y]
    Skipping patch.
    1 out of 1 hunk ignored
    can't find file to patch at input line 1073
    Perhaps you used the wrong -p or --strip option?
    The text leading up to this was:
    --------------------------
    |diff --git downloader/template/settings.phtml downloader/template/settings.phtml
    |index 13551ac..47ab411 100644
    |--- downloader/template/settings.phtml
    |+++ downloader/template/settings.phtml
    --------------------------
    File to patch:
    Skip this patch? [y]
    Skipping patch.
    1 out of 1 hunk ignored

    Motivo: el downloaderdirectorio se eliminó de la instalación

    Solución: Agregue downloaderdesde una nueva descarga de Magento (debe ser la misma versión que su tienda). También puede usar este espejo: https://github.com/firegento/magento . Luego, después de aplicar el parche con éxito, puede eliminar el directorio nuevamente.

  3. Mensaje: algo similar a

    checking file app/design/frontend/base/default/template/checkout/cart.phtml
    Hunk #1 FAILED at 97 (different line endings).
    1 out of 1 hunk FAILED
    checking file app/design/frontend/base/default/template/checkout/cart/noItems.phtml
    Hunk #1 FAILED at 31 (different line endings).
    1 out of 1 hunk FAILED
    checking file app/design/frontend/base/default/template/checkout/onepage/failure.phtml
    Hunk #1 FAILED at 29 (different line endings).
    1 out of 1 hunk FAILED
    checking file app/design/frontend/base/default/template/rss/order/details.phtml
    Hunk #1 FAILED at 31 (different line endings).
    1 out of 1 hunk FAILED
    checking file app/design/frontend/base/default/template/wishlist/email/rss.phtml
    Hunk #1 FAILED at 25 (different line endings).
    1 out of 1 hunk FAILED

    Motivo: los archivos se almacenan con \r\n(CRLF, salto de línea de Windows) o \r(CR, salto de línea de Mac) en lugar de \n(LF, salto de línea de Unix).

    Solución: simplemente convierta los saltos de línea, su editor de texto o IDE debería ser capaz de hacerlo.

Fabian Schmengler
fuente
Como esto parece ser un parche importante, ¿estaría de acuerdo en que las tiendas que ejecutan 1.9.x ahora estarían mejor actualizando a 1.9.2.0 que incluye este parche?
paj
1
Todavía no actualicé ninguna tienda a 1.9.2.0, pero parece que hay algunas dificultades adicionales y las actualizaciones deben probarse con más cuidado de todos modos. Todavía recomendaría instalar el parche primero.
Fabian Schmengler
En nuestro equipo desarrollamos una extensión solo para nuestro uso y después de este parche me di cuenta de que algunos de los controladores de administración no estaban implementando el _isAllowedmétodo. Afortunadamente, tuvimos ACL en el módulo y no se requirió ninguna acción adicional aparte de agregar el método. Además, encontré ese primer mensaje de error con el default/moderntema que se había movido (también encontré al culpable gracias a Git). +1 para eso
Vic
Algunas cosas excelentes aquí. Cuando fui a actualizar mi cart.phtml, comparé mi versión con la de base y noté que su edición parece un poco incorrecta. La nueva línea del archivo de parche es: <button type = "button" title = "<? Php echo Mage :: helper ('core') -> quoteEscape ($ this -> __ ('Continue Shopping'))?> "class =" button btn-continue "onclick =" setLocation ('<? php echo Mage :: helper (' core ') -> quoteEscape ($ this-> getContinueShoppingUrl ())?>') "> <span> < span> <? php echo $ this -> __ ('Continuar comprando')?> </span> </span> </button>. ¿Puedes aclarar?
PedroKTFC
7

Vía @ http://blog.philwinkle.com/supee-6285-broken-down/

En general, esto implica agregar un método protegido _isAllowed que devuelve un valor booleano. A veces, este valor booleano es el resultado de una comprobación de ACL, como con la actualización de Adminhtml / controllers / Catalog / Category / WidgetController. A veces esto está codificado como verdadero, como con Adminhtml / controllers / AjaxController.php

Después de haber agregado:

protected function _isAllowed()
{
    return Mage::getSingleton('admin/session')->isAllowed('system/config');
}

Para uno de los controladores de terceros, la sección de administración comenzó a "trabajar" nuevamente ...

¿Tendremos otro parche de Magento pronto? Esto parece ser un problema mayor ...

Piotr Siejczuk
fuente
Por favor mira mi respuesta. Al otorgarles a los roles restringidos el privilegio de "Tablero", se permitirá nuevamente el acceso a secciones de terceros sin recursos de ACL propios.
Fabian Schmengler
Magento 1.8 : Comprobado que (tenía ese derecho "ENCENDIDO") - misma historia: Acceso denegado . Sí, primero tengo que cerrar sesión e iniciar sesión después de :)
Piotr Siejczuk
Lo siento, he malinterpretado la configuración de "admin", en realidad solo se cumple para los usuarios con todos los privilegios. Es cierto que muchas extensiones deberán ser parcheadas. Actualicé mi respuesta en consecuencia.
Fabian Schmengler
Esto o como escribí en @ magento.stackexchange.com/questions/73646/… podríamos necesitar escribir Override general en la aplicación / código / local para Mage_Adminhtml_Controller_Action :: _ isAllowed () <pre> función protegida _isAllowed () {return Mage :: getSingleton ('admin / session') -> isAllowed ('system / config'); } </ Pre>
Piotr Siejczuk
1
Si "system / config" como permiso predeterminado funciona para usted ... depende del comerciante, supongo
Fabian Schmengler
3

Si tiene muchas extensiones comunitarias / locales, querrá prestar especial atención a este cambio en SUPEE-6285 que afecta app/code/core/Mage/Adminhtml/Controller/Action.phpy está alrededor de la línea 666 dependiendo de su versión de parche (este es el archivo de parche EE 1.14.0.1):

protected function _isAllowed()
    {
-        return true;
+        return Mage::getSingleton('admin/session')->isAllowed('admin');
    }

Todos los módulos personalizados que no implementan sus propios recursos de administración se ven afectados por el cambio anterior y el acceso será denegado a menos que el usuario administrador en cuestión tenga todos los privilegios de administrador.

Si busca en otra parte del parche, verá que muchos de los módulos principales incluidos se han actualizado; sin embargo, es probable que esto afecte a muchos módulos de terceros, así que preste especial atención para probar cualquier extensión de terceros en el parche posterior de su sitio para verificar ¡Todavía puedes acceder a ellos!

simonyoung
fuente
1

Parece que la página de lanzamiento del parche se ha actualizado con información sobre lo que afecta.

Todavía tengo que instalar en un sitio de producción y probar

Ganso84
fuente
3
Lo instalé en el servidor Dev y funcionó bien, así que lo puse en producción. Todo parecía funcionar bien, hasta que algunos de nuestros administradores de productos y ventas intentaron usar el administrador de Magento: estos usuarios tienen permisos de roles restringidos a través del 'editor de roles de usuario' en Magento, fueron frecuentados con errores de acceso denegado en algunas áreas del sitio web del área de administración que usan complementos de terceros. Mi cuenta de administrador principal todavía funciona bien en todo esto ... Todavía lo estoy investigando
Ricky Odin Matthews
0

La lista completa de archivos modificados después de aplicar el parche también está disponible en app/etc/applied.patches.list

gopherIT
fuente
0

En mi caso para módulos de terceros, agregar el siguiente código a los controladores adminhtml funcionó:

protected function _isAllowed()

{
     return true;
}
Ankur Jain
fuente