보안 패치 SUPEE-10752-가능한 문제?


14

25 개의 APPSEC 문제를 해결하는 새로운 보안 패치가 Magento 1 용으로 제공됩니다

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

이 패치를 적용 할 때주의해야 할 일반적인 문제는 무엇입니까?

SUPEE-10752, Magento Commerce 1.14.3.9 및 오픈 소스 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로 업그레이드하십시오.

마 젠토 오픈 소스 1.5.0.0-1.9.3.9 : SUPEE-10752 또는 마 젠토 오픈 소스 1.9.3.9로 업그레이드.


문제는 여기에 설명 발생했습니다 - magento.stackexchange.com/questions/248229/...
Shrenik을

답변:


19

Magento의 공식 문서에서 언급 한대로 :

패치 설치 중 충돌 SUPEE-10752 는 이전 패치 버전 1이 설치되어 ( SUPEE-10570v1 ) 가장 자주 발생 합니다.

제거 할 수 있는지 확인하십시오 SUPEE-10570v1를 설치 SUPEE-10570v2을 하기 전에 새 설치에 SUPEE-10752.


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

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

app / code / core / Mage / Catalog / 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());

누구나 onepage.php 파일을 무시하고 파일을 업데이트하십시오.

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

앱 / 코드 / 코어 / 마법사 / 코어 / 모델 / 세션 / 추상 /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;
+    }
+

앱 / 코드 / 코어 / 마법사 / 고객 / 모델 / 자원 /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 : 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 : 실제 MIME 유형을 반환합니다.

+        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

Apache 대신 nginx를 사용하는 경우이 변경 사항을 복제하도록 구성을 업데이트하십시오.

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

새로 추가 / 업데이트 된 배송 방법은 다음과 같습니다.

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

이스케이프 HTML 파일 :

다운로드 가능한 제품 프론트 엔드 파일 : 다운로드 가능한 제품을 사용하는 사람은 테마 파일의 파일을 업데이트하십시오.

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 / 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 / cart / item / default.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>

다른 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>

app / code / core / Mage / Checkout / controllers / CartController.php에서 결제 페이지 중 일반적으로 폼 키 오류가 표시됩니까?
Icon

1
양식 키 오류가 표시되지 않습니다. 누군가가 기본 / 템플릿 / checkout / cart.phtml 파일을 무시하고 양식 키를 놓친 경우. 오류가 아닌 홈 페이지를 리디렉션합니다. 점검표입니다. 오류가 발생하면 양식 키를 확인하십시오 :). 질문 해 주셔서 감사합니다 :)
Rama Chandran M

1
패치 diff를 모두 여기에 게시하는 것이 매우 유용하다고 생각하지 않습니다. 실제 가능한 문제에 더 관심이 있습니다 ...
7ochem

1
귀하의 의견에 감사드립니다. 변경된 파일과 핵심 코드 변경 사항을 쉽게 찾을 수 있기 때문에 다른 사람들에게 유용하다고 생각합니다. 예제 app / design / frontend / rwd / default / template / downloadable / checkout / onepage / review / item.phtml 우리가 테마에서 무시하고 코드를 쉽게 변경한다고 가정하면 더 쉽게 체크리스트와 같습니다.
Rama Chandran M

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 체크 아웃)으로 이동 한 후이 오류가 발생합니다.

구문 분석 오류 : 구문 오류

691 행의 app / code / core / Mage / Checkout / Model / Type / Onepage.php

패치를 되 돌리면 오류가 사라집니다.

이 질문에 대해 자세히 살펴보면 패치가 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 (); Created of problem
Rama Chandran M

@RamaChandranM p! 동일한 PARSE 오류가 발생합니까? 어떤 버전을 사용하고 있습니까?
아이콘

1
그래, 난 또 다른 프로젝트를 확인하고 자세한 내용 Ans By의 : 제공
라마 CHANDRAN M

2
@Icon PHP 5.4 호환성 패치가있었습니다. 나는 1.7 설치를 오랫동안 만지지 않았지만 5.6에서도 작동 할 것으로 예상하고 시도해보십시오.
Fabian Schmengler 2016 년

1
@icon 한동안 사용 중단 통지를 무시할 수 있습니다. 이것은 PHP 7로 업데이트 할 때 관련이 있습니다.
Fabian Schmengler

2

알려진 문제 :-

사용자 정의 코드 또는 확장 프로그램이 Zend/Filter/PregReplace.ph수정 자 e와 함께 p를 사용 하는 경우 가능한 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) XSS에 Escape Html 추가

+++ 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) mimetype 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) 고객 암호 생성 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) 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;
+    }

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`

이 새로운 기능에 대한 설정 추가

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) 젠드 클래스 추가

`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) cron.php에서 try catch의 관리 세션

-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

바닐라 마 젠토 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
  • 수프 -2619
  • 수프 -2725
  • SUPEE-3941
  • 수퍼 -5344
  • 수퍼 -5994
  • 수프 -6237
  • 수프 -6285
  • 수프 -6482
  • 수프 -6788
  • 수프 -7405
  • 수프 -7405v.1.1
  • 수프 -7616
  • 수첩 -8167
  • 스프 -8788v2
  • 수첩 -8967
  • 수프 -9652
  • 수프 -9767v2
  • 수프 -10336
  • 수프 -10266
  • 수프 -10415
  • 수프 -10570v2

해결책

패치 파일을 편집하여 수정했습니다. 원래 패치 파일 downloadable.phtml의 패치에서 패치로 교체 되었습니다 v1.7.0.2. 1854-1862 행입니다.

