概述

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 内核的堆栈冲突攻击期间检测内核堆栈溢出。

img

适用于对信息安全要求较高的场景。

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辅助插件