/tmp/

雑なメモを置く場所。書いた内容の責任は取らないし、正確性、永続性なども保証しない。

mail コマンドで任意のコマンドが実行できる

Fail2ban の mail-whois と呼ばれる機能(Ban の通知を whois 結果付きでメール送るやつ)で CVE-2021-32749 が出ていた。

Possible RCE vulnerability in mailing action using mailutils (mail-whois) · Advisory · fail2ban/fail2ban · GitHub

これは mail コマンドに whois の内容を標準入力で渡しているのだけれど、mailtuils の mail コマンドには ~! エスケープ修飾子があると、その引数をコマンドみなしてシェル経由で実行するらしい。

確かに man を読むと書いてある。

mail(1): send/receive Internet mail - Linux man page

~!command
Execute the indicated shell command, then return to the message.

確かに実行できる。

root@8a57e227da26:/# cat /tmp/pwn.txt
aaa
~! uname -a

bbb
ccc

root@8a57e227da26:/# cat /tmp/pwn.txt | mail -s 'aaa' user@example.com
Linux 8a57e227da26 5.10.25-linuxkit #1 SMP Tue Mar 23 09:27:39 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
mail: cannot send message: Process exited with a non-zero status

man を読むと他にも色々あるっぽい。

~| でもコマンド実行につながるケースがあるらしいし、~r~w でファイルの書き込みができる。

mail コマンド経由で外部入力値を操作するようなアプリケーションをもし実装する場合は ~エスケープするだけで十分なのかな? 修正コミットを見た感じだと -E 'set escape' というオプションを使うことで対応している。