Permanent drop-in security fix for the authentication bypass in the OSC PayPal
module's User::onLogin override (advisory GHSA-7rp4-9wjf-97cx, bug 0007936).
Who this is for: shops that cannot move to a patched PayPal module release (>= 1.4.0 / 2.9.0 / 3.8.0) and must remain on an older, unpatched version (e.g. 2.7.x) for compatibility or operational reasons. This module closes the bypass without changing the PayPal module itself, and is meant to stay installed for as long as the shop runs an unpatched PayPal version.
If you can upgrade the PayPal module to a patched release, do that instead — this module then becomes redundant (harmless) and can be removed.
- OXID eShop 6.1
- OXID eShop 6.5
- OXID eShop 7.x
One module source works in all three. There is no version-specific build.
The hotfix re-overrides User::onLogin and dispatches directly to the eShop
core implementation via reflection, so the standard shop login always
enforces the password check. The vulnerable PayPal override is bypassed.
Trade-off (permanent while this module is active): the PayPal Express convenience login — signing in to the shop via a PayPal email match without entering a shop password — is disabled. For shops on an unpatched version this is the intended, accepted trade-off: security over that one convenience feature.
The fix only works if this hotfix sits behind (after) the PayPal module in the module extension chain:
Core\User ← PayPal\User ← Hotfix\User (this hotfix is the outermost link)
- Activate the PayPal module first, then this hotfix second.
Hotfix\User::onLoginis then the outermost link, runs first, and jumps straight toCore\User::onLoginvia reflection — the PayPal override is skipped and the password check is enforced. (The hotfix deliberately does not callparent::onLogin(), which would resolve back to the vulnerable PayPal override.)- If the order is reversed (PayPal outermost), the PayPal override runs first and the bypass stays open. The order is not optional.
How to verify / set the order:
- OXID 6.1 / 6.5: the chain order follows activation order. Activate PayPal
first, this hotfix second. Verify under Master Settings → Core Settings →
System → Modules (or in the DB
oxconfig, parameteraModules); forApplication\Model\Userthe hotfix class must appear after the PayPal class. - OXID 7.x: the order is part of the module configuration. After installing,
ensure the hotfix is ordered after the PayPal module and apply the
configuration (
oe-console oe:module:apply-configuration). Verify the resulting chain forUser.
Delivered as a self-contained module and wired in via a Composer path
repository. Do not copy it directly into source/modules/ — Composer
would not register the PSR-4 autoloader. The workflow is identical for
OXID 6.1, 6.5 and 7.
-
Place the module directory outside the shop installation, e.g.:
/var/www/myshop/ ← shop root (composer.json) /var/www/security-hotfix-paypal-onlogin/ composer.json metadata.php src/Model/User.php -
Register it as a path repository and require it (from the shop project root):
composer config repositories.security-hotfix-paypal-onlogin \ '{"type": "path", "url": "../security-hotfix-paypal-onlogin", "options": {"symlink": false}}' composer require oxid-esales/security-hotfix-paypal-onlogin:^2.0Adjust
urlto the real path."symlink": falsemakes Composer copy the files (recommended for production). Theoxid-esales/oxideshop-composer-plugin(part of every OXID shop) detects"type": "oxideshop-module"and installs it into the module directory automatically. -
In the shop admin under Extensions → Modules, activate "OSC PayPal — Security Hotfix (User::onLogin)".
-
Ensure the class-chain order from the section above — PayPal module first, this hotfix second. This is the step that makes or breaks the fix.
-
Clear the shop cache (
tmp/).
The bypass is closed when a login attempt with a victim's email and an empty password through the standard shop login form (with a PayPal Express order session primed) is rejected. With the wrong chain order it would succeed — use this as your order check.
- Deactivate the hotfix in Extensions → Modules.
- From the shop project root:
composer remove oxid-esales/security-hotfix-paypal-onlogin composer config --unset repositories.security-hotfix-paypal-onlogin - Optional: delete the module directory.
- Clear the shop cache (
tmp/).
See CHANGELOG.md. 1.0.0 was the temporary workaround shipped during the
coordinated-disclosure phase and remains installable; 2.0.0 is the same
mechanism re-scoped as a permanent, supported fix.