zoukankan      html  css  js  c++  java
  • (转载)虚拟环境中的隐蔽信道

    此篇来源于实习期间的一次Presentation,仅作科普之用。

    隐蔽信道指允许系统进程以危害系统安全策略的方式传输信息的通信通道。或者说是不是被设计,或本意不是用来传输信息的通信信道。

    通常分为两类。

    (1)存储隐蔽信道,一个进程直接或间接写一个存储位置,被另外一个进程直接或间接读,从而传递信息。

    (2)时间隐蔽信道,以某种方式modulate系统资源使用,从而影响了真实的响应时间,被另一个进程观测到,从而传递信息。其后的例子大多是时间隐蔽信道。

    1. CPU Load based Covert Channels

    CPU 负载基于的。

    在虚拟化环境中,CPU或核心一般会被多个虚拟机和进程共享。改变CPU负载,通过改变CPU的负载,让另一个进程感觉到这个改变,就是时间的改变,从而传输二进制信息。

    Domain U可以通过测量在标准时间timespan内完成任务unitcomp的次数,知道Domain V是否在进行某种计算。Timespan结束时,比较执行次数预先设定的标准值的差。如果这个差值大于了设定的threshold,判定为reveiver接收了bit 1,否则则为bit 0。

    对于多核心的CPU,可以使用sender group和receiver group,只要有一组sender和receiver分在了一个核心上,这个隐蔽信道就可以工作。

    如果同一个物理主机上,有其他的domain活动,传输的准确率会受到影响。

    TT总结:Domain U和Domain V分别代表不同的虚拟机吗?因为Hypersivor会为他们分配不同的域给他们。

    不是这样的?????

    2. CPU SMT based Covert Channel(基于CPU同步多线程的隐蔽信道)

    SMT,simultaneous multi-threading,利用CPU结构上的同步多线程。与前一个的方法类似。

    并发的线程会共享功能单元(functional units),会在每个CPU的cycle(周期)动态分配给每个进程。通过功能单元竞争,一个进程能够扰动另外一个,导致了隐蔽信道。

     

    TT问:具体功能单元都有哪些?他们是怎么共享功能单元的?

    并发进程知道知道其他人和他们一起共享功能单元吗?不是隔离的吗??看来进程会执行具体的指令,这应该就是代码级的吧??

    例如,为了发送bit 1,insider会call MULTIPLY()函数,执行固定数目的指令,以使用了全部的乘法运算器。为了发送bit 0,insider会call NULL(),执行数次 NOP()No operation()函数。而observer通过执行RUN()函数,以固定速率执行整数乘法指令。感受到执行变慢,知道在传输bit 0,否则是bit 1。

    TT问:两个进程要共享乘法运算器,估计乘法运算器、NOP()No operation()函数。有一个问题困扰我的就是,其实当时共享功能单元的,肯定除了发送方和接收方,还有其他的进程。所以我觉得,隐蔽信道里还有其他虚拟机引入的噪声,我觉得应该采用什么方式把噪声去掉。

     

    3. CPU Cache based Covert Channel(基于CPU缓存的隐蔽信道)

    利用了共享CPU Cache。这个攻击考虑到了noise的问题,利用做差的方法消除了noise。把cache分为了偶sets和奇sets,每一个memory address被映射到了一个特定的cache set。

    Sender 分配了一块连续的Buffer A,大小比被攻击的cache line大,为了传输bit 0,他读Buffer A中的偶地址,确保了cache sets中的一类完全被使用,而另一类,完全没有被使用。

    Receiver通过如下方式定义差值。

    (1)分配一个连续的buffer B,大小比被攻击的cache level小。

    (2)暂时休眠,为了建立与调度器的credit

    (3)读全部的buffer B,确保buffer B被全部cached。

    (4)Busy-loop,确保CPU cycle计数器跳到了一个很大的值。希望在这段时间内,调度器被sender使用,也就是前一页的操作,使得cache sets中的一类被重写,一类完全没有动过。

    (5)测量读Buffer B中所有偶地址的时间,同样的测量奇地址的时间,当且仅当差值是正的时候,判定为传输的bit0。因为一类是从cache中直接读入,另一类被sender从cache中擦除,需要从memory中重新读入再写入cache中,时间比较长。

    4. Data Deduplication based Covert Channel

    利用了云存储中重复数据删除的机制。重复数据删除有两种版本,一种是source-based的,一种是cross-user的。Source-based的,在用户端执行,上传前检测是否有相同的文件或block。Cross-user的,区别是在于上传时与其他用户的数据进行比较。

    一个用户可以观测到一个特定的文件或block是否被执行了重复数据删除,这个过程可以通过检测网络的数据传输量来实现,因为如果相同的文件或block存在,这个文件或block将不会被再次上传。

    在cross-user中,存在隐蔽信道,一个恶意软件,生成一个文件的两个版本,X0和X1,存储在了domain U上,希望传输bit 0,则存储X0,bit 1则X1。然后使用云存储服务存储这个文件。

    而在domain V中,相同的服务,通过检测网络传输量,知道domain U上传的那个版本,从而代表bit 0或bit 1。

    对抗策略:使用数据加密,不同的密钥使每个文件不同,从而消除deduplication,但不是个好的方法。或者是deduplication只可以被执行在server端。或对于重复的文件,设置一个随机的threshold,当重复的文件数目超过了这个threshold才会进行deduplication操作。

    5. Memory Deduplication based Covert Channel

    Memory的重复数据删除,名字与前一个类似,但机制不同。Memory的重复数据删除合并了在同一台物理主机上的相同内容的memory page,有效利用了资源。

    由于Copy-On-Write的机制,当数据要被写于一个deduplication page时,页面会被重新创建一个副本,这导致了write access time 比正常情况下要慢,也就是说对于deduplication 的page和nondeduplication的page写的时间是不同的,利用这个时间区别进行隐蔽信道攻击。这样可以用来检测被攻击主机上正在运行或刚结束运行的程序,因为程序驻留内存的一些机制。

    对抗策略:目标memory中包含一些可read-only的page,他们不会在page的life time中改变。或victim的OS中包含一些模糊码,使得每次访问memory image的runtime不同。或写操作延迟,但不是个好的办法。

  • 相关阅读:
    C# 数据库连接字符串拼接
    C# 线程同步计数存在的问题
    字符串操作
    字符串位置
    6个基本函数
    占位符
    str转换成int
    python运算符6
    python运算符5
    python运算符4
  • 原文地址:https://www.cnblogs.com/meihao1989/p/3111967.html
Copyright © 2011-2022 走看看