1 最后由 warriornew (2013-06-18 15:02:54) 编辑

主题: 伪造from为空绕过iredapd的别名策略限制问题

==== 必填信息。没有填写将不予回复 ====
- iRedMail 版本号:iRedAdmin-Pro    v1.6.0 (MySQL)
- 使用哪个数据库存储用户帐号(OpenLDAP,MySQL,PostgreSQL):
- 使用的 Linux/BSD 发行版名称及版本号:CentOS 6.4 X64
- 与您的问题相关的日志信息:
====
用Advanced Direct Remailer 本地建一个SMTP Server
telnet localhost 25
250 OK
ehlo example.com
250 OK
mail from:< > ##中间有个空格
250 OK
rcpt to:lishixin@example.cn
250 OK
data
354 Start mail input; end with <CRLF>.<CRLF>
test
.
250 OK
####
### maillog ###########################################################################3
Jun 18 13:49:54 mail postfix/smtpd[23083]: connect from unknown[124.65.12.4]
Jun 18 13:49:54 mail policyd: connection from: 127.0.0.1 port: 34520 slots: 0 of 2044 used
Jun 18 13:49:54 mail policyd: rcpt=1, module=bypass, host=124.65.12.4 (unknown), from=<>, to=lishixin@example.cn, size=0
Jun 18 13:49:54 mail postfix/smtpd[23083]: 59105619AC: client=unknown[124.65.12.4]
Jun 18 13:49:54 mail postfix/cleanup[23201]: 59105619AC: message-id=<>
Jun 18 13:49:54 mail postfix/qmgr[3713]: 59105619AC: from=<>, size=181, nrcpt=1 (queue active)
Jun 18 13:49:54 mail postfix/smtpd[23083]: disconnect from unknown[124.65.12.4]
Jun 18 13:49:54 mail postfix/pipe[23203]: 59105619AC: to=<lishixin@example.cn>, relay=dovecot, delay=0.19, delays=0.1/0.01/0/0.08, dsn=2.0.0, status=sent (delivered via dovecot service)
##### iredapd log ########
2013-06-18 13:56:42 DEBUG Connect from 127.0.0.1, port 40108.
2013-06-18 13:56:42 DEBUG smtp session: request=smtpd_access_policy
2013-06-18 13:56:42 DEBUG smtp session: protocol_state=RCPT
2013-06-18 13:56:42 DEBUG smtp session: protocol_name=ESMTP
2013-06-18 13:56:42 DEBUG smtp session: client_address=124.65.12.4
2013-06-18 13:56:42 DEBUG smtp session: client_name=unknown
2013-06-18 13:56:42 DEBUG smtp session: reverse_client_name=unknown
2013-06-18 13:56:42 DEBUG smtp session: helo_name=baidu.com
2013-06-18 13:56:42 DEBUG smtp session: sender=
2013-06-18 13:56:42 DEBUG smtp session: recipient=lishixin@example.cn
2013-06-18 13:56:42 DEBUG smtp session: recipient_count=0
2013-06-18 13:56:42 DEBUG smtp session: queue_id=
2013-06-18 13:56:42 DEBUG smtp session: instance=5a2b.51bff69a.74d3d.0
2013-06-18 13:56:42 DEBUG smtp session: size=0
2013-06-18 13:56:42 DEBUG smtp session: etrn_domain=
2013-06-18 13:56:42 DEBUG smtp session: stress=
2013-06-18 13:56:42 DEBUG smtp session: sasl_method=
2013-06-18 13:56:42 DEBUG smtp session: sasl_username=
2013-06-18 13:56:42 DEBUG smtp session: sasl_sender=
2013-06-18 13:56:42 DEBUG smtp session: ccert_subject=
2013-06-18 13:56:42 DEBUG smtp session: ccert_issuer=
2013-06-18 13:56:42 DEBUG smtp session: ccert_fingerprint=
2013-06-18 13:56:42 DEBUG smtp session: encryption_protocol=
2013-06-18 13:56:42 DEBUG smtp session: encryption_cipher=
2013-06-18 13:56:42 DEBUG smtp session: encryption_keysize=0
2013-06-18 13:56:42 INFO [124.65.12.4]  -> lishixin@example.cn, DUNNO
2013-06-18 13:56:42 DEBUG Connection closed
2013-06-18 13:56:42 DEBUG Closed SQL connection.

