# Znak upozorenja: web-poslužitelj pokreće ljusku

> PHP-FPM ili Apache pokreće ljusku? Kako čitati stablo procesa, odvojiti bezazlene slučajeve od tragova provale i trajno nadzirati taj obrazac.

Izvor: https://phpsos.de/hr/blog/webserver-startet-shell/  
Stanje: 25.10.2026  
Pružatelj: PHP SOS, PHP hitna pomoć i sigurnost poslužitelja. Hitna pomoć putem WhatsAppa: https://wa.me/491736494914?text=Pozdrav%20PHP%20SOS%2C%20trebamo%20pomo%C4%87%20s%20na%C5%A1im%20PHP%20poslu%C5%BEiteljem.%20Tvrtka%3A%20%E2%80%A6%20Web-stranica%3A%20%E2%80%A6

**Ukratko:** Ako PHP-FPM, Apache ili neki drugi proces web-poslužitelja pokrene ljusku poput `sh` ili `bash`, to je jedan od najjačih znakova upozorenja na provalu putem web-stranice. Prije nego što išta prekinete, provjerite stablo procesa, naredbeni redak i radni direktorij ljuske. Pojedine kratke ljuske mogu biti legitimne; ljuske koje dugo rade s mrežnim alatima gotovo nikad nisu.

## Zašto taj obrazac toliko govori

Web-poslužitelj odgovara na zahtjeve. PHP-FPM, upravitelj procesa koji za web-poslužitelj izvršava PHP skripte, za to normalno ne pokreće dodatne programe. Ljuska pod web-poslužiteljem znači da je PHP kod svjesno pozvao neki program. Ili aplikacija to radi namjerno, ili je netko drugi ubacio kod.

