安全系统体系构建方法论: 探讨

catalog

1. 安全工程的含义
2. 可用性与心理学
3. 协议 
4. 访问控制
5. 密码学
6. 分布式系统

 

1. 安全工程的含义

安全工程研究如何构建安全的系统,使系统在面对恶意攻击、错误以及灾难时仍可保持可靠性

0x1: 系统的定义

在实践中,系统可以表示为

1. 一种产品或者组件,比如加密协议、智能卡、或者PC硬件
2. 上述内容加上操作系统、通信系统和其他集合,一起组成组织的基础设施
3. 上述内容加上一个或多个应用程序(媒体播放器、浏览器、字处理程序、帐号/工资表管理软件等)
4. 上述的任何一种或者全部,再加上IT员工
5. 上面的任何一种或者全部,再加上内部用户和管理
6. 上面的任何一种或者全部,再加上客户和其他外部用户

 

2. 可用性与心理学

0x1: 人脑在哪些方面逊于计算机

人所犯错误的可预测变种根植于认知的本质属性。图示理论或思维模型,都使得人类在对人进行识别、推理与概念方面都要比计算机做得好,但如果使用了错误的模型,也使得我们更容易犯错误,广义上讲,人类操纵设备时所犯的错误可以归类为三类,这三类分类只要依赖于错误发生在"栈"中的哪个位置: 技巧层面的疏忽与过失、规则层面的错误、认知层面的错误

1. 人执行的操作通常会形成一种技巧,但这也带来一种副作用: 如果一不小心,就会导致执行谙熟的操作,而不执行真正需要执行的操作
2. 对于那些遵循规则执行的操作而言,如果遵循的是错误的规则,则操作也会沿着错误的方向进行,很多情况下(如果信息超载)都会导致人遵循最强的规则或者最通用的规则,而非最适合的规则
3. 第三类错误是由于人的认知原因造成的,即因为不能正确地理解问题,比如Click Hajacking攻击

安全比平安更困难的地方在于,有意识地开展攻击活动的攻击者总会尽力尝试系统中可利用的错误与漏洞。防御者可疑做些什么?我们希望攻击者使用那些利用后果可预测的错误,比如捕获错误,我们也希望攻击者能搜索到(或者创建)系统的用户思维模型与其实际运行逻辑中存在的不一致,如果能对这些有很好的理解,我们就可以尝试对预防措施进行工程化,比如,或许是旨在识别攻击点的认知演练上,就像使用代码逐步发现软件漏洞一样
从本质上说,防御者提提高攻击者门槛的核心是迫使攻击者的攻击向量脱离正常用户的行为轨迹,从而更大程度上地暴力出非正常化的攻击意图

0x2: 密码

密码问题是一个可用性、应用心理学与安全工程交汇的地方,它面临者着几个重大的问题

1. 人们无法记住很少使用的、频繁变更的或很多类似的数据项
2. 人们不能按需忘记某些内容
3. 回想比识别更难
4. 无意义的词汇难于记忆
5. 要找到比密码更差的身份验证机制并非易事,密码的使用对业务产生的实际的成本

总体上来说,用户通过系统身份验证的手段有以下几种(密码是其中最简单易行的一种途径)

1. 有什么: 人保留对设备的物理控制,比如遥控汽车门锁钥匙
2. 知道什么: 提交所知道的某些东西,比如密码
3. 是什么: 使用指纹或虹膜

总之,密码是重要因素,密码管理是一个严肃的现实问题,涉及心理学与技术问题,关于密码管理,主要有以下三个方面的考虑,其重要性与困难度依次上升

1. 用户是否以足够高的概率正确地输入密码
2. 用户是否能记住密码
3. 无论是意外、故意还是被欺骗所致,用户向第三方泄漏密码是否导致系统安全性被破坏

0x3: 系统问题

尽管在密码方面公众关注度增长最快的是钓鱼问题,最大的研究主体是心理学,但是还存在其他大量情况(纯技术层面问题),在这些情况下,攻击者可以采用其他方式盗取或者猜测密码或者突破系统

1. 密码可猜解次数: 密码条目与存储技术

我们可以注意到,最大的系统问题是,是否可以对密码猜解的次数进行限制

1. 在线系统: 限制了猜解次数的密码系统,例如ATM PIN
2. 离线系统: 没有限制猜解次数的称为离线,即这样一类系统,用户可以从中取回密码文件,并在另一台机器上进行猜解

2. 密码攻击模型

1. 对某个帐号的专门攻击
2. 尝试渗透某系统中的任意帐号
3. 尝试渗透任意系统中的任意帐号
4. 拒绝服务攻击

