吐槽一下 Windows 的安全漏洞——严重性超乎想象

2017-04-10 原文 #编程随想 的其它文章

吐槽一下 Windows 的安全漏洞——严重性超乎想象

先插播一个“广而告之”。
上一篇博文 的评论数突破【一千】大关。感谢热心读者的捧场 :)
参与讨论的读者增多了之后,俺再次提醒大伙儿:网上的沟通要注意素质,理性讨论,避免过于情绪化。另外,要避免逻辑谬误的陷阱(参见《 扫盲逻辑谬误 》)。
评论数猛增也暴露出之前未发现的一个“评论区的 Bug”。经过几位热心读者的大力支持(帮俺测试),该 bug 已经在前天修复。在此,向这几位热心读者郑重地表示感谢!


★引子


前一篇博文《 为什么桌面系统装 Linux 可以做到更好的安全性(相比 Windows & macOS 而言) 》发出后,不出所料,引发了一些争议。
有些读者提的批评意见,指出了俺博文某些地方不严密,俺表示感谢,并且也在博文中加了补充说明(以免引起误解)。
但也有些读者的留言,给人感觉是替微软“洗地”的。
比如 131楼37单元 的评论说(下面是原话):
linux平均的漏洞寿命是5年(Kees Cook),COW漏洞更是存在了9年才被修复。很难想象windows会拖这么久。

当俺看到该评论的【最后一句】,不禁哑然失笑——Windows 的安全漏洞之多,在安全业界是有目共睹滴;Windows 安全漏洞潜伏时间之长,在业界也是有目共睹滴。
俺写上一篇博文的时候,主要是介绍 Linux(桌面系统)相对于 Windows 和 macOS 的安全优势。当时想给微软留点面子,所以没怎么狠批 Windows 的安全问题。如今有人跳出来洗地,俺就借这个机会,抖一下 Windows 的阴暗面。


★事先声明


为了严密性,避免有人抬杠,俺先说明一下:本文讨论的是用于【桌面】的 Windows 系统。
服务端的 Windows、手机端的 Windows、嵌入设备的 Windows,均【不在】本文讨论范围。


★预备知识


◇何为“漏洞”?


关于这个概念的解释,请参见《 如何防止黑客入侵 》系列的第4篇(链接在” 这里 “)。

◇何为“安全漏洞”?


(同上)

◇何为“补丁”?


(同上)

◇啥是“漏洞的潜伏期”?


从漏洞开始引入软件的这个时间点,一直到漏洞被曝光(被公开)的时间点,中间这个时期是“潜伏期”。漏洞一旦被曝光(被公开),软件厂商(开发软件的公司/组织)通常会发布补丁,用于修复此漏洞。
在潜伏期,由于漏洞尚未被公开,因此也就【没有】补丁;但是,有可能某些黑客/骇客已经发现了该漏洞,于是这帮人就可以在【没有补丁的情况下】,充分利用该漏洞。
可以这么说:可供利用的“未公开漏洞”(处于潜伏期的漏洞)是攻击者的天堂。

◇【不要】混淆“未公开漏洞”和“零日漏洞”


“零日漏洞”,洋文也叫:“Zero-Day 或 0-Day”。
“未公开漏洞”和“零日漏洞”,概念上是完全不同滴,危险性也是完全不同滴——“未公开漏洞”更危险。
关于这两者的区别,请看《 如何防止黑客入侵 》系列的第4篇(链接在“ 这里 ”)。

◇啥是“CVE”?


CVE 是洋文“Common Vulnerabilities and Exposures”的缩写。
通俗地说:这是全球最大、最权威、最有影响力的漏洞库。由美国的非营利组织 MITRE 负责维护和运营。几乎每一个曝光的操作系统漏洞(不论是 Windows 家族还是 Linux 家族、mac 家族、BSD 家族),通常都有对应的 CVE 编号。
在 CVE 漏洞库中,每一个漏洞都分配一个唯一的编号,形式如:CVE-YYYY-NNNN。其中的 YYYY 是四位数的年份,NNNN 是四位数的递增编号。


★Windows 安全漏洞举例——对最近2个自然年的统计


