轻松实现安全特性检测:Winchecksec工具
我们自豪地发布Winchecksec——一款检测Windows二进制文件安全特性的新型开源工具。该工具为满足我们的分析和研究需求而开发,旨在深度、准确性和性能方面超越现有开源安全特性检测工具,同时保持简洁性。
特性检测,化繁为简
Winchecksec以Windows PE二进制文件作为输入,输出构建时内置的安全特性报告。常见特性包括:
- 地址空间布局随机化(ASLR)及64位高熵ASLR(HEASLR)
- 真实性/完整性保护(Authenticode、强制完整性)
- 数据执行保护(DEP),又称W^X或No eXecute(NX)
- 清单隔离
- 结构化异常处理(SEH)和SafeSEH
- 控制流防护(CFG)和返回流防护(RFG)
- 防护栈(GS),又称栈Cookie或金丝雀
Winchecksec的两种输出模式通过一个标志(-j)控制:默认的纯文本表格模式供人工阅读,JSON模式供机器处理。
深入解析:动态基址与ASLR的区别
您是否注意到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现已停止维护。它执行多项安全特性检查并提供XML和HTML输出,但依赖.pdb文件进行二进制分析。因此,在Microsoft安全开发生命周期之外的使用场景中不实用。
- BinSkim似乎是BinScope的精神继承者并积极维护,但使用晦涩的过度工程化格式供机器使用。与BinScope类似,它似乎也依赖调试信息的可用性。
- Visual Studio工具链提供dumpbin.exe,可用于转储给定二进制文件中的某些安全属性。但dumpbin.exe不提供机器可用的输出,因此开发人员被迫编写临时解析器。更糟糕的是,dumpbin.exe提供的是转储而非分析。例如,它不会解释具有剥离重定位条目和启用动态基址的程序与ASLR不兼容。需要用户自行推断。
- NetSPI维护PESecurity,这是一个用于测试许多常见PE安全特性的PowerShell脚本。虽然它提供CSV输出选项供程序化使用,但性能落后于dumpbin.exe(及其他编译工具),更不用说Winchecksec。
- 还有一些小型特性检测器散布在插件和代码片段中,但这些通常不完整(检查方面)、难以程序化交互、维护 sporadic 和/或执行临时PE解析。
Winchecksec旨在在静态检查领域实现完整性,得到维护,并使用官方Windows API进行PE解析。
立即尝试!
Winchecksec是作为我们集成模糊测试和分类系统Sienna Locomotive的一部分开发的。作为多个分类组件之一,Winchecksec为我们的可利用性评分系统提供信息(例如,如果DEP和ASLR均启用,则降低缓冲区溢出的可利用性),并允许我们向用户提供关于改进应用程序基线安全性的即时建议。
我们期望其他人开发更多使用场景,例如:
- CI/CD集成,使一组基本安全特性对所有构建成为强制要求。
- 审计整个生产服务器中部署的缺乏关键安全特性的应用程序。
- 评估应用程序中安全特性的有效性(例如,在具有大量包含vtable对象缓冲区的C++应用程序中,栈Cookie是否有效)。
立即在GitHub上获取Winchecksec。如果您有兴趣帮助我们开发,请尝试这些首批问题。
如果您喜欢这篇文章,请分享: Twitter LinkedIn GitHub Mastodon Hacker News