通过这种分类方法,在评估密码系统时,可以询问下列问题

1. 是否可以拒绝服务
典型的场景发生在密码系统常用的猜解攻击发现锁定策略,例如在银行系统中,在3次失败的密码尝试后,对终端和用户帐号进行锁定,之后必须由管理员重新激活帐号,这对于WEB系统来说是十分危险的,这导致了潜在的全网拒绝服务攻击,合理的做法是对猜解攻击的来源(源IP)进行识别,并针对来源进行定向的锁定

2. 保护自己还是保护其他
即如果一位用户的密码发生的泄漏,是否会危及其他可以识别的账户的安全。但很多系统在用户之间没有严格的区分,UNIX和WINDOWS等操作系统在设计时考虑了防止用户被其他用户无意间干扰(用户SESSION权限控制),但是却没有进一步防止其他用户可能采取的恶意攻击

3. 对密码输入的攻击
密码输入的保护机制通常很脆弱
    1) 接口设计
    2) 窃听
    3) 密码重试计数器的技术突破: 延时攻击

4. 密码存储攻击
    1) 单行加密: GPU穷极、彩虹表攻击。正确的方式是生成一个随机的盐(salt)。使用盐对密码进行哈希运算,并将盐与哈希值都存储在文件中
    2) 密码破解: 密文离线破解(Unix密码)、提高加密算法复杂度、提高猜解交互响应时间

5. 绝对限制
    1) 影子密码: 把加密的密码隐藏在私有文件里
    2) 使用模糊机制进行加密(Novell)
    3) 在加密中应用密钥(MVS)
    4) 随机分配密码: 军事管理机构,这样有利于估算出密码猜解攻击的概率并进行密码生命周期管理(定期更换)

0x4: CAPTCHA

人们开始尝试设计的保护机制利用了大脑的优势,典型的场景是验证码,这一系统的基本原理是: 人脑非常擅长识别,但不擅长对其进行描述。因此,我们可以设计这样一个系统,其中什么操作都允许,就是不可能让人们泄漏自己的密码,不管是有意的还是无意的,因为密码本身是易于记忆和识别但很难描述的,因此用户即使主观上想泄漏密码都很困难

 

3. 协议

典型的安全系统通常是由很进行主体构成的,例如人、公司、计算机和磁卡机,这些主体相互之间通过各种信道进行通信,例如电话、电子邮件、无线电、红外线以及银行卡和车票等可以携带并传输数据的物理设备。安全协议是对这些通信进行管理的规则,其典型的设计目标是使得系统可以在恶意攻击中"生存",这些攻击包括电话诈骗或者造假者修改火车票等数据
如果要想防御所有可能攻击,代价通常过于昂贵,因此,协议一般都是基于某些威胁假设进行设计,对协议进行评估时,必须回答两个问题: 第一,威胁模型是否能准确反映实际的攻击场景?第二,协议是否可以处理这些威胁

0x1: 密码窃听的风险

一种很常见的攻击是使用"抓取器",通过特定设备对信号进行抓取后重放,一个典型的场景是车库门或者车锁的遥控器使用序列号作为密码,这种密码通信协议存在以下几个安全问题

1. 嗅探器重放
2. 序列号穷举破解
3. 密文空间不足导致的"密文碰撞",即两把不同的钥匙保存了同样的密码
4. 序列号(密码)本身可能会被很多人能够访问,例如汽车序列号可能被所有经销商员工、或者汽车登记所的工作人员访问到、以及发票、提货单上

0x2: 简单身份验证

一种常见地、且简单的验证机制是"密钥分散化(key diversification)",典型的停车场令牌中,其密钥使用全局主密钥KM对没把钥匙对应的序列号加密得到(KM只有中央服务器知道),加密后的密文保存在停车场钥匙中: KT = {T}km
这种协议机制解决了密码猜解的风险(前提是攻击者不知道加密算法),但是还存在另外一个问题就是嗅探重放,解决这个问题方法是同时对序列号和时间戳进行加密,通过时间戳来实现重放检测和阻断

1. 质询与应答

现今很多汽车使用两步协议的遥控行门锁,一般称为"质询-应答"协议,以便对发动机启动进行实际的身份验证

1. 车钥匙插入驾驶锁时,发动机控制器向钥匙发出一个短程无线质询信号,内容是n位随机数
2. 之后,汽车钥匙对质询信号进行加密(所以每一个次密文都不一样),计算出一个应答信号
3. 发送给汽车
/*
E -> T: N
T -> N: {T,N}k
*/

