OS X 实际上支持 ASLR
Is ASLR actually supported by OS X
我目前正在研究由 OSX 改编的安全措施,并注意到一些非常奇怪的事情。虽然他们声称默认支持所有二进制文件的 ASLR,但似乎所有 dylib 都位于运行期间的固定地址。
这是我测试这个的脚本,输出也如下所示
test.c
#include<stdio.h>
int main(){
printf("main address : %p\n",&main);
printf("printf address : %p\n",&printf);
return 0;
}
五次连续运行的输出
main address : 0x10bbd5f00
printf address : 0x7fff9a053154
main address : 0x109c82f00
printf address : 0x7fff9a053154
main address : 0x1044a7f00
printf address : 0x7fff9a053154
main address : 0x103d7cf00
printf address : 0x7fff9a053154
main address : 0x10c90ef00
printf address : 0x7fff9a053154
结果清楚地表明,虽然启用了PIE,但肯定没有启用ASLR。
为了进一步检查是否为 libsystem_c.dylib 特别禁用了 ASLR,我还 运行 测试代码 DYLD_PRINT_SEGMENTS=1,并且确认所有 dylib 都位于固定位置。
所以我的问题是,ASLR 真的 available/supported 在 mac 上吗?
如果是,我应该如何启用它?
如果不是,苹果 fail/refuse 实施此功能的可能原因是什么?
备注:
代码是 运行 OSX El Captain(10.11.6) 和 Mojave(10.14.6)
在做了更多实验和研究之后,我意识到 OSX 实现的 ASLR 与 linux ASLR 的行为完全不同。最根本的区别是,在 OSX 中,PIE 和 ASLR 是捆绑在一起的,并在编译时决定。
以下是 with/without PIE 之间的总结比较:
没有馅饼
可执行文件 - 已修复
库 - 每个设备启动时随机化
堆 - 固定
Mmap - 固定
堆栈 - 已修复
馅饼
可执行文件 - 每次执行随机分配 16 位
库 - 每个设备启动时随机化
堆 - 每次执行随机分配 20 位
Mmap - 每次执行随机 16 位(总是在 Activity 跟踪区域之后,与可执行文件的固定偏移量)
堆栈 - 每次执行随机分配 16 位
与每个区域至少有 20 位随机化的 Linux ASLR 相比,OSX ASLR 相对较弱,可能会在可接受的时间内被暴力破解。使其极易受到 ROP 和其他攻击。
我目前正在研究由 OSX 改编的安全措施,并注意到一些非常奇怪的事情。虽然他们声称默认支持所有二进制文件的 ASLR,但似乎所有 dylib 都位于运行期间的固定地址。
这是我测试这个的脚本,输出也如下所示
test.c
#include<stdio.h>
int main(){
printf("main address : %p\n",&main);
printf("printf address : %p\n",&printf);
return 0;
}
五次连续运行的输出
main address : 0x10bbd5f00
printf address : 0x7fff9a053154
main address : 0x109c82f00
printf address : 0x7fff9a053154
main address : 0x1044a7f00
printf address : 0x7fff9a053154
main address : 0x103d7cf00
printf address : 0x7fff9a053154
main address : 0x10c90ef00
printf address : 0x7fff9a053154
结果清楚地表明,虽然启用了PIE,但肯定没有启用ASLR。
为了进一步检查是否为 libsystem_c.dylib 特别禁用了 ASLR,我还 运行 测试代码 DYLD_PRINT_SEGMENTS=1,并且确认所有 dylib 都位于固定位置。
所以我的问题是,ASLR 真的 available/supported 在 mac 上吗?
如果是,我应该如何启用它?
如果不是,苹果 fail/refuse 实施此功能的可能原因是什么?
备注:
代码是 运行 OSX El Captain(10.11.6) 和 Mojave(10.14.6)
在做了更多实验和研究之后,我意识到 OSX 实现的 ASLR 与 linux ASLR 的行为完全不同。最根本的区别是,在 OSX 中,PIE 和 ASLR 是捆绑在一起的,并在编译时决定。
以下是 with/without PIE 之间的总结比较:
没有馅饼
可执行文件 - 已修复
库 - 每个设备启动时随机化
堆 - 固定
Mmap - 固定
堆栈 - 已修复
馅饼
可执行文件 - 每次执行随机分配 16 位
库 - 每个设备启动时随机化
堆 - 每次执行随机分配 20 位
Mmap - 每次执行随机 16 位(总是在 Activity 跟踪区域之后,与可执行文件的固定偏移量)
堆栈 - 每次执行随机分配 16 位
与每个区域至少有 20 位随机化的 Linux ASLR 相比,OSX ASLR 相对较弱,可能会在可接受的时间内被暴力破解。使其极易受到 ROP 和其他攻击。