修正Qmail auth smtp中电子邮件地址任意的patch[1]

[入库:2005年9月21日] [更新:2007年3月24日]

本文简介:


qmail 的auth smtp有两个patch,
分别在:http://members.elysium.pl/brush/qmail-smtpd-auth/和www.nimh.org/hacks/qmail-smtpd.c。

不过都有个问题,就是auth 的用户可以和mail from的用户不一样,这样就
给了垃圾邮件发送者可乘之机,只要知道了某个用户的地址和口令,就可以
以自己的名义发信。同时认证用户的过程并不记录在邮件日志中,这给了系统管理员造成了很大不便,难以知道是哪个用户被黑掉了。

下面这个patch就是针对这种情况写的。

作用有两个:
1. 通过环境变量来控制是否记录认证过程。
2. 如果mail from和auth user name不一致,拒绝发送信件。


这个patch是基于www.nimh.org/hacks/qmail-smtpd.c,iceblood版本中实际上也是的这个。因此,用iceblood版本的可以直接使用。如果是用
http://members.elysium.pl/brush/qmail-smtpd-auth/版本的就需要自己
相应的修改了。

安装方法,如下,将下面这些内容存到qmail-smtpd.patch。放到qmail的源码目录。然后
1. patch < qmail-smtpd.patch
2. make qmail-smtpd
3. 替换qmail-smtpd
   或者复制到新的执行文件例如qmail-smtpd.auth,这样你的旧版本就能保留
  了,只需要在smtpd的启动脚本中,修改为对应的执行文件就可以。

如果你需要记录smtp认证的信息,在smtpd的启动脚本中定义环境变量,如下:
LOG_AUTH=1
export LOG_AUTH

缺省情况下,认证信息不记入log

[quote:d38fd091a9]
--- qmail-smtpd.c       2003-04-05 17:55:20.000000000 -0500
+++ qmail-smtpd.c.new   2003-04-05 17:50:58.000000000 -0500
@@ -304,7 +304,11 @@
   if (!stralloc_copys(&rcptto,"")) die_nomem();
   if (!stralloc_copys(&mailfrom,addr.s)) die_nomem();
   if (!stralloc_0(&mailfrom)) die_nomem();
+  if (smtp_auth_validfrom(mailfrom.s)) {
   out("250 ok\r\n");
+  } else {
+    out("must use username as From authenticated! (#5.7.1)\r\n");
+  }
 }
 void smtp_rcpt(arg) char *arg; {
   if (!seenmail) { err_wantmail(); return; }
@@ -527,6 +531,82 @@
 static stralloc smtpauth = {0};
 static char smtpauthlogin[65];
 static char smtpauthpass[65];
+static int authd = 0;
+
+/* Author: gadfly@163.com.
+ * 1. Check consistent between auth user and 'From' user.
+ * 2. Read the LOG_AUTH enviroment variable to determine whether logging the auth info.
+ * LOG_AUTH=1, write the auth smtp info into syslog.
+ */
+#include <syslog.h>
+
+#define SMTP_AUTH_SUCCESS     0
+#define SMTP_AUTH_FAILED      1
+
+int smtp_auth_validfrom(from) char * from;
+{
+  stralloc tmplogin={0},mydefaultdomain={0};
+  char authusername[256];
+  int k, userlen;
+
+  if (!authd) return 1;
+
+  authusername[255] = '\0';
+  userlen = k = str_len(smtpauthlogin);
+  k = byte_rchr(smtpauthlogin, k, '@');
+
+  if (k == userlen)
+  {
+    k = byte_rchr(smtpauthlogin, userlen, '%');
+
+    if (k == userlen)
+    {
+      if (control_readfile(&mydefaultdomain,"/var/qmail/control/me",1) != 1)
+      {
+        die_nomem();
+      }
+      if (!stralloc_copys(&tmplogin, smtpauthlogin) )
+      {
+        die_nomem();
+      }
+      if (!stralloc_cats(&tmplogin, "@") )
+      {
+        die_nomem();
+      }
+      if (!stralloc_cat(&tmplogin, &mydefaultdomain))
+      {
+        die_nomem();
+      }
+      strncpy(authusername, tmplogin.s, sizeof(authusername));
+      }
+      else
+      {
+        strcpy(authusername, smtpauthlogin);

本文关键:修正Qmail auth smtp中电子邮件地址任意的patch
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top