####问题关键所在############
/opt/iredapd/libs/sql/modeler.py

        # Not a valid email address.
        if len(smtp_session_data['sender']) < 6:
            return 'DUNNO'

sender 小于6的最后都dunno了。然后这个就直接返回了。
#### 暂时解决方法############
开启垃圾邮件,直接隔离
等待 张工处理吧

回复: 伪造from为空绕过iredapd的别名策略限制问题

用Advanced Direct Remailer 本地建一个SMTP Server

这个 Advanced Direct Remailer 是什么?

*) sender 邮件地址少于6个字符不应该直接拒收,因为有其他情况会出现 sender 邮件地址少于6个字符的情况。

*) 你在邮件里给的 iRedAPD debug 日志里显示 job@ 这个帐号没有设置 access policy,所以 iRedAPD 认为所有人都可以往 job@ 这个别名发送邮件。

*) sender 为空的情况还需要再测试一下,可能是 iRedMail 的配置有疏漏,但暂时无法确定。抱歉。

回复: 伪造from为空绕过iredapd的别名策略限制问题

Advanced Direct Remailer
是一个smtp服务器
来模拟向我的邮件服务器发信使用的
这个测试是最新的,不是job@那个别名,这个别名是我在一个测试环境里面搞的,这个只是为了演示from为空是怎么进入系统里面的。我想你应该解决一下iredapd可以绕过去的情况。

ZhangHuangbin 写道:

用Advanced Direct Remailer 本地建一个SMTP Server

这个 Advanced Direct Remailer 是什么?

*) sender 邮件地址少于6个字符不应该直接拒收,因为有其他情况会出现 sender 邮件地址少于6个字符的情况。

*) 你在邮件里给的 iRedAPD debug 日志里显示 job@ 这个帐号没有设置 access policy,所以 iRedAPD 认为所有人都可以往 job@ 这个别名发送邮件。

*) sender 为空的情况还需要再测试一下,可能是 iRedMail 的配置有疏漏,但暂时无法确定。抱歉。

回复: 伪造from为空绕过iredapd的别名策略限制问题

抱歉,我不认为应该在 iRedAPD 这里做控制。问题在于它如何绕过了 Postfix 的种种限制。

5 最后由 warriornew (2013-06-20 09:14:35) 编辑

回复: 伪造from为空绕过iredapd的别名策略限制问题

那它其不是 是一个BUG,在过滤from 的时候 允许空格这种字符了,那这家伙,一时半会解决不了。 那我应该怎么做啊,向postfix提交bug吗,

ZhangHuangbin 写道:

抱歉,我不认为应该在 iRedAPD 这里做控制。问题在于它如何绕过了 Postfix 的种种限制。

回复: 伪造from为空绕过iredapd的别名策略限制问题

能否将这样收到的几封邮件的邮件头和邮件内容完整的贴出来(最好是邮件源文件)?大家分析一下怎么解决。

7 最后由 warriornew (2013-06-20 18:05:11) 编辑

回复: 伪造from为空绕过iredapd的别名策略限制问题

###发送信息##
20-06-2013 17:56:42 Log record is created.
Message from   to lishixin@dongao.cn, file 14q5td0-000-0000.msg
Request DNS for SMTP servers for this e-mail...
Try DNS-server 192.168.0.181
Sending DNS request...
Found 1 relay(s) (mail.dongao.cn [5])
Send via mail.dongao.cn SMTP-server
Host: mail.dongao.cn
Connecting to SMTP server...
IP: 211.151.33.219
Port: 25
Socks5 not used
Connected with SMTP-server
< 220 mail.dongao.cn ESMTP Postfix
> EHLO baidu.com
< 250-mail.dongao.cn
250-PIPELINING
250-SIZE 15728640
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
> MAIL FROM:< >
< 250 2.1.0 Ok
> RCPT TO:<lishixin@dongao.cn>
< 250 2.1.5 Ok
> DATA
< 354 End data with <CR><LF>.<CR><LF>
...Message body was sent, 9 bytes
250 2.0.0 Ok: queued as 8E31161B1E
> QUIT
< 221 2.0.0 Bye
mail.dongao.cn "250 2.0.0 Ok: queued as 8E31161B1E"