为了体现本文的说服力,俺以【事实说话】。
下面列出的漏洞,【全部来自微软官网】。也就是说,这些安全漏洞全部都是微软自己承认滴。这些漏洞波及(影响)的范围,也都是微软官方承认滴。
考虑到俺只是一介屁民,时间和精力很有限,俺不可能把微软官网历史上所有的安全漏洞都汇总一遍。所以俺挑选了最近的2个【完整自然年】,作为举例——分别是 2016 和 2015。

◇2016年


微软在该年度发布了【153个】安全公告 (全部清单在“ 这个链接 ”)。
请原谅俺的耐心和精力有限,只列出【前20个】(算是抽样)。
注:
下面列出的安全公告是该年度的前20条,都是在年初曝光的。那年的最新版本是 Win 10。(“Windows Server 2016”要到2016年【下半年】才发布)
在2016年上半年,仍然提供支持的最老版本是 Windows Vista。
因此,下列的漏洞,如果影响范围是【从 Vista 到 Win10】,那么这个漏洞就是【全系列漏洞】——影响了(漏洞曝光时)所有的 Windows 版本。

微软安全公告 漏洞数 漏洞的 CVE 号 漏洞类型 漏洞所在模块 潜伏期 影响范围 描述
MS16-001 2 CVE-2016-0002
CVE-2016-0005
远程执行代码 IE 浏览器 10年 从 IE7 到 IE11
(对应系统版本)从 Vista 到 Win8.1
攻击者构造特定网页,当受害者用上述版本的 IE 访问,就中招
MS16-002 2 CVE-2016-0003
CVE-2016-0024
远程执行代码 Edge 浏览器 1年 Edge
(对应系统版本)Win10
攻击者构造特定网页,当受害者用上述版本的 Edge 访问,就中招
MS16-003 1 CVE-2016-0002 远程执行代码 VBS 脚本引擎 10年 从 VBS 5.7 到 5.8
(对应系统版本)从 Vista 到 Windows Server 2008 R2
攻击者构造特定网页(嵌入特定的 VBS 脚本),如果受害者使用的 IE 含有上述版本的 VBS 引擎,就中招
MS16-004 4 CVE-2016-0010
CVE-2016-0012
CVE-2016-0017
CVE-2016-0035
远程执行代码 Office 9年 从 Office 2007 到 2016 攻击者构造特定文档(Excel、PowerPoint),当受害者用上述版本的 Office 打开,就中招
MS16-005 2 CVE-2016-0008
CVE-2016-0009
远程执行代码 内核的 GDI32 模块
内核的 Win32k.sys 模块
10年 从 Vista 到 Win8.1 攻击者构造特定网页,不论受害者用哪种浏览器访问,都会中招
MS16-006 1 CVE-2016-0034 远程执行代码 Silverlight 5年 Silverlight 5 攻击者构造特定网页,当受害者的浏览器安装了上述版本的 Silverlight,就中招
MS16-007 6 CVE-2016-0014
CVE-2016-0015
CVE-2016-0016
CVE-2016-0018
CVE-2016-0019
CVE-2016-0020
远程执行代码
本地提升权限
安全特性绕过
内核的动态库加载
DirectShow
RDP(远程桌面)
10年 从 Vista 到 Win10
【全系列漏洞】
攻击者可以构造特定文件,当受害者打开该文件会引发 DirectShow 的堆溢出(缓冲区溢出)并执行恶意代码。
攻击者可以构造特定的动态库,当受害者的系统加载该动态库会中招,攻击代码可以提升到管理员权限。
攻击者可以利用 RDP 的漏洞在没有密码的情况下登录
MS16-008 2 CVE-2016-0006
CVE-2016-0007
本地提升权限 内核 10年 从 Vista 到 Win8.1 如果攻击者有机会在受害者的系统中执行代码,就可以利用该漏洞提升到“管理员权限”
MS16-009 13 CVE-2016-0041
CVE-2016-0059
CVE-2016-0060
CVE-2016-0061
CVE-2016-0062
CVE-2016-0063
CVE-2016-0064
CVE-2016-0067
CVE-2016-0068
CVE-2016-0069
CVE-2016-0071
CVE-2016-0072
CVE-2016-0077
远程执行代码
本地提升权限
IE 浏览器 10年 从 IE9 到 IE11
(对应系统版本)从 Vista 到 Win10
【全系列漏洞】
攻击者构造特定网页,当受害者用上述版本的 IE 访问,就中招。
这次公告包含大量 IE 浏览器的缓冲区溢出漏洞。
MS16-010 - - - Exchange Server - - (这个是关于服务端软件的漏洞,与本文无关)
MS16-011 4 CVE-2016-0060
CVE-2016-0061
CVE-2016-0062
CVE-2016-0080
远程执行代码 Edge 浏览器 1年 Edge
(对应系统版本)Win10
攻击者构造特定网页,当受害者用上述版本的 Edge 访问,就中招
MS16-012 2 CVE-2016-0046
CVE-2016-0058
远程执行代码 PDF Library
Windows Reader
3年 从 Win8.1 到 Win10 攻击者构造特定文档,当受害者用上述版本的 Reader 打开,就中招
MS16-013 1 CVE-2016-0038 远程执行代码 Windows Journal 10年 从 Vista 到 Win10
【全系列漏洞】
攻击者构造特定的 Journal 文档,当受害者打开,就中招
MS16-014 4 CVE-2016-0040
CVE-2016-0041
CVE-2016-0042
CVE-2016-0049
远程执行代码
本地提升权限
内核 10年 从 Vista 到 Win10
【全系列漏洞】
如果攻击者有机会在受害者的系统中执行代码,就可以利用该漏洞提升到“管理员权限”
MS16-015 6 CVE-2016-0022
CVE-2016-0039
CVE-2016-0052
CVE-2016-0053
CVE-2016-0055
CVE-2016-0056
远程执行代码 Office 9年 从 Office 2007 到 2016 攻击者构造特定文档(Word、Excel),当受害者用上述版本的 Office 打开,就中招
MS16-016 1 CVE-2016-0051 本地提升权限 WebDAV 10年 从 Vista 到 Win10
【全系列漏洞】
如果攻击者有机会在受害者的系统中执行代码,就可以利用该漏洞提升到“管理员权限”
MS16-017 1 CVE-2016-0036 本地提升权限 RDP(远程桌面) 7年 从 Win7 到 Win10 如果受害者的系统开启了远程桌面服务,攻击者通过远程桌面登录到该系统之后,可以利用此漏洞提升到“管理员权限”
MS16-018 1 CVE-2016-0048 本地提升权限 内核 Win32k.sys 模块 10年 从 Vista 到 Win8.1 如果攻击者有机会在受害者的系统中执行代码,就可以利用该漏洞提升到“管理员权限”
MS16-019 2 CVE-2016-0033
CVE-2016-0047
拒绝服务 dotNet Framework 10年 从 dotNet Framework 2.0 到 4.6
(对应系统版本)从 Vista 到 Win10
【全系列漏洞】
攻击者构造特定的 XSLT 文档,当受害者打开会导致系统崩溃。
(.Net Framework 2.0 发布于2006年,漏洞的潜伏期从那年起算)
MS16-020 - - - Active Directory - - (这个是关于服务端软件的漏洞,与本文无关)

