# Opozorilni znak: spletni strežnik zažene lupino

> PHP-FPM ali Apache zažene lupino? Preberite drevo procesov, ločite neškodljive primere od sledi vdora in vzorec trajno nadzorujte.

Vir: https://phpsos.de/sl/blog/webserver-startet-shell/  
Stanje: 25.10.2026  
Ponudnik: PHP SOS, Nujna pomoč za PHP in varnost strežnikov. Takojšnja pomoč po WhatsAppu: https://wa.me/491736494914?text=Pozdravljeni%2C%20PHP%20SOS%2C%20potrebujemo%20pomo%C4%8D%20z%20na%C5%A1im%20stre%C5%BEnikom%20PHP.%20Podjetje%3A%20%E2%80%A6%20Spletna%20stran%3A%20%E2%80%A6

**Na kratko:** Če PHP-FPM, Apache ali drug proces spletnega strežnika zažene lupino, kot sta `sh` ali `bash`, je to eden najmočnejših opozorilnih znakov vdora prek spletne strani. Preden karkoli končate, preverite drevo procesov, ukazno vrstico in delovni imenik lupine. Posamezne kratke lupine so lahko legitimne; dolgo tekoče lupine z omrežnimi orodji skoraj nikoli niso.

## Zakaj ta vzorec toliko pove

Spletni strežnik odgovarja na zahteve. PHP-FPM, upravljavec procesov, ki skripte PHP izvaja za spletni strežnik, zaradi tega običajno ne zaganja drugih programov. Lupina pod spletnim strežnikom pomeni, da je koda PHP namenoma poklicala program. Bodisi to aplikacija počne namenoma, bodisi je nekdo drug vnesel kodo.

