Demo Importer Plus sebezhetőség: site reset és admin jog
Ha használsz demo importert (főleg téma telepítésnél), akkor tudod: ezek a pluginek mélyen belenyúlnak a WordPressbe. Na most pont ezért tud nagyot ütni, amikor egy ilyen eszközben jogosultságkezelési hiba csúszik be. A Demo Importer Plus esetében ez konkrétan azt jelentette, hogy egy támadó site resetet tudott indítani, és a végén még Administrator szerepet is kaphatott.
A sebezhetőség a Wordfence kutatói és bug bounty programja révén került nyilvánosságra, és több mint 10 000 aktív telepítésű pluginről beszélünk. A javítás már kint van: Demo Importer Plus 2.0.9.
Mi volt a gond röviden?
A hibát úgy érdemes fejben elhelyezni, mint egy klasszikus „nonce van, capability check nincs” helyzetet.
- Érkezett egy AJAX endpoint, ami a plugin műveleteit kezelte.
- Volt nonce ellenőrzés (ráadásul a gyakori
wp_restnonce), tehát első ránézésre „védettnek” tűnt. - Viszont a kritikus műveletnél nem volt rendes jogosultság-ellenőrzés (capability check).
- Így egy bejelentkezett felhasználó (akár Subscriber szinten) olyan funkciót is meghívhatott, amihez csak adminnak lenne szabad hozzáférnie.
Mit tudott csinálni a támadó?
A legsúlyosabb rész a plugin „újratelepítés / reinstall” jellegű funkciója volt (a forrásban do-reinstall néven szerepel). Ezzel a támadó:
- El tudta indítani a teljes site resetet.
- A reset során a folyamat kidobálta az adatbázistáblákat (a leírás szerint mindent, kivéve
usersésusermeta). - Ezután lefutott egy
wp_install()jellegű újratelepítési lépés. - A végén a támadó felhasználója Administrator szerepet kapott.
A technikai lényeg: AJAX endpoint és hiányzó authorization
A plugin az admin-ajax.php-n keresztül regisztrált egy demo_importer_plus nevű AJAX actiont, és ami külön figyelemre méltó: nemcsak bejelentkezett, hanem nopriv (nem bejelentkezett) útvonalra is fel volt véve a handler. A handler egy központi handle_request() metódus volt, ami a demo_action paraméter alapján kapcsolgatott funkciók között.
add_action( 'wp_ajax_demo_importer_plus', array( KraftPluginsDemoImporterPlusAjax::class, 'handle_request' ) );
add_action( 'wp_ajax_nopriv_demo_importer_plus', array( KraftPluginsDemoImporterPlusAjax::class, 'handle_request' ) );
// ... később a handle_request() a demo_action alapján switch-el, és volt benne do-reinstall is.
A nonce ellenőrzés önmagában nem elég, ha a nonce könnyen megszerezhető alacsony jogosultságú felhasználóként is. Ráadásul itt a plugin a gyakran használt wp_rest nonce-t használta, ami sok helyen előkerül a frontendben is.
wp_rest nonce-t kiteszi olyan helyre, ahol azt nem bejelentkezett látogató is meg tudja szerezni, akkor a sebezhetőség elméletben akár autentikáció nélkül is kihasználható lehetett – különösen azért, mert a wp_ajax_nopriv_... endpoint is regisztrálva volt.Érintett verziók, CVE, súlyosság
- Plugin: Demo Importer Plus (
demo-importer-plus) - Érintett: 2.0.8 és korábbi
- Javított: 2.0.9
- CVE: CVE-2025-14364
- Súlyosság: CVSS 8.8 (High)
Hogyan javították?
A fix a klasszikus és helyes irány: a kritikus do-reinstall ágnál bekerült egy capability check. Magyarul: hiába van nonce-od, attól még nem csinálhatsz admin műveletet, ha nincs hozzá jogod.
case 'do-reinstall':
if ( ! current_user_can( 'manage_options' ) ) {
$data = new WP_Error( 'permission_denied', 'You do not have permission to reset site.', 403 );
} else {
$data = static::do_reinstall( $request );
}
break;
A manage_options tipikusan admin capability, így ezzel a reinstall funkció gyakorlatilag adminhoz lett kötve, ami ennél a műveletnél teljesen indokolt.
Mit csinálj, ha van ilyen plugin az oldaladon? (gyors checklist)
- Frissítsd a Demo Importer Plus-t 2.0.9-re vagy újabbra.
- Ha nem használod aktívan demo importálásra: gondold át, kell-e egyáltalán éles oldalon. Sokszor telepítés után ott marad feleslegesen.
- Nézd át, van-e gyanús admin user vagy friss plugin/theme telepítés a közelmúltban.
- Ha van Wordfence-ed: ellenőrizd, hogy a firewall szabályok naprakészek (Premium/Care/Response korábban kapta meg, Free késleltetéssel).
- Általános higiénia: minimalizáld a Subscriber felhasználók számát, és ahol lehet, zárd le a regisztrációt, ha nincs rá szükség.
Idővonal (mi mikor történt)
- 2025-11-27: bejelentés a Wordfence Bug Bounty Programon keresztül
- 2025-12-09: validálás + részletek továbbítása a fejlesztőnek (Vulnerability Management Portalon)
- 2025-12-10: Wordfence Premium/Care/Response kapott védelmi szabályt
- 2025-12-16: megjelent a javított plugin verzió (2.0.9)
- 2026-01-09: Wordfence Free is megkapta ugyanazt a firewall védelmet
Tanulság fejlesztői szemmel
WordPress plugin fejlesztésnél ez az eset tankönyvi példa arra, hogy:
- A nonce nem authorization. A nonce maximum azt segíti, hogy „a kérés valahonnan a site-odról jött”, de nem azt, hogy „a user jogosult rá”.
- Minden kritikus műveletnél legyen
current_user_can()ellenőrzés (és lehetőleg a legszűkebb capability). - Ha van
wp_ajax_nopriv_...regisztráció, akkor különösen szigorúan gondold át, hogy az adott action biztosan publikus-e. - Demo import / reset / reinstall funkciók éles oldalon különösen veszélyesek: ezeknél inkább legyen túl szigorú a védelem, mint „kényelmes”.
Összefoglaló
A Demo Importer Plus 2.0.8 és korábbi verzióiban egy hiányzó jogosultság-ellenőrzés miatt bejelentkezett (Subscriber+) támadó el tudott indítani egy olyan AJAX műveletet, ami lenullázta a site-ot, majd a támadót Administrator szerepbe emelte. A javítás a 2.0.9-es verzióban érkezett meg, érdemes azonnal frissíteni, és átnézni, nem maradt-e ott feleslegesen a plugin éles környezetben.
Hivatkozások
- 10,000 WordPress Sites Protected Against Site Reset and Privilege Escalation Vulnerability in Demo Importer Plus WordPress Plugin
- Demo Importer Plus <= 2.0.8 - Missing Authorization to Authenticated (Subscriber+) Site Reset and Privilege Escalation
- CVE-2025-14364
- Demo Importer Plus plugin page (WordPress.org)
Hannah Turing
Full Stack fejlesztő a HelloWP csapatában. Laravel, WordPress, React és minden ami a modern webfejlesztéshez kell.
Összes bejegyzés