Za PHP2Shell ne postoje objavljeni, potvrđeni Indicators of Compromise, dakle nema popisa čvrstih obilježja prepoznavanja. Prepoznavanje se temelji na ponašanju. Prema izvješćima koja su nam dostupna procesi web-poslužitelja ili PHP-FPM-a koji pokreću ljusku spadaju među najjače opće znakove upozorenja. To vrijedi za svaku ranjivost putem koje napadači izvršavaju kod na poslužitelju. Pregled daljnjih znakova daje članak [Jesam li već kompromitiran?](https://phpsos.de/hr/php2shell/bin-ich-gehackt-anzeichen/).

Zašto je ljuska napadaču toliko važna? Uz ranjivost on isprva može ispaljivati samo pojedine naredbe preko PHP procesa. Ljuska od toga čini udobno radno mjesto: može se razgledati, dohvatiti alate, čitati pristupne podatke iz konfiguracijskih datoteka i trajno se smjestiti. Tko prepozna ljusku, napadača često prepoznaje upravo u trenutku kad prelazi s prvog pristupa na stvarni naum.

## PHP-FPM pokreće bash: čitati stablo procesa

Svaki proces pod Linuxom ima roditeljski proces. Pitanje je radi li ljuska kao dijete procesa web-poslužitelja. Sljedeće naredbe samo čitaju:

```bash
# Stablo procesa s korisnikom, PID-om roditelja i vremenom pokretanja
ps -eo user,pid,ppid,lstart,cmd --forest | grep -B2 -A4 -E "[p]hp-fpm|[a]pache2|[h]ttpd|[l]sphp"

# Ljuske koje rade pod tipičnim korisnicima web-poslužitelja
ps -eo user,pid,ppid,lstart,cmd | grep -E "^(www-data|apache|nginx) " | grep -E "[ /](ba|da)?sh( |$)"

# Stablo od najstarijeg PHP-FPM procesa
pstree -alp "$(pgrep -o php-fpm)"
```

Ako ste pronašli sumnjivu ljusku, unosi pod `/proc` daju daljnje naznake, također samo čitanjem:

```bash
PID=12345   # PID sumnjive ljuske
tr '\0' ' ' < /proc/$PID/cmdline; echo        # potpun naredbeni redak
ls -l /proc/$PID/cwd /proc/$PID/exe            # radni direktorij i programska datoteka
ls -l /proc/$PID/fd 2>/dev/null | grep socket  # otvorene mrežne veze
```

Nazivi procesa na Debianu i Ubuntuu često glase `php8.3-fpm` ili slično; prilagodite obrasce pretraživanja. Radni direktoriji u `/tmp`, `/dev/shm` ili u direktorijima za prijenose jasan su znak.

## Legitimne iznimke i pravi znakovi upozorenja

Neke aplikacije putem PHP-a pozivaju programe. Pritom nakratko može nastati ljuska, primjerice kad PHP putem `sendmail_path` predaje poštu ili aplikacija obrađuje slike vanjskim alatom. Takve ljuske žive samo sekunde i uvijek pozivaju isti program. Te očekivane slučajeve jednom uredno dokumentirajte; tada svako odstupanje odmah upada u oči umjesto da utone u poplavu poznatih poruka.

| Opažanje | Prije bezazleno ako | Sumnjivo ako |
|---|---|---|
| Kratka ljuska pod PHP-FPM-om | pokreće poznati program aplikacije | su cilj i svrha nejasni |
| Ljuska koja dulje radi | nikad | radi minutama ili satima |
| Mrežni alati kao podproces | poznati upit aplikacije za ažuriranje ili API | slijede preuzimanja u privremene direktorije |
| Radni direktorij | projektni direktorij aplikacije | `/tmp`, `/dev/shm`, direktoriji za prijenose |
| Vrijeme | odgovara poznatoj radnji, primjerice slanju pošte | noću, bez aktivnosti korisnika, učestalo |

Ako ne znate poziva li Vaša aplikacija programe, pitajte razvojnog programera ili u kodu potražite funkcije poput `exec`, `shell_exec`, `system`, `passthru`, `proc_open` i `popen`. Pogoci u vlastitom kodu su normalni, pogoci u nepoznatim datotekama nisu.

## Trajno nadzirati umjesto jednom pogledati

Trenutna snimka naredbom `ps` hvata samo ljuske koje upravo rade. Kratkotrajni procesi proklize. Pouzdanije je pokretanja programa od korisnika web-poslužitelja trajno bilježiti. Na Linuxu to omogućuje audit usluga auditd s pravilom za pokretanja programa korisnika web-poslužitelja. Evaluacija se radi čitanjem:

```bash
# Prikazati zabilježena pokretanja programa pod ključem pravila (ključ kao primjer)
sudo ausearch -k web_exec --start today -i | grep -E "exe=|proctitle="
```

Kako pravilo izgleda, ovisi o distribuciji i ID-u korisnika; najprije ga testirajte jer na jako opterećenim poslužiteljima nastaje mnogo unosa.

Dvije dopune čine nadzor otpornim. Prvo, zapisnici bi trebali dodatno ići u središnji sustav, jer napadač s root pravima može obrisati lokalne zapisnike. Drugo, treba alarmiranje: pokretanje programa od korisnika web-poslužitelja koje nije na kratkom popisu očekivanih programa trebalo bi izazvati poruku, ne samo zapis u zapisniku. Tko već koristi rješenje za prepoznavanje na krajnjim uređajima ili poslužiteljima, isto pravilo može preslikati tamo. Preventivno se putem `disable_functions` može blokirati ono što aplikacija ne treba. To ne zatvara ranjivost u interpreteru, ali otežava napadačev sljedeći korak. Pojedinosti su u članku [Ispravno koristiti disable_functions](https://phpsos.de/hr/ratgeber/disable-functions/).

## Što učiniti kad pod web-poslužiteljem pronađete ljusku

1. **Dokumentirati:** Ispis naredbe `ps`, naredbeni redak, radni direktorij i otvorene veze spremiti u datoteku izvan web-direktorija.
2. **Ne čistiti:** Ne brisati datoteke i ne prekidati procese prije nego što su tragovi osigurani.
3. **Izolirati:** Poslužitelj maknuti s mreže ili pristup jako ograničiti.
4. **Tražiti uzrok:** Provjeriti zapisnike, nove datoteke i postojanost poput cron poslova, vidi [Pronaći sumnjive procese na Linux poslužiteljima](https://phpsos.de/hr/blog/verdaechtige-prozesse-linux/).
5. **Promijeniti pristupe:** Sve lozinke i ključevi koji su bili na poslužitelju smatraju se poznatima.

Ako aplikacija radi u kontejnerima, isto načelo vrijedi u malom. Ljuska u PHP kontejneru jednako je sumnjiva kao i na klasičnom poslužitelju, a image-i kontejnera sadrže je često samo zato što je donosi osnovni image. Prije ponovnog pokretanja kontejnera osigurajte njegovo stanje, jer s kontejnerom nestaju i tragovi u prolaznom datotečnom sustavu.

Provjerite i susjedstvo. Napadač s ljuskom na web-poslužitelju često odatle pokušava doći do drugih sustava, primjerice baze podataka, pohrane sigurnosnih kopija ili internih sučelja za upravljanje. Pristupni podaci u konfiguracijskim datotekama aplikacije to mu olakšavaju.

> **Djelujte odmah:**
> Ljuska koja dugo radi pod PHP-FPM-om na poslužitelju s podacima o klijentima je sigurnosni incident. Tretirajte je tako: osigurati, izolirati, strukturirano obraditi, dati provjeriti obveze prijave.

## Kako PHP SOS konkretno pomaže?

- **Razvrstati nalaz:** Provjeravamo stablo procesa, naredbene retke i veze te odvajamo ponašanje aplikacije od tragova provale.
- **Osigurati tragove:** Stanje sustava osiguravamo provjerljivo prije nego što se išta promijeni.
- **Obraditi incident:** Uz [odgovor na incidente](https://phpsos.de/hr/leistungen/incident-response/) vodimo od ograničavanja do dokumentiranog zaključka.
- **Trajno zaštititi:** Postavljamo bilježenje pokretanja programa i ograničavamo PHP funkcije na nužno. Kako PHP-FPM radi iznutra, objašnjava članak [PHP-FPM objašnjen](https://phpsos.de/hr/php/php-fpm-erklaert/).


## Česta pitanja

**Je li svaka ljuska pod PHP-FPM-om napad?**  
Ne svaka. Neke aplikacije putem PHP-a svjesno pozivaju programe, primjerice za obradu slika ili slanje pošte, pri čemu nakratko može nastati ljuska. Sumnjivo postaje ako ljuska radi dulje, pokreće mrežne alate ili radi iz neuobičajenih direktorija.

**Trebam li sumnjivi proces odmah prekinuti?**  
Prvo dokumentirati, zatim djelovati. Zabilježite podatke o procesu, naredbeni redak, radni direktorij i mrežne veze. Nakon toga izolirajte poslužitelj. Prenagljeno prekidanje uništava tragove i ne sprječava napadača da se vrati.

**Postoje li za PHP2Shell potvrđena obilježja prepoznavanja?**  
Ne. Nema objavljenih, potvrđenih Indicators of Compromise. Ljuske pod web-poslužiteljem opći su znak upozorenja na provale putem web-aplikacija, a ne specifični za PHP2Shell.

**Kako spriječiti da PHP uopće pokreće ljuske?**  
Putem disable_functions mogu se blokirati funkcije poput exec, shell_exec, system i proc_open ako ih aplikacija ne treba. To ne zatvara ranjivost u PHP interpreteru, ali otežava iskorištavanje.

## Izvori

- [BSI: Savezni ured za informacijsku sigurnost (Njemačka)](https://www.bsi.bund.de/)
- [OWASP Cheat Sheet Series](https://cheatsheetseries.owasp.org/)
- [php.net: sigurnosne objave](https://www.php.net/)
