百科问答小站 logo
百科问答小站 font logo



Windows NT 内核与 Linux 内核相比哪个更安全? 第1页

  

user avatar   shi-guo-huai 网友的相关建议: 
      

占坑,一点点的说。

先说内核的定义:狭义的WindowsNT内核指的就是NTOSKRNL.EXE,Linux内核就是Grub里指定的那个内核文件,这两个文件都不大,属于系统最核心的组件;广义的内核定义是:WindowsNT架构下的大部分SYS文件,Linux里所有工作在内核模式的进程。

因为WindowsNT是微内核(勉强算是吧),Linux则完全不属于微内核结构,就先从这种区别来说安全性吧:

微内核的好处就是核心的东西通常可靠性较高,并且如果某一个子系统挂掉的情况下,不会完全影响到内核的工作(当然实际NT情况不是这样),缺点就是外围驱动的代码无法控制,为此微软引入了数字签名之类的东西,从WIN7x64开始,没有签名的驱动是无法被加载的,这一点可以保证一些安全性。

Linux里内核包括了很多东西,编译内核的时候可以定制自己想要的东西,如果对自己想要的东西理解的足够多的话,那么驱动的安全性是可以保证的。但Linux的一大问题是LKM,LKM可以在root权限下动态载入任意一个内核代码。

从载入第三方代码的角度说,微软在WIN7以后安全性提高了很多,而Linux因为有LKM的存在,如果root权限被控制,那么任意指令都可以被载入到内核执行。

所以,我不太认为Linux的内核安全性比NT内核要高多少,虽然微软签名也有可能滥发,但LKM更可怕。

Windows使用IRQL之类的限制保证不同的代码运行在不同的内存空间下,理论上说,对硬件的资源控制是要优于Linux的。Linux在这方面没有提供更多的保护(或者,我不了解相关的情况)。注:此处的内存空间是指page和non-paged的区别。

剩下的我慢慢补充。

------------------补充1------------------

关于root权限的问题:

这是在对等的条件下进行比较的,Windows的管理员权限下是无法载入未验证的代码到内核的,Linux在root(管理员)权限下是可以载入任何未验证的代码到内核的。所以说从内核的结构上看对待ring0的代码来说Linux的保护机制更弱。

@deep-pro @殷红路

你们的说法我无法赞同,Windows非管理员权限是很安全的,但是没有人这么用,如果用Windows管理员权限与Linux一般用户去比较那么是不公平的。

另外,

@殷红路

以下是我找到的数据链接:

Usage share of operating systems

看不出Linux的占有率哪里明显高于Windows了,在服务器市场,IDC的数据仍然是Windows高于Linux,唯一的一组数据是安全领域Linux很高,但是点开那个引用数据可以看到那个数值是基于apache的应用的,Windows、Linux、Unix是都支持apache的,尤其在IDC的服务器上Apache+Windows的应用也是见过很多的,所以也没理由说Linux的占用率一定高于Windows。

----------------------------补充2----------------------------

讨论的是内核安全性,但我还要说说应用的事情,在应用的方面,Windows应用的安全性还是远远低于Linux的,虽然微软在vista以后加入了UAC这种控制,但易用性和安全性之间本身就是有矛盾的,在方便的同时是要牺牲一部分安全性的代价的。

Windows的应用漏洞多的不计其数,但也不是说Linux是完全安全的,Linux的代码来源未必都是可靠的,并且就算是可靠的也未必是安全的,比如今年的struts2漏洞,当然有人会说那不是Linux的,那好吧Windows的很多应用也不是微软发布的,在这之间没有明显的界限,不做进一步讨论了。

----------------------------补充3----------------------------

继续说安全性,说两个内核区别:

Windows内核的二次开发是非常困难的,比如,Linux里可以基于VFS很快建立一个自己的文件系统,自建文件系统的好处就是可以保证数据安全,而Windows想要扩展第三方文件系统是十分困难的,因为Windows内核里有太多的API是不公开或者没有明确文档说明的。

Windows内核的为了方便第三方软件工作提供了过滤驱动这种接口,这种设计简直是为木马软件专门留的后门。当然微软的策略是:方便自己封闭、也方便别人使用,但正是这种思路,也使得用户无法触及封闭的部分,使得开放的部分被人滥用,因此也就有了各种奇怪的保护手段,比如QQ密码框用的修改IDT表项之类的,Linux因为系统是开放的,应用软件有足够的手段去开发安全性更强的驱动、插件、系统调用。

所以NT内核的封闭性+开放API的做法很容易导致开放的部分被滥用,这一点对开发者而言是很不友好的,在这个方面,Linux取胜。

----------------------------补充4----------------------------

两个系统内核还有明显的区别,但跟安全性关联不大,比如:

系统调用,一个用int 0x80,另一个用sysenter,据说最新版本的Linux也是用sysenter,我没有考察过,二者安全性应该没太大区别,只存在于速度上。sysenter更快一点。

图形化组件是集成在Windows内核里的,但Linux的图形化不集成在内核里,集成内核的效果是图形化更快。但对于服务器而言,图形化组件不是一个必需的选项,Windows这么做其实是在浪费资源,并且也多了一个漏洞存在的可能性,因为Windows JPEG缓冲区溢出漏洞是能攻击到内核的。

Windows的调用栈更多,写过Windows驱动的人都知道IRP这个东西,一层一层的传递,效率其实很差的,浪费内存资源,所以Linux能精简,但Windows想精简都困难。




  

相关话题

  都说操作系统难开发,那为什么微软在90年代就能开发出Windows呢? 
  windows为什么不添加图形界面的定时关机功能? 
  微软会针对「支付婊」事件对 WP 进行一次营销和推广吗? 
  为什么WinXP的驱动无法用于Win7、Vista,但是Win7,Vista驱动可用于Win10? 
  一台用于学习linux的主机该如何配置、选购? 
  Windows 辨别文件为什么一定要扩展名?感觉 Linux 上要求就没有这么高? 
  为何一提起Linux,总有人指出显卡驱动配置不好等问题? 
  为什么一般操作系统中应用程序的栈空间都要设最大值,不支持动态扩展? 
  Linux内核代码算屎山吗? 
  使用微软历代 Windows 版本是怎样的一番体验? 

前一个讨论
苏维埃社会主义共和国联盟怎么做才能赢得冷战?
下一个讨论
在中国活久了都会有哪些错觉?





© 2024-05-17 - tinynew.org. All Rights Reserved.
© 2024-05-17 - tinynew.org. 保留所有权利