但这里仍然不够安全,在这个系统中,由发动机管理单元生成的随机数实际上是可预测的,因此窃贼可能向车主口袋里的钥匙发送他预测的下一个质询信号,如果成功,就完成了部分身份验证功能,接下来就可以拿着这个得到的质询回应信号和汽车进行交互验证,同样,要解决安全问题首先要识别安全威胁,在这个攻击场景中,攻击模型的关键点在于

1. 攻击者完成了一次中间人欺骗攻击,钥匙应该对发出质询信号的来源进行合法性身份验证
2. 汽车自身的随机序列是可预测的,应该采取更强的随机熵源
3. 缺乏可信的用户接口,验证交互的信道无法保证通信的双方都是真实、可信的

2. MIG中间人攻击

3. 反射攻击

对信任假设及其后果的清晰理解是设计安全协议的核心。安全协议的正确性依赖于对需求的假设,如果协议可以阻止一种攻击,但是增大了暴力在危害更大的攻击之下的可能性,那么这样做就弊大于利

0x3: 操纵消息

我们已经看到了多种形式的中间人攻击,攻击者反射或伪造用于对参与方身份进行身份验的信息,但是还存在更加复杂的攻击形式,攻击者不仅可以伪造身份信息,还可以采用某种方式对消息内容进行操纵

0x4: 环境变化

协议失败的一个常见原因是环境变化,环境变化会导致原来成立的假设不再成立,从而安全协议就无法应对新的威胁

0x5: 选择协议攻击

"选择协议攻击"隐含的思想是,给定一个目标协议,攻击者设计一个新协议,如果诱使用户重用同样的令牌或加密密钥,就可以对其进行攻击。已经证明的是,尽管很多协议本身是安全的,但如果协议的用户在其他应用中重用相同的密钥,就可能会导致协议被攻破,典型的场景是在一张智能卡上同时绑定了多个敏感业务(例如银行业务和电表业务),则攻击者可以通过对电表业务的攻击达到窃取或者中间人受害者银行业务的目的(因为对用户来说,它可能仅仅是在进行电表业务)

0x6: 加密密钥管理

之前讨论的安全协议大多是对主体的名称或应用数据(比如对出租车计价器进行触发的脉冲)进行身份验证,实际上,另外还有一种很重要的身份验证协议,即用于管理密钥的协议,身份验证协议现在也广泛用于分布式计算机系统,以实现通常的密钥管理目的,Kerberos是第一种得到广泛应用的这类系统,windows中使用了该协议的一个变种

1. 基本密钥管理

密钥分配协议的基本思想是,在两个主体需要进行通信时,使用一个可信的第三方进行身份验证。简单的身份验证协议运行方式如下

//两个通信的主体分别称为Alice、Bob,可信的第三方为Sam
1. Alice首先呼叫Sam,申请密钥与Bob进行通信
2. Sam进行应答,向Alice发送一对证书,每个证书包括一个密钥副本
    1) 第一个加密证书只有Alice能读懂
    2) 第二个加密证书只有Bob能读懂
3. Alice呼叫Bob,提交第二个证书对自己进行介绍
4. Alice和Bob双方都用和Sam共享的密钥对相应的证书进行解密,然后才可以得到新的密钥
5. 完成自我介绍后,Alice现在可以用这个密钥向Bob发送密文,并且接收Bob返回的消息,因为双方都采用对方能懂的密钥对消息进行加密

使用协议表示法,可以把这个过程描述如下

1. A -> S: A,B
2. S -> A: {A,B,Kab,T}Kas,{A,B,Kab,T}Kbs
3. A -> B: {A,B,Kab,T}Kbs,{M}Kab

2. Needham-Schroeder协议

//Alice发起请求,告诉Sam: 我是Alice,我想和Bon通话,我的随机nonce是Na
消息1: A -> S: A,B,Na

//Sam给她提供一个会话密钥,用他和Alice共享的密钥进行加密,密文中也包括Alice的nonce,因此Alice可能断定这不是一次重发(前提是nonce本身不可预测)
消息2: S -> A: {Na,B,Kab,{Kab,A}Kbs}Kas

//Sam还给了Alice一个证书,让Alice把密钥同时转给Bob
消息3: A -> B: {Kab, A}Kbs

//Bob做一次质询/响应来检验Alice的身份有效性
消息4: B -> A: {Nb}Kab

//Alice响应质询
消息5: A -> B: {Nb - 1}Kab 

3. Kerberos

从Needham-Schroeder协议派生出来的一个重要的协议用在了Kerberos中,这是一个分布式访问控制系统,起源于MIT,是Windows 2000中默认的认证选项。Kerberos不只是一个信任的第三方,而是有两种角色

