当前位置: 首页 > 科技观察

ASLR如何保护Linux系统免受缓冲区溢出攻击

时间:2023-03-12 16:40:59 科技观察

AddressSpaceLayoutRandomization(ASLR)是操作系统用来防御缓冲区溢出攻击的一种内存保护机制。这种技术使系统上运行的进程的内存地址不可预测,从而使与这些进程相关的漏洞更难被利用。ASLR目前可在Linux、Windows和MacOS系统上使用。它于2005年首次出现在Linux系统上。2007年,该技术部署在Windows和MacOS上。尽管ASLR在各种系统上提供相同的功能,但有不同的实现。ASLR的有效性取决于整个地址空间布局是否对威胁参与者保持未知。另外,只有编译为PIE(PositionIndependentExecutable,PIE)的可执行程序才能得到ASLR技术的最大保护,因为只有这样,可执行文件的所有代码段才会被加载到随机地址。不管绝对地址如何,PIE机器码都能正确执行。ASLR的局限性尽管ASLR使利用系统漏洞变得更加困难,但它保护系统的能力是有限的。了解有关ASLR的以下几点很重要:它不解决漏洞,它使利用它们变得更加困难不跟踪或报告漏洞不保护在没有ASLR支持的情况下编译的二进制文件它是如何工作的通过随机化内存布局中的偏移量攻击者需要在缓冲区溢出攻击中使用,ASLR使攻击更难得逞,从而增强系统的控制流完整性。人们普遍认为ASLR在64位系统上工作得更好,因为64位系统提供更大的熵(可随机化的地址范围)。ASLR是否在您的Linux系统上运行?下面显示的两个命令可以判断您的系统是否启用了ASLR:$cat/proc/sys/kernel/randomize_va_space2$sysctl-a--patternrandomizekernel.randomize_va_space=2上述命令结果中的值(2)表示ASLR在完全随机模式下工作。它可能是以下值之一:0=Disabled1=ConservativeRandomization2=FullRandomization如果关闭ASLR并执行以下命令,您会注意到两个ldd的输出完全相同。ldd命令加载共享对象并显示它们在内存中的地址。$sudosysctl-wkernel.randomize_va_space=0<==禁用[sudo]shs的密码:kernel.randomize_va_space=0$ldd/bin/bashlinux-vdso.so.1(0x00007ffff7fd1000)<==相同地址libtinfo.so.6=>/lib/x86_64-linux-gnu/libtinfo.so.6(0x00007ffff7c69000)libdl.so.2=>/lib/x86_64-linux-gnu/libdl.so.2(0x00007ffff7c63000)libc.so.6=>/lib/x86_64-linux-gnu/libc.so.6(0x00007ffff7a79000)/lib64/ld-linux-x86-64.so.2(0x00007ffff7fd3000)$ldd/bin/bashlinux-vdso.so.1(0x00007ffff7fd1000)<==相同地址libtinfo.so.6=>/lib/x86_64-linux-gnu/libtinfo.so.6(0x00007ffff7c69000)libdl.so.2=>/lib/x86_64-linux-gnu/libdl.so.2(0x00007ffff7c63000)libc.so.6=>/lib/x86_64-linux-gnu/libc.so.6(0x00007ffff7a79000)/lib64/ld-linux-x86-64.so.2(0x00007ffff7fd3000)如果你重新安装Set它设置为2以启用ASLR,您将看到每次运行ldd时,您都会获得不同的内存地址。$sudosysctl-wkernel.randomize_va_space=2<==启用[sudo]shs的密码:kernel.randomize_va_space=2$ldd/bin/bashlinux-vdso.so.1(0x00007fff47d0e000)<==第一组地址libtinfo.so.6=>/lib/x86_64-linux-gnu/libtinfo.so.6(0x00007f1cb7ce0000)libdl.so.2=>/lib/x86_64-linux-gnu/libdl.so.2(0x00007f1cb7cda000)libc.so.6=>/lib/x86_64-linux-gnu/libc.so.6(0x00007f1cb7af0000)/lib64/ld-linux-x86-64.so.2(0x00007f1cb8045000)$ldd/bin/bashlinux-vdso.so.1(0x00007ffe1cbd7000)<==第二组地址libtinfo.so.6=>/lib/x86_64-linux-gnu/libtinfo.so.6(0x00007fed59742000)libdl.so.2=>/lib/x86_64-linux-gnu/libdl.so.2(0x00007fed5973c000)libc.so.6=>/lib/x86_64-linux-gnu/libc.so.6(0x00007fed59552000)/lib64/ld-linux-x86-64.so.2(0x00007fed59aa7000)尝试绕过ASLR虽然这项技术有很多优点,但绕过ASLR的攻击并不少见,主要分为以下几类:ASLR实现中猜测地址的缺陷,常见于低熵或ASLR实现不完善的系统使用边信道攻击来总结ASLR具有很大的价值,尤其是在64位系统上运行并正确实现时。虽然无法避免绕过,但这种技术确实使利用系统漏洞变得更加困难。此参考提供了有关完整ASLR在64位Linux系统上的有效性的更多详细信息,并且本文介绍了一种使用分支预测来绕过ASLR的技术。