Vienas GET užklausa — ir jūsų pašto raktai nutekėjo: CVE-2026-4020 Gravity SMTP
Vienas GET užklausa — ir jūsų pašto raktai nutekėjo: CVE-2026-4020 Gravity SMTP
Įdiegėte WordPress SMTP papildinį, prijungėte SendGrid arba Amazon SES, patikrinote kad laiškai išsiunčiami — ir pamiršote. Papildinys veikia, viskas gerai. Tuo tarpu bet kas internete, net neturėdamas paskyros jūsų svetainėje, išsiunčia vieną HTTP GET užklausą ir gauna 365 KB JSON su jūsų API raktais, OAuth tokenais, DKIM konfigūracija, visų įdiegtų papildinių sąrašu su versijų numeriais ir duomenų bazės struktūra. Be prisijungimo. Be brute force. Be jokio išnaudojimo. Tiesiog užklausa į atvirą endpoint.
Būtent tai ir vyksta svetainėse, kuriose įdiegtas Gravity SMTP versija 2.1.4 ir žemesnė. Pažeidžiamumas užregistruotas kaip CVE-2026-4020, CVSS 7.5 (High), CWE-200 — Exposure of Sensitive Information to an Unauthorized Actor. Už šio įvertinimo slypi pilnas jūsų pašto tarnybos credentials ištraukimas, paruoštas naudoti be jokio papildomo pasiruošimo. Wordfence jau užblokavo daugiau nei 17 milijonų išnaudojimo bandymų.
KAS YRA GRAVITY SMTP
Gravity SMTP — komercinis WordPress papildinys iš bendrovės RocketGenius, tos pačios komandos, kuri sukūrė Gravity Forms. Papildinys sprendžia tipinę problemą: WordPress pagal nutylėjimą siunčia laiškus per PHP funkciją mail(), kuri neveikia daugumoje hosting aplinkų — laiškai arba visai nepasiekia gavėjo, arba patenka į šlamštą, nes serveris nėra įgaliotas siųsti vardu domeno. Gravity SMTP pakeičia šį sugedusį mechanizmą jungtimi su profesionalia pašto tarnyba — SendGrid, Mailgun, Amazon SES, Google Workspace, Brevo, Postmark, Resend, Zoho ir kitomis. Papildinys įdiegtas maždaug 100 000 svetainių.
Būtent tai ir daro jį patrauklia taikiniu. SMTP papildinys iš esmės yra raktų saugykla. Jis žino viską, ko reikia siųsti laiškus jūsų domeno vardu: API raktus, OAuth tokenus, SMTP prisijungimo duomenis ir slaptažodžius, DKIM konfigūraciją. Be šių duomenų papildinys negali veikti, todėl jie saugomi tiesiai WordPress — duomenų bazėje ir papildinio konfigūracijoje. Tai normali architektūra, taip veikia visi SMTP papildiniai.
KAIP VEIKIA PAŽEIDŽIAMUMAS
Kai WordPress papildinys registruoja REST API endpoint, jis privalo nurodyti permission_callback — sargybinio funkciją, kuri nusprendžia: praleisti šią užklausą ar atmesti. Grąžino true — praeik. Grąžino false — gauk 401. Visa prieigos kontrolės sistema laikosi ant šios vienos funkcijos.
Gravity SMTP kažkas parašė sargybinį, kuris praleidžia visus. Be išimčių. Endpoint /wp-json/gravitysmtp/v1/tests/mock-data užregistruotas su permission_callback, kuris besąlygiškai grąžina true — jokio sesijos tikrinimo, jokio vaidmens tikrinimo, jokio nonce, nieko. Pridėkite užklausai parametrą ?page=gravitysmtp-settings ir papildinys paklusniai iškviečia vidinį metodą register_connector_data(), surenka pilną System Report ir grąžina jį atsakyme. Visa sistemos informacija atsiduria užpuoliko rankose.
Išnaudojimas atrodo taip: viena curl komanda, jokie specialūs įrankiai, be jokių išankstinių žinių apie taikinį:
curl "https://example.com/wp-json/gravitysmtp/v1/tests/mock-data?page=gravitysmtp-settings"
Atsakyme gaunamas ~365 KB JSON, kuriame yra API raktai ir OAuth tokenai visiems sukonfigūruotiems pašto integravimams, SMTP prisijungimo duomenys ir slaptažodžiai, DKIM tokenai, PHP versija, web serverio versija, pilnas įdiegtų papildinių sąrašas su versijomis, aktyvi tema, duomenų bazės lentelių pavadinimai ir MariaDB/MySQL versija.
Paveiktos visos Gravity SMTP versijos iki 2.1.4 imtinai. Pataisymas išleistas versijoje 2.1.5 — 2026 m. kovo 17 d., dar prieš viešą atskleidimą. Pataisymas pridėjo tinkamą prieigos kontrolės patikrinimą permission_callback.
CHRONOLOGIJA
RocketGenius ištaisė pažeidžiamumą 2026 m. kovo mėnesį — tyliai, viena kodo eilute, be jokio paminėjimo changelog ir be nė vieno laiško vartotojams. Logika suprantama: nesukurti dėmesio kol dauguma neatnaujins. Tačiau mokamiems papildiniams automatiniai atnaujinimai dažnai išjungti — administratoriai bijo, kad atnaujinimas sugadins produkcinę aplinką. Dėl to tūkstančiai svetainių taip ir liko su 2.1.4, net nežinodamos, kad pataisymas jau egzistuoja.
Gegužės pradžioje r/WordPress administratoriai pradėjo skųstis keistais dalykais: SendGrid paskyros užblokuotos už šlamšto siuntimą, Mailgun sąskaitos per naktį išaugo tris kartus, kai kuriems tiekėjai patys rotavo raktus su pastaba „įtartina veikla”. CrowdSec užfiksavo pirmą realų išnaudojimą gegužės 27 d., o iki birželio 1 d. srautą klasifikavo kaip „foninį triukšmą” — tai reiškia, kad pažeidžiamumas jau buvo įtrauktas į automatizuotus skenerius, kurie nuolatos perima WordPress svetaines be žmogaus dalyvavimo.
2026 m. birželio 19 d. pasirodė oficialus advisory. Tą dieną blokuotų bandymų skaitliukas peržengė 17 milijonų ribą. Pikas — birželio 7 d., daugiau nei 4 milijonai užklausų per vieną parą. Trys mėnesiai tarp pataisymo ir viešo atskleidimo pasirodė esą ne apsauga, o laiko pranašumas tiems, kas rado klaidą anksčiau nei Wordfence.
KODĖL TAI SVARBU
Dvi svetainės neteko savo SendGrid paskyrų. Abi naudojo Gravity SMTP, abi turėjo mokamas SendGrid planus transakciniam paštui. Per 36 valandas nuo to, kai jų endpoint atidavė credentials skaneriu, SendGrid užblokavo abi paskyras dėl šlamšto siuntimo. Atkūrimas užtruko aštuonias dienas ir reikalavo raštiško incidento ataskaitos. Aštuonios dienos be transakcinio pašto — be užsakymų patvirtinimų, be slaptažodžių keitimo laiškų, be pranešimų. Internetinei parduotuvei tai ne „saugumo incidentas”, tai operacinis žlugimas.
CVSS 7.5 — tai High, ir įvertinimas užtarnaitas: ataka nereikalauja nieko, nulis išankstinių sąlygų, nulis privilegijų, viena užklausa. Tačiau tai, ką užpuolikas gauna atsakyme — tai ne tik abstrakti „informacijos nutekėjimas”, o paruoštas įrankių rinkinys keliems nepriklausomiems atakos vektoriams vienu metu.
Pažeistas SendGrid arba Mailgun API raktas suteikia užpuolikui galimybę siųsti laiškus jūsų domeno vardu. Ne suklastotus — tikrus, per jūsų paskyrą, su jūsų credentials. Tokie laiškai praeina SPF patikrinimą, nes siunčiami per įgaliotą tarnybą. Jie praeina DKIM patikrinimą, nes pasirašyti jūsų raktu. Bet kokio šlamšto filtro ir gavėjo požiūriu — tai teisėtas paštas iš jūsų domeno. Būtent tokią infrastruktūrą phishing grupės nuomojasi už didelius pinigus. Čia ji gaunama nemokamai, viena curl užklausa.
Tuo pačiu metu užpuolikas gauna pilną jūsų svetainės žemėlapį. Įdiegtų papildinių sąrašas su tiksliais versijų numeriais — tai pagrindas pasirinkti kitą atakos vektorių. Yra pasenęs papildinys su žinomu CVE? Užpuolikas jį mato iš karto. PHP versija, MariaDB versija, duomenų bazės lentelių pavadinimai — visa tai sumažina slenkstį vėlesniam bet kokio kito pažeidžiamumo išnaudojimui.
DKIM nusipelno atskiro paminėjimo. Dauguma administratorių po incidento atšaukia API raktus — ir mano, kad viskas tvarkoje. Tačiau jei DKIM tokenai pateko į ištrauką, vien API raktų keitimas problemos visiškai neužsandarina. DKIM raktas susietas su jūsų domeno DNS įrašu, o ne su paskyra pašto tarnyboje. Jei užpuolikas suspėjo nukopijuoti privatų DKIM raktą, jis techniškai gali toliau pasirašinėti laiškus jūsų domeno parašu — net po to, kai atšaukėte visus API raktus. Sprendimas — DKIM selector rotacija: sukurti naują DNS įrašą su nauju raktu, o seną selector deaktyvuoti pas tiekėją.
KĄ DARYTI
Pirmiausia patikrinkite ar papildinys įdiegtas ir kokia versija naudojama. WordPress administravimo skydelyje tai matoma skiltyje Plugins → Installed Plugins. Per WP-CLI patikrinimas užtrunka sekundę:
wp plugin get gravity-smtp --field=version
Jei versija 2.1.4 arba žemesnė — atnaujinkite nedelsiant:
wp plugin update gravity-smtp
Po atnaujinimo patikrinkite, kad pataisymas veikia. Užklausa į endpoint dabar turėtų grąžinti 401 arba 403, o ne JSON su duomenimis:
curl -o /dev/null -s -w "%{http_code}" \
"https://example.com/wp-json/gravitysmtp/v1/tests/mock-data?page=gravitysmtp-settings"
Jei svetainė veikė su pažeidžiama versija — laikykite visus credentials pažeistais ir rotuokite juos nepriklausomai nuo to, ar loguose radote atakos pėdsakų. Užpuolikai WordPress nepalieka jokių pėdsakų — jie tiesiog siunčia GET užklausą į atvirą endpoint ir gauna, ko norėjo. Pėdsakai yra tik web serverio prieigos logų failuose. Patikrinkite juos dėl užklausų į pažeidžiamą endpoint per pastarąsias savaites — aktyvus skenavimas prasidėjo gegužę:
grep "gravitysmtp/v1/tests/mock-data" /var/log/nginx/access.log
# arba Apache atveju:
grep "gravitysmtp/v1/tests/mock-data" /var/log/apache2/access.log
Jei įrašų yra — svetainė beveik tikrai buvo nuskenuota. Pirmojo įrašo data logų faile parodys nuo kurio momento laikyti credentials pažeistais. Rotuokite visus API raktus pašto integravimams atitinkamų tarnybų nustatymuose: SendGrid, Mailgun, Amazon SES, Google OAuth, Brevo — viską, kas buvo prijungta Gravity SMTP. Jei naudotas DKIM — sukurkite naują selector pas tiekėją, atnaujinkite DNS TXT įrašą, seną selector deaktyvuokite. Tai svarbu: API rakto keitimas be DKIM selector keitimo palieka užpuolikui galimybę pasirašinėti laiškus jūsų domeno vardu.
Tuo pat metu įjunkite automatinius atnaujinimus. WordPress gali automatiškai atnaujinti papildinius, tačiau mokamiems papildiniams tai dažnai išjungta — administratoriai bijo, kad atnaujinimas sugadins jų pritaikymus. Baimė suprantama, tačiau kaina — kaip tik tokios situacijos, kai pataisymas guli tris mėnesius, o svetainė lieka pažeidžiama. Įjunkite automatinius atnaujinimus per WP-CLI:
wp plugin auto-updates enable gravity-smtp
Arba visiems papildiniams iš karto — kad nereikėtų rankiniu būdu spręsti kuris svarbus, o kuris ne:
wp plugin auto-updates enable --all
Jei atnaujinimas šiuo metu neįmanomas — pavyzdžiui, svetainę tvarko trečioji šalis ir reikia suderinimo — blokuokite endpoint nginx konfigūracijos lygmeniu kaip laikiną priemonę:
location ~* /wp-json/gravitysmtp/ {
deny all;
return 403;
}
IŠVADOS
CVE-2026-4020 — vadovėlinis CWE-200 pavyzdys: viena kodo eilutė permission_callback paverčia SMTP papildinį vieša credentials sąvartynu. CVSS 7.5 (High), aktyvus išnaudojimas, 17 milijonų blokuotų bandymų — ir visa tai dėl pažeidžiamumo, kurį nereikia „išnaudoti” įprasta prasme. Prieiga prie SMTP paskyros su gera domeno siuntimo reputacija juodojoje rinkoje kainuoja daugiau nei daugelis RCE išnaudojimų.
Jei Gravity SMTP įdiegtas — atnaujinkite iki 2.1.5, patikrinkite logus, rotuokite credentials ir DKIM. Jei neįdiegtas — įsitikinkite, kad jūsų SMTP papildinys neregistruoja viešų endpointų su jautriais duomenimis. Tai taikoma bet kokiam papildiniui, kuris saugo API raktus: nuo SMTP integravimų iki mokėjimo tiekėjų ir CRM sistemų. WordPress REST API — patogus įrankis, tačiau kiekvienas neapsaugotas endpoint yra potenciali nutekėjimo vieta.
Pataisymas pasirodė kovo mėnesį. Svetainės laužomos birželį. Trys mėnesiai skirtumo — tai ne kūrėjo kaltė, jis klaidą ištaisė. Tai tyli pataisymo be pranešimų ir išjungtų automatinių atnaujinimų kaina. Kitą kartą tai bus kitas papildinys, kitas endpoint, tos pačios pasekmės. Padėtį keičia tik vienas dalykas — automatiniai atnaujinimai įjungti, arba jūs patys sekate saugumo leidimus papildinių, kurie saugo jūsų raktus.
