# Varovný signál: webový server spúšťa shell

> PHP-FPM alebo Apache spúšťa shell? Ako čítať strom procesov, oddeliť neškodné prípady od stôp vlámania a tento vzorec trvalo sledovať.

Zdroj: https://phpsos.de/sk/blog/webserver-startet-shell/  
Stav: 25.10.2026  
Poskytovateľ: PHP SOS, Núdzová pomoc pri PHP a bezpečnosť serverov. Okamžitá pomoc cez WhatsApp: https://wa.me/491736494914?text=Dobr%C3%BD%20de%C5%88%2C%20PHP%20SOS%2C%20potrebujeme%20pomoc%20s%20na%C5%A1%C3%ADm%20serverom%20s%20PHP.%20Spolo%C4%8Dnos%C5%A5%3A%20%E2%80%A6%20Web%3A%20%E2%80%A6

**Stručne:** Ak PHP-FPM, Apache alebo iný proces webového servera spustí shell ako `sh` alebo `bash`, je to jeden z najsilnejších varovných signálov vlámania cez web. Skôr než niečo ukončíte, preverte strom procesov, príkazový riadok a pracovný adresár shellu. Jednotlivé krátke shelly môžu byť legitímne; dlho bežiace shelly so sieťovými nástrojmi takmer nikdy.

## Prečo tento vzorec toľko vypovedá

Webový server odpovedá na požiadavky. PHP-FPM, teda správca procesov, ktorý pre webový server vykonáva skripty PHP, na to bežne nespúšťa ďalšie programy. Shell pod webovým serverom znamená, že kód PHP vedome zavolal program. Buď to aplikácia robí zámerne, alebo niekto iný vložil kód.

