Łatka SUPEE-6285, co zostało zmienione?


26

OK, ktoś musi o to zapytać: dzisiaj, 7.07.2015, została wydana nowa poprawka bezpieczeństwa dla Magento <1.9.2.

zaktualizuj swoje sklepy jak najszybciej!

Ale co się zmieniło? Czy znane są luki w zabezpieczeniach? Co najgorszego mogło się stać?

I czy jest coś, co może się zepsuć? Podobnie jak w przypadku SUPEE-5994, w którym nie można zastosować poprawki, jeśli brakuje katalogu downloadera ...


4
DUŻO. Sam plik łatki ma ponad 1100 linii z około 350 dodatkami i 100 usunięciami. Ręczne zmiany szablonów będą musiały zostać wykonane w ~ 8 szablonach nakładki, jeśli
zastąpiłeś

Odpowiedzi:


36

Jak już wspomniano, załatane luki opisano szczegółowo na tej oficjalnej stronie (nowe dokumenty sprzedawcy): http://merch.docs.magento.com/ce/user_guide/Magento_Community_Edition_User_Guide.html#magento/patch-releases-2015.html

Podsumowanie

Ten pakiet obejmuje ochronę przed następującymi problemami związanymi z bezpieczeństwem:

  • Wyciek informacji o klientach przez RSS i eskalację uprawnień
  • Żądaj fałszerstwa w Magento Connect prowadzi do wykonania kodu
  • Skrypty krzyżowe w liście życzeń
  • Skrypty krzyżowe w koszyku
  • Ujawnienie ścieżki sklepu
  • Zbyt szerokie uprawnienia do plików dziennika
  • Skrypty między witrynami w administracji
  • Skrypty krzyżowe w RSS zamówień

Po załataniu kilku sklepów, oto co zebrałem:

Łatki tematyczne

Niektóre pliki motywów zostały załatane z dodaniem znaku ucieczki, aby zapobiec możliwym atakom XSS:

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

Jeśli Twój motyw (y) zawiera którykolwiek z tych szablonów lub dokonałeś modyfikacji bezpośrednio w base/default(powodzenia, jesteś wkręcony), musisz je załatać ręcznie:

  1. w szablonach płatności zamień wszystkie wystąpienia

    $this->getContinueShoppingUrl()

    z

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

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

    z

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

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

    z

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

Uprawnienia

.htaccesspliki zostały dodane do downloader/Magedi downloader/libuniemożliwiają bezpośredni dostęp do plików źródłowych. Jeśli używasz nginx, musisz dodać te reguły, aby osiągnąć to samo ( dziękuję Benowi Lessani za ten):

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

Ale i tak zalecam wykluczenie downloaderz wdrożeń systemu działającego na żywo, w tym przypadku nie musisz podejmować żadnych działań.

Uprawnienia administratora (ACL)

Jeśli używasz ograniczonych kont administracyjnych, niektóre menu rozszerzeń innych firm mogą już nie działać. Powodem jest to, że domyślna wartość zwracana Mage_Adminhtml_Controller_Action::_isAllowed()została zmieniona z truena Mage::getSingleton('admin/session')->isAllowed('admin'). Rozszerzenia, które nie zastępują tej metody w swoich kontrolerach administracyjnych, ponieważ nie używają ACL, teraz potrzebują uprawnienia „WSZYSTKO” .

Jedynym rozwiązaniem jest załatanie rozszerzeń i dodanie tej metody do wszystkich kontrolerów administratora:

protected function _isAllowed()
{
    return true;
}

Lub jeśli faktycznie mają zasób ACL zdefiniowany w etc/adminhtml.xml:

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

(widać, że łatka robi to samo Phoenix_Moneybookersw starszych wersjach Magento, takich jak 1.7, w których to rozszerzenie zostało uwzględnione)

Aby uzyskać bardziej szczegółowe spojrzenie na ten problem i wyjaśnienie, jak zdefiniować brakujące zasoby ACL, zobacz: Błędy odmowy dostępu po zainstalowaniu SUPEE-6285

Możliwe błędy podczas stosowania poprawki

  1. Wiadomość:

    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

    Powód:default/modern Temat został usunięty z instalacji

    Rozwiązanie: Dodaj app/design/frontend/default/modernze świeżego pliku do pobrania Magento (powinna być w tej samej wersji co Twój sklep). Możesz także użyć tego lustra: https://github.com/firegento/magento . Następnie po pomyślnym zastosowaniu łatki możesz ponownie usunąć motyw.

  2. Wiadomość

    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

    Powód:downloader katalog został usunięty z instalacji

    Rozwiązanie: Dodaj downloaderze świeżego pliku do pobrania Magento (powinna być w tej samej wersji co Twój sklep). Możesz także użyć tego lustra: https://github.com/firegento/magento . Następnie po pomyślnym zastosowaniu łatki możesz ponownie usunąć katalog.

  3. Wiadomość: Coś podobnego do

    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

    Powód: pliki są przechowywane w \r\n(CRLF, podział linii Windows) lub \r(CR, podział linii Mac) zamiast \n(LF, podział linii Unix).

    Rozwiązanie: Wystarczy przekonwertować podziały wierszy, edytor tekstu lub IDE powinno to umożliwić.


Ponieważ wydaje się, że jest to poważna łatka, czy zgodziłbyś się, że sklepy z wersją 1.9.x lepiej byłoby teraz zaktualizować do wersji 1.9.2.0, która zawiera tę poprawkę?
paj

