如何确定内核是否开启了地址随机化功能

要确定 Linux 内核是否启用了地址随机化(ASLR,Address Space Layout Randomization),可以通过以下步骤检查:


1. 检查 /proc/sys/kernel/randomize_va_space 的值

1
cat /proc/sys/kernel/randomize_va_space
  • 结果说明
    • 0: ASLR 已关闭(无随机化)。
    • 1: ASLR 部分开启(保守随机化,如栈、堆等)。
    • 2: ASLR 完全开启(默认值,对所有内存区域随机化)。

2. 临时启用/禁用 ASLR

  • 临时关闭 ASLR
    1
    sudo echo 0 > /proc/sys/kernel/randomize_va_space
  • 临时恢复默认(完全开启)
    1
    sudo echo 2 > /proc/sys/kernel/randomize_va_space
  • 注意:此方法重启后失效

3. 永久修改 ASLR 配置

编辑 /etc/sysctl.conf,添加或修改以下行:

1
2
3
4
5
# 禁用 ASLR
kernel.randomize_va_space = 0

# 启用 ASLR(默认配置)
kernel.randomize_va_space = 2

保存后运行:
1
sudo sysctl -p


4. 验证 ASLR 效果(可选)

可以通过观察程序运行时内存地址是否变化来验证:

1
2
# 多次运行以下命令,观察每次输出的地址是否不同
grep heap /proc/self/maps

  • ASLR 开启时:地址会随机变化。
  • ASLR 关闭时:地址固定不变。

5. 注意事项

  • 安全性:关闭 ASLR 会降低系统安全性,仅在调试或特殊需求时禁用。
  • 兼容性:现代 Linux 发行版默认启用 ASLR(值为 2)。

通过上述步骤,你可以快速确认并控制系统的地址随机化状态。

如何确定内核是否开启了内核地址随机化功能(KASLR)

要确定 Linux 内核是否启用了 内核地址随机化(KASLR,Kernel Address Space Layout Randomization),可以通过以下方法检查:


1. 检查内核启动参数

KASLR 默认在大多数现代内核中启用,但可以通过内核启动参数 nokaslr 显式禁用。
查看内核启动参数是否包含 nokaslr

1
cat /proc/cmdline

  • 结果说明
    • 如果输出中包含 nokaslr,表示 KASLR 已禁用
    • 如果未包含 nokaslr,则 KASLR 默认启用(具体需结合内核版本和发行版配置)。

2. 检查内核日志(dmesg)

KASLR 在内核启动时会输出地址随机化的日志。
使用 dmesg 查找相关关键字:

1
dmesg | grep -i "kaslr"

  • 结果说明
    • 若输出类似 KASLR enabledKernel Offset: 0x... (随机值),表示 KASLR 已启用
    • 若输出 KASLR disabled,表示 KASLR 已禁用

示例(启用 KASLR 时的输出):

1
2
3
[    0.000000] Kernel command line: ...  # 未包含 nokaslr
[ 0.000000] KASLR enabled
[ 0.000000] Kernel Offset: 0x1d200000 from 0xffffffff81000000 (relocation range: 0xffffffff80000000-0xffffffffbfffffff)


3. 检查内核符号地址是否随机化

KASLR 会随机化内核符号的地址。
通过 /proc/kallsyms 查看内核符号地址是否变化:

1
2
# 多次运行以下命令,观察内核符号地址是否固定
sudo cat /proc/kallsyms | grep " startup_64"

  • 结果说明
    • 如果每次输出的地址不同,表示 KASLR 已启用
    • 如果地址固定不变,表示 KASLR 已禁用

4. 检查 /proc/cmdlinekaslr 参数(仅限较新内核)

Linux 4.12+ 内核中,KASLR 可能直接通过 kaslr 参数启用:

1
cat /proc/cmdline | grep -o "kaslr"

  • 结果说明
    • 若输出 kaslr,表示 KASLR 已启用
    • 若未输出,需结合其他方法判断(部分发行版默认启用 KASLR,无需显式参数)。

5. 临时禁用 KASLR(调试用途)

若需临时禁用 KASLR(例如调试内核),可在启动时修改 GRUB 参数:

  1. 编辑 GRUB 配置文件:
    1
    sudo vim /etc/default/grub
  2. GRUB_CMDLINE_LINUX_DEFAULT 中添加 nokaslr
    1
    GRUB_CMDLINE_LINUX_DEFAULT="... nokaslr"
  3. 更新 GRUB 并重启:
    1
    sudo update-grub && reboot

6. 注意事项

  • 安全性:KASLR 是内核安全的关键特性,禁用会降低系统安全性(仅建议调试时禁用)。
  • 内核版本差异:旧版内核(如 3.x)可能未默认启用 KASLR,需确认具体版本行为。
  • 发行版差异:部分发行版(如 RHEL/CentOS 7)默认不启用 KASLR,需手动配置。

通过上述方法,可以明确判断内核是否启用了 KASLR,并根据需要调整配置。