Stručně: Skrytá cron úloha je jedna z nejčastějších zadních vrátek na serverech s Linuxem: pravidelně stahuje škodlivý kód nebo znovu spouští procesy, i po aktualizaci PHP. Zkontrolujte všechna místa plánovaných úloh, nejen crontab -l: crontaby všech uživatelů, /etc/crontab, /etc/cron.d, složky cron, časovače systemd a úlohy at. Nálezy zajistěte dřív, než je odstraníte.
Proč jsou cron úlohy jako zadní vrátka tak oblíbené
Po úspěšném průniku má útočník problém: jeho přístup je křehký. Aktualizace zavře zranitelnost, administrátor smaže webshell, restart ukončí proces. Cron úloha tento problém řeší. Spouští příkazy v pevných časech, aniž by někdo zasahoval, a tak obnovuje ztracené přístupy.
Pro PHP2Shell neexistují potvrzené indikátory kompromitace (Indicators of Compromise). Nové cron úlohy ale podle zpráv, které máme k dispozici, patří k obecným varovným signálům po průnicích přes webové aplikace. Kdo už hledal webshelly, měl by hned zkontrolovat i plánované úlohy. Ostatní kroky následné péče uvádí Kontrolní seznam po napadení.
Kde se mohou plánované úlohy skrývat
Linux zná několik mechanismů plánovaných úloh. Mnoho kontrol ztroskotá tím, že se zkontroluje jen jeden z nich.
| Místo | Debian/Ubuntu | Rodina RHEL | Kdo smí zapisovat |
|---|---|---|---|
| Crontab pro každého uživatele | /var/spool/cron/crontabs/ |
/var/spool/cron/ |
příslušný uživatel |
| Celosystémový crontab | /etc/crontab |
/etc/crontab |
root |
| Jednotlivé soubory | /etc/cron.d/ |
/etc/cron.d/ |
root |
| Periodické složky | /etc/cron.hourly až /etc/cron.monthly |
stejně | root |
| Časovače systemd | /etc/systemd/system/, uživatelské units |
stejně | root, částečně uživatelé |
| Úlohy at | fronta atd |
stejně | uživatel, pokud je povoleno |
Důležité pro webové servery: Uživatel webového serveru si zpravidla může založit vlastní crontab bez práv root. Útočník s právy www-data k tomu tedy nepotřebuje další zranitelnost. Záznamy v /etc/cron.d nebo units systemd naopak naznačují, že získal práva root.
Hostingové panely jako Plesk nebo cPanel nabízejí vlastní rozhraní pro plánované úlohy. Za ním zpravidla stojí rovněž crontaby příslušných systémových uživatelů. Kdo se podívá jen do rozhraní, nepozná proto každý záznam, který byl založen přímo na serveru. V případě pochybností zkontrolujte obojí.
Jak zkontrolovat všechna místa úplně
Následující příkazy jen čtou. Spouštějte je jako root a výstupy zajistěte s datem.
# Vypsat crontaby všech uživatelů
for u in $(cut -d: -f1 /etc/passwd); do
out=$(crontab -l -u "$u" 2>/dev/null) && printf '### %s\n%s\n' "$u" "$out"
done
# Celosystémové záznamy a časy změn
cat /etc/crontab
ls -la --time-style=full-iso /etc/cron.d /etc/cron.hourly /etc/cron.daily /etc/cron.weekly /etc/cron.monthly
# Časovače systemd a úlohy at
systemctl list-timers --all
atq 2>/dev/null
# Hledat typické vzory ve všech souborech cron
grep -rnE "curl|wget|base64|/tmp/|/dev/shm|\| *(ba)?sh" /etc/crontab /etc/cron.* /var/spool/cron 2>/dev/null
Dva triky zaslouží zvláštní pozornost. Některé záznamy skrývají příkazy za mnoha mezerami, takže v editoru vyjedou doprava z obrazovky. Jiné používají řídicí znaky, které při zobrazení přepisují text. Pomocí cat -A se takové znaky stanou viditelnými:
cat -A /var/spool/cron/crontabs/www-data 2>/dev/null | less
Druhým pohledem jsou protokoly služby cron. Na mnoha systémech cron zaznamenává každé provedení s uživatelem a příkazem. Uvidíte tak i záznamy, které útočník mezitím odstranil, a poznáte, od kdy podezřelý příkaz běží:
# Provedené příkazy cron uživatele webového serveru (Debian/Ubuntu, resp. žurnál systemd)
grep -h "CRON" /var/log/syslog* 2>/dev/null | grep -E "\((www-data|apache|nginx)\) CMD"
journalctl -u cron -u crond --since "2026-10-17" --no-pager 2>/dev/null | grep CMD | head -100
Podle čeho poznáte zadní vrátka v cronu
- Stahování z internetu: Stažení, jehož výsledek se přímo předává shellu.
- Kódovaný obsah: Dlouhé řetězce, které se dekódují až za běhu.
- Neobvyklé cesty: Programy v
/tmp,/dev/shm, skrytých složkách nebo adresářích uploadu. - Špatný uživatel: Úlohy pod uživatelem webového serveru, ačkoli je aplikace nepotřebuje.
- Nápadný takt: Spouštění každou minutu nebo při každém restartu přes
@reboot. - Nevhodná časová razítka: Soubor změněn v době, kdy na serveru nikdo nepracoval, například po 17. říjnu.
Nezapomeňte: Také aplikace mají vlastní plány. WordPress například spravuje plánované úlohy v databázi. Jak je tam zkontrolovat, popisuje článek Hledání backdoorů ve WordPressu.
Cron úloha málokdy přichází sama. Kdo založil plánovanou úlohu, často také uložil klíče SSH nebo ukryl soubory. Zkontrolujte navíc klíče, jak popisuje článek Hledání neznámých klíčů SSH.
Nález zajistit, pochopit, pak odstranit
Škodlivá cron úloha je cenný důkazní předmět. Ukazuje adresu stahování, okamžik založení a často uživatele, přes něhož útočník přišel. Soubor před odstraněním zajistěte s kontrolním součtem a časovými razítky. Časové razítko později pomáhá rekonstruovat průběh; jak na to, ukazuje článek Sestavení časové osy incidentu. I pro případné oznámení dozorovému úřadu pro ochranu osobních údajů nebo pro pojišťovnu je nález důležitým dokladem, od kdy měl útočník přístup.
Samotné odstranění nestačí. Běží-li ještě proces, který záznam přepisuje, je za minutu zpět. A dokud je původní zranitelnost otevřená, může útočník kdykoli začít znovu. Pořadí proto zní: zajistit, uzavřít příčinu, odstranit všechny součásti, změnit přístupy, sledovat.
Cron úlohy preventivně zabezpečit
Aby zadní vrátka v cronu vůbec nemohla vzniknout nebo rychle vyšla najevo, pomáhají tři opatření. Za prvé lze určit, kteří uživatelé vůbec smějí založit crontab. Existuje-li soubor /etc/cron.allow, smějí crontab používat jen tam uvedení uživatelé. Nepotřebuje-li vaše aplikace cron úlohu pod uživatelem webového serveru, tento uživatel na seznam nepatří. Předem zkontrolujte, jaké úlohy aplikace skutečně potřebuje, a založte je vědomě pod vlastním uživatelem.
Za druhé se vyplatí sledování souborů. Nástroj pro kontrolu integrity ohlásí, jakmile se změní soubor v adresářích cron nebo pod /var/spool/cron. Za třetí patří plánované úlohy do dokumentace serveru: kdo ví, jaké záznamy mají existovat, pozná cizí okamžitě.
Jak konkrétně pomáhá PHP SOS?
- Zkontrolovat úplně: Zkoumáme všechny mechanismy plánovaných úloh, i časovače systemd, úlohy at a plány aplikací.
- Zařadit nálezy: Podezřelé záznamy vyhodnocujeme, aniž bychom je spouštěli, a odvozujeme další stopy.
- Vyčistit čistě: V rámci odstranění malwaru odstraníme všechny součásti a uzavřeme příčinu.
- Rozpoznat návrat: Zavádíme sledování, které hlásí nové nebo změněné plánované úlohy.
Časté dotazy
Proč útočníci používají cron úlohy?
Cron úloha spouští příkazy pravidelně a bez dalšího přičinění. Útočníci jí stahují škodlivý kód, znovu zakládají smazané soubory nebo spouštějí procesy. Jejich přístup tak přežije aktualizaci a často i povrchní vyčištění.
Stačí ke kontrole crontab -l?
Ne. crontab -l ukazuje jen crontab aktuálního uživatele. Plánované úlohy jsou navíc v crontabech jiných uživatelů, v /etc/crontab, /etc/cron.d, ve složkách cron.daily, v časovačích systemd a v úlohách at.
Jak poznám škodlivou cron úlohu?
Typické jsou stahování z internetu s přímým spuštěním, příkazy s kódovanými řetězci, programy v dočasných složkách, úlohy pod uživatelem webového serveru a záznamy, které běží každou minutu. Jediný znak je vodítko, několik je vážné podezření.
Mohu podezřelé cron úlohy prostě smazat?
Nejprve zajistit, pak odstranit. Záznam často prozradí původ, adresu stahování a další součásti. Bez objasnění, jak vznikl, jej útočník často založí znovu.