1
Nie zaktualizowałem jeszcze żadnego sklepu do wersji 1.9.2.0, ale wydaje się, że istnieją pewne dodatkowe pułapki, a aktualizacje powinny być i tak testowane dokładniej. Nadal zalecałbym najpierw zainstalowanie łatki.
Fabian Schmengler,

W naszym zespole opracowaliśmy rozszerzenie do naszego użytku, a po tej łatce zdałem sobie sprawę, że niektórzy administratorzy nie wdrażali tej _isAllowedmetody. Na szczęście w module mamy ACL i nie było żadnych dodatkowych działań oprócz dodania metody. Spotkałem też ten pierwszy komunikat o błędzie z przeniesionym default/modernmotywem (znalazłem również winowajcę dzięki Git). +1 za to
Vic

Kilka świetnych rzeczy tutaj. Kiedy poszedłem zaktualizować mój plik cart.phtml, porównałem swoją wersję z wersją podstawową i zauważyłem, że twoja edycja wydaje się nieco niepoprawna. Nowa linia z pliku łatki to: <button type = "button" title = "<? Php echo Mage :: helper ('core') -> quoteEscape ($ this -> __ ('Continue Shopping'))?> "class =" przycisk btn-Continue "onclick =" setLocation ('<? php echo Mage :: helper (' core ') -> quoteEscape ($ this-> getContinueShoppingUrl ())?>') "> <span> < span> <? php echo $ this -> __ ('Kontynuuj zakupy')?> </span> </span> </button>. Możesz wyjaśnić?
PedroKTFC

7

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

Zasadniczo wymaga to dodania chronionej metody _isAllowed, która zwraca wartość logiczną. Czasami ta wartość logiczna jest wynikiem sprawdzenia listy ACL, tak jak w przypadku aktualizacji Adminhtml / controllers / Catalog / Category / WidgetController. Czasami jest to mocno zakodowane na prawdę, jak w przypadku Adminhtml / controllers / AjaxController.php

Po dodaniu:

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

Do jednego z zewnętrznych kontrolerów ta sekcja administracyjna znów zaczęła „działać” ...

Czyli wkrótce dostaniemy kolejną łatkę Magento? Wydaje się to większym problemem ...


Proszę zobaczyć moją odpowiedź. Przyznanie ograniczonym rolom uprawnienia „Dashboard” umożliwi dostęp do sekcji stron trzecich bez własnego zasobu ACL.
Fabian Schmengler

Magento 1.8 : Sprawdziłem, że (miał „ON” to prawo) - ta sama historia: odmowa dostępu . Tak, najpierw się wylogowałem i zaloguj się po :)
Piotr Siejczuk,

Niestety, źle zinterpretowałem konfigurację „admin”, w rzeczywistości zwraca ona wartość true tylko dla użytkowników ze wszystkimi uprawnieniami. Prawdą jest, że wiele rozszerzeń będzie wymagać załatania. Zaktualizowałem odpowiednio moją odpowiedź.
Fabian Schmengler

To lub jak napisałem @ magento.stackexchange.com/questions/73646/... możemy potrzebować napisać ogólne zastąpienie w app / code / local dla Mage_Adminhtml_Controller_Action :: _ isAllowed () <pre> funkcja chroniona _isAllowed () {return Mage :: getSingleton ('admin / session') -> isAllowed ('system / config'); } </pre>
Piotr Siejczuk

1
Jeśli „system / config” jako dzieła domyślne uprawnień dla ciebie .. zależy od kupca Chyba
Fabian Schmengler

3

Jeśli masz wiele rozszerzeń społecznościowych / lokalnych, powinieneś zwrócić szczególną uwagę na tę zmianę w SUPEE-6285, która wpływa app/code/core/Mage/Adminhtml/Controller/Action.phpi jest w linii 666 w zależności od wersji łatki (jest to plik poprawek EE 1.14.0.1):

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

Powyższe zmiany mają wpływ na wszystkie niestandardowe moduły, które nie wdrażają własnych zasobów administracyjnych, a dostęp zostanie odmówiony, chyba że dany administrator będzie miał pełne uprawnienia administratora.

Jeśli spojrzysz gdzie indziej w łatce, zobaczysz, że wiele zawartych modułów podstawowych zostało zaktualizowanych, jednak może to wpłynąć na wiele modułów stron trzecich, więc zwróć szczególną uwagę na przetestowanie rozszerzeń innych firm w łatce po stronie, aby sprawdzić nadal możesz uzyskać do nich dostęp!


1

Wygląda na to, że strona wydania łatki została zaktualizowana o informacje dotyczące jej wpływu.

Muszę jeszcze zainstalować na stronie produkcyjnej i przetestować


3
Zainstalowałem go na serwerze Dev i działało dobrze, więc przerzuciłem go na produkcję. Wydawało się, że wszystko działa dobrze, dopóki niektórzy z naszych administratorów ds. Produktów i sprzedaży nie spróbowali użyć administratora Magento - ci użytkownicy mieli ograniczone uprawnienia do roli za pośrednictwem „edytora ról użytkownika” w Magento, byli odwiedzani z błędami odmowy dostępu w niektórych obszarach strony administracyjnej które używają wtyczek innych firm. Moje główne konto administratora nadal działa dobrze na wszystkich z nich ... Nadal patrzę na to
Ricky Odin Matthews

0

Pełna lista zmodyfikowanych plików po zastosowaniu poprawki jest również dostępna w app/etc/applied.patches.list


0

W moim przypadku dla modułów stron trzecich dodanie poniższego kodu do kontrolerów adminhtml działało:

protected function _isAllowed()

{
     return true;
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.