Linux GCC插件
概述
Linux gcc plugins是由Emese Revfy 2016年从grsecurity/PaX移植而来,提供了一系列gcc插件,它是KSPP的一部分。
latent_entropy_plugin
在启动过程收集熵,但它不是密码学安全的熵。适合嵌入式场景下,熵源较少的场景。
内核配置:CONFIG_GCC_PLUGIN_LATENT_ENTROPY
原理概述
在irq、init等函数前添加__latent_entropy属性,通过插件,收集有__latent_entropy属性的函数、变量,每个都有一个临时熵,各种计算后累积到全局latent_entropy。然后在start_kernel、kernel_clone函数调用add_latent_entropy-》add_device_randomness添加到随机数熵源中。
测试情况
基于Linux 6.2测试,OS极简,只运行rsyslog、audit、sshd等OS必须的二进制。
开启该选项后直到“random: crng init done” 6.67s。
未开启该选项后直到“random: crng init done” 15.74s。
注意事项
该特性对启动性能有影响,会延长启动时间。
randomize_layout
背景:当已知结构体地址及结构体成员顺序,计算偏移值,使用恶意值覆盖特定字段,从而达到攻击目的。
内核配置:CONFIG_GCC_PLUGIN_RANDSTRUCT、CONFIG_GCC_PLUGIN_RANDSTRUCT_PERFORMANCE
关键数据结构都添加了属性__randomize_layout
参考资料:https://lwn.net/Articles/722293/
注意事项
启用该功能会有一些性能影响,内存会有一点增加
arm_ssp_per_task_plugin
功能:支持arm每个task 栈canaries。
背景:当前仅在内核切换任务的时候更新canary,在SMP场景下,不可能实现
内核配置:CONFIG_GCC_PLUGIN_ARM_SSP_PER_TASK
参考地址: https://lwn.net/Articles/770984/
stackleak_plugin
https://a13xp0p0v.github.io/2018/11/04/stackleak.html
功能:通过以下方式减轻了几种类型的 Linux 内核漏洞:
- 减少内核堆栈泄漏错误可以向攻击者透露的信息,
- 阻止一些未初始化的堆栈变量攻击,
- 在针对 Linux 内核的堆栈冲突攻击期间检测内核堆栈溢出。
适用于对信息安全要求较高的场景。
structleak_plugin
功能:该插件主要是防止结构体未初始化导致信息泄露。
参考资料:https://linxz.tech/post/compilers/2021-10-10-structleak/
rap_plugin
地址完整性检查
cyc_complexity_plugin
函数圈复杂度插件。
效果如下:
Cyclomatic Complexity main.c:3:5:main 1
文件main.c 第3行第5列 main函数,复杂度为1
sancov_plugin
kcov辅助插件