引子
这篇文章的来由,是因为公众号粉丝的一条私信。这位粉丝想让笔者剖析安全漏洞更多的规律性认识,与社会的关系,与其他学科理论的联系。再赶上最近安全圈又出了太多的奇葩政策、安全事件和厂商白帽子纠纷...于是诞生了这么一篇文章。
既然是安全漏洞的终极秘密「进阶篇」,那么我们就不能再说“熵”这些老套的东西了,那笔者就描述一些进阶的内容…
本文“长达”三千多字,希望读者可以耐心下翻读完。笔者将从历史、操控、对抗和未来四个部分描述安全漏洞的一些进阶秘密,每一部分的信息足够扩展出一个体系,希望能给读者带来启发,也许笔者来了兴趣还会有「终极篇」。
历史
你也许知道比尔盖茨,但你永远不会注意到巨人背后的核心技术人员。
拉里.奥斯特曼(Larry Osterman),微软首席软件设计工程师,从1984年8月开始在微软工作,至今仍在写代码活跃,已经整整从业快38 年...
拉里.奥斯特曼(Larry Osterman)
这位令人尊敬的大师曾在博客中调侃了很多微软的内部秘密,比如防御性编程的坑。
笔者上周拿Confluence 0day为例,简单科普了防御性编程,安全人员普遍认为厂商不懂安全,开发人员不懂安全。而拉里.奥斯特曼(Larry Osterman)这样的传奇大师,在玩rootkit和挖安全漏洞时,今天的很多安全人员还没有出生,然而懂安全漏洞并不妨碍这位大师成为微软幕后真正的技术首席,一直到今天还在岗位上。
来看看大师在18年前对于编程容错的认知:
参考:
https://docs.microsoft.com/en-us/archive/blogs/larryosterman/erroneous-assumptions
有没有人注意到所有的 Win32 文档对于每个 API 都有这样的内容:
返回值
如果函数成功,则返回值为 NO_ERROR。
如果函数失败,则返回以下的错误码之一。
值 | 描述 |
ERROR_INVALID_PARAMETER | 关于ERROR_INVALID_PARAMETER 错误的一些信息 |
Other | WinError.h 中定义的系统错误代码 |
无法想像有多少人抱怨过对上述返回值的描述,微软究竟为什么不能在文档中直接枚举所有的错误码?他们是傻,还是怎么着了?
其实答案要简单一些。过去我们已经被这样的事情坑了,我们不愿意再次被坑。
我桌上的纪念品中有本MS-DOS 2.0参考手册,微软于1984年出版。在第1-143页,有个创建句柄的API,这是DOS版的open()函数。该API文档枚举了当时所有的错误码
AX可取值有:
3 = 找不到路径
4 = 打开的文件太多
5 = 拒绝访问
微软和IBM公布了所有DOS调用的所有返回值信息,我们跟客户说,INT 21的0x3D号调用只有三种返回值(3、4、5)。你知道吗,客户相信我们,他们基于这个说法开发应用程序。
好吧,随之而来的是DOS 3.1,它增加了对网络的支持,于是新增了一些失败原因,比如,"未找到网络路径"(文件在服务器上但服务器下线了),"共享冲突"(有人以排他方式打开了一个共享文件,导致他人打开失败)。
起初DOS 3.1通过AX返回新的错误码。微软以为绝大多数程序员足够聪明,知道将来会出现3、4、5之外的新的错误码。
我们开始测试DOS 3.1的兼容性,发现这个假设大错特错。已有的应用程序左崩崩、右崩崩,每个被测应用都崩了。为啥?因为微软和IBM告诉这些应用的开发者,他们只会得到3、4、5三种错误码。当年内存非常昂贵,他们不想编写容错性更强的代码,那样太费内存。当你的应用跑在64KB内存的主机上时,防御性编程只是可选项。
为了保持向后兼容性,微软只好为DOS 3.1设计一种称为"DOS错误映射表"的技术,它将一个更广范围的错误码通过N对3映射到DOS 2.0的3种错误码中。为了获取更精准的新错误码,应用可以额外调用一个新的API(Get Extended Error)。
这项技术仍然存在于Longhorn中,我前几天还去查看了一下源码,在NTVDM相关组件中,不在Win32组件中。不管怎么样,它还活着,而且很可能我们永远无法摆脱它。至少在我们丢弃对16位DOS的支持之前,我们无法摆脱它,这不会很快发生。
从此,微软再也不文档化API返回值的所有错误码,由此将处理潜在出现新错误码的责任从微软转嫁给应用开发人员自己。
微软早在十几年前的经验就告诉我们,软件工程的潜在错误是不可能穷尽的,在笔者看来,安全漏洞也是软件工程潜在错误的一种,它会一直存在并且永远都会存在。
操控
有一位心灵魔术师叫达伦布朗,别的魔术师能予人惊喜,而他带来的却是恐惧。操控人心对他来说是家常便饭。如果他想的话,只要告诉你“水是热的”,你就会在冰水里面躺一天,直至冻死。
曾经他表演过多个细思恐极的魔术,最出名的,还要属“俄罗斯轮盘赌”。
具体流程是这样的:观众在左轮手枪6个弹位里,随机放入一颗子弹。之后从1至6依次念出6个数字,达伦布朗再通过观众的声音决定扣动扳机的时刻。
这个魔术秀的原理是利用了“社会屈从性”。社会屈从性指:人在社会权威的框架下,被影响做出一系列有违自身三观和人格的行为,从而获取社会认同和安全感。
例如其中一个实验:布朗首先找了三个托,这三个托会根据有规律的铃声做出坐下或起立的动作。
这个例子只是让读者理解“社会屈从性”的原理。在安全领域的类似操控,是超出普通人想象的,由于安全漏洞产生于软件的开发过程,软件是由人开发,人是社会性动物,不能脱离群体而独居,自然也会受到“社会屈从性”的影响。例如:
Shiva的另一个意思叫做虚无,宇宙的毁灭是一切归为虚无,那么一切皆为湿婆。
在无尽的虚无湿婆之中,然后出现能够创造一切的Shakti(萨克蒂),宇宙由此再次诞生。
Vishnu(毗湿奴)维持世界的一切美意,Brahma(梵天)创造世界与生命。
一切是萨克蒂始,湿婆…
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……
还没有评论,来说两句吧...