◇2015


微软在该年度发布了【135个】安全公告 (全部清单在“ 这个链接 ”)。
请原谅俺的耐心和精力有限,只整理出【前20个】(算是抽样)。
注:
下面列出的安全公告是该年度的前20条,都是在年初曝光的。此时的最新版本是 Win 8.1。(“Windows 10 和 Windows Server 2016”要到2015年【下半年】才发布)
在2015年上半年,仍然提供支持的最老版本是 Windows 2003。
因此,下列的漏洞,如果影响范围是【从 Win2003 到 Win8.1】,那么这个漏洞就是【全系列漏洞】——影响了(漏洞曝光时)所有的 Windows 版本。

微软安全公告 漏洞数 漏洞的 CVE 号 漏洞类型 漏洞所在的模块 潜伏期 影响范围 描述
MS15-001 1 CVE-2015-0002 本地提升权限 内核的 ahcache.sys 模块 6年 从 Win7 到 Win8.1 如果攻击者有机会在受害者的系统中执行代码,就可以利用该漏洞提升到“管理员权限”
MS15-002 1 CVE-2015-0014 远程执行代码 Telnet 服务 12年 从 Win2003 到 Win8.1
【全系列漏洞】
如果受害者的系统启用了 telnet 服务,攻击者远程连上 telnet 的 TCP 端口后,可以利用该漏洞执行恶意代码。
MS15-003 1 CVE-2015-0004 本地提升权限 User Profile 服务 12年 从 Win2003 到 Win8.1
【全系列漏洞】
如果攻击者有机会在受害者的系统中执行代码,就可以利用该漏洞提升到“管理员权限”
MS15-004 1 CVE-2015-0016 本地提升权限 WebProxy 模块 9年 从 Vista 到 Win8.1 如果攻击者有机会在受害者的系统中执行代码,就可以利用该漏洞提升到“管理员权限”
MS15-005 1 CVE-2015-0006 安全特性绕过 NLA 服务 12年 从 Win2003 到 Win8.1
【全系列漏洞】
当攻击者与受害者处于同一个网络(domain),攻击者可以利用此漏洞进行 DNS/LDAP 欺骗。
MS15-006 1 CVE-2015-0001 安全特性绕过 WER(错误报告) 3年 从 Win8 到 Win8.1 攻击者需要先登录到系统中,然后利用此漏洞可以读取任何进程的内存。
MS15-007 - - - Network Policy Server - - (这个是关于服务端软件的漏洞,与本文无关)
MS15-008 1 CVE-2015-0011 本地提升权限 内核 mrxdav.sys 模块 12年 从 Win2003 到 Win8.1
【全系列漏洞】
如果攻击者有机会在受害者的系统中执行代码,就可以利用该漏洞提升到“管理员权限”
MS15-009 41 涉及的漏洞太多
不逐一列出 CVE
远程执行代码
拒绝服务
IE 浏览器 14年 从 IE6 到 IE11
【IE 全系列漏洞】
(对应系统版本)从 Win2000 到 Win8.1
攻击者构造特定网页,当受害者用上述版本的 IE 访问,就中招
MS15-010 6 CVE-2015-0003
CVE-2015-0010
CVE-2015-0057
CVE-2015-0058
CVE-2015-0059
CVE-2015-0060
本地提升权限
远程执行代码
内核 Win32k.sys 模块 12年 从 Win2003 到 Win8.1
【全系列漏洞】
攻击者构造特定网页,内含特定的 TrueType 字体。不论受害者用哪种浏览器访问,都会中招
MS15-011 1 CVE-2015-0008 远程执行代码 Group Policy 12年 从 Win2003 到 Win8.1
【全系列漏洞】
如果攻击者掌握了某个“主域控制器”,可以通过构造特定的“域策略”并下发,所有加入该域的主机都会中招。
MS15-012 3 CVE-2015-0063
CVE-2015-0064
CVE-2015-0065
远程执行代码 Office 8年 从 Office 2007 到 2013 攻击者构造特定文档(Word、Excel),当受害者用上述版本的 Office 打开,就中招
MS15-013 1 CVE-2014-6362 安全特性绕过 Office 8年 从 Office 2007 到 2013 该漏洞可以让攻击者绕过 ASLR(地址空间布局随机化),有助于后续进行“远程执行代码”的攻击
MS15-014 1 CVE-2015-0009 安全特性绕过 Group Policy 12年 从 Win2003 到 Win8.1
【全系列漏洞】
攻击者可以利用此漏洞进行“中间人攻击”,篡改“主域控制器”下发的组策略,使得“域成员主机”收到的组策略变得缺乏安全性。
MS15-015 1 CVE-2015-0062 本地提升权限 内核 8年 从 Win7 到 Win8.1 如果攻击者有机会在受害者的系统中执行代码,就可以利用该漏洞提升到“管理员权限”
MS15-016 1 CVE-2015-0061 信息泄漏 图形组件 12年 从 Win2003 到 Win8.1
【全系列漏洞】
攻击者构造特定的网页或文档(其中嵌入特定的 TIFF 图片),当受害者打开该网页或文档,就中招(攻击者可以获取某些进程的内存)
MS15-017 - - - VMM Server(虚拟机管理服务器) - - (这个是关于服务端软件的漏洞,与本文无关)
MS15-018 9 CVE-2015-0056
CVE-2015-0099
CVE-2015-0100
CVE-2015-01622
CVE-2015-01623
CVE-2015-01624
CVE-2015-01625
CVE-2015-01626
CVE-2015-01634
远程执行代码 IE 浏览器 14年
从 IE6 到 IE11
【IE 全系列漏洞】
(对应系统版本)从 Win2000 到 Win8.1
攻击者构造特定网页,当受害者用上述版本的 IE 访问,就中招
MS15-019 1 CVE-2015-0032 远程执行代码 VBS 脚本引擎 12年 从 VBS 5.6 到 5.8
(对应系统版本)从 Win2003 到 Windows Server 2008 R2
攻击者构造特定网页(嵌入特定的 VBS 脚本),如果受害者使用的 IE 含有上述版本的 VBS 引擎,就中招
MS15-020 2 CVE-2015-0081
CVE-2015-0096
远程执行代码 WTS(文本服务)
内核的动态库加载
12年 从 Win2003 到 Win8.1
【全系列漏洞】
攻击者构造特定的网页或文档,当受害者打开该网页或文档,就中招
攻击者可以构造特定的远程共享目录或者USB盘,当受害者用“资源管理器”访问该共享目录或U盘,就中招


