
目录
微架构隐蔽信道是现代计算机安全中的一个重要问题。其核心在于利用微妙的硬件行为在隔离的安全边界之间泄漏信息,从而绕过传统的操作系统和应用层防御。随着云计算和多租户环境成为常态,自动检测和缓解此类威胁比以往任何时候都重要。
AutoCC 是一个创新的框架,可以自动发现这些隐蔽的时间信道,帮助攻防双方提升理解和保护能力。在本指南中,我们将介绍AutoCC背后的技术和研究,进行实际检测提示,并解释微架构隐蔽信道在当今威胁环境中的重要性。
在计算机安全中,隐蔽信道 是一种非预期的通信途径,可以用于以违反系统安全政策的方式传输信息。与会通过意外辐射或观察泄漏数据的 侧信道 不同,隐蔽信道往往被用来在合作代理之间秘密传输信息,经常绕过访问控制。
关键特征:
微架构 指的是CPU的硬件级实现细节,这些被设计为通过抽象对软件不可见。
微架构隐蔽信道通过利用这些 硬件状态转换 实现:
研究引用:
微架构信道利用对指令集架构(ISA)不可见的硬件状态来实现未授权的信息流。
硬件特性(如缓存、缓冲区、分支预测器)与ISA提供的抽象视图之间的差距为隐蔽信道提供了机会。
共享相同硬件的程序可以影响彼此的执行时间或行为,即使在没有直接通信信道的情况下。
定时信道 是最常见的微架构隐蔽信道。其工作原理为:
典型被滥用的资源:
当两个进程竞相争夺有限的硬件资源(如缓存集、内存控制器队列)时,常常会出现信道。
微架构隐蔽信道利用竞争对有限硬件资源的访问产生的执行时间变化。
这种竞争会导致可测量的时间差异,可以编码隐蔽信息。
在多核/线程之间共享的CPU缓存是隐蔽信道利用的宝库。
场景:
**Prime+Probe:**使用内存访问的时间来检查缓存行是否被替换。
**Flush+Reload:**依赖于共享内存,比Prime+Probe更精确。
# 伪代码:Python中的Prime+Probe循环(概念性)
import time
CACHE_SET = 0xdeadbeef # 模拟地址
def access_memory(addr):
# 模拟访问一个缓存行
pass
def prime():
for i in range(NUM_LINES):
access_memory(CACHE_SET + i * CACHE_LINE_SIZE)
def probe():
start = time.perf_counter_ns()
for i in range(NUM_LINES):
access_memory(CACHE_SET + i * CACHE_LINE_SIZE)
end = time.perf_counter_ns()
return end - start
# 发送者预置,等待,然后接收者探测并计时访问
尽管不能算作纯粹的隐蔽信道(通常被归类为侧信道漏洞),这些攻击通过展示 如何利用推测和无序执行打破安全边界,并通过微架构状态变化泄漏秘密 激发了对微架构信息泄漏的兴趣。
**类似Spectre的攻击:**利用推测执行将攻击者控制的数据注入到微架构结构中,影响受害者代码执行并可观察地改变其行为。
AutoCC代表自动发现时间中的隐蔽信道。它是一个系统化工具,用于自动查找CPU微架构资源中的隐蔽定时信道。
摘自 Marcelo et al., MICRO 2023:
AutoCC:
关键研究见解:
AutoCC发现了以前未记录的信道和流行CPU中的弱点,这表明需要紧迫的自动分析和防御。
AutoCC使用了一系列技术:
有了AutoCC,攻击者和防御者都可以获得:
由于隐蔽信道起源于硬件层面,防止或缓解它们非常具有挑战性。然而,一些高层次策略包括:
操作系统可以通过:
rdtsc 或类似指令。硬件供应商可以:
Linux通过 perf 工具提供性能监测计数器,可用于检测可能指示隐蔽信道使用的可疑微架构活动或性能异常。
perf list
# 记录进程PID 1234的缓存未命中和周期数
sudo perf stat -e cache-misses,cycles -p 1234
# 输出解析(示例输出)
# 1,234,567 cache-misses
# 23,456,789 cycles
使用 rdtsc 或 /dev/tsc 的应用可能是基于定时的攻击代码的线索。
# 列出使用 /dev/tsc 或类似的进程
lsof | grep '/dev/tsc'
# 查找引用rdtsc操作码(0f 31)的二进制文件
grep -rl -E $'\x0f\x31' /usr/bin /usr/local/bin
# 替代方法:使用strace监控可疑进程中的时间相关系统调用
strace -e trace=clock_gettime,gettimeofday -p <pid>
import subprocess
def monitor_perf(pid, duration=10):
cmd = [
'perf', 'stat', '-e', 'cache-misses,cycles',
'-p', str(pid), 'sleep', str(duration)
]
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = proc.communicate()
return out.decode(), err.decode()
# 示例用法
out, err = monitor_perf(1234)
print("Perf Output:", out)
print("Perf Errors:", err)
为了更深入的自动化,你可以解析 perf 输出以发现缓存未命中率的可疑变化,可能表明存在活跃的基于缓存的隐蔽信道活动。
import re
def parse_perf_output(perf_err):
cache_misses = re.search(r'([\d,]+)\s+cache-misses', perf_err)
cycles = re.search(r'([\d,]+)\s+cycles', perf_err)
return {
'cache_misses': int(cache_misses.group(1).replace(',', '')) if cache_misses else 0,
'cycles': int(cycles.group(1).replace(',', '')) if cycles else 0,
}
metrics = parse_perf_output(err)
print(f"Cache Misses: {metrics['cache_misses']}, Cycles: {metrics['cycles']}")
隐蔽信道应包含在以下环境的威胁模型中:
要考虑的问题:
红队 可以使用AutoCC风格的工具识别可用的外部传输方法并模拟真实世界攻击。
蓝队 和取证分析师可以使用性能计数器、操作系统跟踪日志和行为分析来搜寻隐蔽信道活动的异常迹象。
微架构隐蔽信道是当今硬件安全中最隐蔽的威胁之一。远低于经典网络或应用层漏洞的层面,它们利用现代计算的基本构建块,实现未经授权的信息流动在隔离用户和进程之间。
AutoCC和类似研究正在推动这一领域的发展,提供必要的工具和方法来发现和关闭这些信道——在攻击者有机会使用它们之前。随着CPU和防御者的共同进化,唯一不变的是,我们必须继续寻找(并从中学习)每一个新出现的隐蔽信道。
通过将监控、分析和主动威胁建模集成到安全处理流程中,组织可以走在这一隐蔽而强大的威胁矢量之前。
AutoCC:时间中隐蔽信道的自动发现
作者:Marcelo Santos等。MICRO 2023
完整论文 (PDF)
Linux perf文档
https://perf.wiki.kernel.org/index.php/Main_Page
Intel® 64和IA-32架构优化参考手册
https://software.intel.com/content/www/us/en/develop/articles/intel-sdm.html
Spectre和Meltdown攻击
https://meltdownattack.com/
对更深入的指南感兴趣吗?订阅我们的网络安全见解通讯!