Japan
サイト内の現在位置
そのCron設定、安全ですか?
NECセキュリティブログ2023年12月8日
NECサイバーセキュリティ戦略統括部 セキュリティ技術センターの岩川です。今回のブログでは、Unix系のOSに標準で備わっているジョブスケジューラである「Cron」の危険な使用例と攻撃者による悪用について紹介します。
- ※本ブログに記載の内容を悪用した行為は絶対におやめください。本ブログの内容を使用したことによって発生する不利益等について筆者はいかなる責任も負いません。
1. Cronとは
Cronとは、設定ファイルに記載されたスケジュールに従ってプログラムやコマンドを実行してくれる常駐プログラムです。定期的にプログラムやコマンドを実行したい場合に、crontabコマンドで実行したいプログラムやコマンドと実行日時を指定することができます。バックアップの取得やサーバの状態の監視など使用用途は多岐にわたります。便利なので使用されている方も多いと思います。
以下はcrontabコマンドでrootユーザのCron設定を表示したときの例となります。5分間隔でシェルスクリプト/opt/check.shを実行する設定になっています。
$ sudo crontab -u root -l
(省略)
*/5 * * * * /opt/check.sh >/dev/null 2>&1
2. 危険なCron設定
2-1. ファイルの権限
1.で示した例では、/opt/check.shがroot権限により5分間隔で実行される設定になっていました。ここで/opt/check.shファイルの権限を確認します。
$ ls -l /opt/check.sh
-rwxrwxrwx 1 777 root 21 11月 13 09:21 /opt/check.sh
rootユーザ以外の任意のユーザが書込みできることが確認できます。一般権限のユーザにも書き込み権限があるためスクリプトを編集するとroot権限で任意のコマンド実行ができ権限昇格できます。例えば以下のようにsetuidが有効になったbashプログラムを作成することでroot権限の実効ユーザIDを持つシェルを獲得できます。
$ cat /opt/check.sh
cp /bin/bash /tmp/bash
chmod u+s /tmp/bash
$ ls -l /tmp/bash
-rwsr-xr-x 1 root root 1183448 11月 13 10:50 /tmp/bash
$ /tmp/bash -p
# id
uid=1000(user) gid=1000(user) euid=0(root) groups=1000(user)
Cronにより実行させるスクリプトやプログラムは、想定しているユーザ以外で上書きできないように適切に権限を指定する必要があります。また、 Cron設定が悪用された場合でも被害範囲を抑えることができるようにCronでコマンドを実行する際に使用するユーザは必要最小限の権限を持つユーザにする必要があります。
2-2. ワイルドカードインジェクション
以下のようにCronにより実行させるコマンドラインにワイルドカードを使用する場合には権限昇格の危険があります。
$ sudo crontab -u root -l
(省略)
*/5 * * * * (cd /home/user; tar cvf /var/backups/backup.tar *)
ワイルドカードインジェクションを用いた権限昇格については、「本当は怖いワイルドカード(「*」)」[3]というタイトルで過去に紹介されていますのでそちらをご参照ください。
2-3. 環境変数
以下のように環境変数が指定されている場合にも危険な場合があります。
$ sudo crontab -u root -l
(省略)
PATH=/home/user:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
*/5 * * * * bash /opt/check.sh >/dev/null 2>&1
環境変数PATHの先頭に/home/userが指定されているため、/home/userの配下にbashというファイル名を作成することができれば任意のコマンドを実行させることが可能です。
2-1.と同様のスクリプトを作成することで権限昇格が可能です。
$ cat /home/user/bash
cp /bin/bash /tmp/
chmod u+s /tmp/bash
$ ls -l /tmp/bash
-rwsr-xr-x 1 root root 1183448 11月 14 10:45 bash
$ /tmp/bash -p
# id
uid=1000(user) gid=1000(user) euid=0(root) groups=1000(user)
Cronで実行するコマンドは絶対パス(例:/bin/bash)で指定することでこの問題は回避できます。
2-4. コマンドラインの機微情報
Cron設定は通常他人が見ることはできないですが、実行するコマンドラインに機微情報を記載することは危険です。以下のように所有者であるユーザ以外にはデフォルトでは権限が付与されません。
# ls -l /var/spool/cron/crontabs
total 8
-rw------- 1 user crontab 1106 11月 14 11:10 user
-rw------- 1 root crontab 1155 11月 14 11:03 root
rootユーザのCron設定にユーザ名、パスワードを含むコマンドラインを指定します。
$ sudo crontab -u root -l
(省略)
*/5 * * * * mysqldump -u user -pg1AglOgHv45gh -x -A > /var/backups/mysql_backup
上記のCron設定がされた状態で一般権限ユーザによりpspy[4]を実行します。pspyを使いプロセスをモニタリングすると以下のように実行されるコマンドラインが見れるためユーザ名、パスワードの情報が取得できます。
$ ./pspy64
2023/11/14 11:50:01 CMD: UID=0 PID=825539 | /usr/sbin/CRON -f
2023/11/14 11:50:01 CMD: UID=0 PID=825540 | /bin/sh -c mysqldump -u user -pg1AglOgHv45gh -x -A > /var/backups/mysql_backup
実行されるコマンドラインは他人からも見えるためコマンドラインに機微情報は含めないようにすることが必要です。
3. 攻撃者による永続化
Cronは攻撃者が侵入後のシステムへのアクセスの永続化やコインマイナーのような不正プログラムを定期的に実行するために悪用されます。CronはMITRE ATT&CKのサブテクニックT1053.003 [5]に紐づけられおり永続化の攻撃手口とされています。筆者もインシデントの調査の際に侵害されたマシンに不審なCron設定が追加されていたのを見たことがあります。
3-1. 永続化の確認
- /etc/crontab
- /etc/anacrontab
- /var/spool/cron/
- /etc/cron.d/
- /etc/cron.hourly/
- /etc/cron.daily/
- /etc/cron.weekly/
- /etc/cron.monthly/
3-2. 検知と対策
侵害の検知については、3-1.で紹介したファイルとディレクトリ配下のファイルの変更を監視することで検知が可能です。普段Cron設定を変更しないマシンにおいてCron設定が変更された場合は侵害の可能性があります。
変更の検知についてはSplunk Security Content[7]の以下の検知名に紐づくSearch式が参考になります。
Cron設定の悪用に対する対策としては、MITRE ATT&CK [5]で挙げられている/etc/cron.allowファイルと/etc/cron.denyファイルによるCronを使用できるユーザの制限が一定の効果があると考えられます。侵害された場合でも、侵害されたユーザでCronの使用が制限されていればCronによる永続化は難しくなります。
4. まとめ
「Cron」の危険な使用例と攻撃者による悪用について紹介しました。危険なCron設定をしている場合、権限昇格や機微情報の窃取に悪用される可能性があります。また、Cronは攻撃者が永続化の手法として悪用することもあります。Cronだけ気を付けていればよいというわけではないですが、改めてCron設定を見直すきっかけとなれば幸いです。
参考資料
- [1]TryHackMe | Linux PrivEsc
https://tryhackme.com/room/linuxprivesc
- [2]Hack The Box: Hacking Training For The Best | Individuals & Companies
https://www.hackthebox.com/
- [3]本当は怖いワイルドカード(「*」): NECセキュリティブログ | NEC
https://jpn.nec.com/cybersecurity/blog/210903/index.html - [4]GitHub - DominicBreuker/pspy: Monitor linux processes without root permissions (License: GPL-3.0)
https://github.com/DominicBreuker/pspy
- [5]Scheduled Task/Job: Cron, Sub-technique T1053.003 - Enterprise | MITRE ATT&CK
https://attack.mitre.org/techniques/T1053/003/
- [6]Linux Persistence Map v0.2
https://pberba.github.io/assets/posts/common/20220201-linux-persistence.pdf
- [7]GitHub - splunk/security_content: Splunk Security Content (License: Apache-2.0)
https://github.com/splunk/security_content
- [8]security_content/detections/endpoint/linux_add_files_in_known_crontab_directories.yml at develop · splunk/security_content · GitHub
https://github.com/splunk/security_content/blob/develop/detections/endpoint/linux_add_files_in_known_crontab_directories.yml
- [9]security_content/detections/endpoint/linux_adding_crontab_using_list_parameter.yml at develop · splunk/security_content · GitHub
https://github.com/splunk/security_content/blob/develop/detections/endpoint/linux_adding_crontab_using_list_parameter.yml
- [10]security_content/detections/endpoint/linux_edit_cron_table_parameter.yml at develop · splunk/security_content · GitHub
https://github.com/splunk/security_content/blob/develop/detections/endpoint/linux_edit_cron_table_parameter.yml
- [11]security_content/detections/endpoint/linux_possible_append_cronjob_entry_on_existing_cronjob_file.yml at develop · splunk/security_content · GitHub
https://github.com/splunk/security_content/blob/develop/detections/endpoint/linux_possible_append_cronjob_entry_on_existing_cronjob_file.yml
- [12]security_content/detections/endpoint/linux_possible_cronjob_modification_with_editor.yml at develop · splunk/security_content · GitHub
https://github.com/splunk/security_content/blob/develop/detections/endpoint/linux_possible_cronjob_modification_with_editor.yml
執筆者プロフィール
岩川 健人(いわかわ けんと)
セキュリティ技術センター リスクハンティング・アナリシスグループ
高性能計算(HPC)分野のソフトウェア開発業務を経て、現在はペネトレーションテスト、脆弱性診断などに従事。
SANS SEC575 メダル保持。
CISSP/情報処理安全確保支援士(RISS)/CHFI/情報処理技術者試験(NW,DB,ES)/GIAC(GREM,GMOB)/AWS認定(SAA,SCS)を保持。
Hack The Box - Guruランク。

執筆者の他の記事を読む
アクセスランキング
2025年4月6日~4月12日に読まれた記事のランキング