Linux Kernel是开放源代码操作系统Linux的内核。 Linux Kernel moxa驱动MoxaDriverIoctl函数存在缓冲区溢出,本地攻击者可以利用这个漏洞提升特权。 问题存在于如下代码drivers/char/moxa.c: In MoxaDriverIoctl(): > if(copy_from_user( &dltmp, argp, sizeof(struct dl_str))) > return -EFAULT; ^ dltmp.len 是由用户控制 > if(dltmp.cardno < 0 || dltmp.cardno >= MAX_BOARDS) > return -EINVAL; > > switch(cmd) > {> case MOXA_LOAD_BIOS: > i = moxaloadbios(dltmp.cardno, dltmp.buf, dltmp.len); ^ 调用时没有任何长度检查 > return (i); > case MOXA_FIND_BOARD: > return moxafindcard(dltmp.cardno); > case MOXA_LOAD_C320B: > moxaload320b(dltmp.cardno, dltmp.buf, dltmp.len); ^ 调用时没有任何长度检查 > default: /* to keep gcc happy */ > return (0); > case MOXA_LOAD_CODE: > i = moxaloadcode(dltmp.cardno, dltmp.buf, dltmp.len); ^ 调用时没有任何长度检查 在 moxaloadbios()中: >static int moxaloadbios(int cardno, unsigned char __user *tmp, int len) >{ > void __iomem *baseAddr; > int i; > > if(copy_from_user(moxaBuff, tmp, len)) ^ copy_from_user没有进行任何长度检查 > return -EFAULT; 在 moxaloadcode()中: > static int...
Linux Kernel是开放源代码操作系统Linux的内核。 Linux Kernel moxa驱动MoxaDriverIoctl函数存在缓冲区溢出,本地攻击者可以利用这个漏洞提升特权。 问题存在于如下代码drivers/char/moxa.c: In MoxaDriverIoctl(): > if(copy_from_user( &dltmp, argp, sizeof(struct dl_str))) > return -EFAULT; ^ dltmp.len 是由用户控制 > if(dltmp.cardno < 0 || dltmp.cardno >= MAX_BOARDS) > return -EINVAL; > > switch(cmd) > {> case MOXA_LOAD_BIOS: > i = moxaloadbios(dltmp.cardno, dltmp.buf, dltmp.len); ^ 调用时没有任何长度检查 > return (i); > case MOXA_FIND_BOARD: > return moxafindcard(dltmp.cardno); > case MOXA_LOAD_C320B: > moxaload320b(dltmp.cardno, dltmp.buf, dltmp.len); ^ 调用时没有任何长度检查 > default: /* to keep gcc happy */ > return (0); > case MOXA_LOAD_CODE: > i = moxaloadcode(dltmp.cardno, dltmp.buf, dltmp.len); ^ 调用时没有任何长度检查 在 moxaloadbios()中: >static int moxaloadbios(int cardno, unsigned char __user *tmp, int len) >{ > void __iomem *baseAddr; > int i; > > if(copy_from_user(moxaBuff, tmp, len)) ^ copy_from_user没有进行任何长度检查 > return -EFAULT; 在 moxaloadcode()中: > static int moxaloadcode(int cardno, unsigned char __user *tmp, int len) > { > void __iomem *baseAddr, *ofsAddr; > int retval, port, i; > > if(copy_from_user(moxaBuff, tmp, len)) ^ copy_from_user没有进行任何长度检查 > return -EFAULT; In moxaload320b(): >static int moxaload320b(int cardno, unsigned char __user *tmp, int len) >{ > void __iomem *baseAddr; > int i; > > if(len > sizeof(moxaBuff)) ^ signed int只有一个上界检查 > return -EINVAL; > if(copy_from_user(moxaBuff, tmp, len)) ^ copy_from_user的len可能大于sizeof(moxaBuff) > return -EFAULT; 攻击者可以控制长度值造成缓冲区溢出,精心构建提交数据可能以提升特权。