Īsi sakot: Ja PHP-FPM, Apache vai cits tīmekļa servera process startē shell, piemēram, sh vai bash, tā ir viena no spēcīgākajām brīdinājuma pazīmēm par ielaušanos caur vietni. Pirms ko pārtraucat, pārbaudiet procesu koku, shell komandrindu un darba direktoriju. Atsevišķi īsi shell var būt likumīgi; ilgi darbojoši shell ar tīkla rīkiem gandrīz nekad.
Kāpēc šis modelis tik daudz pasaka
Tīmekļa serveris atbild uz pieprasījumiem. PHP-FPM, tas ir procesu pārvaldnieks, kas tīmekļa serverim izpilda PHP skriptus, šim nolūkam parasti nestartē citas programmas. Shell zem tīmekļa servera nozīmē, ka PHP kods ir apzināti izsaucis programmu. Vai nu lietojumprogramma to dara ar nodomu, vai kāds cits ir ievadījis kodu.
PHP2Shell nav publicētu, apstiprinātu Indicators of Compromise, tātad nav fiksētu atpazīšanas pazīmju saraksta. Atpazīšana balstās uz uzvedību. Saskaņā ar mūsu rīcībā esošajiem ziņojumiem tīmekļa servera vai PHP-FPM procesi, kas startē shell, ir starp spēcīgākajām vispārējām brīdinājuma pazīmēm. Tas attiecas uz katru ievainojamību, ar kuru uzbrucēji var serverī izpildīt kodu. Pārskatu par citām pazīmēm sniedz Vai esmu jau kompromitēts?.
Kāpēc shell uzbrucējam ir tik svarīgs? Ar ievainojamību viņš sākotnēji var tikai nosūtīt atsevišķas komandas caur PHP procesu. Shell no tā padara ērtu darba vietu: viņš var apskatīties apkārt, ielādēt rīkus, nolasīt piekļuves datus no konfigurācijas failiem un iekārtoties pastāvīgi. Kas shell atpazīst, bieži atpazīst uzbrucēju tieši brīdī, kad viņš no pirmās piekļuves pāriet pie īstā nodoma.
PHP-FPM startē bash: procesu koka nolasīšana
Katram procesam Linux sistēmā ir vecākprocess. Jautājums ir, vai shell darbojas kā tīmekļa servera procesa bērns. Šīs komandas tikai lasa:
# Procesu koks ar lietotāju, vecāka PID un startēšanas laiku
ps -eo user,pid,ppid,lstart,cmd --forest | grep -B2 -A4 -E "[p]hp-fpm|[a]pache2|[h]ttpd|[l]sphp"
# Shell, kas darbojas zem tipiskiem tīmekļa servera lietotājiem
ps -eo user,pid,ppid,lstart,cmd | grep -E "^(www-data|apache|nginx) " | grep -E "[ /](ba|da)?sh( |$)"
# Koks, sākot no vecākā PHP-FPM procesa
pstree -alp "$(pgrep -o php-fpm)"
Ja esat atradis aizdomīgu shell, ieraksti zem /proc sniedz papildu norādes, arī tikai lasot:
PID=12345 # aizdomīgā shell PID
tr '\0' ' ' < /proc/$PID/cmdline; echo # pilnā komandrinda
ls -l /proc/$PID/cwd /proc/$PID/exe # darba direktorijs un programmas fails
ls -l /proc/$PID/fd 2>/dev/null | grep socket # atvērtie tīkla savienojumi
Procesu nosaukumi Debian un Ubuntu bieži ir php8.3-fpm vai līdzīgi; pielāgojiet meklēšanas šablonus. Darba direktoriji /tmp, /dev/shm vai augšupielāžu mapēs ir skaidra pazīme.
Likumīgi izņēmumi un īstas brīdinājuma pazīmes
Dažas lietojumprogrammas ar PHP izsauc programmas. Tad uz īsu brīdi var rasties shell, piemēram, kad PHP ar sendmail_path nodod pastu vai lietojumprogramma apstrādā attēlus ar ārēju rīku. Šādi shell dzīvo tikai sekundes un vienmēr izsauc to pašu programmu. Šos sagaidāmos gadījumus vienreiz sakārtoti dokumentējiet; tad katra novirze uzreiz kļūst pamanāma, nevis noslīkst pazīstamu ziņojumu plūsmā.
| Novērojums | Drīzāk nekaitīgs, ja | Aizdomīgs, ja |
|---|---|---|
| Īss shell zem PHP-FPM | tas startē lietojumprogrammai zināmu programmu | mērķis un nolūks nav skaidri |
| Ilgāk darbojošs shell | nekad | tas darbojas minūtes vai stundas |
| Tīkla rīki kā bērnprocess | zināms lietojumprogrammas atjauninājuma vai API pieprasījums | seko lejupielādes pagaidu direktorijos |
| Darba direktorijs | lietojumprogrammas projekta mape | /tmp, /dev/shm, augšupielāžu mape |
| Laiks | atbilst zināmai darbībai, piemēram, pasta sūtīšanai | naktī, bez lietotāju aktivitātes, uzkrājoties |
Ja nezināt, vai jūsu lietojumprogramma izsauc programmas, pajautājiet izstrādātājam vai meklējiet kodā funkcijas, piemēram, exec, shell_exec, system, passthru, proc_open un popen. Atradumi paša kodā ir normāli, atradumi nepazīstamos failos nav.
Uzraudzīt pastāvīgi, nevis paskatīties vienreiz
Momentuzņēmums ar ps pārtver tikai shell, kas darbojas tieši tagad. Īslaicīgi procesi izslīd cauri. Uzticamāk ir pastāvīgi protokolēt programmu startēšanu, ko veic tīmekļa servera lietotājs. Linux sistēmā to nodrošina audit pakalpojums auditd ar noteikumu tīmekļa servera lietotāja programmu startiem. Izvērtē, tikai lasot:
# Parādīt protokolētos programmu startus zem noteikuma atslēgas (atslēga kā piemērs)
sudo ausearch -k web_exec --start today -i | grep -E "exe=|proctitle="
Kā noteikums izskatās, ir atkarīgs no distributīva un lietotāja ID; vispirms to pārbaudiet, jo ļoti noslogotos serveros rodas daudz ierakstu.
Divi papildinājumi padara uzraudzību noturīgu. Pirmkārt, protokoliem papildus jānonāk centrālā sistēmā, jo uzbrucējs ar root tiesībām var izdzēst lokālos žurnālus. Otrkārt, vajadzīga trauksme: tīmekļa servera lietotāja programmas starts, kas nav īsā sagaidāmo programmu sarakstā, jāpavada ar paziņojumu, nevis tikai žurnāla ierakstu. Kas jau izmanto risinājumu atpazīšanai galiekārtās vai serveros, tur var atveidot to pašu noteikumu. Profilaktiski ar disable_functions var bloķēt to, ko lietojumprogramma nevajag. Tas neaizver ievainojamību interpretatorā, bet apgrūtina uzbrucēja nākamo soli. Sīkāk sadaļā disable_functions pareiza lietošana.
Ko darīt, ja atrodat shell zem tīmekļa servera
- Dokumentēt:
psizvadu, komandrindu, darba direktoriju un atvērtos savienojumus saglabāt failā ārpus tīmekļa direktorija. - Netīrīt: neizdzēst failus un nepārtraukt procesus, pirms pēdas nav nodrošinātas.
- Izolēt: serveri atvienot no tīkla vai stipri ierobežot piekļuvi.
- Meklēt cēloni: pārbaudīt žurnālus, jaunus failus un noturību, piemēram, cronjobs, skatiet Aizdomīgu procesu atrašana Linux serveros.
- Mainīt piekļuves: visas paroles un atslēgas, kas bija serverī, uzskatāmas par zināmām.
Ja lietojumprogramma darbojas konteineros, tas pats princips attiecas mazākā mērogā. Shell PHP konteinerā ir tikpat aizdomīgs kā klasiskā serverī, un konteineru attēlos tas bieži ir tikai tāpēc, ka bāzes attēls to nes līdzi. Pirms konteinera pārstartēšanas saglabājiet tā stāvokli, jo kopā ar konteineru pazūd arī pēdas īslaicīgajā failu sistēmā.
Pārbaudiet arī apkārtni. Uzbrucējs ar shell tīmekļa serverī bieži mēģina no turienes sasniegt citas sistēmas, piemēram, datubāzi, rezerves kopiju krātuvi vai iekšējās pārvaldības saskarnes. Piekļuves dati lietojumprogrammas konfigurācijas failos to viņam atvieglo.
Ilgi darbojošs shell zem PHP-FPM serverī ar klientu datiem ir drošības incidents. Izturieties pret to attiecīgi: nodrošināt, izolēt, strukturēti izstrādāt, ziņošanas pienākumus ļaut pārbaudīt.
Kā PHP SOS palīdz konkrēti?
- Novērtēt atradumu: Mēs pārbaudām procesu koku, komandrindas un savienojumus un atšķiram lietojumprogrammas uzvedību no ielaušanās pēdām.
- Nodrošināt pēdas: Mēs sistēmas stāvokli nodrošinām izsekojami, pirms kaut kas tiek mainīts.
- Apstrādāt incidentu: Ar Incident Response mēs vadām no ierobežošanas līdz dokumentētam noslēgumam.
- Aizsargāt ilgstoši: Mēs iestatām programmu startu protokolēšanu un ierobežojam PHP funkcijas līdz nepieciešamajam. Kā PHP-FPM darbojas iekšēji, izskaidro PHP-FPM paskaidrojums.
Biežāk uzdotie jautājumi
Vai katrs shell zem PHP-FPM ir uzbrukums?
Ne katrs. Dažas lietojumprogrammas ar PHP apzināti izsauc programmas, piemēram, attēlu apstrādei vai pasta nosūtīšanai, un tad uz īsu brīdi var rasties shell. Aizdomīgi kļūst, ja shell darbojas ilgāk, startē tīkla rīkus vai darbojas no neraksturīgiem direktorijiem.
Vai aizdomīgo procesu vajadzētu pārtraukt nekavējoties?
Vispirms dokumentēt, tad rīkoties. Nofiksējiet procesa datus, komandrindu, darba direktoriju un tīkla savienojumus. Pēc tam izolējiet serveri. Pārsteidzīga pārtraukšana iznīcina pēdas un neliedz uzbrucējam atgriezties.
Vai PHP2Shell ir apstiprinātas atpazīšanas pazīmes?
Nē. Publicētu, apstiprinātu Indicators of Compromise nav. Shell zem tīmekļa servera ir vispārēja brīdinājuma pazīme par ielaušanos caur tīmekļa lietojumprogrammām, nevis raksturīga tieši PHP2Shell.
Kā novērst, lai PHP vispār startētu shell?
Ar disable_functions var bloķēt funkcijas, piemēram, exec, shell_exec, system un proc_open, ja lietojumprogramma tās nevajag. Tas neaizver ievainojamību PHP interpretatorā, bet apgrūtina izmantošanu.