SUPEE-6285补丁程序,已更改了什么?


26

好了,有人要问这个问题:今天,2015年7月7日,发布了适用于Magento <1.9.2的新安全补丁。

尽快更新您的商店!

但是发生了什么变化?是否存在针对涵盖的安全问题的已知利用?可能发生的最坏情况是什么?

还有什么可以打破的吗?就像SUPEE-5994一样,如果缺少下载程序目录,则无法应用补丁...


4
很多。仅补丁文件就有1100行以上,其中约有350个添加项和100个删除项。如果您已在包/主题中覆盖了手动模板编辑的内容,则需要在
〜8个

Answers:


36

如前所述,已修补的漏洞在此官方页面(新商人文档)上有详细描述:http : //merch.docs.magento.com/ce/user_guide/Magento_Community_Edition_User_Guide.html#magento/patch-releases-2015.html

摘要

该捆绑软件包括针对以下与安全性有关的问题的保护:

  • 通过RSS和特权升级的客户信息泄漏
  • 在Magento中请求伪造将线索连接到代码执行
  • 愿望清单中的跨站点脚本
  • 购物车中的跨站点脚本
  • 商店路径披露
  • 日志文件权限太宽
  • Admin中的跨站点脚本
  • 订单中的跨站点脚本RSS

在修补了一些商店之后,这就是我收集的内容:

主题补丁

一些主题文件已进行了修补,并添加了转义功能,以防止可能的XSS攻击:

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

如果您的主题包含这些模板中的任何一个,或者直接在其中进行了修改base/default(祝您好运,这很麻烦),那么您需要手动对其进行修补:

  1. 在结帐模板中,替换所有出现的

    $this->getContinueShoppingUrl()

    Mage::helper('core')->quoteEscape($this->getContinueShoppingUrl())
  2. 在中wishlist/email/rss.phtml,替换

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

    Mage::helper('core')->escapeHtml($this->helper('wishlist')->getCustomerName())
  3. 在中rss/order/details.phtml,替换

    <?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 />
    

    <?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 />
    

权限

.htaccess文件已添加到downloader/Maged并且downloader/lib不允许直接访问源文件。如果您使用nginx,则需要添加以下规则以实现相同的规则(为此,向Ben Lessani致敬):

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

但是我还是建议downloader无论如何都不要从部署到实时系统的系统中进行部署,在这种情况下,您无需采取任何措施。

管理员权限(ACL)

如果您使用受限管理员帐户,则第三方扩展名的某些菜单可能不再适用于它们。原因是默认的返回值Mage_Adminhtml_Controller_Action::_isAllowed()已从更改trueMage::getSingleton('admin/session')->isAllowed('admin')。由于不使用ACL而不在其管理控制器中覆盖此方法的扩展现在需要“ ALL”特权。

唯一的解决方案是修补扩展并将此方法添加到其所有管理控制器中:

protected function _isAllowed()
{
    return true;
}

或者,如果它们实际上具有在中定义的ACL资源etc/adminhtml.xml

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

(您可以看到该补丁Phoenix_Moneybookers在旧版的Magento版本(如1.7)中具有相同的功能,其中包含此扩展名)

有关此问题的更详细的观点以及如何定义缺少的ACL资源的解释,请参阅:安装SUPEE-6285后访问拒绝的错误。

应用补丁时可能出现的错误

  1. 信息:

    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
    

    原因:default/modern主题是从安装中删除

    解决方案:app/design/frontend/default/modern从全新的Magento下载中添加(应该与您的商店的版本相同)。您也可以使用此镜像:https : //github.com/firegento/magento。然后,在成功应用补丁之后,您可以再次删除主题。

  2. 信息

    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
    

    原因:downloader目录已从安装中删除

    解决方案:downloader从全新的Magento下载中添加(应该与您的商店的版本相同)。您也可以使用此镜像:https : //github.com/firegento/magento。然后,成功应用补丁后,您可以再次删除目录。

  3. 讯息:类似

    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
    

    原因:文件存储时使用\r\n(CRLF,Windows换行符)或\r(CR,Mac换行符)而不是\n(LF,Unix换行符)。

    解决方案:只需转换换行符,您的文本编辑器或IDE应该可以做到这一点。