1. 让用户登陆的认证服务器
2. 给用户发放票证来允许它们访问各种资源(比如文件)的服务器
//这样就能允许分级访问管理

抛开kerberos的登录认证不谈,我们来研究下Kerberos的资源访问认证(这里的资源访问是广义的,指两个实体相互通信)

//首先,Alice使用密钥登录到认证服务器上,她PC机上的客户端软件从服务器取回一张票,它是在这个密码加密下加密的并且包含一个会话密钥Kas

//Alice希望访问发行票证的服务器S控制的资源B
A -> S: A,B

//协议产生一个密钥Kab,它带有时间戳Ts和生存期L,用来认证Alice随后和资源B间的通信
S -> A: {Ts,L,Kab,B,{Ts,L,Kab,A}Kbs}Kas

//Alice向资源B发送一个时间戳Ta来核实Kab通信密钥
A -> B: {Ts,L,Kab,A}Kbs,{A,Ta}Kab

//被访问资源B通过给发送回的时间戳加1确认它的存在性(这是一个惯例,表明所要访问的资源能够正确解密票证,并且取出密钥Kab)
B -> A: {Ta + 1}Kab

通过引入时间戳而不是随机的nonce,Needham-Schroeder的脆弱性已经得到了巩固,但是同时又存在了新的安全问题,就是各种客户端和服务器的时钟可能不同步,甚至被更复杂的攻击导致故意不同步

0x7: 走向形式化

我么知道,安全协议的基础就是假设,只有当假设成立时,安全协议对威胁模型的对抗才是有效了,一旦假设失败或者因为外部环境导致原假设不成立,则安全协议就会受到挑战,有多种方法可以说明协议的正确性 

1. BAN逻辑(一种信任逻辑): 它在已知某些消息和时间戳等条件时,推理出当事人应该信任什么
2. 随机预研模型: 它可以让协议的性能依赖于所采用的加密算法的性能
3. 主流形式化方法: CSP和Lotos

1. BAN逻辑

BAN逻辑提供了一种形式化的方法,用于对加密协议中主体应该信任的要素进行推理,其基本思想是,如果一条消息是用相关密钥加密的,并且是新鲜的(即在协议的当前运行期间生成),那么这条消息就是可信的。进一步的假设包括: 主体只对其信任的元素进行断言,有一些主体是某些陈述的身份授权者,用符号表示法描述如下

2. 形式化认证的局限性

在安全协议设计中,形式化方法是可以用于发现bug的优秀方法,这是因为形式化方法迫使设计者把每个情况都进行显式地表述,从而面临困难的设计选择,否则就无法通过形式化认证。然而,这种方法也有其局限性。需要特别注意的是,安全工程中的一个普遍问题:漏洞出现在两种保护技术的边界,往往因为两种保护技术对同一个上下文的"理解"不一致,导致原本的安全假设被打破

鉴于以上问题,人们已经研究了其他替代方法来确保身份验证协议的设计,其中包括协议鲁棒性(protocol robustness)思想,正如结构化编程技术的目标是确保系统化地设计软件而不遗漏任何要点,鲁棒性协议设计的目标主要是为了明晰。鲁棒性原则包括

1. 一个协议的阐述只应该根据它的内容,而不是其上下文
2. 每个要素(比如主体的名称)都应该在消息中显式声明
3. 如果协议中采取了公钥密码学或者数字签名机制,还有更多的技术鲁棒性问题

 

4. 访问控制

0x1: 引言

访问控制是计算机安全领域的一个传统重心,也是安全工程和计算机科学的交汇处。访问控制主要用于控制主体(用户、进程、计算机..)对系统中资源的访问,即哪个文件可读、哪个文件可以执行、怎样与其他主体共享数据,等等。访问控制可以在很多层面工作,例如

1. 应用程序
用户在应用层看到的访问控制机制具有非常丰富的复杂安全策略,现代的在线商务会在几十个不同的角色中给职员分配角色,每个角色都可以开展系统中数百种可能交易的一些子集,有些交易(比如退款)可能需要双重控制或管理员的许可

2. 中间件
应用程序可以在中间件(如数据库管理系统)之上进行编写,这可以增强很多保护属性。典型的数据库软件内置一些访问控制机制,其中规定了指定的用户可以选择哪些字段、以及可以运行哪些过程
中间件使用底层操作系统提供的功能,由于它由文件和来自更底层组件的通信端口等资源构成,所有需要提供对这些资源进行访问控制的功能

3. 操作系统
操作系统的访问控制通常依赖于处理器或者相关内存管理硬件提供的硬件功能,这会对程序可以访问哪些内存地址进行控制(windows的保护内存模式)