####接收到的信息####
Return-Path: <MAILER-DAEMON>
Delivered-To: lishixin@dongao.cn
Received: from baidu.com (unknown [124.65.129.74])
    by mail.dongao.cn (Postfix) with ESMTP id 8E31161B1E
    for <lishixin@dongao.cn>; Thu, 20 Jun 2013 17:56:44 +0800 (CST)

test

###############################
baidu.com 是我伪造,这是就from 为空的收到的信息头,如果你们有限制别名组的,我还可以伪造一个from为空的给你们发一封,你们就可以收到了。
当然这个是没有把垃圾邮件直接隔离的情况下。

回复: 伪造from为空绕过iredapd的别名策略限制问题

完整的邮件头就这么几行么?这个就有点怪了。

空发件人是 RFC 里规定运行的,恐怕还以另外的方式来屏蔽这类的垃圾邮件才行。你看看这里的方法是否对你有用:
http://www.postfix.org/BACKSCATTER_README.html

9 最后由 warriornew (2013-06-21 09:58:07) 编辑

回复: 伪造from为空绕过iredapd的别名策略限制问题

它这个主要是为了解决大量的伪造投递的目标地址不存在的情况下,系统会产生大量的退信,是主要解决这个问题的,其实这个问题,可以用正则表达式在检查头信息的地方做,但这个是需要一个条件的,那就是from 为空并且是目标地址是我的别名,并且 我别名没有允许任何人发送到这个别名的情况下拒绝,其它的都允许。


其实,我感觉你没理解我说的重点,我其实不是要阻止想这种from为空的邮件进入我的邮箱,而是要解决 我本身设置只能管理员才能发送到我的别名组的,这种from为空的竟然也可以发送进去,你觉得这是postfix的机制问题,但我觉得这应该是iredadp是设计的时候,没有考虑到对from为空的情况下的限制问题。


说白一点,就是irepapd 条件限制不严格。

public: Unrestricted. Everyone can mail to this address.   这个是可以from 为空 的向我发送
domain: Only users under same domain can send mail to this address.  这个也可以
subdomain: Only users under same domain and sub-domains can send mail to this address.  这个还可以
membersOnly: Only members can send mail to this address.  这个就不可以了,因为这个的意思only,只能是成员,from显示不是我的成员。
allowedOnly: Only moderators can send mail to this address.  这个更要拒绝,from为空,显然不是我的管理员
membersAndModeratorsOnly: Only members and moderators can send mail to this address.  这个更是了from为空不是我的管理员也不是我的成员

我想这是我对这几个限制条件的理解。




ZhangHuangbin 写道:

完整的邮件头就这么几行么?这个就有点怪了。

空发件人是 RFC 里规定运行的,恐怕还以另外的方式来屏蔽这类的垃圾邮件才行。你看看这里的方法是否对你有用:
http://www.postfix.org/BACKSCATTER_README.html

回复: 伪造from为空绕过iredapd的别名策略限制问题

抱歉,我理解有误。

关于 mail list 限制,你可以将第一个帖子里你已经定位的代码删除,让它不要处理小于6个字符的发件人地址。这样应该就ok了。
应该说这个算是一个bug,当时没有考虑到这种情况。

我已经修正了,并标记了你的论坛ID表示感谢:
https://bitbucket.org/zhb/iredapd/commi … f15c100f91

回复: 伪造from为空绕过iredapd的别名策略限制问题

确实解决了,感谢张工的不厌其烦回答与解决问题,可以结贴了