★关于 Windows 安全漏洞的“潜伏期”——实际情况比统计表中看到的更长


在微软官方的安全公告中,明确指出:生命周期已经结束(已经终止支持)的 Windows 版本,是【不会】出现在安全公告中的。
考虑到这点,所以俺上面列出的“潜伏期”总是【偏小】滴。
为啥捏?俺来解释一下:
假设有一个 WinXP 的安全漏洞,一直遗留在 Windows 内核中,一直到 2016年 才被发现。此时,微软的安全公告列出的受影响系统,只会包含:从 Windows Vista 一直到 Win10。而不会有 WinXP 和 Win2003。因为在 2016年,这两个系统已经终止支持。
对该漏洞,俺如果根据微软的安全公告计算潜伏期,(由于微软公布的信息不足)俺只能从 Vista 开始算起。得出的计算结果是 10年 (Vista 是2006年发布);但实际上,这个漏洞的潜伏期是 15年 (应该从 2001年 发布 WinXP 开始算起)。
但即使这样(由于信息不足而导致计算出的“潜伏期”偏小),你也会发现:Windows 的安全漏洞,潜伏期都很长。

为了方便跟漏洞列表中的“潜伏期”作对照,俺列出各个 Windows 版本的生命周期。
操作系统版本 发布时间 终止支持时间
Windows 2000 2000年2月 2010年7月
Windows XP 2001年10月 2014年4月
Windows Server 2003 2003年4月 2015年7月
Windows Vista 2006年11月 2017年4月
Windows Server 2008 2008年2月 2020年1月
Windows 7 2009年7月 2020年1月
Windows Server 2008 R2 2009年7月 2020年1月
Windows 8 2012年10月 2023年1月
Windows Server 2012 2012年10月 2023年10月
Windows 8.1 2013年10月 2023年1月
Windows Server 2012 R2 2013年10月 2023年10月
Windows 10 2015年7月 2026年10月
Windows Server 2016 2016年9月 2027年1月


