mail コマンドで任意のコマンドが実行できる
Fail2ban の mail-whois と呼ばれる機能(Ban の通知を whois 結果付きでメール送るやつ)で CVE-2021-32749 が出ていた。
これは 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'
というオプションを使うことで対応している。