Na kratko: Če strežnik pošilja neželeno pošto, so večinoma tri vzroki: vnesen ali zlorabljen skript PHP, poštni predal z ukradenim geslom ali napačno konfiguriran poštni strežnik. Zavarujte nekaj čakajočih sporočil, preberite njihove glave in poštni dnevnik ter v večini primerov boste našli vir. Nato ustavite pošiljanje, zaprite vzrok in šele nato zahtevajte odstranitev s črnih list.
Ko stranke vaše račune najdejo v mapi z neželeno pošto
Redko se začne z varnostnim obvestilom. Večinoma se oglasijo stranke, ki ne prejemajo več vaših ponudb, ali pa se poštni predal napolni z vrnjenimi sporočili o pošti, ki je nihče ni nikoli napisal. Včasih ponudnik gostovanja pošiljanje zaklene in kot razlog navede opazen poštni promet.
Za podjetje ima to hitro otipljive posledice. Če je naslov strežnika na črni listi, drugi poštni strežniki zavračajo tudi vašo pravo pošto: račune, potrditve naročil, povezave za geslo iz spletne trgovine. Ugled domene trpi, škoda pa raste z vsako uro, v kateri pošiljanje teče naprej.
Pošiljanje neželene pošte sodi med znane posledice ogrozitve. Po PHP2Shell, ranljivostih CVE-2026-109618 in CVE-2026-109619 z izvajanjem kode brez prijave, je to še en razlog za natančnejši pogled. Specifičen namig na PHP2Shell neželena pošta ni; potrjenih indikatorjev ogroženosti (Indicators of Compromise) ni. Nadaljnje splošne znake opisuje Ali smo že ogroženi?.
Trije tipični vzroki, ko strežnik pošilja neželeno pošto
| Vzrok | Tipična slika | Kje pogledati |
|---|---|---|
| Vnesen skript PHP | Pošta brez prijave, lokalno oddana prek sendmail |
Glave, poštni dnevnik PHP, nove datoteke PHP |
| Zlorabljen obrazec | Pošta prek kontaktnega ali priporočilnega obrazca tujim prejemnikom | Dnevnik dostopov obrazca, glave |
| Ugrabljen poštni predal | Pošiljanje z veljavno prijavo na poštni strežnik | Poštni dnevnik z imenom prijave, kraji prijav |
| Odprt poštni strežnik | Tuji pošiljatelji uporabljajo vaš strežnik kot posrednika | Konfiguracija poštnega strežnika, zunanje preverjanje |
Prva dva vzroka zadevata spletno stran, tretji poštne račune, četrti konfiguracijo strežnika. Razlikovanje je pomembno, ker so protiukrepi povsem različni.
Branje poštne čakalne vrste
Na strežnikih s Postfixom čakalna vrsta pokaže, kaj se ravno namerava poslati. Naslednji ukazi samo berejo:
# Prikaz vsebine čakalne vrste (ustreza mailq)
postqueue -p | tail -30
# Prikaz glav posamezne pošte (vstavite ID čakalne vrste s seznama)
sudo postcat -q -h QUEUE-ID
# Uspešne prijave na poštni strežnik z uporabniškim imenom
sudo grep 'sasl_username=' /var/log/mail.log | awk -F'sasl_username=' '{print $2}' | sort | uniq -c | sort -rn | head
Glave pogosto že razkrijejo vir. Če pošta izvira iz prijavljenega poštnega predala, se ime prijave pojavi v poštnem dnevniku. Če se tam kopiči en sam račun s prijavami iz tujih držav, je geslo tega poštnega predala zelo verjetno postalo znano. Če je bila pošta oddana lokalno, praviloma izvira iz skripta na strežniku.
Če na vašem strežniku teče drug poštni strežnik, na primer Exim, se ukazi imenujejo drugače, načelo pa ostane: ogled čakalne vrste, branje glav, štetje prijav v dnevniku. Pri skupnem gostovanju brez dostopa do lupine ponudnika gostovanja pisno prosite za izvleček poštnega dnevnika in nekaj primerov pošte s popolnimi glavami. Mnogi ponudniki te podatke na zahtevo dajo, ker imajo sami interes, da pošiljanje preneha.
Nekaj popolnih sporočil zavarujte, preden čakalno vrsto ustavite ali izpraznite. So dokaz za poznejšo analizo in za pogovore s ponudnikom gostovanja ali upravljavci črnih list.
Poiščite odgovorni skript PHP
Če pošiljanje teče prek PHP, pomaga poštna konfiguracija PHP. Po priročniku PHP mail.log zabeleži vsak klic funkcije mail() s polno potjo skripta, številko vrstice, prejemnikom in glavami. mail.add_x_header v vsako pošto dodatno zapiše glavo X-PHP-Originating-Script z identifikatorjem uporabnika in imenom datoteke.
; V php.ini ali v poolu FPM, nato znova zaženite vse workerje
mail.add_x_header = On
mail.log = /var/log/php/mail.log
Datoteka dnevnika mora biti zapisljiva za proces PHP. Glava prejemnikom razkrije ime datoteke; po analizi jo znova izklopite, če je ne želite imeti trajno.
Če je kot pošiljatelj najdena neznana datoteka, na primer v imeniku za nalaganje ali predpomnilnika, je to namig na webshell. Kako take datoteke razvrstite, opisuje Prepoznavanje in odstranjevanje webshellov. Če gre za znan kontaktni obrazec, je bil verjetno zlorabljen, na primer ker se prejemniki ali glave povzamejo iz vnosov obrazca. To je napaka v kodi, ne vdor, a jo je treba odpraviti enako hitro.
Ne uporablja vsa neželena pošta funkcije mail(). Škodljiva koda lahko tudi neposredno vzpostavi povezavo s tujimi poštnimi strežniki. Tedaj pošiljanje ni ne v čakalni vrsti ne v poštnem dnevniku PHP, je pa kot odhodne povezave na vratih 25. Kako jih preverite, piše pod Preverjanje odhodnih povezav strežnika.
Ustavite pošiljanje in ga čisto znova zaženite
Ko je vir najden, sledi čiščenje v tem vrstnem redu:
- Ustavite pošiljanje: Zaprite prizadeto pot, torej deaktivirajte skript, zaklenite poštni predal ali ustavite čakalno vrsto. Čakajočo pošto zavarujte kot dokaz.
- Zaprite vzrok: Pri webshellu PHP spravite na odpravljeno stanje (8.5.12, 8.4.27, 8.3.36, 8.2.35 ali potrjen backport), znova zaženite vse workerje in spletno stran očistite. Pri obrazcu popravite kodo. Pri poštnem predalu zamenjajte geslo in preverite napravo uporabnika.
- Poiščite druge sledi: Kdor pošilja neželeno pošto prek webshella, je pogosto uredil nadaljnja stranska vrata.
- Omejite izhod: Odhodne povezave na vratih 25 dovolite samo poštnemu strežniku, ne uporabniku spletnega strežnika.
- Očistite črne liste: Šele zdaj pri upravljavcih črnih list zahtevajte odstranitev in kratko opišite, kaj je bilo odpravljeno.
Ob tej priložnosti preverite SPF, DKIM in DMARC svoje domene. Ti vnosi DNS določajo, kateri strežniki smejo pošiljati v imenu vaše domene, in tujcem otežujejo zlorabo vašega naslova pošiljatelja.
Kako PHP SOS pomaga konkretno?
- Ovrednotimo čakalno vrsto, glave in poštne dnevnike ter ugotovimo, ali je vzrok skript, obrazec, poštni predal ali konfiguracija.
- Pošiljanje ustavimo nadzorovano in zavarujemo dokaze za ponudnika gostovanja in črne liste.
- Spletno stran očistimo v okviru odstranjevanja škodljive programske opreme in zapremo vstopno točko.
- Odhodni poštni promet omejimo na ravni strežnika in spremljamo odstranitev s črnih list.
Pogosta vprašanja
Po čem opazim, da moj strežnik pošilja neželeno pošto?
Tipična so vrnjena sporočila o pošti, ki je nihče ni napisal, opozorila ponudnika gostovanja, polna poštna čakalna vrsta in stranke, ki vašo pošto nenadoma najdejo v mapi z neželeno pošto. Jasen znak so tudi vnosi naslova vašega strežnika na javnih črnih listah.
Kako najdem skript PHP, ki pošilja neželeno pošto?
PHP lahko vsak klic funkcije mail() zabeleži s potjo skripta, če je nastavljen mail.log. Z mail.add_x_header PHP ime skripta dodatno zapiše v glavo vsake pošte. Pri že poslani ali čakajoči pošti pomaga pogled v glave.
Ali naj poštno čakalno vrsto takoj izpraznim?
Ne, preden ste nekaj sporočil zavarovali kot dokaz. Glave pogosto pokažejo, kateri skript ali poštni predal je sprožil pošiljanje. Ustavitev je večinoma boljša od brisanja, dokler vir ni znan.
Kako pridem spet z črnih list?
Najprej odpravite vzrok, nato pri upravljavcih črnih list zahtevajte odstranitev. Večina zahteva pojasnilo, kaj je bilo odpravljeno. Kdor zahteva prezgodaj in neželeno pošto pošilja naprej, je znova uvrščen.