CFI 选项:-fsanitize=cfi-nvcall

CFI 选项:-fsanitize=cfi-nvcall
cfi-nvcall 选项在精神上类似于 cfi-vcall 选项,除了它适用于非虚拟呼叫。关键区别在于非虚拟调用是在编译时静态已知的直接调用,因此这种保护严格来说不是控制流完整性问题。cfi-nvcall 选项的作用是识别非虚拟调用并确保运行时调用对象的类型可以从编译时已知的对象类型派生。

简单来说,想象一个Balls 的类层次结构和一个 s 的类层次结构Brick。使用 cfi-nvcall,编译时调用Ball::Throw可能会执行Baseball::Throw,但永远不会执行Brick::Throw,即使攻击者用对象替换了Brick对象Ball。

cfi-nvcall 修复的情况可能来自内存损坏、类型混淆和反序列化。虽然这些实例不允许攻击者自行重定向控制流,但这些错误可能会导致仅数据攻击,或导致足够多的不当行为以允许未来的错误起作用。这种使用纯数据漏洞的攻击在 cfi-nvcall 示例中显示:使用低权限用户对象代替高权限管理员对象,导致应用程序内权限升级。

你可能感兴趣的:(CFI,c++)