이것은 주로 파일의 들여 쓰기 때문입니다. 의 변화로 downloadable.phtml인이 V1.7.0.2가지고 더 들여.

해결책 2

비슷한 문제가 있었지만 Windows 스타일 CRLF 또는 Mac CR이 아닌 Unix 스타일 LF로 끝나는 편집기에서 원본 파일을 다시 저장하여 수정할 수있었습니다.


1

Matt Antley와 관련하여 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을 유지하기로 결정 했습니까?!


+1 이것이 그 이유 일 가능성이 가장 높지만, 사용자가 업그레이드하고 적용 SUPEE-10570v2해야한다면 다시 적용해야 한다는 점에 주목할 가치가 있습니다.
Matt Antley

Peter O'Callaghan이 말했듯이 10570v2의 변경 사항은 10752로 되돌려 지므로 전자를 포함시킬 필요가 없습니다. 1.9.3.9에는 10570v2가 없으므로 아무 것도 적용하지 않아도됩니다. 전체 추론이 약한 이유 : 마 젠토가 왜 1.9.3.9 지점을 다른 지점과 다른 기반으로 유지해야합니까? 그들은 모든 향후 릴리스와 10570v2에 패치를 적용 할 것이라고 말했습니다.
pong

댓글 Peter와 pong에 감사드립니다. 두 사람이 진술 한대로 오도 된대로 내 대답을 제거했습니다. 그것은 내 강렬한 것이 아니고, 그것을 쓸 때 생각하지 않았고, 조금만 살펴보고 SUPEE-10752총을 뛸 때 잠깐 눈치 something 습니다. 다시 한 번, 의견에 감사드립니다.
Matt Antley

1

바닐라 마 젠토 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
  • 스프 -2631
  • 수프 -2725
  • 수퍼 -5344
  • 수퍼 -5994
  • 수프 -6237
  • 수프 -6285
  • 수프 -6482
  • 수프 -6788
  • 수프 -7405
  • 수프 -7405v.1.1
  • 수첩 -8167
  • 스프 -8788v2
  • 수첩 -8967
  • 수프 -9652
  • 수프 -9767v2
  • 수프 -10266
  • 수프 -10415
  • 수프 -10570v2
  • SUPEE-10752

해결

패치 파일을 변경하여이 문제를 해결했습니다. v1.5.1.0 패치에서 문제를 일으킨 덩어리를 교체했습니다. 원본 패치 파일에는 167-177 및 663-670 행이 있습니다.


1

SUPEE-10752를 적용한 후 EE v1.14.2.4에서 체크 아웃이 성공 페이지 대신 홈페이지로 리디렉션되는 문제를 해결하기 위해 다음 패치를 적용해야했습니다.

파일 : 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 MB)


또한 PHP가 5.5 미만인 경우 CE 1.9.3.6과 동일합니다. 수정 해 주셔서 감사합니다
GunJan Mehta

1

이 패치 후에 문제가 발생했습니다. "UPS Type" "United Parcel Service XML"에 대해 "Free Method"를 설정할 수 없습니다. "자유 방법"드롭 다운에서 방법을 선택하면 Magento에서 오류가 발생합니다. 오류 : " 필드"Ups Free Method "에 잘못된 값이 있습니다. "

누구든지 같은 문제에 직면하여 해결책을 얻었습니까?

미리 감사드립니다!


0

1.6에서 ups.phtml 패치가 깨졌습니다. 1.6에 오타가있는 $ storedOriginShipment, $ storedFreeShipment ($ stroredOriginShipment 및 $ stroredFreeShipment)를 참조합니다. 또한 1.6에는 전혀 존재하지 않는 $ storedUpsType을 참조합니다.


0

1.9.1.0 및 1.9.2.4에서 문제가 발생했습니다 (타사에서는 테스트하지 않았습니다). 모든 프로젝트에 나타나지는 않지만 여러 프로젝트에서 반복되었습니다. SUPEE-10570v1이 설치된 프로젝트에 영향을 줄 수 있다고 생각합니다.

패치를 적용한 후 사용자가 로그인하면 계정 페이지가 완벽하게 표시됩니다. 그러나 사이트의 다른 페이지로 돌아 가려고하면 페이지가 응답하지 않고 빈 화면이나 502 Bad Gateway가 표시됩니다. 이는 PHP가 무한 루프로 들어가서 segfaulting 또는 .ini 설정에 의해 중지 되었기 때문입니다.

나는 문제가 $customerin \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에 제공된 해결 방법이 제대로 작동하지만 무슨 일이 일어나고 있는지 알고 싶습니다.


0

패치 SUPEE 10752를 적용한 후 등록 및 체크 아웃이 성공 페이지를 홈페이지로 가져갑니다. 어떤 제안?


-1

SUPEE-10752를 적용하고 컴파일 한 후 / checkout / *에 빈 페이지가 표시되었습니다.

버전 : 1.9.1.0

트리거 조건 : SUPEE-10752 적용 + 컴파일러 사용 + 고객으로 로그인 한 후 / checkout / * 방문

명확히하기 위해 : 비활성화 된 컴파일러를 사용하면 모든 것이 잘되었습니다. 활성화 된 컴파일러를 사용하면 로그 항목없이 로그인 할 때 빈 카트 페이지 만 볼 수 있습니다 (모든 가능한 로그 및 개발자 모드를 활성화 한 후에도).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.