利用ProxyCFI掌控代码指针的力量
1. 代码指针与多分支示例
在程序中,间接调用和返回等操作常常涉及多分支跳转。例如在函数 foo() 中对 bar() 和 baz() 的间接调用,通过多分支实现:当遇到代理 $7743d2ff 时跳转到 bar() ,当指针代理为 $1f324a19 时跳转到 baz() 。而且, bar() 和 baz() 函数的返回操作同样通过多分支实现。
高级控制流攻击,如控制流弯曲,会利用从一个函数上下文复制的代码指针,在不违反控制流完整性(CFI)约束的情况下跳转到其他函数地址,从而破坏 CFI。而指针代理被唯一分配给控制流边(即源和目标的函数),函数 X 的指针代理对函数 Y 毫无意义。这一强大特性在不影响指针代理可用性的同时,能抵御大量高级控制流攻击。例如在图 1 中, bar() 和 baz() 函数虽返回同一地址(标签 done ),但使用不同的指针代理,若相互披露并使用对方的指针代理返回,会导致多分支跳转不匹配,引发违规。为防止指针代理被伪造,所有指针代理值按函数定义,并在程序加载时由验证器重新随机化。
2. 构建使用指针代理的代码
2.1 强化间接跳转
构建使用指针代理的代码,需将程序中使用代码指针的地方全部替换为指针代理。对于所有
超级会员免费看
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



