主题: 伪造寄件人地址

我们的邮箱现在存在如下几个问题
1. A用户登录之后发送邮件的时候可以任意修改from为其他人(不管这个地址是否存在)的邮箱地址, 给B发送邮件
2. 邮件列表的邮箱地址可以用来给任意人发送邮件,而不需要登录验证, 接收到这个邮件的用户的from上显示的就是邮件列表的地址.

对于问题1 我们的发信规则中有加入: reject_sender_login_mismatch, reject_authenticated_sender_login_mismatch, 来进行限制, 但是好像无效
对于问题2的验证. 有如下脚本
假设all@example.com 是一个邮件列表的地址

import sys
import smtplib
import email.utils
from email.mime.text import MIMEText

content = ["test",'test']
msg = MIMEText(''.join(content))
msg['To'] = email.utils.formataddr(('yp2','yp2@example.com,'))
msg['From'] = email.utils.formataddr(('all','all@example.com'))
msg['Subject'] = 'this is fake mail'
server = smtplib.SMTP()
try:
    server.connect('mx.example.com')
    server.ehlo()
    server.sendmail('all@example.com',['yp2@example.com'],msg.as_string())
except Exception,e:
    print e
    sys.exit(1)
finally:
    server.quit()

回复: 伪造寄件人地址

补充一下. 我设置了一个邮件列表的投递规则为 本域用户. 我用我自己的gmail邮件给我公司邮箱发送邮件提示 被公司邮箱(iredmaial) 拒绝了, 但是 我使用上面的脚本. 例如我需要对ytest@example.com 这个邮件列表投递邮件 我可以这样绕过

import sys
import smtplib
import email.utils
from email.mime.text import MIMEText

content = ["test",'test']
msg = MIMEText(''.join(content))
msg['To'] = email.utils.formataddr(('ytest','ytest@example.com,'))
msg['From'] = email.utils.formataddr(('ytest','ytest@example.com'))
msg['Subject'] = 'this is fake mail'
server = smtplib.SMTP()
try:
    server.connect('mx.example.com')
    server.ehlo()
    server.sendmail('ytest@example.com',['ytest@example.com'],msg.as_string())
except Exception,e:
    print e
    sys.exit(1)
finally:
    server.quit()

这样的话. 哪怕我的ytest设置了只允许域内用户投递邮件. 此时这个信件也是可以被送进来的

回复: 伪造寄件人地址

1:iRedMail 里有用 iRedAPD 软件的 reject_sender_login_mismatch 插件来做,但是它获取的发件人地址仅限于 smtp 会话过程中,客户端提交的 MAIL FROM: 及 RCPT TO: 里的收件人/发件人地址,而不是你提交的邮件内容(包括邮件头和正文)里的收件人发件人。iRedMail 暂时没有使用其它组件来做基于邮件头的这种伪造发件人的阻挡。

2: 你做的测试似乎是在服务器本地(localhost)?如果是,这种无法避免,因为本地是受信的。试试在另外一台笔记本电脑或服务器上经由(或不经由) smtp 验证去发这样的测试邮件。