Za PHP2Shell ni objavljenih, potrjenih indikatorjev ogroženosti (Indicators of Compromise), torej ni seznama stalnih znakov prepoznavanja. Odkrivanje temelji na vedenju. Po poročilih, ki so nam na voljo, spadajo procesi spletnega strežnika ali PHP-FPM, ki zaženejo lupino, med najmočnejše splošne opozorilne znake. To velja za vsako ranljivost, prek katere napadalci na strežniku izvajajo kodo. Pregled nadaljnjih znakov daje [Ali smo že ogroženi?](https://phpsos.de/sl/php2shell/bin-ich-gehackt-anzeichen/).

Zakaj je lupina za napadalca tako pomembna? Z ranljivostjo lahko sprva odda le posamezne ukaze prek procesa PHP. Lupina iz tega naredi udobno delovno mesto: lahko se razgleda, naloži orodja, bere dostopna gesla iz konfiguracijskih datotek in se trajno namesti. Kdor lupino prepozna, napadalca torej pogosto prepozna v trenutku, ko preide od prvega dostopa k pravemu namenu.

## PHP-FPM zažene bash: branje drevesa procesov

Vsak proces v Linuxu ima nadrejeni proces. Vprašanje je, ali lupina teče kot otrok procesa spletnega strežnika. Naslednji ukazi samo berejo:

```bash
# Drevo procesov z uporabnikom, nadrejenim PID in časom zagona
ps -eo user,pid,ppid,lstart,cmd --forest | grep -B2 -A4 -E "[p]hp-fpm|[a]pache2|[h]ttpd|[l]sphp"

# Lupine, ki tečejo pod tipičnimi uporabniki spletnega strežnika
ps -eo user,pid,ppid,lstart,cmd | grep -E "^(www-data|apache|nginx) " | grep -E "[ /](ba|da)?sh( |$)"

# Drevo od najstarejšega procesa PHP-FPM
pstree -alp "$(pgrep -o php-fpm)"
```

Če ste našli sumljivo lupino, nadaljnje namige dajo vnosi pod `/proc`, prav tako samo za branje:

```bash
PID=12345   # PID sumljive lupine
tr '\0' ' ' < /proc/$PID/cmdline; echo        # celotna ukazna vrstica
ls -l /proc/$PID/cwd /proc/$PID/exe            # delovni imenik in programska datoteka
ls -l /proc/$PID/fd 2>/dev/null | grep socket  # odprte omrežne povezave
```

Imena procesov v Debianu in Ubuntuju se pogosto glasijo `php8.3-fpm` ali podobno; iskalne vzorce prilagodite. Delovni imeniki v `/tmp`, `/dev/shm` ali v imenikih za nalaganje so jasen znak.

## Legitimne izjeme in pravi opozorilni znaki

Nekatere aplikacije prek PHP kličejo programe. Pri tem lahko za kratek čas nastane lupina, na primer ko PHP prek `sendmail_path` predaja pošto ali ko aplikacija slike obdeluje z zunanjim orodjem. Take lupine živijo samo sekunde in vedno kličejo isti program. Te pričakovane primere enkrat čisto dokumentirajte; tedaj se vsako odstopanje takoj opazi, namesto da utone v poplavi znanih sporočil.

| Opazovanje | Prej neškodljivo, če | Sumljivo, če |
|---|---|---|
| Kratka lupina pod PHP-FPM | zažene znan program aplikacije | sta cilj in namen nejasna |
| Dlje tekoča lupina | nikoli | teče minute ali ure |
| Omrežna orodja kot podrejeni proces | znana poizvedba aplikacije za posodobitve ali API | sledijo prenosi v začasne imenike |
| Delovni imenik | imenik projekta aplikacije | `/tmp`, `/dev/shm`, imeniki za nalaganje |
| Čas | ujema se z znanim dejanjem, na primer pošiljanjem pošte | ponoči, brez dejavnosti uporabnikov, množično |

Če ne veste, ali vaša aplikacija kliče programe, vprašajte razvijalca ali v kodi poiščite funkcije, kot so `exec`, `shell_exec`, `system`, `passthru`, `proc_open` in `popen`. Zadetki v lastni kodi so običajni, zadetki v neznanih datotekah ne.

## Trajni nadzor namesto enkratnega pogleda

Posnetek z `ps` ujame samo lupine, ki ravno tečejo. Kratkotrajni procesi zdrsnejo mimo. Zanesljiveje je zagone programov s strani uporabnika spletnega strežnika trajno beležiti. Pod Linuxom to omogoča revizijska storitev auditd s pravilom za zagone programov uporabnika spletnega strežnika. Vrednotenje poteka samo z branjem:

```bash
# Prikaz zabeleženih zagonov programov pod ključem pravila (ključ kot primer)
sudo ausearch -k web_exec --start today -i | grep -E "exe=|proctitle="
```

Kako je pravilo videti, je odvisno od distribucije in ID uporabnika; najprej ga preizkusite, saj na močno obremenjenih strežnikih nastane veliko vnosov.

Dve dopolnitvi naredita nadzor zanesljiv. Prvič, dnevniki naj dodatno gredo v centralni sistem, ker napadalec s pravicami root lahko lokalne dnevnike izbriše. Drugič, potrebno je alarmiranje: zagon programa s strani uporabnika spletnega strežnika, ki ni na kratkem seznamu pričakovanih programov, naj sproži sporočilo, ne samo vnos v dnevnik. Kdor že uporablja rešitev za odkrivanje na končnih napravah ali strežnikih, lahko enako pravilo preslika tja. Preventivno je mogoče z `disable_functions` zakleniti, česar aplikacija ne potrebuje. To ne zapre ranljivosti v interpreterju, a otežuje naslednji korak napadalca. Podrobnosti so pod [Pravilna uporaba disable_functions](https://phpsos.de/sl/ratgeber/disable-functions/).

## Kaj storiti, če pod spletnim strežnikom najdete lupino

1. **Dokumentirajte:** Izpis `ps`, ukazno vrstico, delovni imenik in odprte povezave shranite v datoteko zunaj spletnega imenika.
2. **Ne čistite:** Ne brišite datotek in ne končujte procesov, preden so sledi zavarovane.
3. **Izolirajte:** Strežnik odklopite z omrežja ali dostop močno omejite.
4. **Poiščite vzrok:** Preverite dnevnike, nove datoteke in obstojnost, kot so cronjobi, glejte [Iskanje sumljivih procesov na strežnikih Linux](https://phpsos.de/sl/blog/verdaechtige-prozesse-linux/).
5. **Zamenjajte dostope:** Vsa gesla in ključi, ki so bili na strežniku, veljajo za znane.

Če aplikacija teče v vsebnikih, velja enako načelo v malem. Lupina v vsebniku PHP je enako sumljiva kot na klasičnem strežniku, slike vsebnikov pa jo pogosto vsebujejo samo zato, ker jo prinaša osnovna slika. Pred ponovnim zagonom vsebnika zavarujte njegovo stanje, saj z vsebnikom izginejo tudi sledi v hlapnem datotečnem sistemu.

Preverite tudi okolico. Napadalec z lupino na spletnem strežniku si od tam pogosto prizadeva doseči druge sisteme, na primer podatkovno bazo, shrambe varnostnih kopij ali notranje upravljavske vmesnike. Dostopna gesla v konfiguracijskih datotekah aplikacije mu to olajšajo.

> **Ukrepajte takoj:**
> Dolgo tekoča lupina pod PHP-FPM na strežniku s podatki strank je varnostni incident. Obravnavajte jo tako: zavarujte, izolirajte, strukturirano obdelajte, dajte preveriti obveznosti prijave.

## Kako PHP SOS pomaga konkretno?

- **Ocena ugotovitve:** Preverimo drevo procesov, ukazne vrstice in povezave ter ločimo vedenje aplikacije od sledi vdora.
- **Zavarovanje sledi:** Stanje sistema zavarujemo sledljivo, preden se karkoli spremeni.
- **Obravnava incidenta:** Z [odzivom na incidente](https://phpsos.de/sl/leistungen/incident-response/) vodimo od zajezitve do dokumentiranega zaključka.
- **Trajna zaščita:** Vzpostavimo beleženje zagonov programov in funkcije PHP omejimo na nujno. Kako PHP-FPM deluje znotraj, pojasnjuje [PHP-FPM razložen](https://phpsos.de/sl/php/php-fpm-erklaert/).


## Pogosta vprašanja

**Ali je vsaka lupina pod PHP-FPM napad?**  
Ne vsaka. Nekatere aplikacije prek PHP namenoma kličejo programe, na primer za obdelavo slik ali pošiljanje pošte, pri tem pa lahko za kratek čas nastane lupina. Sumljivo postane, ko lupina teče dlje, zažene omrežna orodja ali dela iz netipičnih imenikov.

**Ali naj sumljivi proces takoj končam?**  
Najprej dokumentirajte, nato ukrepajte. Zabeležite podatke o procesu, ukazno vrstico, delovni imenik in omrežne povezave. Nato strežnik izolirajte. Prenagljena prekinitev uniči sledi in ne prepreči, da bi se napadalec vrnil.

**Ali obstajajo potrjeni znaki prepoznavanja za PHP2Shell?**  
Ne. Objavljenih, potrjenih indikatorjev ogroženosti (Indicators of Compromise) ni. Lupine pod spletnim strežnikom so splošen opozorilni znak za vdore prek spletnih aplikacij, ne specifičen za PHP2Shell.

**Kako preprečim, da PHP sploh zaganja lupine?**  
Prek disable_functions je mogoče zakleniti funkcije, kot so exec, shell_exec, system in proc_open, če jih aplikacija ne potrebuje. To ne zapre ranljivosti v interpreterju PHP, a otežuje izkoriščanje.

## Viri

- [BSI: Zvezni urad za varnost v informacijski tehnologiji (Nemčija)](https://www.bsi.bund.de/)
- [OWASP Cheat Sheet Series](https://cheatsheetseries.owasp.org/)
- [php.net: varnostna obvestila](https://www.php.net/)