4. 硬件

随着我们从硬件发展到操作系统和中间件再到应用层,控制渐渐变得复杂、不可靠,实际上大多数计算机诈骗都是因为员工偶然发现它们可以投机取巧地利用某些应用代码,或者在系统认为不会发生某些事情的地方却偏偏出现此类事件(未捕获的边界问题)。我们接下来集中讨论硬件和操作系统的访问控制(应用层控制有不同的原理,在另一个章节讨论),因为操作系统机制的保护需求是硬件保护系统设计的驱动之源
需要明白的是,访问控制只在以安全为目标的情况下才有意义,用来表达一种安全策略 

0x2: 操作系统访问控制

操作系统提供的访问控制一般使用口令或者Kerberos机制对当事人进行认证,然后调度它们访问文件、通信端口和其他系统资源,这就是常说的Linux SELINUX访问控制

访问控制矩阵(二维或者三维)可以用来实现保护机制,也可以只是建立保护机制的模型,但是它们的缩放效果不好,不仅有性能问题,还(可能)会导致管理员发生错误,通常我们需要使用一种更简洁的方法来存储和管理信息,主要有以下几种方法

1. 采用组或者角色来同步管理大量用户的特权,例如linux中的user、group、other文件ACL权限管理模型
2. 按照访问控制矩阵来进行管理
    1) 列: 访问控制列表
    2) 行: 能力(有时称为"票据")或证书

1. 组和角色

在很多系统上严谨的定义如下,组是一组当事人的列表,角色是一些固定的访问许可权限

2. 访问控制列表

简化访问权限管理的另一个方法(除了角色管理)是,每次存储访问控制矩阵一列,同时还包括那一列所指定的资源,这称为访问控制列表,又称之为ACL。ACL作为管理安全状况的方法有很多优缺点,可以分为ACL的一般属性和个别实现中的特殊属性

1. ACL广泛应用在用户管理自己文件安全的环境里,而不太适合于用户人数众多并且经常变化的环境,或者用户在某段时间把权限委托给其他用户来运行一个特定程序的环境,因为ACL是一种面向"主体"进行授权的权限控制
2. ACL易于实现,但是作为一种运行时安全检查方法却不是总是有效,因为操作系统只知道哪个用户正在运行特定的程序,却不知道哪个文件调用后被授权访问过
3. 操作系统必须在每次访问文件时检查ACL,或者用其他的方式跟踪激活的访问权
4. 把访问规则分配到ACL中,要找出用户有权访问的所有文件、确认一个不存在一个可以让任何人有权可写入的文件,这需要检查上百万个用户文件中的ACL

3. Unix操作系统的安全

在Unix(以及由其衍生出来的流行的Linux操作系统中)典型的是采取了基于角色的访问控制模型,即每个文件都规定了资源拥有者、组、任意用户赋予简单的rwx属性,在Unix系统中,机器启动(操作系统内核)时有控制权的程序以超级用户身份运行,可以不受限地访问整个机器,其他所有程序都作为一般用户,由超级用户分配访问权限,这意味着系统管理员可以做任何事情,我们很难将审计跟踪实现为让其无法修改的文件。这意味着,如果黑客成为系统管理员,就可以清除所有的入侵证据

另外,ACL只包含用户名称,不包含程序名称,这样就不能直接实现访问三元组(用户、程序、文件),Unix提供了一个间接的替代方法,就是suid文件属性。程序的所有者可以将其标记为suid,这样该程序就可以以所有者权限临时运行,而不是以调用该程序的用户的权限运行。但是,本来很自然地应该用三维模型-三元组(用户、程序、文件)来描述的访问控制问题,实际上却用二维机制来实现,这种二维机制没有三元组模型直观,因此,人们实现时经常犯错,典型地是将应用程序实现为suid root,这样就可以做任何事情,这导致一个安全风险转移的问题,即访问控制决策的责任从操作系统环境转移到了应用程序上

4. Apple OS/X

Apple OS/X采取了和Windows或Linux不同的特权用户思路,在文件系统曾,OS/X几乎是标准的Unix,默认安装时,根帐号是禁用的,但可以对系统进行管理的用户位于名为wheel组中,并可以提权为root,在这种设计下,如果你i确实是系统管理员,在安装一个新程序之前就必须输入根密码,这有效防止了用户在不知情的情况下安装了恶意软件

5. windows基本体系结构

windows的保护机制在很大程度上基于从windows NT开始使用的访问控制列表,Windows NT(Windows v4)的保护机制与Unix非常类似,或者说是从中得到启发,这也遵循了Windows的一贯哲学: "接受并扩展"