由于这似乎是一个重要补丁,您是否同意运行1.9.x的商店现在最好升级到包含此补丁的1.9.2.0?
paj 2015年

1
我还没有将任何商店更新到1.9.2.0,但是似乎还有其他陷阱,无论如何都要对更新进行仔细的测试。我仍然建议先安装补丁。
Fabian Schmengler,2015年

在我们的团队中,我们开发了一个扩展程序供我们使用,在此补丁程序之后,我意识到某些管理控制器未实现该_isAllowed方法。幸运的是,我们确实在模块中添加了ACL,除了添加方法之外,不需要其他操作。此外,我确实遇到了第一个错误消息,其default/modern主题已被移动(由于Git,我也找到了罪魁祸首)。为此+1
Vic

这里有一些很棒的东西。当我更新cart.phtml时,我将我的版本与基本版本进行了比较,并注意到您的编辑似乎有些错误。补丁文件中的新行是:<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-> __('Continue Shopping')?> </ span> </ span> </ button>。你能澄清一下吗?
PedroKTFC 2015年

7

通过@ http://blog.philwinkle.com/supee-6285-broken-down/

通常,这涉及添加一个_isAllowed受保护的方法,该方法返回一个布尔值。有时,此布尔值是ACL检查的结果,就像对Adminhtml / controllers / Catalog / Category / WidgetController的更新一样。有时,例如与Adminhtml / controllers / AjaxController.php一样,这是硬编码为true的

添加完后:

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

对于第3方负责人之一,管理科又开始“工作”了……

那么我们很快就会获得另一个Magento补丁?这似乎是一个更大的问题...


请看我的回答。授予受限角色“仪表板”特权将允许再次访问没有自己的ACL资源的第三方部分。
Fabian Schmengler

Magento 1.8:检查(该权限为“ ON”)-相同的情况:访问被拒绝。是的,我先退出并在之后登录::
Piotr Siejczuk

抱歉,我误解了“ admin”的配置,它实际上仅对具有所有特权的用户返回true。确实,许多扩展都需要打补丁。相应地更新了我的答案。
Fabian Schmengler,2015年

这或我写的@ magento.stackexchange.com /questions/73646/…我们可能需要在app / code / local中为Mage_Adminhtml_Controller_Action :: _ isAllowed()<pre>受保护的函数_isAllowed(){返回Mage :: getSingleton('admin / session')-> isAllowed('system / config'); } </ pre>
Piotr Siejczuk 2015年

1
如果“ system / config”作为默认权限对您有效。.取决于商人,我猜
Fabian Schmengler,2015年

3

如果您有很多社区/本地扩展,您将需要特别注意SUPEE-6285中的此更改,该更改会影响app/code/core/Mage/Adminhtml/Controller/Action.php并围绕666行,具体取决于您的补丁程序版本(这是EE 1.14.0.1补丁文件):

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

所有未实现自己的管理资源的自定义模块均会受到上述更改的影响,除非该管理员用户具有完整的管理员权限,否则访问将被拒绝。

如果您在修补程序中的其他地方查看,您会看到很多包含的核心模块已更新,但是这可能会影响许多第三方模块,因此请特别注意在修补程序后测试网站中的任何第三方扩展,以检查您仍然可以访问它们!


1

补丁程序发布页面似乎已更新了有关其影响的信息。

我尚未在生产站点上安装并进行测试


3
我已将其安装在Dev服务器上,并且工作正常,因此将其投入生产。一切似乎都正常,直到我们的某些产品和销售管理员尝试使用Magento管理员-这些用户通过Magento中的“用户角色编辑器”限制了角色权限,在管理区域网站的某些区域,他们经常出现访问被拒绝的错误。使用第3方插件。我的主要管理员帐户仍然可以在所有这些程序上正常工作...我仍在对其进行研究
Ricky Odin Matthews 2015年

0

应用补丁程序后的已修改文件的完整列表也位于 app/etc/applied.patches.list


0

在我的第三方模块中,将以下代码添加到adminhtml控制器中可以工作:

protected function _isAllowed()

{
     return true;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.