轻松实现安全特性检测:Winchecksec
我们自豪地宣布发布Winchecksec,这是一款新的开源工具,用于检测Windows二进制文件中的安全特性。为满足我们的分析和研究需求而开发,Winchecksec旨在深度、准确性和性能上超越当前的开源安全特性检测工具,同时不牺牲简洁性。
特性检测,简单化
Winchecksec以Windows PE二进制文件作为输入,并输出构建时内置的安全特性报告。常见特性包括:
- 地址空间布局随机化(ASLR)和64位感知高熵ASLR(HEASLR)
- 真实性/完整性保护(Authenticode,强制完整性)
- 数据执行保护(DEP),更常称为W^X或No eXecute(NX)
- 清单隔离
- 结构化异常处理(SEH)和SafeSEH
- 控制流防护(CFG)和返回流防护(RFG)
- 防护栈(GS),更常称为栈cookies或canaries
Winchecksec的两种输出模式由一个标志(-j)控制:默认的纯文本表格模式供人类阅读,以及JSON模式供机器使用。实际操作中:
您是否注意到Winchecksec在上述区分了“动态基址”和ASLR?这是因为在构建时设置/DYNAMICBASE并不保证地址空间随机化。Windows没有重定位表无法执行ASLR,因此明确请求ASLR但缺少重定位条目(由映像头标志中的IMAGE_FILE_RELOCS_STRIPPED指示)的二进制文件会在没有随机化地址空间的情况下静默加载。这种边缘情况直接导致VLC 2.2.8中一个原本中等的释放后使用漏洞变成一个巨大漏洞(CVE-2017-17670)。mingw-w64中的底层工具链错误仍未修复。
类似地,在CLR下运行的应用程序保证使用ASLR和DEP,无论动态基址/NX兼容性标志的状态或重定位表的存在如何。因此,Winchecksec将在任何指示在CLR下运行的二进制文件上报告ASLR和DEP已启用。CLR还提供安全异常处理,但不是通过SafeSEH,因此除非启用,否则不会指示SafeSEH。
其他工具如何比较?
表现不佳:
-
Microsoft在2014年发布了BinScope,但让其逐渐衰落。BinScope执行多项安全特性检查并提供XML和HTML输出,但依赖于.pdb文件进行二进制分析。因此,在Microsoft安全开发生命周期之外的任何用例中都不实用。BinSkim似乎是BinScope的精神继承者并积极维护,但使用一种晦涩的过度工程化格式供机器使用。与BinScope类似,它似乎也依赖于调试信息的可用性。
-
Visual Studio工具链提供dumpbin.exe,可用于转储给定二进制文件中的一些安全属性。但dumpbin.exe不提供机器可消费的输出,因此开发人员被迫编写临时解析器。更糟的是,dumpbin.exe提供的是转储,而不是对给定文件的分析。例如,它不会解释具有剥离重定位条目和启用动态基址的程序不兼容ASLR。用户需要自己推断。
-
NetSPI维护PESecurity,一个PowerShell脚本,用于测试许多常见的PE安全特性。虽然它提供CSV输出选项供编程使用,但性能上落后于dumpbin.exe(以及下面列出的其他编译工具),更不用说Winchecksec。
-
还有一些小的特性检测器在插件和gist世界中流传,比如这个、这个和这个(用于x64dbg!)。这些通常不完整(就检查而言),难以以编程方式交互,维护 sporadic,和/或执行临时PE解析。Winchecksec旨在在静态检查领域实现完整性,得到维护,并使用官方Windows API进行PE解析。
尝试它!
Winchecksec是作为Sienna Locomotive的一部分开发的,这是我们集成的模糊测试和分类系统。作为几个分类组件之一,Winchecksec通知我们的可利用性评分系统(例如,如果DEP和ASLR都启用,则降低缓冲区溢出的可利用性),并允许我们向用户提供关于提高应用程序基线安全性的即时建议。我们期望其他人会开发额外的用例,例如:
- CI/CD集成,使一组基本安全特性对所有构建成为强制要求。
- 审计整个生产服务器,查找缺乏关键安全特性的部署应用程序。
- 评估应用程序中安全特性的有效性(例如,在具有大量包含vtable的对象中缓冲区的C++应用程序中,栈cookies是否有效)。
立即在GitHub上获取Winchecksec。如果您有兴趣帮助我们开发它,尝试这一批首要问题。
如果您喜欢这篇文章,请分享: Twitter LinkedIn GitHub Mastodon Hacker News