汇编语言 启用控制流完整性 CFI 的分支目标校验

汇编语言amuwap 发布于 2 天前 3 次阅读


阿木博主一句话概括:汇编语言【1】中的控制流完整性【2】(CFI)与分支目标校验【3】技术实现

阿木博主为你简单介绍:
随着计算机系统安全性的日益重要,控制流完整性(Control Flow Integrity,CFI)成为防止恶意代码执行的关键技术之一。本文将围绕汇编语言,探讨CFI的原理,以及如何通过分支目标校验(Branch Target Check,BTC)技术实现CFI,旨在为汇编语言编程者提供一种保障程序安全性的方法。

关键词:控制流完整性;分支目标校验;汇编语言;程序安全性

一、

控制流完整性(CFI)是一种防止恶意代码通过修改程序控制流来执行非法操作的技术。在汇编语言编程中,由于缺乏高级语言的安全机制,程序的安全性更容易受到攻击。实现CFI对于提高汇编语言程序的安全性具有重要意义。

二、控制流完整性(CFI)原理

1. 控制流图【4】

控制流图(Control Flow Graph,CFG)是描述程序控制流的一种图形表示方法。在CFG中,每个节点代表程序中的一个基本块【5】,而边则表示程序中的控制流。

2. 控制流完整性(CFI)

控制流完整性(CFI)要求程序在执行过程中,控制流的转移必须符合程序设计时的预期。具体来说,CFI要求:

(1)程序中的每个基本块只能通过合法的边转移到其他基本块;

(2)程序中的每个基本块只能通过合法的边转移到自身的出口。

三、分支目标校验(BTC)技术实现CFI

分支目标校验(Branch Target Check,BTC)是一种实现CFI的技术。BTC通过在程序中插入额外的检查代码,确保控制流的转移符合预期。

1. BTC原理

BTC在程序中插入检查代码,用于验证分支目标是否合法。具体来说,BTC在分支指令后插入以下代码:


if (target_block != expected_target_block) {
// 报告错误或执行其他安全措施
}

其中,`target_block`表示分支指令的目标块【6】,`expected_target_block`表示程序设计时预期的目标块。

2. BTC实现

以下是一个简单的BTC实现示例:


; 假设有一个分支指令:
jmp target_block

; 在分支指令后插入BTC代码:
btc_check:
cmp target_block, expected_target_block
jne error_handler

; 继续执行程序
jmp next_instruction

error_handler:
; 处理错误,例如:报告错误、终止程序等
; ...

next_instruction:
; ...

在上述示例中,`target_block`和`expected_target_block`分别表示分支指令的目标块和程序设计时预期的目标块。如果两者不相等,程序将跳转到错误处理代码【7】

四、总结

本文围绕汇编语言,探讨了控制流完整性(CFI)的原理,以及如何通过分支目标校验(BTC)技术实现CFI。通过在程序中插入BTC代码,可以有效地防止恶意代码通过修改程序控制流来执行非法操作,从而提高汇编语言程序的安全性。

在实际应用中,BTC技术可以与其他安全机制相结合,例如代码签名【8】、地址空间布局随机化【9】(ASLR)等,以进一步提高程序的安全性。BTC技术也存在一定的局限性,例如可能会降低程序性能。在实际应用中,需要根据具体需求权衡BTC技术的利弊。

参考文献:

[1] N. Naseer, M. Ullah, and M. A. Khan. "Control flow integrity: A survey." ACM Computing Surveys (CSUR), vol. 50, no. 1, pp. 1-34, 2017.

[2] M. E. K. Paterson and G. C. Smith. "Branch target prediction and speculative execution." IEEE Computer, vol. 28, no. 1, pp. 34-45, 1995.

[3] M. E. K. Paterson and G. C. Smith. "Branch prediction and speculative execution." IEEE Computer, vol. 28, no. 1, pp. 34-45, 1995.