PAYONE-GmbH / shopware-5

PAYONE Payment Plugin for shopware 5
MIT License
10 stars 24 forks source link

Shopware Security Fix Session Fixation #277

Closed mfritsche-dotsource closed 5 years ago

mfritsche-dotsource commented 5 years ago

Hallo,

im Zuge der Sicherheitsupdates von Shopware kommt es nun zu einem unerwarteten Verhalten mit der zahlart Sofortüberweisung. Der durch das Sicherheitsplugin 1.1.14 und in Shopware >= 5.5.7 behobene Fehler führt beim Einsatz von Sofortüberweisung bei der Rückleitung in den Shop zu einer direkten Umleitung auf die Shop Startseite ohne auf die Bestellabschlussseite zu kommen.

Folgender Code aus dem Sicherheitsplugin verursacht das Problem:

    public function fixSessionFixation_23428(Enlight_Event_EventArgs $args)
    {
        $version = $this->swVersion();
        if (
            version_compare($version, '5.0.0', '<') ||
            version_compare($version, '5.5.7', '>=') ||
            !$this->Config()->get('fix_session_fixation_23428')) {
            return;
        }

        if (array_key_exists(session_name(), $_GET) || array_key_exists(session_name(), $_POST)) {
            \Zend_Session::regenerateId();

            /** @var \Enlight_Controller_Front $front */
            $front = $args->getSubject();
            $front->Response()->setRedirect($front->Router()->assemble(['controller' => 'index']));
        }
    }

Hierbei wird geprüft ob in der Url eine Session ID mitgegeben wird welche dem Shop schon bekannt ist und falls dies der Fall ist auf die Startseite umgeleitet. In der Rückleitungs-Url von Sofortüberweisung wird die Session Id mit übergeben.

Ich habe das Problem an Shopware unter https://issues.shopware.com/issues/PT-10297 übermittelt und folgende Antwort darauf bekommen:

Hallo!

Die Übertragung der Session-Id per Parameter ermöglicht eine Reihe von Angriffen (Session Fixation, Session Hijacking, etc) und musste deshalb ausgebaut werden. Unsere Empfehlung für Use-Cases wie den hier beschriebenen ist, die Session-Id in der DB zusammen mit einem Timestamp und einem zufällig generierten Hash zu speichern. Dieser Hash kann dann als GET-Parameter anstelle der Session-Id verwendet werden, beim Redirect zurück zum Shop muss dann auch diesen Hash geprüft und bei Bedarf die Session wiederhergestellt werden.

In Shopware 5.6 wird es dafür den PaymentTokenService (Github) geben der genau dieses Verhalten implementiert, es sollte jedoch kein Problem sein aus dem Github-PR die relevanten Stellen in ein Plugin zu übernehmen um die Funktionen auch für ältere Shopware Versionen zurück zu portieren.

Bei Detailfragen kann Ihnen hier auch der Shopware-Support weiterhelfen.

Ist Ihnen dieses Problem schon in einer Art und Weise bekannt und gibt es hier möglicherweise schon eine Lösung Ihrerseits dafür?

Eingesetzte Shopware Version: 5.2.25 Eingesetzte Payone version: 3.9.0

Mit freundlichen Grüßen

hreinberger commented 5 years ago

Hallo @mfritsche-dotsource,

wir haben das intern angeschaut und werden hier unser Vorgehen an die Empfehlung von Shopware anlehnen. Ab Shopware 5.6 nutzen wir dann den PaymentToken Subscriber und in Versionen darunter eine Lösung innerhalb des Plugins. PR folgt. :)