1983年,微软开始研发Windows系统,第一个版本的Windows 1.0[1]于1985年问世,1987年,微软推出了Windows 2.0,此后,直到1990年5月22日,微软迎来了第一个具有时代意义的作品——Windows 3.0。
而在此之前,微软早已开始研究基于NT内核的Windows NT系统了[2],并在1988年11月开始了对于“WinNT”(即第一代的Windows NT 3.1)的产品研发。
Windows NT是基于OS/2 NT的基础编制的,体系结构是一种分层设计,由两个主要组件组成,用户模式和内核模式。
可以看到,上图用户模式(User mode)和内核模式(Kernel Mode)有明显的分隔,上方用户模式的进程都运行在受保护的进程地址空间,通过ntdll.dll将Win32函数的调用转换为非文档化的系统内部函数调用,经过SSDT(系统服务描述表)后从ring3层进入ring0层执行[3]。
用户模式下,对对象的访问都要经过系统的安全审核,内核模式的权限则提高了很多[4]。
Microsoft Windows 2000是沿袭微软公司Windows NT系列的32位视窗操作系统,是Windows操作系统发展的一个新里程碑,Windows 2000起初称为Windows NT 5.0。
Windows 2000引入了NTFS 3.0、加密文件系统、动态逻辑磁盘管理等机制,但就安全性而言,还是太弱,正因如此,其成为许多高危电脑病毒的攻击目标,像是知名的红色代码(Code Red)和Nimda病毒等。
2001年发布的Windows XP,在Windows 2000的基础上进行了更多的安全性改进。如果以受限账户登陆,那么在ACL的限制下,病毒程序将不能修改系统的关键数据。然而,受限账户限制太多,比如无法安装应用程序,无法修改系统设置等,因此,XP用户在大多数情况下,其实都是以管理员账户的身份来进行日常操作的。
2003 年 8 月,冲击波(Worm.Blaster)病毒[5]利用 RPC 服务漏洞全球爆发,感染该病毒后,将出现系统无故重启、无法正常上网等现象。2004 年 5 月,震荡波(Worm.Sasser)病毒利用 LSASS 服务漏洞全球爆发,感染该病毒后将出现系统反复重启、电脑运行缓慢等现象[6]。
那个时候,Windows XP 逐渐普及起来。然而,由于 Windows XP 经常出现安全漏洞以及易受恶意软件、电脑病毒、缓存溢出等问题的影响,接连出现全球安全风暴,微软陷入严重信任危机。
这件事带来两个影响,首先是微软检讨后开始提出“可信计算”的概念,而关于这项技术的讨论,到现在也没有停止。
这项技术的拥护者,称它将会使计算机更加安全、更加不易被病毒和恶意软件侵害,因此从最终用户角度来看也更加可靠。
而反对者则认为,可信计算背后的那些公司并不那么值得信任,这项技术给系统和软件设计者过多的权利和控制。他们还认为可信计算会潜在地迫使用户的在线交互过程失去匿名性,并强制推行一些不必要的技术。
第二个影响在于,Windows XP SP2 最终于 2004 年 8 月推出,包含了加强版的 Windows 防火墙、Internet Explorer 6(新增弹窗拦截),且新增了数据执行保护(DEP)、Windows 安全中心等功能,支持蓝牙技术和改良对 Wi-Fi 的支持。
此时,Windows的安全机制主要靠定期向病毒木马样本库中添加signature来查杀,辅之hook关键的系统函数,以方便在用户down文件或者打开exe时查杀木马。
但是,由于系统本身缺乏在管理员模式下对应用程序的行为限制,导致木马、病毒仍然层出不穷,盗号和损害系统的行为依然到处可见。
例如,许多RAT可以很直接地通过调用NtUserGetAsyncKeyState或者NtUserGetRawInputData来获取用户输入,亦或者通过调用NtUserSetWindowsHookEx来注册消息回调函数,作为应对手段,许多软件都必须加载键盘过滤驱动来避免木马窃取账号信息。[7]
前文说到,Windows XP SP2引入了数据执行保护(DEP)机制,可以防止应用运行用于暂存指令的那部分内存中的数据,从而保护电脑。
而在此之前,分给某一进程的全部内存空间都是可读写并且可执行的,但DEP允许系统将一页或多页内存标记为不可执行文件。 将内存区域标记为不可执行意味着不能从该内存区域运行代码,这会使对缓冲区溢出的利用变得更困难。当然,攻击者们也有新的入侵手段,例如通过调用系统内部的函数,将注入的恶意代码标记为可执行的,这样便可绕过 XP SP2引入的数据执行保护(DEP)机制了。
Windows XP之后的下一代操作系统是Windows Vista,这是用户权限变化最为明显的一次。
较之 XP,Vista增加了用户管理机制(UAC)以及内置的恶意软件查杀工具(Windows Defender),以便实现——即便用户以管理员账户的身份登陆操作系统,系统也能在有效程度上防止病毒程序获得高权限并以此来对系统造成严重破坏——高权限必然带来高破坏。直到现在,提权也是入侵之后必不可少的手段。
此外,微软还在Vista系统中引入了名为ASLR(Address Space Layout Randomization,地址空间布局随机化)的技术,随机化地打乱地址空间,来防止黑客的入侵。
当然,ASLR也并非无懈可击,在出现了某些漏洞,比如内存信息泄露的情况下,攻击者会得到部分内存信息,比如某些代码指针。传统的ASLR只随机化整个segment,比如栈,堆,或者代码区。这时候攻击者可以通过泄露的地址信息来推导别的信息,比如另外一个函数的地址,等等。这样整个segment的地址都可以推导出来,进而得到更多信息,大大增加了攻击利用的成功率[8]。
本问题下面,有位匿名用户提到了Flash应用,还有过时的Java等,都可以绕过ASLR的限制,进而突破数据执行保护。
而且,在32位系统中,由于随机的熵值不高,攻击者也容易通过穷举猜出地址
接着,为了兼容性考虑,对一部分文件的加载位置并未做随机化,而这也为ASLR的被攻克留下了机会[9]。
此外,2005年,在Windows XP与Windows Server 2003 Service Pack 1的64位版本中,首次推出内核补丁保护(Kernel Patch Protection)机制,防止对内核的修补[10]。
话接上文,Windows XP默认提供给用户管理员账号,但从Vista开始,默认情况下标准用户和管理员都会在标准用户安全上下文中访问资源和运行程序。用户登录系统之后,不仅会分配到一个session,还会创建一个访问令牌(token),这个令牌中包含授权给该用户的访问权限信息,比如对应的Windows权限和安全标识符(SID)等。
如果登陆账户是Administrators组的成员,系统会为之创建两个单独的令牌:标准用户访问令牌和管理员访问令牌。标准用户访问令牌包含的用户特定信息与管理员访问令牌包含的信息相同,但是已经删除管理 Windows 权限和 SID,标准用户访问令牌用于启动不执行管理任务的应用程序。
默认情况下,将用户的权限控制在标准用户访问令牌之内,当需要写入文件,或者运行特定程序时,便需要管理员权限,这时只有申请到管理员令牌,才能进行相应的高权限操作如运行or写入文件。
Windows Vista企图赋予用户两方面的好处,一方面是允许管理员在标准用户的上下文环境下执行大部分的进程,仅通过用户准许来提升他们的用户令牌的特权,另外,允许标准用户通过选择提升一个进程,使用管理员级别的身份来执行管理员的任务。
此外,除了ASLR和UAC,ACL、MIC和UIPI等机制也对用户和进程权限进行限制。例如,即使遵守ACL机制,进程的行为也需要进行检查,主要查看进程和资源对象的完整性级别,完整性级别低的进程,不能写入到完整性级别比之高的资源对象中去。
但是,过多且繁琐的管理员权限申请,使得大多数用户十分不耐烦,也正因如此,很多杂志把禁用UAC视作是对于Vista的一大优化,正如现如今,禁用WIN10的自动更新被指为是对于WIN10系统的优化,但我建议你不要那么做,详见下面的回答:
接着,Windows 8中引入了AppContainer的机制,主推运行在AppContainer中的Metro应用,这一项机制直到WIN 10还在使用,例如下图就是我在自己的WIN 10虚拟机上用Process monitor[11]查看得到的信息,你可以看到integrity一栏明显的AppContainer。
从 Windows 8 引入 Metro(Morden) App 开始,Windows 出现了一个新的进程隔离机制,即 AppContainer。Windows Store 应用运行在AppContainer 的容器当中权限被极大的限制,很多危险的操作无法进行,微软通过 Windows Store 进行应用分发,能够控制来源,这样能够极大的降低恶意软件的困扰,而 AppContainer 同样能够支持传统的 Desktop 应用[12]。
隔离是 AppContainer 执行环境的主要目标。通过将应用程序与不需要的资源和其他应用程序隔离,可以最大限度地减少恶意操作的机会。基于最低权限授予访问权限可防止应用程序和用户访问超出其权限的资源。控制对资源的访问可以保护进程、设备和网络。
Windows 中的大多数漏洞都始于应用程序。一些常见示例包括应用程序脱离其浏览器或向 Internet Explorer 发送错误文档以及利用插件(如 Flash)。这些应用程序在 AppContainer 中隔离的越多,设备和资源就越安全。即使应用程序中的漏洞被利用,该应用程序也无法访问超出授予 AppContainer 的资源。恶意应用程序无法接管机器的其余部分。
Windows 8中,大量加入了ASLR机制,强制所有DLL进行ASLR方式的内存载入方式,硬件ASLR和HEASLR等......
Windows 10中,加入了以下内置的安全特性:
总结一下:Windows XP以后,也就是自Windows Vista起,乃至之后的Windows 7、Windows 8 、Windows 10,登陆账户是管理员,不代表用户默认使用管理员权限来执行所有操作,在普通用户权限下执行的操作不在少数,仍有很多运行和修改操作需要申请“管理员权限”,例如写入只读文件,运行某些特定[13]进程。