- 主题:无聊的担心一下kbs安全性的问题~~!
Linux 源代码是公开的
Windows源代码是保密的
比较下两者的安全性
【 在 liangls (精灵射手) 的大作中提到: 】
: 源代码都是开放的,那么如果有人想研究一下攻击的办法,似乎还是应该能研究的出来的啊~!
--
FROM 60.178.69.*
确切的说,是bug,不是hole.
【 在 du2050 (杜杜) 的大作中提到: 】
: 漏洞坑定有的,就看有没有人原意改,如
: G) 群体信件选单-》选进去一个组-》a-》aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa->回车
: 就是个大大的缓冲区溢出。啊,说漏嘴了,hoho
: ...................
--
FROM 60.178.69.*
问题出在 mail.c 里的 set_mailgroup_key() 与 init_mailgroup() 函数
把 mailgroup_t 里的 id数组直接接传给 usercomplete() 函数造成溢出, id的数组长度只有IDLEN+1, 而usercomplete()要求的长度是 STRLEN
修复这个bug 可做如下修改:
static int init_mailgroup(mailgroup_list_t * mgl, int entry, mailgroup_t * users)
{
+ char tmpuserid[STRLEN];
mailgroup_t user;
int ret = 0;
+ tmpuserid[0]='\0';
clear();
move(0, 0);
prints("初始化群体信件组用户向导\n");
bzero(&user, sizeof(user));
move(1, 0);
- usercomplete("请输入要增加的用户代号: ", user.id);
+ usercomplete("请输入要增加的用户代号: ",tmpuserid);
+ strncpy(user.id,tmpuserid,IDLEN);
+ user.id[IDLEN]='\0';
if (user.id[0] != '\0') {
if (searchuser(user.id) <= 0) {
move(2, 0);
prints(MSG_ERR_USERID);
pressanykey();
} else {
move(2, 0);
getdata(2, 0, "请输入用户说明: ", user.exp, sizeof(user.exp), DOECHO, NULL, true);
add_mailgroup_user(mgl, entry, users, &user);
move(3, 0);
prints("初始化完成!\n");
pressanykey();
ret = 1;
}
}
return ret;
}
另一个函数的修改方法类似.
我们站已经修改好了.
说实话,以前从来没用过群组信件的功能,这东西是干啥用的?
【 在 nbysy (孩子他爸) 的大作中提到: 】
: 确切的说,是bug,不是hole.
--
FROM 60.178.69.*
主要是 usercomplete 这个函数还没怎么看,万一改错了,整个系统也完了,风险太大。
CVS 里改了吗?能贴一下吗?我这边上不了。
【 在 du2050 (杜杜) 的大作中提到: 】
: 呵呵,你看,你改的就不如人家改的好,全篇用到usercomplete函数有多处,即便是个个都注意了开大缓存也不好
: 后来人还可能用错这个函数。所以人家是在函数里限制输入长度了,就好多了,以后不会用错
: 还有总方法,就是把你的char tmpuserid[STRLEN];放在usercomplete里实现,这样既能全行输入,又能保证不溢出,hoho
: ...................
--
FROM 60.178.69.*
哈哈,看了下usercomplete() 函数,确实改这个要来得好些。
只要把 STRLEN 换成IDLEN 就OK了,反正现在站上没人,冒了次险改掉了。
【 在 du2050 (杜杜) 的大作中提到: 】
: 呵呵,你看,你改的就不如人家改的好,全篇用到usercomplete函数有多处,即便是个个都注意了开大缓存也不好
: 后来人还可能用错这个函数。所以人家是在函数里限制输入长度了,就好多了,以后不会用错
: 还有总方法,就是把你的char tmpuserid[STRLEN];放在usercomplete里实现,这样既能全行输入,又能保证不溢出,hoho
: ...................
--
FROM 60.178.69.*
我感觉传缓冲区大小没什么必要。
函数就叫 usercomplete(),可想而知传进去的缓冲区应该是IDLEN+1 个字节,因为ID长度不可能超过12字节,输入超过12字节的数据是不合逻辑的。
错误在于usercomplete() 允许用户输入STRLEN个字符(超过了IDLEN,何苦来哉),欺骗调用者的感情。
【 在 fancitron (Albatross) 的大作中提到: 】
: 照理应该有一个参数传缓冲区大小的。。。
--
FROM 60.178.69.*
不可能的吧? 你确认你是在发送站外信件?
int m_internet()
{
char receiver[STRLEN], title[STRLEN];
modify_user_mode(SMAIL);
getdata(1, 0, "收信人: ", receiver, 70, DOECHO, NULL, true);
getdata(2, 0, "主题 : ", title, 70, DOECHO, NULL, true);
xxxx
代码显示长度限制是70
【 在 mfkwmfk (阿水) 的大作中提到: 】
: 现在改了之后,如果要发送站外信件。。邮件地址就不能长于 12 了。。。
--
FROM 60.178.69.*
这样本来就不行的.
站外寄信要在site.h中 define MAILOUT
在 信件处理中会有 寄站外信件的选单
【 在 mfkwmfk (阿水) 的大作中提到: 】
: 我是说直接在
: ◆S) 寄信
: 这里输入站外地址
: ...................
--
FROM 60.178.69.*