★为啥 IE 浏览器的漏洞特别危险?


浏览器相关的漏洞,特别危险——因为攻击者可以构造一个“挂马的网页”,当你访问这个页面就会中招。
这种情况下,很多安全工具是【无法】帮助防范的,原因如下:
1. 因为你的浏览器总是要上网的,所以你的防火墙,不论设置了多么严格的规则,也【无法】防范这类“基于 Web 的攻击”。
2. 如果攻击者利用的是【未公开】漏洞,你安装的杀毒软件很可能【无法】防范。因为杀毒软件是基于【事后收集】来形成杀毒软件的特征库。针对未公开漏洞的攻击代码,尚未进入它们的特征库。
3. 很多杀毒软件吹嘘他们具有“基于行为识别的防范机制”。这大部分都是用来进行市场营销宣传的噱头,其效果令人怀疑。


★(在 Windows 上)改用其它浏览器上网,并【不能】消除 IE 的危险性


很多读者看了上面一段,吓坏了。他们肯定在想,要换一个浏览器,别再用 IE 了。
但是俺想提醒你一下: (在 Windows 上)IE 是无处不在滴,即使你改用其它浏览器(比如 Chrome/Firefox),依然存在 IE 的风险。
下面俺来解释一下——为啥【IE 是无处不在滴】。
从上世纪90年代的 Win98 一直到 Win10(2015年发布),IE 都是内置(捆绑)到 Windows 中的。你【没办法】从 Windows 中【彻底移除】IE。没法移除也就算了,但是有很多软件会依赖 IE 的组件来处理 Web 内容。这种情况下,能针对 IE 的攻击代码,通常也可以攻击这些“调用了 IE 的软件”。

