内核检测 MacOS内核安全性检测
MacOS Big Sur自问世以来,近一年来一直没有稳定下来。有人惊叹macOS系统沦落到需要重启电脑才能解决问题的地步。事实上,macOS Big Sur已经让很多用户使用了重启功能。尤其是在使用这个系统的第一个正式版本时,计算机重启的次数比过去几年的总数还多。
与Windows系统相比,macOS升级频繁。其实频繁更新不是问题,关键是系统不稳定,影响日常使用。这个问题在macOS大苏尔上最为突出。尤其是电池问题,MacBook Pro到底是不能充电还是耗电快,一直困扰着很多用户。
今年年初,苹果发布了macOS Big Sur的源代码。它包括了MAC OS操作系统的内核xnu。几年前,PVS-Studio已经检查过内核源代码,与macOS上发布的分析器一致。PVS-Studio是俄罗斯公司开发的一款简单易用的静态代码分析工具。其主要目的是在初期识别和修复错误,防止后期浪费大量时间寻找错误,提高效率,保证质量。PVS-Studio可用于检测程序源代码中的错误,并使用该软件帮助用户快速检测C/C ++/C ++ 0x应用程序源代码中的错误。
XNU-X不是Unix,它是苹果为Mac OS X开发的..这个内核的源代码是根据APSL和OC Darwin在20年前发布的。在过去,你甚至可以安装达尔文作为一个成熟的操作系统。但是,现在不可能了。源代码主要基于其他开源项目。这就是它的源代码被发布的原因。
你可以点击这里找到组件的源代码在https://opensource.apple.com/.我用GitHub上的图片来检查它。
如上所述,几年前,PVS-Studio已经检查了内核源代码。有关相关发现,请点击此https://www.viva64.com/en/b/0566/。
最新的内核安全检测
说实话,这个项目代码比较复杂,我没有使用这样的代码库的经验。但是,PVS-Studio的警告非常详细。这里有一个文档链接,上面有正确和错误代码的例子。在这次检查中,时钟计数为1346 *。C文件,1822个C/ c++头文件和225个*。项目中的cpp文件。
片段N1
根据生成的bus_to_dec_rate_den字段的名称,除数和被除数是混淆的。这段代码的开发者可能认为初始值会改变,所以结果不再等于0。但是,这个代码对我来说还是很可疑的。
片段N2
PVS-Studio警告:V560条件表达式的一部分始终为假:索引
这是一个示例,说明分析器如何跟踪变量的可能值,并将索引变量与函数开头的零进行比较。如果它小于零,则在内部块中将为该变量分配一个不小于零的值。因此,下一个外部if会再次检查索引变量的值是否小于零。然而,这是不可能的。
这不会改变程序的逻辑,但可能暗示其他条件。也就是说,在任何情况下,额外的检查都不能使代码更加易读和易懂。
片段N4
在condition . kern _ descriptp . c _ 99 3916中使用了V1019复合赋值表达式“n -= i”。
这段代码很难阅读,所以也许应该简化:
这段代码看起来不太有效,但绝对更容易理解。要快速检查代码等价性,请转到Godbolt。顺便说一下,你可以在那里测试PVS-Studio检查器的工作。在本服务的工具中很容易找到分析器。
如果没有启用优化,汇编代码将只有几行。但是,要注意if的体。没有使用新的n值。也就是说,这里很有可能不需要布置任务。
此外,当进一步使用n变量时,源代码可能会导致错误。如果表达式
片段N9
PVS-Studio警告:V571重复检查。' If '已在第245行的第246行选中。audit _ mac.c 246 c
PVS-Studio警告:V547表达式' ar-> k _ ar。ar _ arg _ MAC _ string = = null '始终为真。audit _ mac.c246
解析器同时对这段代码发出了两个警告。
您可能会注意到,第一个if中的检查与第二个if中的检查相同。此外,第二次检查还有另一种解释:
因此,第二次检查不应有内部验证。我们只需要戒掉这种方法。因此,内部检查很可能是偶然重复的,没有任何意义。
虽然也许其他字段应该在内部检查中检查。但是,这里有一个复制粘贴错误。开发人员忘记更正字段名。
片段N12
PVS-工作室警告:V567没有定义行为
宏很难理解,但事实证明这种情况更容易。分析从表达式OSSwapInt16开始。
然后,我意识到有一个更简单的方法。我刚打开了。我在项目检查后留下了文件。
最重要的是,这部分表达引起了我们的注意:
表达式中的运算符都不是序列点,因为我们不知道|运算符的哪个参数会先赋值,所以*uscp的值是未定义的。
PVS-Studio为V567检查提供了非常详细的文档。如果您想知道为什么这样的代码会导致未定义的行为,您可以详细阅读本文档。
此时程序员只打算将递增*ucsp的值增加一倍,实际上这个值会增加三倍。第二,这个过程是无形的,不清晰的。这就是为什么宏非常危险。很多情况下,最好写一个普通的函数。编译器最有可能自动执行替换,因此性能不会下降。
片段N13
PVS-Studio警告:V567没有定义行为。让我们看看htobe64调用的行。经过预处理,分析师发现银行可疑:
这个问题其实和前面的例子是一样的。具有|和&操作数的内部链中没有序列点。因此,每次操作过程中pf_status.stateid的值是未知的,结果也是不确定的。
同样,变量会连续递增几次。
摘要
这次分析器发现的错误比之前的检查少,证明XNU开发中很可能使用了静态分析等代码质量控制工具。几乎可以肯定,这个项目使用的是Clang静态分析程序。但是如上所述,PVS-Studio还是发现了错误和漏洞。
参考资料和来源:https://www.viva64.com/en/b/0818/