热门关键字:  ubuntu  分区  Fedora  linux系统进程  函数

当前位置 :| 主页>Linux教程>内核研究>

Linux内核isdn_net.c文件 本地溢出漏洞

来源: 作者: 时间:2007-12-07 Tag: 点击:

 

Linux Kernel的drivers/isdn/i4l/isdn_net.c文件中的isdn_net_setcfg()函数在处理发送给ISDN伪设备(/dev/isdnctrl)的IOCTL配置请求时存在缓冲区溢出漏洞:

 

 

isdn_ioctl (drivers/isdn/i4l/isdn_common.c):
  1270 isdn_ioctl(struct inode *inode, struct file *file, uint cmd, ulong arg)
  ...
  ...
  1410 case IIOCNETSCF:
  1411 
  1412 if (arg) {
  1413 if (copy_from_user(&cfg, argp, sizeof(cfg))) *** <- cfg is user-controlled
  1414 return -EFAULT;
  1415 return isdn_net_setcfg(&cfg); *** <-call isdn_net_setcfg()
  1416 } else
  1417 return -EINVAL;
  ...
  在1413行,cfg是从用户空间读取的,因此受用户控制。在1415行调用了isdn_net_setcfg()函数,&cfg作为参数传送给了isdn_net_setcfg()。
  isdn_net_setcfg (drivers/isdn/i41/isdn_net.c):
  2664 isdn_net_setcfg(isdn_net_ioctl_cfg * cfg)
  2665 {
  ...
  2777 if (cfg->exclusive > 0) {
  2778 unsigned long flags;
  2779
  2780 
  2781 spin_lock_irqsave(&dev->lock, flags);
  2782 if ((i = isdn_get_free_channel(ISDN_USAGE_NET,
  2783 lp->l2_proto, lp->l3_proto, drvidx,
  2784 chidx, lp->msn)) < 0) {
  2785 
  2786 lp->exclusive = -1;
  2787 spin_unlock_irqrestore(&dev->lock, flags);
  2788 return -EBUSY;
  2789 }
  2790 
  2791 dev->usage = ISDN_USAGE_EXCLUSIVE;
  2792 isdn_info_update();
  2793 spin_unlock_irqrestore(&dev->lock, flags);
  2794 lp->exclusive = i;
  2795 } else {
  2796 
  2797 lp->exclusive = -1;
  2798 if ((lp->pre_device != -1) && (cfg->exclusive == -1)) {
  2799 isdn_unexclusive_channel(lp->pre_device, lp->pre_channel);
  2800 isdn_free_channel(lp->pre_device, lp->pre_channel, ISDN_USAGE_NET);
  2801 drvidx = -1;
  2802 chidx = -1;
  2803 }
  2804 }
  2805 strcpy(lp->msn, cfg->eaz); *** <- Possible overrun of lp->msn by cfg-eaz
  2806 lp->pre_device = drvidx;
  2807 lp->pre_channel = chidx;
  2808 lp->onhtime = cfg->onhtime;
  2809 lp->charge = cfg->charge;
  ...
  2884 return -ENODEV;
  2885 }

 

在2805行调用了strcpy(),lp->msn参数大小为32,cfg ->eaz大小为256。由于*cfg的数据是用户可控的,因此cfg->eaz也是用户可控的,这样就可以通过cfg->eaz字符串覆盖目标字符串lp->msn。如果cfg->eaz字符串的长度大于32的话,就可以触发缓冲区溢出。

 

建议使用此软件的用户随时关注厂商的主页以获取最新版本:http://www.kernel.org/




相关文章:
精通initramfs构建step by step
Linux利用kexec迅速切换内核
进程上下文VS中断上下文
内核通知链 学习笔记
linux spi子系统驱动分析
menuconfig 配置选项
《Linux操作系统内核实习》之练习一
udev详解
什么叫微内核,宏内核?
Linux 信号signal处理机制
开发简单的 Linux2.6 内核模块
删除内核的perl脚本
Linux2.6内核usb gadget驱动移植
GCC hacks in the Linux kernel
iomem
kernel学习的想法
让自己的驱动支持udev
linux内核编译步骤
内核的等待队列
Linux内核wait_queue深入分析
升级和删除内核
SD卡驱动分析2
Linux Kernel VDSO本地权限提升漏洞
内核中的TCP的追踪分析-15-TCP(IPV4)的客户端与
linux 2.6内核可加载模块的编译
内核模块HelloWorld
在环回接口上发送一个数据报
ARP初始化
1分钟编译FreeBSD内核
linux设备模型之uart驱动架构分析