举个“邮件客户端依赖 IE”的例子:
当你用 Outlook 或 Outlook Express 收邮件,如果你收到的邮件内容是基于 HTML 的(这很常见),那么 Outlook/Outlook Express 会调用 IE 相应的组件来渲染这些含有 HTML 内容的邮件。不光是 Outlook 或 Outlook Express,其它一些【第三方】的邮件客户端软件,也会依赖 IE 的组件来渲染 HTML 内容的邮件。这种做法很普遍,因为 IE 是 Windows 的标配,对那些开发邮件客户端的程序员来说,这么干是最省事儿的(俺也做过 Windows 程序猿,很清楚这种玩法)。
在这种情况下,如果 IE 存在未公开漏洞,攻击者就可以通过给你发(HTML 格式的)邮件,来利用这个漏洞,从而让你中招。

再举个“Office 依赖 IE”的例子:
用 Windows 的同学,俺相信 95% 以上都装了 Office。不管你平时是否需要文字处理,反正 Office 基本上是 Windows 的标配。
假设 IE 的 Web 引擎存在某个【未公开的】缓冲区溢出漏洞,可以导致“执行代码”。那么攻击者可以在网上提供一个 Word 格式(doc/docx)的文档(或者通过邮件/IM 等方式分发这个文档),文档中包含基于 HTML 的 Web 内容。这段 HTML 是精心构造的,可以利用 IE 的上述漏洞。那么,当你拿到这个文档并双击打开,此时 Windows 会启动 Word 来加载该文档,Word 发现文档中有 Web 内容,会调用 IE 的引擎来渲染,于是你就中招了。由于这个漏洞可以导致“执行代码”,那么攻击者可以在你的系统中安装一个木马。之后就可以玩很多花样啦 :(


★更要命的是——IE 浏览器的安全漏洞还特别多


某个专门研究 IE 的御用骇客说过一句话(大意是):IE 的漏洞之多,就像筛子一样。
看完俺下面的统计数字,你就能体会——此话一点不夸张。

在俺整理的这40个公告中,累计漏洞数 129 个,“浏览器相关”的漏洞占了很大比例:
65个是 IE 浏览器本身的漏洞
6个是 Edge 浏览器本身的漏洞
6个是 其它模块的漏洞(但可以通过 IE 或 Edge 触发)

也就是说,在俺抽样的40个安全公告中,浏览器相关的漏洞(77个),占了漏洞总数的比例是 59.6%。而这些浏览器相关的漏洞,类型是【远程执行代码】又占了很大比例。这种类型的漏洞是最危险的(没有之一)。

可能有些同学会怀疑:俺抽样的这40个安全公告,在统计学上有偏差。
那俺还可以再告诉你另一批数据(更吓人)——几乎每一个月,都会有 IE 相关的安全公告,而且 IE 的公告披露的漏洞往往很多(通常在十个左右)。下面拿 2016年 来举例:

安全公告编号 发布时间 IE 漏洞数
MS16-009 2月 13个
MS16-023 3月 13个
MS16-037 4月 6个
MS16-051 5月 5个
MS16-063 6月 10个
MS16-084 7月 14个
MS16-095 8月 9个
MS16-104 9月 10个
MS16-118 10月 11个
MS16-142 11月 6个
MS16-144 12月 8个

看完上述表格,你是否联想到——像筛子一样多的漏洞?而且这还只是 IE 相关的漏洞,Edge 还【没有】算在内哦。
在安全圈混了这么多年(20年大概有了),俺的印象是:IE 总是不停地不停地曝光高危漏洞(远程执行代码)。


★八卦一下:为啥 IE 这么烂?


(本章节是八卦,不想看八卦的请自行略过)
凭良心说,微软是一家不错的公司;微软的程序员,平均素质也不算差。那为啥 IE 这么烂捏?
考虑到篇幅已经很长,下面俺简单聊一下:

◇1. Web 引擎本来就很难写


Web 浏览器需要依靠 Web 引擎来渲染网页。网页是用 HTML 编写的。HTML 的语法很灵活,本来就很难处理;而很多网站的写手(Web 程序员)写出来的网页甚至都没有严格遵循 HTML 语法。浏览器的引擎需要尽量智能地处理这些不规范的 HTML 语法。
HTML 还允许嵌入样式表(CSS)和脚本(JavaScript)。而 JS 脚本的语法又是出了名的灵活。因此,写一个浏览器的 JS 引擎也是蛮有难度滴(Google 的 V8 引擎能获得如此高的赞誉,就是因为 JS 引擎难写)

◇2. IE 的开发团队曾经出现长期断档


如果你观察 IE 版本的历史,会发现 IE6 之后停滞了长达 5年 才发布了 IE7。
据说 IE6 发布之后,微软把整个 IE 团队都解散了,只留少数几个人负责改 bug。因为当时的微软领导层觉得 IE6 作为浏览器已经很完善了,而且浏览器这个产品本身没有利润,不值得投入太多人。
(这是微软领导层的严重失策)
这个决策造成了整个团队严重的断档。等到后来重启 IE7 的开发,新加入的程序员,很多都没有经手过前面的开发,完全不知道原有的代码中留下哪些“坑”(技术陷阱)。
(如果你曾经管理过程序员团队,对上述这种情况应该深有体会)
有些天真的同学会问:老团队虽然解散了,应该还会有文档留下来啊。新团队可以通过文档了解情况嘛。
这么问的同学,多半属于“图样图森破”。当软件项目复杂到一定程度,你就不要指望文档是完备的。在这种软件项目里,有相当比例的文档,要么不全,要么不够新(与代码脱节),要么是错的。这不是一两家公司的个案,这是整个软件行业的通病。

◇3. 过于陈旧的架构


目前 IE 使用的 Trident 引擎是在 1997年 引入 IE4 的(20年之前哦)。1997年是什么年代,年青的程序员可能没体会。俺正好借这个机会倚老卖老一下。
(据说 IE 是用 C++ 写的,俺就拿 C++ 来举例)那时候,C++ 尚未标准化(第一次标准化是 C++98)。以现在的眼光看,那年头简直就是 C++ 的洪荒年代。
虽然俺没有看过 IE 的源代码,但是可以合理地猜测:在那么久远的年代,设计一个全新的软件(浏览器在当时算是新事物),而且这个软件的需求又超复杂(参见前面提及的“Web 引擎复杂度”),设计出来的架构,其水平会好到哪里去?

◇4. (对旧架构)只敢修修补补,不敢大改


在长达二十年的时间里,硬件环境有了巨大变化(多核多CPU),Web 标准也有了巨大的变化(更灵活更复杂了)。为了适应环境的变化,IE 的 Trident 引擎早就应该动一些“大手术”,对架构作一些大的调整。但是前面说过,IE6 之后,开发团队出现长达5年的断档(团队被解散)。IE7 之后的那帮 IE 团队的程序员,全都是新人(此处的“新人”是指:对老代码不熟)。所以俺猜测:他们只敢在旧的架构上修修补补,不敢动“大手术”。(如果你在大公司待过,一定明白:多做多出错,少做少出错,不做不出错)


★IE 这么烂,那你能指望 Edge 吗?


前面费了这么多口水聊 IE,下面用三句话概括一下:
从 Win98 到 Win10(甚至下一代的 WinXX),IE 都是无处不在滴(很多软件会调用 IE 组件);
从 Win98 到 Win10(甚至下一代的 WinXX),IE 都是【无法】彻底移除滴;
IE 的代码很烂,相关的漏洞非常多。

前几年,微软高调推出全新的浏览器“Microsoft Edge”。为啥微软要另起炉灶?除了外部的因素(市场营销策略),内部因素恐怕就是俺刚才分析的原因——IE 已经老朽不堪,难以维护了。
估计有些同学在默默指望着:用 Edge 彻底替代老朽不堪的 IE。俺劝这些同学别抱太大期望。
前面已经提到:很多 Windows 上的应用软件(包括微软自己的软件以及第三方软件)重度依赖 IE 组件。出于兼容性的考虑,微软不可能在短期内彻底抛弃 IE。也就是说:在很长时间内,IE 会与 Edge 并存(Win10 就是一个例证)。


★最后,稍微聊一下:Windows 的【树大招风】


最后来提一下“树大招风”引发的风险。
在【桌面系统】的市场份额中,Windows 是毫无疑问的老大。所以,各种黑客与骇客,都会花很多精力来研究如何去入侵 Windows 系统。这就是所谓的——树大招风。
关于“树大招风”这点,应该没有太大争议。俺之所以单独写这个章节,是想【反驳】前一篇博文的某条读者留言。
该读者认为:御用骇客针对的是高价值目标,而高价值目标用 Linux 的比较多,所以御用骇客会花更多精力研究 Linux 的漏洞,这就导致——使用 Linux 反而容易碰到”被利用的未公开漏洞“。

下面是俺的【反驳】:
上述这个推理过程,第一个前提(“御用骇客”主要针对“高价值目标”),是正确滴。错误发生在第二个前提(高价值目标用 Linux 的比较多)。
这个读者混淆了两个不同的概念:“高价值目标”&“技术高手”(“高价值目标”不一定是“技术高手”,“技术高手”也不一定是“高价值目标”)
俺借此机会给大伙儿介绍一下,天朝御用骇客心目中的高价值目标,大概是哪些:
重要的外国政治人物
重要的民运人士、政治异议人士
外国政府机构(尤其是涉密机构)的雇员
国外敏感企业(尤其是军工企业)的雇员
从事“分离运动/独立运动”的少数民族组织
上述这些高价值目标,难道他们会去玩 Linux?NO,他们的桌面系统依然是以 Windows 为主,其次是 macOS。所以很自然的,朝廷的御用骇客,也是以 Windows 漏洞的研究为主,macOS 为辅。(当然也有御用骇客在研究 Linux 漏洞,但他们在 Linux 上的投入,远不如 Windows,也不如 macOS)


★结论


所以俺早在 N年前 就一直劝周围的同事和朋友,把日常使用的系统切换成别的(Linux、BSD、macOS 都要【远远好于】Windows)。
切换系统并没有你想象的那么困难。得益于虚拟化软件,你可以先在某个虚拟系统中使用 Linux 或 macOS,慢慢适应,然后慢慢过渡。接下来,俺会写一些关于 Linux 的扫盲教程,帮助技术菜鸟在虚拟机中玩转 Linux。


俺博客上,和本文相关的帖子(需翻墙)
如何防止黑客入侵 》(系列)
为什么桌面系统装 Linux 可以做到更好的安全性(相比 Windows & macOS 而言)
扫盲 Linux:新手如何搞定 Linux 操作系统?
扫盲 Linux:如何选择发行版?
在线查毒工具 VirusTotal 的 N 种玩法——从“误报/漏报”聊到“攻击者对它的利用”
版权声明
本博客所有的原创文章,作者皆保留版权。转载必须包含本声明,保持本文完整,并以超链接形式注明作者 编程随想 和本文原始地址:
https://program-think.blogspot.com/2017/04/Security-Vulnerabilities-in-Windows.html

文章版权归原作者所有。
二维码分享本站