Lyhyesti: Kun palvelin lähettää roskapostia, syy on yleensä jokin kolmesta: lisätty tai väärinkäytetty PHP-skripti, postilaatikko, jonka salasana on varastettu, tai väärin konfiguroitu postipalvelin. Varmistakaa muutama odottava viesti, lukekaa niiden otsikkotiedot ja postilokia, ja useimmiten löydätte lähteen. Sen jälkeen pysäyttäkää lähetys, sulkekaa syy ja pyytäkää vasta sitten poistoa estolistoilta.
Kun asiakkaat löytävät laskunne roskapostikansiosta
Alku on harvoin tietoturvailmoitus. Yleensä ottavat yhteyttä asiakkaat, jotka eivät enää saa tarjouksianne, tai postilaatikko täyttyy palautusilmoituksista viesteihin, joita kukaan ei ole koskaan kirjoittanut. Joskus hosting-yritys estää lähetyksen ja ilmoittaa syyksi poikkeavan postiliikenteen.
Yritykselle siitä seuraa nopeasti tuntuvia seurauksia. Jos palvelimen osoite on estolistalla, muut postipalvelimet hylkäävät myös oikeat viestinne: laskut, tilausvahvistukset, verkkokaupan salasanalinkit. Verkkotunnuksen maine kärsii, ja vahinko kasvaa jokaisella tunnilla, jonka lähetys jatkuu.
Roskapostin lähetys kuuluu vaarantumisen tunnettuihin seurauksiin. PHP2Shellin, aukkojen CVE-2026-109618 ja CVE-2026-109619 jälkeen, joissa koodia voi suorittaa ilman kirjautumista, se on yksi syy lisää katsoa tarkemmin. Roskaposti ei kuitenkaan ole erityinen PHP2Shell-vihje; vahvistettuja Indicators of Compromise -tunnisteita ei ole. Muita yleisiä merkkejä kuvaa Olenko jo vaarantunut?.
Kolme tyypillistä syytä, kun palvelin lähettää roskapostia
| Syy | Tyypillinen kuva | Mistä katsotaan |
|---|---|---|
| Lisätty PHP-skripti | Viestit ilman kirjautumista, toimitettu paikallisesti sendmail-komennolla |
Otsikkotiedot, PHP:n postiloki, uudet PHP-tiedostot |
| Väärinkäytetty lomake | Viestit yhteydenotto- tai suosituslomakkeen kautta vieraille vastaanottajille | Lomakkeen käyttöloki, otsikkotiedot |
| Kaapattu postilaatikko | Lähetys voimassa olevalla kirjautumisella postipalvelimelle | Postiloki kirjautumisnimen kanssa, kirjautumispaikat |
| Avoin postipalvelin | Vieraat lähettäjät käyttävät palvelintanne välittäjänä | Postipalvelimen konfiguraatio, ulkopuolinen tarkistus |
Kaksi ensimmäistä syytä koskevat verkkosivustoa, kolmas postitilejä, neljäs palvelimen konfiguraatiota. Erottelu on tärkeä, koska vastatoimet ovat täysin erilaiset.
Postijonon lukeminen
Postfixiä käyttävillä palvelimilla jono näyttää, mitä parhaillaan ollaan lähettämässä. Seuraavat komennot vain lukevat:
# Näytä jonon sisältö (vastaa komentoa mailq)
postqueue -p | tail -30
# Näytä yksittäisen viestin otsikkotiedot (syötä jonotunnus luettelosta)
sudo postcat -q -h QUEUE-ID
# Onnistuneet kirjautumiset postipalvelimelle käyttäjänimen kanssa
sudo grep 'sasl_username=' /var/log/mail.log | awk -F'sasl_username=' '{print $2}' | sort | uniq -c | sort -rn | head
Otsikkotiedot paljastavat usein jo lähteen. Jos viesti on peräisin kirjautuneelta postilaatikolta, kirjautumisnimi näkyy postilokissa. Jos siellä toistuu yksittäinen tili kirjautumisineen vieraista maista, tämän postilaatikon salasana on hyvin todennäköisesti päätynyt vääriin käsiin. Jos viesti sen sijaan toimitettiin paikallisesti, se tulee yleensä palvelimella olevasta skriptistä.
Jos palvelimellanne toimii jokin muu postipalvelin, esimerkiksi Exim, komennot ovat erilaiset, mutta periaate on sama: katsokaa jonoa, lukekaa otsikkotiedot, laskekaa kirjautumiset lokista. Jaetussa hostingissa ilman shell-pääsyä pyytäkää hosting-yritykseltä kirjallisesti ote postilokista ja muutama esimerkkiviesti täydellisine otsikkotietoineen. Monet hosting-yritykset toimittavat nämä tiedot pyynnöstä, koska niilläkin on intressi lopettaa lähetys.
Varmistakaa muutama täydellinen viesti, ennen kuin pysäytätte tai tyhjennätte jonon. Ne ovat todisteita myöhempää analyysia sekä keskusteluja hosting-yrityksen tai estolistojen ylläpitäjien kanssa varten.
Vastuullisen PHP-skriptin löytäminen
Jos lähetys kulkee PHP:n kautta, auttaa PHP:n postikonfiguraatio. PHP-käsikirjan mukaan mail.log kirjaa jokaisen mail()-funktion kutsun täydellä skriptin polulla, rivinumerolla, vastaanottajalla ja otsikkotiedoilla. mail.add_x_header kirjoittaa lisäksi jokaiseen viestiin otsikon X-PHP-Originating-Script käyttäjätunnuksen ja tiedostonimen kanssa.
; php.ini-tiedostossa tai FPM-poolissa, käynnistä sen jälkeen kaikki workerit uudelleen
mail.add_x_header = On
mail.log = /var/log/php/mail.log
Lokitiedoston on oltava PHP-prosessin kirjoitettavissa. Otsikko paljastaa vastaanottajille tiedostonimen; poistakaa se käytöstä analyysin jälkeen, jos ette halua pitää sitä pysyvästi.
Jos lähettäjänä on tuntematon tiedosto, esimerkiksi upload- tai välimuistikansiossa, se viittaa web shelliin. Miten tällaiset tiedostot arvioidaan, kuvaa Web shellien tunnistaminen ja poisto. Jos kyseessä on sen sijaan tunnettu yhteydenottolomake, sitä on todennäköisesti väärinkäytetty, esimerkiksi koska vastaanottajat tai otsikot otetaan lomakesyötteistä. Se on koodivirhe eikä murto, mutta se on korjattava yhtä nopeasti.
Kaikki roskaposti ei käytä mail()-funktiota. Haittakoodi voi myös muodostaa suoran yhteyden vieraisiin postipalvelimiin. Silloin lähetys ei näy jonossa eikä PHP:n postilokissa, mutta kyllä lähtevinä yhteyksinä portissa 25. Miten ne tarkistetaan, kerrotaan artikkelissa Palvelimen lähtevien yhteyksien tarkistus.
Lähetyksen pysäyttäminen ja siisti uudelleenkäynnistys
Kun lähde on löydetty, siivous etenee tässä järjestyksessä:
- Pysäyttäkää lähetys: Estäkää kyseinen reitti eli poistakaa skripti käytöstä, estäkää postilaatikko tai pysäyttäkää jono. Varmistakaa odottavat viestit todisteiksi.
- Sulkekaa syy: Web shellin tapauksessa viekää PHP korjatulle tasolle (8.5.12, 8.4.27, 8.3.36, 8.2.35 tai vahvistettu backport), käynnistäkää kaikki workerit uudelleen ja siivotkaa verkkosivusto. Lomakkeen kohdalla korjatkaa koodi. Postilaatikon kohdalla vaihtakaa salasana ja tarkistakaa käyttäjän laite.
- Etsikää muita jälkiä: Joka lähettää roskapostia web shellin kautta, on usein luonut muita takaovia.
- Rajatkaa lähtevä liikenne: Sallikaa lähtevät yhteydet portissa 25 vain postipalvelimelle, ei verkkopalvelinkäyttäjälle.
- Siivotkaa estolistat: Vasta nyt pyytäkää estolistojen ylläpitäjiltä poistoa ja kuvatkaa lyhyesti, mitä on korjattu.
Tarkistakaa samalla verkkotunnuksenne SPF, DKIM ja DMARC. Nämä DNS-merkinnät määrittävät, mitkä palvelimet saavat lähettää verkkotunnuksenne nimissä, ja vaikeuttavat vieraiden mahdollisuuksia väärinkäyttää lähettäjäosoitettanne.
Miten PHP SOS auttaa konkreettisesti?
- Arvioimme jonon, otsikkotiedot ja postilokit ja selvitämme, onko syynä skripti, lomake, postilaatikko vai konfiguraatio.
- Pysäytämme lähetyksen hallitusti ja varmistamme todisteet hosting-yritykselle ja estolistoille.
- Siivoamme verkkosivuston haittaohjelmien poiston puitteissa ja suljemme sisääntuloportin.
- Rajaamme lähtevän postiliikenteen palvelintasolla ja tuemme poistoa estolistoilta.
Usein kysytyt kysymykset
Mistä huomaan, että palvelimeni lähettää roskapostia?
Tyypillisiä ovat palautusilmoitukset viesteistä, joita kukaan ei ole kirjoittanut, hosting-yrityksen huomautukset, täynnä oleva postijono ja asiakkaat, jotka löytävät viestinne yhtäkkiä roskapostikansiosta. Myös palvelimenne osoitteen esiintyminen julkisilla estolistoilla on selvä merkki.
Miten löydän roskapostia lähettävän PHP-skriptin?
PHP voi kirjata jokaisen mail()-funktion kutsun skriptin polun kanssa, kun mail.log on asetettu. Asetuksella mail.add_x_header PHP kirjoittaa skriptin nimen lisäksi jokaisen viestin otsikkoon. Jo lähetetyissä tai odottavissa viesteissä auttaa katsaus otsikkotietoihin.
Pitäisikö postijono tyhjentää heti?
Ei ennen kuin olette varmistaneet muutaman viestin todisteeksi. Otsikkotiedot näyttävät usein, mikä skripti tai postilaatikko laukaisi lähetyksen. Pysäyttäminen on yleensä parempi kuin poistaminen, kunnes lähde tiedetään.
Miten pääsen takaisin pois estolistoilta?
Poistakaa ensin syy, pyytäkää sitten estolistojen ylläpitäjiltä poistoa. Useimmat vaativat selityksen siitä, mitä on korjattu. Joka pyytää liian aikaisin ja jatkaa roskapostin lähettämistä, joutuu uudelleen listalle.