zoukankan      html  css  js  c++  java
  • 软件分析笔记7 Security

    下面几节课都比较轻松,内容偏科普性质

    Security

    Achieving some goals in the presence of adversaries

    这个概括可以说是很简练了

    统计意义下最常见的两类漏洞:

    1. Injection Errors
    2. Information leaks

    这两者本质上都是信息流的错误流动,因此就自然引出信息流安全的问题和分析

    Information Flow

    字面意思....前面指针分析本质上是对数据流的分析,而数据流正是信息流的一种

    IF的安全问题在于出现了unwanted infowmation flow,即本应该流向x处的信息流向了y处,举个例子就是本来应该发给plmm的情书一不小心塞进了好基友的书包里....
    那么想要保持安全,我们的目标就是阻止非法信息流

    Access Control

    即对信息上锁,每次获取信息的时候要求通行权限
    AC主要关心信息是否被获取,而不关心后续对信息操作的流程。可以认为是点上的安全措施

    同样用情书举例,AC就是基友在任何东西进包之前都要检查这东西能不能进包,以此来阻止上述情况

    而信息流安全则关注的是不同节点之间的联系以及互动,因此又被叫做端到端的安全措施

    Information Flow Security

    IFS会(1)把变量分成若干安全等级,并(2)规定流动法则。最简单的分级就是分成高、低安全等级

    Security Level

    举例中国保密的四级:绝密>机密>秘密>公开
    同时等级并不一定是全序的,比如公司内两个部门可以不互通内部信息,但是最高决策者应当看到所有的信息

    这意味着我们可以用lattice对等级进行建模

    Flow Policy

    经典方法是Noninterference policy,它要求"高等级的信息不应该影响(流向)低级信息"
    这句话比较抽象,这里的“影响”或许要从信息论的角度来理解。例如a=b+c,若a、b均为低级,则c不能为高级(否则可以通过获取a和b来计算出c的值)

    同时还提到了两个概念

    Confidentiality

    就是要防止机密信息泄露

    Integrity

    保证Integrity的广义要求是保证数据的准确性(不应被低等级信息污染)、完整性(不应该丢失)、一致性(在传输过程中不应该变化)
    狭义地讲,就是要防止危险信息的流入(例如各种注入攻击)

    这两种保护可以看成是分别对读/写的保护

    泄露的情况又分为两种

    Implicit Flow

    考虑如果H信息对程序的控制流产生了影响,且这段受影响的控制流有着对L信息的不同的副作用,那么显然可以通过监听L信息的变化来判断控制流的流向,并间接推断出H信息

    例如这样一段代码

    switch (high) {
    	case 1: case 2: {
    		low = 0;
    		break;
    	}
    	case 3: {
    		low = 1;
    		break;
    	}
    	case 4: {
    		low = 2;
    		break;
    	}
    	default: {
    		low = 3;
    	}
    }
    

    只需观测low即可得到high的信息

    Convert/Hidden Channels

    在计算机系统中传输信息的组件被称为信道(channels)
    如果某段代码本来目的并不是传输信息,但最终它传递了某种信息,则称为这是一个隐藏信道

    PPT给了四个例子

    Implicit Flows

    通过控制流泄露信息

    if (high < 0) low = 1;
    else low = 2;
    

    Termination Channels

    通过是否结束(运行状态)泄露信息

    while (high<0) {...}
    

    Timing Channels

    通过运行时间泄露信息

    if(high>0) SPEND_A_LONG_TIME();
    

    Exceptions

    通过异常泄露信息

    if (high>0) throw new Exception("exception");
    

    此外还有很多,一些听起来就很牛逼的比如观察缓存命中率来推断一些关键信息(这个要怎么做啊好想知道啊看起来好好玩啊洗礼太洗礼太)

    通过对比explicit flow和implicit flow我们可以发现

    1. explicit flow泄露的信息不会更少(毕竟全露了)。举例就是在if的控制流泄露中,implicit只泄露了1bit的信息量
    2. implicit flow很难实现数据的更改,往往只能获得信息
      因此目前的主要研究对象就是显式流的规避

    Taint Analysis

    污点分析首先对数据分类:感兴趣的数据则打上标记,否则没有标记
    然后将一些函数/方法标记为source,表示污点数据会以函数的返回值进入程序
    将一些方法标记为sink,表示这些是我们关注的关键部分
    那么这个分析要回答的问题就是:是否有污点数据从source流向了sink?

    可以类比一下动物学中的标志法求群体迁徙路线...

    本文来自博客园,作者:jjppp。本博客所有文章除特别声明外,均采用CC BY-SA 4.0 协议

  • 相关阅读:
    11.28 正则表达式
    12.28jQuery 的取值赋值
    11.27 上传下载 图片预览
    11.28 验证控件
    12.23,repeater 分页显示
    12.23,搜索标记
    1.基础CRUD
    C#杀进程与之之子进程
    使用procedump捕获未处理异常的dump
    [.net core] 12.环境变量
  • 原文地址:https://www.cnblogs.com/jjppp/p/15116560.html
Copyright © 2011-2022 走看看