使用strace -f执行mutt命令失败的原因排查
问题背景
- 单独执行mutt命令发送邮件可正常运行:
mutt myOwnMail@server.com -s "some_subject" -a file.log < file.log # WORKS
- 使用
strace直接跟踪该命令也能正常运行:
strace mutt myOwnMail@server.com -s "some_subject" -a file.log < file.log # WORKS
- 但添加
-f(跟踪子进程)选项后执行失败,错误输出如下:
[pid 24140] open("maildrop/816765.24140", O_RDWR|O_CREAT|O_EXCL, 0644) = -1 EACCES (Permission denied) [pid 24140] write(2, "postdrop: warning: mail_queue_en"..., 90postdrop: warning: mail_queue_enter: create file maildrop/816765.24140: Permission denied ) = 90 [pid 24140] sendto(3, "<20>Aug 22 20:49:03 postfix/post"..., 124, MSG_NOSIGNAL, NULL, 0) = 124 [pid 24140] rt_sigprocmask(SIG_BLOCK, [CHLD], [CHLD TSTP], 8) = 0 [pid 24140] nanosleep({10, 0}, 0x7ffd7e940140) = 0 [pid 24140] open("maildrop/817709.24140", O_RDWR|O_CREAT|O_EXCL, 0644) = -1 EACCES (Permission denied) [pid 24140] write(2, "postdrop: warning: mail_queue_en"..., 90postdrop: warning: mail_queue_enter: create file maildrop/817709.24140: Permission denied ) = 90 [pid 24140] sendto(3, "<20>Aug 22 20:49:13 postfix/post"..., 124, MSG_NOSIGNAL, NULL, 0) = 124 [pid 24140] rt_sigprocmask(SIG_BLOCK, [CHLD], [CHLD TSTP], 8) = 0 [pid 24140] nanosleep({10, 0}, 0x7ffd7e940140) = 0 [pid 24140] open("maildrop/818761.24140", O_RDWR|O_CREAT|O_EXCL, 0644) = -1 EACCES (Permission denied) [pid 24140] write(2, "postdrop: warning: mail_queue_en"..., 90postdrop: warning: mail_queue_enter: create file maildrop/818761.24140: Permission denied ) = 90 [pid 24140] sendto(3, "<20>Aug 22 20:49:23 postfix/post"..., 124, MSG_NOSIGNAL, NULL, 0) = 124 [pid 24140] rt_sigprocmask(SIG_BLOCK, [CHLD], [CHLD TSTP], 8) = 0 [pid 24140] nanosleep({10, 0}, ^Cstrace: Process 24137 detached
- 查询
postdrop的权限信息:
sh -c 'find / -name \*postdrop\* -ls 2> /dev/null'
输出结果:
2333274 216 -rwxr-sr-x 1 root postdrop 218632 Oct 30 2018 /usr/sbin/postdrop 9426253 4 -rw-r--r-- 1 root root 1629 Oct 30 2018 /usr/share/man/man1/postdrop.1.gz
原因分析
问题核心在于postdrop的SGID权限位与strace -f的跟踪机制冲突:
- 从权限输出可知,
/usr/sbin/postdrop的权限为-rwxr-sr-x,其中的s表示启用了SGID位——程序运行时会继承所属组(postdrop组)的权限,这是它能写入Postfix的maildrop目录(该目录通常仅对postdrop组开放写入权限)的关键。 - 当使用
strace -f时,strace会通过ptrace系统调用跟踪所有子进程(包括mutt启动的postdrop进程)。Linux的安全机制会限制被ptrace跟踪的进程的权限提升:被跟踪的进程无法正常获取SGID带来的有效组ID(EGID)提升,导致postdrop只能以当前用户的组权限运行,没有权限写入maildrop目录,最终触发Permission denied错误。 - 而不带
-f的strace仅跟踪父进程(mutt本身),不会干预postdrop子进程,因此postdrop能正常继承SGID权限完成邮件投递。
内容的提问来源于stack exchange,提问作者urie
相关产品推荐
相关产品推荐