Pre PHP2Shell neexistujú zverejnené, potvrdené indikátory kompromitácie (Indicators of Compromise), teda žiadny zoznam pevných znakov rozpoznania. Detekcia sa opiera o správanie. Podľa správ, ktoré máme k dispozícii, patria procesy webového servera alebo PHP-FPM, ktoré spúšťajú shell, medzi najsilnejšie všeobecné varovné signály. To platí pre každú zraniteľnosť, cez ktorú môžu útočníci vykonávať kód na serveri. Prehľad ďalších príznakov poskytuje [Som už kompromitovaný?](https://phpsos.de/sk/php2shell/bin-ich-gehackt-anzeichen/).

Prečo je shell pre útočníka taký dôležitý? Pomocou zraniteľnosti môže spočiatku zadávať len jednotlivé príkazy cez proces PHP. Shell z toho robí pohodlné pracovisko: môže sa rozhliadnuť, doťahovať nástroje, čítať prístupové údaje z konfiguračných súborov a trvalo sa usadiť. Kto rozpozná shell, často rozpozná útočníka práve v okamihu, keď prechádza od prvého prístupu k skutočnému zámeru.

## PHP-FPM spúšťa bash: čítanie stromu procesov

Každý proces v Linuxe má rodičovský proces. Otázka je, či shell beží ako potomok procesu webového servera. Nasledujúce príkazy len čítajú:

```bash
# Strom procesov s používateľom, PID rodiča a časom spustenia
ps -eo user,pid,ppid,lstart,cmd --forest | grep -B2 -A4 -E "[p]hp-fpm|[a]pache2|[h]ttpd|[l]sphp"

# Shelly, ktoré bežia pod typickými používateľmi webového servera
ps -eo user,pid,ppid,lstart,cmd | grep -E "^(www-data|apache|nginx) " | grep -E "[ /](ba|da)?sh( |$)"

# Strom od najstaršieho procesu PHP-FPM
pstree -alp "$(pgrep -o php-fpm)"
```

Ak ste našli podozrivý shell, položky pod `/proc` poskytnú ďalšie náznaky, takisto len na čítanie:

```bash
PID=12345   # PID podozrivého shellu
tr '\0' ' ' < /proc/$PID/cmdline; echo        # úplný príkazový riadok
ls -l /proc/$PID/cwd /proc/$PID/exe            # pracovný adresár a súbor programu
ls -l /proc/$PID/fd 2>/dev/null | grep socket  # otvorené sieťové spojenia
```

Názvy procesov v Debiane a Ubuntu znejú často `php8.3-fpm` alebo podobne; prispôsobte vyhľadávacie vzory. Pracovné adresáre v `/tmp`, `/dev/shm` alebo v priečinkoch na nahrávanie sú zreteľným znakom.

## Legitímne výnimky a skutočné varovné znaky

Niektoré aplikácie volajú programy cez PHP. Pritom môže nakrátko vzniknúť shell, napríklad keď PHP odovzdáva poštu cez `sendmail_path` alebo keď aplikácia spracúva obrázky externým nástrojom. Takéto shelly žijú len sekundy a volajú vždy ten istý program. Tieto očakávané prípady zdokumentujte raz poriadne; potom sa každá odchýlka hneď ukáže, namiesto aby sa stratila v záplave známych hlásení.

| Pozorovanie | Skôr neškodné, ak | Podozrivé, ak |
|---|---|---|
| Krátky shell pod PHP-FPM | spúšťa známy program aplikácie | cieľ a účel sú nejasné |
| Dlhšie bežiaci shell | nikdy | beží minúty alebo hodiny |
| Sieťové nástroje ako potomok | známy dopyt aplikácie na aktualizáciu alebo API | nasledujú sťahovania do dočasných adresárov |
| Pracovný adresár | priečinok projektu aplikácie | `/tmp`, `/dev/shm`, priečinok na nahrávanie |
| Čas | zodpovedá známej akcii, napríklad odoslaniu pošty | v noci, bez aktivity používateľa, nahromadene |

Ak neviete, či vaša aplikácia volá programy, opýtajte sa vývojára alebo hľadajte v kóde funkcie ako `exec`, `shell_exec`, `system`, `passthru`, `proc_open` a `popen`. Nálezy vo vlastnom kóde sú normálne, nálezy v neznámych súboroch nie.

## Trvalo sledovať, nie raz nahliadnuť

Momentka cez `ps` zachytí len shelly, ktoré práve bežia. Krátkodobé procesy prekĺznu. Spoľahlivejšie je trvalo zaznamenávať spustenia programov používateľom webového servera. V Linuxe to zvládne auditovacia služba auditd s pravidlom pre spustenia programov používateľom webového servera. Vyhodnocuje sa čítaním:

```bash
# Zobraziť zaznamenané spustenia programov pod kľúčom pravidla (kľúč ako príklad)
sudo ausearch -k web_exec --start today -i | grep -E "exe=|proctitle="
```

Ako pravidlo vyzerá, závisí od distribúcie a ID používateľa; najprv ho otestujte, pretože na silno zaťažených serveroch vzniká veľa záznamov.

Dve doplnenia robia sledovanie spoľahlivým. Po prvé, protokoly by mali ísť navyše do centrálneho systému, pretože útočník s právami root môže lokálne logy zmazať. Po druhé, potrebné je upozorňovanie: spustenie programu používateľom webového servera, ktorý nie je na krátkom zozname očakávaných programov, by malo vyvolať hlásenie, nielen záznam v logu. Kto už používa riešenie na detekciu na koncových zariadeniach alebo serveroch, môže rovnaké pravidlo zobraziť tam. Preventívne sa dá pomocou `disable_functions` zablokovať to, čo aplikácia nepotrebuje. Tým sa neuzatvorí zraniteľnosť v interpreteri, ale sťaží sa ďalší krok útočníka. Podrobnosti sú v časti [Správne používanie disable_functions](https://phpsos.de/sk/ratgeber/disable-functions/).

## Čo robiť, keď nájdete shell pod webovým serverom

1. **Zdokumentovať:** Výstup `ps`, príkazový riadok, pracovný adresár a otvorené spojenia uložiť do súboru mimo webového adresára.
2. **Neupratovať:** Nemazať súbory ani neukončovať procesy, kým nie sú stopy zabezpečené.
3. **Izolovať:** Server odpojiť od siete alebo prístup silne obmedziť.
4. **Hľadať príčinu:** Skontrolovať logy, nové súbory a perzistenciu ako cronjoby, pozri [Hľadanie podozrivých procesov na serveroch s Linuxom](https://phpsos.de/sk/blog/verdaechtige-prozesse-linux/).
5. **Zmeniť prístupy:** Všetky heslá a kľúče, ktoré boli na serveri, treba považovať za známe.

Ak aplikácia beží v kontajneroch, platí ten istý princíp v malom. Shell v kontajneri PHP je rovnako podozrivý ako na klasickom serveri a obrazy kontajnerov ho často obsahujú len preto, že ho prináša základný obraz. Pred reštartom kontajnera zabezpečte jeho stav, pretože s kontajnerom miznú aj stopy v prchavom súborovom systéme.

Skontrolujte navyše okolie. Útočník so shellom na webovom serveri sa odtiaľ často pokúša dostať k iným systémom, napríklad k databáze, úložisku záloh alebo interným správcovským rozhraniam. Prístupové údaje v konfiguračných súboroch aplikácie mu to uľahčujú.

> **Konajte hneď:**
> Dlho bežiaci shell pod PHP-FPM na serveri s údajmi zákazníkov je bezpečnostný incident. Zaobchádzajte s ním tak: zabezpečiť, izolovať, štruktúrovane spracovať, nechať preveriť oznamovacie povinnosti.

## Ako konkrétne pomáha PHP SOS?

- **Zaradiť nález:** Preveríme strom procesov, príkazové riadky a spojenia a oddelíme správanie aplikácie od stôp vlámania.
- **Zabezpečiť stopy:** Stav systému zabezpečíme dohľadateľne ešte predtým, než sa niečo zmení.
- **Spracovať incident:** S [reakciou na incidenty](https://phpsos.de/sk/leistungen/incident-response/) vedieme od izolácie po zdokumentované uzavretie.
- **Trvalo zabezpečiť:** Nastavíme zaznamenávanie spustení programov a obmedzíme funkcie PHP na nevyhnutné. Ako PHP-FPM funguje vnútri, vysvetľuje [PHP-FPM vysvetlené](https://phpsos.de/sk/php/php-fpm-erklaert/).


## Časté otázky

**Je každý shell pod PHP-FPM útok?**  
Nie každý. Niektoré aplikácie cez PHP zámerne volajú programy, napríklad na úpravu obrázkov alebo odosielanie pošty, a pritom môže nakrátko vzniknúť shell. Podozrivé je to vtedy, keď shell beží dlhšie, spúšťa sieťové nástroje alebo pracuje z netypických adresárov.

**Mal by som podozrivý proces okamžite ukončiť?**  
Najprv zdokumentovať, potom konať. Zaznamenajte údaje procesu, príkazový riadok, pracovný adresár a sieťové spojenia. Potom server izolujte. Unáhlené ukončenie ničí stopy a nezabráni tomu, aby sa útočník vrátil.

**Existujú pre PHP2Shell potvrdené znaky rozpoznania?**  
Nie. Neexistujú zverejnené, potvrdené indikátory kompromitácie (Indicators of Compromise). Shelly pod webovým serverom sú všeobecný varovný signál vlámania cez webové aplikácie, nie špecifický pre PHP2Shell.

**Ako zabránim tomu, aby PHP vôbec spúšťalo shelly?**  
Pomocou disable_functions sa dajú zablokovať funkcie ako exec, shell_exec, system a proc_open, ak ich aplikácia nepotrebuje. Tým sa neuzatvorí zraniteľnosť v interpreteri PHP, ale sťaží sa jej zneužitie.

## Zdroje

- [BSI: nemecký Spolkový úrad pre informačnú bezpečnosť](https://www.bsi.bund.de/)
- [OWASP Cheat Sheet Series](https://cheatsheetseries.owasp.org/)
- [php.net: bezpečnostné hlásenia](https://www.php.net/)