1. Windows不仅具有读、写、执行属性,还有成为所有者(take ownership)、改变权限(change permission)和删除(delete)等单独属性,这意味着Windows支持更加灵活的授权行为
2. 这些属性既可用于组,也可以用于用户,组权限与Unix系统中的suid程序具有相同的效果
3. 与Unix中只是简单的""""相比,Windows中的属性可以设置为更多的值: AccessDenied、AccessAllowed、SystemAudit,并按照这个优先级进行解析,如果相关用户或组的ACL中看到AccessDedied,就不用考虑是否出现了冲突的AccessAllowed标志
4. 用户和资源可以分配到不同管理员的域中,并且在域之间实现单向或双向的信任继承

6. 能力

对访问控制矩阵进行管理的另一种方法是按行存储,这称为能力(capability)

对于ACL来说,能力(权能)的强弱或多或少是与之对立的。运行时安全检查更加高效,但同时,改变文件的状态变得更加棘手,因为很难找出哪个用户有访问权限,当调查一次事故或者为一个案件准备证据时,会很费力。事实上,如果我们深入思考基于能力(权能)模型的访问控制策略的本质,我们会发现公钥证书验证模型就是一种权能验证,因为公私钥的本质就是主体宣称并证明自己对某个客体资源拥有访问权限,非对称加密技术和访问控制之间存在大量的共通点

7. Windows新增的特性

从大型机访问控制产品到研究型系统,很多系统都结合了ACL和能力(权能)这两种方法,试图达到最佳效果,但权能最重要的应用是在Windows系统中

1. Windows 2000以两种方式增加能力,可以覆盖或者补充Windows NT中的ACL
    1) 通过配置文件,将用户或组放入白名单或黑名单中
    2) 安全策略以组为单位设置,而不是整个系统使用一个策略,组被当作集中配置管理和控制(组策略可以覆盖单个配置文件)的基本方法,组策略可以与站点、域或阻止单元等关联,所以可以通过合理的命名来解决一些复杂的实际问题
2. 策略可以通过标准工具创建,也可以通过自定义编码实现
3. 组在活动目录(Active Directory)中定义,活动目录是面向对象的数据库,它在一个层次化的命名空间内把用户、组、机器和组织单元组织起来,并为其设置索引,这样就可以搜索到任何属性,对于个体资源,也拥有了细粒度的访问控制列表
4. Windows 2000中的Kerberos是Windows中网络身份验证的主要方法,并封装在安全支持提供者接口(security support provider interface SSPI)中,让管理者可以插入其他身份验证服务
5. 在很多应用程序中,人们使用公钥协议TLS,该协议在网络上应用得非常广泛,其基础是公钥证书,这些证书的管理在活动目录范围之外提供了一个面向能力的访问控制层
6. Windows vista引入了更多的保护机制,其中最重要的可能就是"计量包",其用途是从以前那种所有软件都以根权限运行的状况中脱离出来
    1) 系统内核对开发者是关闭的
    2) 图形子系统被从内核中移除,大多数驱动程序也从中移除
    3) 用户账户控制(UAC)取代了用户默认赋予的管理员权限
7. 在vista中,管理员登录时,系统会为其提供两个访问令牌
    1) 一个用于标准权限: 标准权限令牌用于启动桌面进程explorere.exe,并作为后续用户进程的父进程
    2) 一个用于管理员权限: 当某个任务启动需要管理员权限时,用户会看到一个提权提示(elevation prompt),并要求其输入管理员密码进行授权
8. Windows vista在文件完整性层次上提供了进一步的控制机制,其基本思想是,低完整性的进程(比如从internet下载的代码)不应修改高完整性的数据(比如系统文件)

8. 中间件

在一个典型的情况下,银行支行的簿记系统在数据库产品上运行,而数据库在操作系统看来就是一个大型的文件,这意味着,访问控制必须在数据库中实现,操作系统所处的维度过于高,导致它无法看到所有的业务细节

1. 数据库访问控制
数据库产品(如Oracle、DB2、Mysql),有自己的访问控制机制,从操作系统角度看,数据库就是一个大型文件,操作系统所能做的就是尽可能识别用户,并将数据库与运行在同一台机器上的其他应用程序分离。通常,数据库访问控制是在操作系统机制上进行建模的,典型的情况下,其特权对用户和对象都是可用的(因此该机制是访问控制列表与能力的混合),然而,典型的数据库访问控制体系结构甚至比Windows还要复杂: Oracle是上百种系统特权,其中至少有6种可以完全接管系统,Mysql中包含了更加细粒度的库、表、字段级别的访问控制。因为这些数据库产品非常复杂,用户试图控制的元素通常会包含比文件或进程更高层次的抽象,由此带来的负面影响是,除非开发人员准确知道自己正在做什么,否则就可能在不经意间留下后门

有些产品允许开发者绕过操作系统的控制机制,例如SQLSERVER同时提供操作系统帐号(其用户必须由平台在外部进行身份验证)与数据库帐号。在很多安装中,数据库可以直接从外部访问,这导致了很多问题,从默认密码到网络协议中的漏洞,即便通过WEB前端将数据库与外部隔离开来,也通常会包含SQL代码被注入到数据库中的漏洞

2. 通常的中间件问题
在中间件安全与应用层访问控制方面,有很多常见的问题
    1) 粒度问题: 由于操作系统是以文件为对象进行处理的,文件通常是访问控制机制可以施加到的最小对象
    2) 状态问题: 访问控制规则涉及到对状态的管理
    3) 层次问题: 在机器层、网络层和应用层,通常会采取不同的访问控制系统,而不同层面的访问控制系统可能导致"边界问题",即对同一个场景理解不一致导致的绕过

3. ORB与策略语言

9. 沙盒与携带证明的代码

Sun公司在其Java程序设计语言中引入了软件沙盒(sandbox)技术,该技术试图建模的场景是: 用户需要运行从网络上下载的代码(作为applet),但又担心这个小程序可能会做一些恶意行为
为了解决这个问题,Java设计者给这些代码提供一个"沙盒",一个受限的环境,在该环境内不能访问本地磁盘(或者至多只能临时访问受限的目录),并且只允许与自己的主机进行通信。用解释器(Java虚拟机JVM)来执行代码就可以满足这些安全目标,JVM只有有限的访问权
携带证明的代码是一种替代方法,这里,要执行的代码必须持有证明保证它不会做出违反本地安全策略的事情,这种方法不会像解释器那样导致速度低下,但是不得不在执行代码之前信任一个简短的程序,由它去核实对下载的程序所提供的证明,而不再需要增加JVM的负载

10. 虚拟化

虚拟技术可以将单一计算机模拟成为多台独立的计算机

11. 可信计算

可信计算的目的的提供更安全的的PC,该项目宣称的目标是在PC体系结构基础上提供软件与硬件附件,以确保给定的程序确实以符合给定规范的形式在计算机上运行

1. 硬件角度的方案是添加一个芯片,即可信平台模块(TPM),该模块可以在PC启动时对其进行检测,并向操作系统报告其状态,密钥也依赖于该状态生成。由此,如果平台被修改(如改变了引导ROM或磁盘控制器),就会计算出不同的密钥,并且以前加密的数据也不再可用
2. PC机也可以使用其TPM来向其他PC证明自己具有"批准的"配置,这是一个被称为远程证明(remote attestation)的过程
3. 除正常的操作系统外,Windows还包含一个Nexus,即一个很小的仅仅用于验证的内核,该内核可以直接与TPM硬件以及监控器交互,而每个应用程序也有一个Nexus控制程序(NCP Nexus Control Program),NCP运行在安全虚拟机中的Nexus之上,对关键性要素(如密钥)进行管理,并且,NCP可以直接访问硬件,通过这种方式,媒体播放器等DRM程序可以将密钥保存在其NCP中,并且其直接向屏幕与扬声器输出相应内容

0x3: 硬件保护

大多数访问控制系统不仅要控制用户的行为,还要限制程序的行为,在大多数系统中,用户可以编写或者下载安装程序,因此,程序中可能包含漏洞甚至恶意代码

1. 保护问题(protection problem)的定义是防止一个程序干扰其他程序
2. 限制问题(confinement problem)通常定义为防止程序通过未授权的通道与外部通信

这通常意味着硬件访问控制必须与处理器的内存管理功能整合起来,段寻址(segment addressing)就是一种典型的机制,内存是通过两个寄存器寻址的,其中段寄存器指向内存段,而地址寄存器指向段内的位置,段寄存器是由操作系统控制的,它是连接访问控制机制和硬件的桥梁,这就是后来的ring0、ring3隔离技术

1. Intel处理器与可信计算

很多机制都支持保护环,当前权限级别只能由ring0进程更改,程序不能直接访问低层级环内的对象,但是有一些门(gate),允许在不同的权限级别执行代码,并管理支持性基础设置,比如给不同权限级别准备多个堆栈段、异常处理等

Intel已经实现和使用的一个硬件特性是x86的虚拟化支持,也就是Intel VT(Vanderpool),AMD也提供的等效的硬件特性,带有这些扩展性的处理器可以使用Xen等产品来运行未修改的客户操作系统

2. ARM处理器

3. 安全处理器

0x4: 存在的问题

在任何时候,网络上都可能传播着几十个已知的安全威胁,并散布着其攻击脚本/工具,漏洞有其典型的生命周期

1. 发现漏洞: 报告给CERT或产品销售商
2. 发布相应补丁: 补丁被逆向分析,并出现针对该漏洞的批量渗透工具
3. 没有及时打补丁的用户发现自己的计算机已经沦陷为僵尸网络的成员
4. 而其ISP则对其进行阻断、封停以防止其发送垃圾邮件、DDOS其他用户

传统上,攻击者的目标是在系统中获得一个正常帐号并成为系统管理员,以便完全地控制系统,但最近几年,一般用户与根用户的区别不再那么重要,这只要有两个原因

1. Windows、Linux上运行的主流应用程序(特别是WEB容器)都需要以管理员权限才能运行,因此攻击者突破了这样的应用程序获取的必然就是管理员权限
2. 攻击者已经开始将重点放在突破大量的PC机,并将其组织为僵尸网络,以便发送垃圾邮件或者DDOS攻击

1. 破坏堆栈(缓冲区溢出漏洞)

2. 其他攻击技术

3. 用户接口失败

6. 环境变化 

我们知道,很多安全失败都是由于环境变化破坏了原有安全模型而导致的,通常,在受限环境中可以胜任的机制在更普遍的环境中会失败

0x5: 小结

访问控制机制运行在系统中的多个层次上,从应用程序层向下到中间层,再到操作系统与硬件层等,更高层的机制可能具有更强的表述能力,但由于很多原因(从内在复杂性到 实施技术水平等)也更容易遭受攻击。大部分攻击都涉及那些较容易利用的bug,以及大规模庞大和/和应用广泛(如操作系统与数据库)的软件产品,这样的软件特别容易产生安全漏洞并被公布,在所有层次上,系统也容易受到因环境变化而导致设计时的原始假设被破坏带来的攻击

Relevant Link:

http://www.cnblogs.com/LittleHann/p/4705880.html

 

5. 密码学

6. 分布式系统

0x2: 并发

并发编程是一个艰巨的任务,它不仅仅局限于操作系统内部和线程管理这样的狭窄范围内,并发控制同样是一个安全问题,像访问控制一样,并发控制也可以用来阻止用户之间有意或无意的干扰。此外,并发问题在系统中可以表现为从硬件层到业务层等多个层次

1. 使用陈旧数据与状态传播成本

并发方式存在的两种问题

1. 攻击者可以使用过期的凭据对协议进行重放攻击
2. 存在竞争问题,例如Unix下的mkdir漏洞,其中有一个分两阶段执行的特权指令,攻击者会对其操作的对象进行重命名,从而在进程的中途攻击该指令

有很多实例是关于检查时间到使用时间(time-of-check-to-time-of-use TOCTTOU)内的攻击,存在用于在文件系统中发现这类攻击的系统化方法,在业务逻辑层也存在类似的情况。阻止这些攻击总是比较麻烦,因为安全状态变更的传播需要付出一些成本

2. 通过锁机制防止不一致的更新

锁作为一种管理资源(例如文件系统)一致性和减少更新冲突可能性的方式是很重要的。另一种机制是回调(callback),服务器可以保留一个安全状态依赖于它的客户的列表,并在状态发生变化时通知它们。在安全的分布式系统中,锁与回调机制同样有效

3. 更新顺序

4. 死锁

死锁是另外一个问题,事情可能因为两个系统都在等待对方先行动而变得很麻烦

5. 不收敛状态

在设计用于更新分布式系统状态的协议时,完美的状态是ACID: 交易应该是原子的(atomic)、一致的(consistent)、隔离的(isolated)、持久的(durable)。将系统设计成收敛的(convergent)通常是足够的,这意味着,如果交易量减少,那么处于中间态的交易将逐渐减少,最终会全部变为一致的状态

6. 安全时间

并发问题的最后一类问题是提供精确的时间,攻击者可以利用时钟中的错误攻击Kerberos这类身份验证协议,因此,在网络中,简单地信任一个时间源是不够的,在大多数应用程序中最终会使用网络时间协议(NTP Network time protocol),其中提供了适当的保护机制,并辅以时钟"投票"与时间服务器身份验证等

0x3: 容错与故障恢复

Relevant Link:

Copyright (c) 2015 LittleHann All rights reserved

posted @ 2017-04-23 10:23  郑瀚Andrew  阅读(343)  评论(0编辑  收藏  举报