54 CHEN

网络安全基础一览

网络安全这个话题太庞大了,本文力求总结过去半年的经验。

CyBOK范围给网络安全定义了21种知识领域(KAs)。其中三大块有 系统安全,基础架构安全,软件和平台安全。 伴随而来的网络犯罪也是颇成体系,并且全球范围内有一整套成体系的网络犯罪商业链条。不单单为了商业目的,也有政治目的,个人目的,地理目的,攻击点目的等等。其直接经济消耗达到172B美元。网络安全的目的,是研究如何保护网络不受此类行为干扰的一系列措施和策略。

术语

网络犯罪

为了描述网络犯罪,Palo把其分成四部分:actions行为,targets目标,resources资源,operating envrionment操作环境。通过去审视一项行为,放到这四个分类下来看其性质。另一个方法是大名鼎鼎的MITRE的ATT&CK框架。此框架有14大类策略分类,每个分类下又有详细的技术,可谓是十分的详尽。

基础信息安全属性

CIA属性也是非常常见的信息安全属性。Confidentiality定义了只有授权方才有权 看到 信息,即 保密性。Integrity定义了只有授权方才有权 修改 信息,即 完整性。Availability定义了只有授权方才有权 使用 信息,即 可用性。

除了常见CIA,还会遇到三个:Authentication定义系统认证能力。Authorization定义了系统的赋权能力。Non-repudiation定义了系统内发生的行为不可抵赖能力。

漏洞 威胁 控制 三范式

这三个也是较常见的:Vulnerability 系统的弱点可导致系统发生本不应该发生的情况,即漏洞。Threat 威胁是有可能是一连串的有可能会带来危害的事件。Control 控制是一种行为、设备、流程、技术,其可用来减缓漏洞。

A threat is blocked by the control of a vulnerability

一项威胁可因控制一个漏洞可被排除。

威胁类型

著名的STRIDE模型:

Spoofing-Authentication

Tampering-Integrity

Repudiation-Non-repudiation

Information Disclosure-Confidentiality

Denial of Service-Availability

Elevation of Privilege-Authorization

威胁代理

可以是一个人、组织甚至是国家。采取的办法为 技术漏洞,网络安全知识缺乏,技术开发bug。

攻击动机

理解攻击动机来提升防备。

认证

AAA: Authentication 谁可以登录。 Authorization 谁可以做什么事。 Accounting 记录所有的日志以备审查。

认证又分两部分:注册和验证

注册

identity(身份) 定义为一系列与某一实体相关的属性。用户注册的时候就会提供各种各样的属性,比如说名字、地址、年龄等等。属性最小化很有必要。于是便有了NIST身份安全等级。

IAL1 什么都不要求。

IAL2 开始要求一些真人存在的属性。

IAL3 必须要真人出现才能完成注册了。

一般的服务,如果不需要个人信息的话,都是IAL1 。

认证所基于的属性

你知道的东西:密码啥的

你有的东西:物理的钥匙啥的

你的东西:指纹

你干了什么:打键盘

你在哪里:地理位置

NIST电子身份模型

NIST SP 800-63-3把注册登录这事给定义得一清二楚,细到不能再细。

身份:用户和电子邮箱都是用户取的,带一定属性。

用户名要求 过滤 + 正常化(就是把特殊字符处理)+限制长度

用邮箱的话 要求 验证是不是邮箱以及二次确认。

认证时用的密码

永远不要直接保存用户的明文密码。

攻击用户的密码:暴力攻击 字典攻击

彩虹表

直接保存所有可能的hash是不现实的一种办法,于是就有了彩虹表。彩虹表计算了大量的hash,但并不全部保存。其使用了hash链的办法,用时间换了空间,折中了一下。

hash链里需要自己准备一个reduce方法将各处链起来。

密码破解工具:Kali系统里一堆。

对策

加盐:hash密码前要加盐,盐也要保存。

使用密码专用hash:bcrypt, scrypt, argon2. 特点是慢得可以,还能自己定义快慢。

还有加pepper的:固定的盐直接在代码层面的静态值。有一丁丁点用。

实践

相同密码强度下,宁选长度更长但复杂度更低的,因为人脑更容易记。

SSO

现在的乱像:一个组织里一堆系统,各用各的登录注册。会出现的问题有:密码疲劳,用户体验差,较高可能性有潜在漏洞。

错SSO:微软也用。 机器上保存了加密算法加密后的票据。可能会丢。伪SSO:把所有系统的票据都给保存下来,模拟访问相应的系统。

真SSO:认证只发生一次。SAML 安全确信标记语言。2.0版本。

其他

UNIX的UID,root用户是0。

弱点和漏洞

弱点

weakness 弱点是指软硬件中的 有责任无责任的各种错误、bugs、各种导致影响的出错,其是在 实现、代码、设计、基础架构层面就出现了,不解的话将可能被攻击。

弱点例子:buffer溢出 整型溢出 格式化字符串问题 结构体验证问题 等等

CWE MITRE的CWE天天报这种弱点。

漏洞

vulnerabilities 软件弱点+环境 将导致 漏洞 发生。

CVE MITRE的CVE也是全球闻名。

漏洞开发

exploit 漏洞开发就是一段代码、脚本、一系列的说明,用来利用某个漏洞取得好处。

CVSS 公共漏洞打分系统,用来给漏洞打分告诉大家严重性。由大类打分合成,最基础的是base score,只有它是必须的。

CAPEC 公共攻击模式枚举分类平台。

OVERFLOWS

整型溢出:比如8位的数字到了256 。只要一个整型的数字增加到它不能保存的时候就发生溢出了。发生后数字变成非常小的负数。特别当这个数字是用户输入的时候,再加上如果有在做内存开辟,复制,连接等等的操作的话,其风险是非常大的。

1996年,一个64位的浮点数被赋给了一个16位的整型。损失超过7b美元。

小心所有的算术运算,小心用户输入,测试边界,特别小心数据下标计算。可能的话使用无符号整型更易验证。

源代码安全分析

SonarQube, Gitlab SAST等等。

Qodescape for PHP。

缓冲区溢出

buffer overflow给攻击者留下了可读写更多数据的空间。

程序内存布局

TEXT 代码段 程序代码

DATA 数据段 已初始化的全局和静态变量

BSS 未初始化的全局变量和静态变量

栈 不固定长度,函数里的本地变量。参数,返回的address,前一frame的指针(调用一个函数会创建一个栈frame)。LIFO后进先出。攻击靠修改returen address去执行攻击者的逻辑。

堆 代码里动态开辟给变量的内存

溢出总结

内存拷贝很常见。写代码的一出错,大于开辟的内存的数据存入该内存,问题就出来了。有些语言会检测,有些不会,如C。

常见位置:小心 输入。 从输入转换数据到内部结构。使用不安全的字符串处理。用算术计算要多大空间或者剩下多少空间。

0day攻击

近来常见的术语。攻击一个还不被知道的漏洞。漏洞发现==攻击那天才知道。e.g. log4shell。CVSS 10分。

什么不是0day攻击,用过去已经知道的漏洞。

操作系统安全

UNIX访问控制

ACLs vs capabilities 两种访问控制办法,UNIX是ACLs。前者以资源角度出发,每个对象为单位,难以代理权限,容易删除用户;后者以用户出发,每个用户为单位,容易代理,难以删除用户。

每个用户都有自己的UID和GID,用户运行进程时,进程取得你的UID,GID和EUID。所有资源都是文件。所有文件都有owner和group。权限分成三组,每组三种细节行为权限。owner组,group组,其他组。组内分读写运行三个权限。owner有所有权限,包括赋权。只有owner和root可以用chmod改赋权。

超级账号为root。root的UID为0。其拥有所有对象的root权限。非root账号会有密码困境,因为unix的密码保存在/etc/shadow,而这个文件只有owner才有写权限,普通用户如何修改这个文件?于是就有了 特权程序 (privileged programs),非root用户可以执行他们但不能修改他们。两种特权程序:

1)daemon程序 2)Set-UID程序

第2种大量在UNIX系统中使用。使用一个特殊标记位指定此程序为Set-UID程序。比如passwd, umount, chsh, sudo, 等等。用户可以以owner的权限来运行这个程序,有点像临时的权限提升。此类程序有一个EUID(Effective UID)。普通程序UID=EUID,都为运行这个程序的用户ID。Set-UID被执行的时候,UID和EUID不等,UID为运行用户的ID,EUID为程序owner的ID。如果此程序的owner为root,则会以root来运行。允许普通用户实现了权限逃逸。把所有程序转成Set-UID是危险的。比如/bin/sh和vi等等。Set-UID程序在ls中会显示为rwsr多一个s。

Set-UID的问题

Set-UID以root权限来运行。非root用户有可能通过这里来达到权限逃逸。如果此类程序可以运行命令,就可被用于打开shell。如果此类程序存在漏洞,可被用于打开拥有root权限的shell,然后就用来做更多的事情。

通过未彻底检查用户输入可能会导致漏洞暴出。例如CHSH-改变shell。通过修改/etc/passwd文件。

通过系统输入也可以。比如说用软链接把passwd文件连接到自己准备的文件上。

通过环境变量。比如说PATH变量,改变执行程序的位置。

多用户操作系统

用户和应用并不可信,操作系统必须限制他们可以做什么的范围。于是就有了保护圈(protection rings)。Ring0是kernel,Ring1&2是驱动,Ring3是应用程序。当前的OS几乎都只有2个圈,0是kernel,3是其他,包括了用户代码,除kernel外的其他os代码,第三方驱动等等。实现的办法是靠内存保护,特权指令,CPU模式,系统调用。

内存保护

使用Base和Bound注册机制,OS会保存一个进程的最低和最高内存地址限制。超过后会出现段错误。MS-DOS没有内存保护机制。所以它可以用一个程序修改另一个程序,导致混乱,于是就出现漏洞百出。

特权指令

有一套指令集严格限制只能被OS所使用。比如说只有OS才可以directly access I/O设备。

CPU模式

用户模式下:限制权限

Kernel模式下:可以执行特权指令,各种不受限制。

X86框架下靠CPL 当前权限等级 位,一共2位,00代表kernel 11代表用户。CPU执行的时候会先检查CPL。

系统调用

用户进程可以用trap或syscall指令调用kernel。trap可以修改进程模式从用户模式为内核模式。

CVE里有不少系统调用漏洞。

加密学

达到安全目标的方法之一:加密学。另一个是基于一个系统,保管起来。

最早的加密学办法,公元前7世纪 scytale。 公元前1世纪,Caeser是一种替换加密的办法。CIA的CI都可以通过加密学办法得到。

可分为 对称加密(一个密钥) 和 非对称加密(两个密钥)。或按明文处理来分类:流加密和块加密。

对称加密的困难在于密钥的传输。流加密有RC4等,块加密有DES AES RSA等。

攻击加密系统:找到密钥只能靠暴力攻击和密码分析攻击。暴力攻击就是尝试所有可能的密钥。统计分析可能带来新的破解办法,比如自然语言的词频等等,是有规律的。于是就有了密码分析攻击。统计分析攻击遇到小块的基于替换的加密有奇效。

就有了好几种:COA 只知道密文 KPA 知道一小部分的明文和对应的密文 CPA 可选择任意的明文进行加密 CCA 攻击者可选密文且可解出来。

对称加密

加密算法的强度:世上没有无条件的安全。只有“一次性加密”完美安全,但无法做到“一次性”。有条件安全是可能的,依赖解密所需要的花费大于系统本身 或 解密时间超出被加密数据的生命周期。

当今块加密的基石:一个是直接替换 一个是对应的组合。

块加密的块大小:我们需要一个大小合适的块,可以合理地使用可管理大小的密钥进行反解。块越大,其要管理的密钥大小成指数增长。

Horst Fiestel

Fiestel这哥们弄了一个很牛的结构,垄断了块加密。其结合了替换和组合。主要目的是提高块大小同时还不太增加密钥大小。Fiestel网络的参数有:块大小,密钥大小,多少轮,子密钥生成算法,轮次函数。

一个好的加密算法要具备的属性

差异性:明文密文差异越大越好,任何一个位的改变都将导致巨大的密文变化。fiestel网络靠重复组合达到。

混淆性:密文和密钥的关联越复杂越好,密文的任何一个位都应该依赖密钥的很多部分。fiestel网络靠重复替换达到。

基于Fiestel网络的加密算法有:DES TEA XTEA。。。

DES

1977年NIST采用。56位的密钥和64位长的块。

P-Box定义了一个密码表盒子(64个位置),靠盒子里的顺序重新安排数字。

S-Box用来将6位变4位,6位里的前和后一位标定在第几行,剩下数字标定第几列,得到数字后转为4位。DES用这种办法来产生密钥。

DES有多强?1998年EFF弄了25万美元的机器破解了它。不再是标准了。但还可以3DES。

块加密的设计原则

多少轮很关键,足够多可以对冲破解。F函数。产生密钥的地方也是关键,子密钥需要难以被破。

AES

2001年NIST发布。作者是Rijndael,并非基于feistel结构,2002年成为标准。当前SSL/TLS大多已经是AES。块大小为128位,用3个不同大小的密钥。

如果明文小于块大小,进行padding补位。明文大于块大小的,明文按块大小拆成无数块,最后一块有可能需要进行补位处理。

块加密运转模式

ECB 最简单的一个,不推荐使用,长明文不安全,因为相同的原文会有相同的密文,低差异性。

CBC 增加了随机码 IV。

上述二者用做流数据传输很浪费。

CFB IoT设备,在内存里加密,问题在于 有可能有noisy。面向流。

OFB 避免了CFB的noisy。增加了Nonce-只用一次的数字。面向流。 只能串行。

CTR 随机数字开始然后自增。高速。加解密都能并行。

随机数

安全界随机数用处:产生密钥,生成密码,生成Nonce,生成IV。

什么是随机?一系列的随机数字,它们以某种统计随机的结果呈现。几个标准:分布要平均就是说有相同数量的0和1 。而且要独立,是说任何随机值不依赖序列中其他的值是多少。

在加密学上的随机,我们还要求 不可预测性。不能提前预测下一个随机数是多少。

不可预测的随机数是 真随机数。靠软件是无法产生真随机数(TRNGs)的,只能产伪随机数(PRNGs)。真随机数无法被预测,使用物理源,比如说环境noise,硬盘读写的实际移动时长。伪随机数需要一个种子,可以是系统时钟,鼠标移动等等。又被叫做伪随机函数PRF。其生成一个固定长度数字,而不是一个数字序列。

PRNG算法:Linear congruential生成器,BBS生成器,Linux RNG。以及基于加密算法的随机数算法。

线性同余发生器(Linear congruential)不应用于安全,因为有了参数非常容易猜测后一个随机数。

Linux RNG除硬件产生的外,其他都是PRNGs。块加密用来做PRNG:CTR可以,OFB也可以。

非对称加密

对称加密不能保护 抵赖和伪造。同时传递密钥也是困难。可以物理分发,第三方生成 和 物理分发,理想情况是加密一个通道用来分布密钥。于是就有了非对称加密。

非对称加密也叫公钥加密算法。C和A都解了同时还解决密钥分发。同时产生两个密钥,公钥给别人,私钥自己保存。

C保密性如何做到,用接收者的公钥对数据加密,只有有私钥的人才能解开。

Authenticaiton如何做到,用发送者私钥加密,用其公钥能解开则确定是其发送。

分发密钥,比较好的做法是,做两次非对称加密。同时确保C和A。

非对称加密中有一种叫做 单向函数,容易计算难以破解,没有可能逆向,基于多种非对称密钥加密系统。比如说离散对数,整数因式分解,平方求余。

哈希函数

把可变长度的信息给map到固定长度的摘要就是hash。可用于Integrity完整性验证。有些hash算法太容易冲突的不能用于完整性验证。

hash函数在加密领域的属性:单向性-单向计算不可逆;不冲突性-弱抗碰撞和强抗碰撞。弱的可能有找到2个明文是同一个hash。强的完全找不到任意的。

加密学hash算法有 MD系列的如MD5 MD6,SHA系列的SHA-1 2 3,BLAKE等

Merkel-Damgad结构

这个是经典结构,MD5 SHA1 2都用他。

加密学hash安全

pre-image或二次pre-image攻击,通过hash找出原文 或 暴力破解。

抗碰撞攻击,找出x和y有相同的hash。暴力破解:用生日悖论 降低暴力破解的难度。

啥是生日悖论,就是在一个屋子里的只需要23个人,有50.73%的机会有相同的生日。

MAC

消息认证码MAC。网络上会有中间人攻击,于是就有了MAC。不安全的MAC由于使用了Merkel-Damgad结构,将K加在原文的头部,会出现后面的消息不经加K。就很容易遇到长度扩展攻击。长度扩展攻击很容易基于旧的计算得到新的hash值,但不需要k本身。Flickr被这样攻击过。

于是就有了HMAC–keyed hash mac。两次pad。都加k。让k出现在所有地方。

其他

非对称加密一般比对称加密要快。MD5的抗冲突属性已经被破。

数字签名和PKI

块加密中可用于认证的加密算法?块加密算法中大部分只能保证Confidentiality保密性。MACs可以和对称加密一起工作用于认证性。办法有2: 1创建MAC,密文中附上某种收据。类似HMAC创建MAC。 2用一种认证加密模式生成密文再加上MAC一起。支持认证的块加密模式有 GCM CCM OCB等等。

GCM

GCM模式的上半段,与CTR模式一样。下半段为了得到MAC需要进行hash的方式计算,于是把所有的CTR每一块的输出进行XOR计算后乘以hashkey,再进行下一块的计算,最后能得到一个摘要大小。第一块的头上,用一个随机的authdata直接乘以hashkey来启动。最终再进行长度处理,得到一个MAC/TAC。SSL zoom等加密必用GCM模式。Authdata实际上不被加密,需要用来确认是什么,于是起到了认证的作用。不怕中间人攻击,但依然怕伪造和抵赖。

签名

没有签名,所有的hash都有能力被验证,但却不能防止伪造。MAC提供了防第三方却怕内部:发送者可否认发过消息给接收者,接收者可以伪造消息是来自发送者。

电子签名才能解决不可抵赖性和防伪造。

用于认证机制时,消息上带签名,收到的人验证。不可抵赖和防伪造时,接收者要能信任消息是发送者发的,发送者不能否认发过,因为消息产生了一个由发送者私钥产生的签名。完整性保障,如果有人在中间改动消息,接收者验证签名会失败。

非对称加密用于认证。用发送者的私钥加密,只有他的公钥才能解开。

PKI公钥基础架构

非对称加密传递公钥是个难题,于是就产生了这些办法。个人公钥通告,公开目录,公钥机构,公钥鉴证。

公钥的分发会有一个中央的注册机构。注册机构的公钥大家都知道。公钥注册机构又会是个瓶颈,于是就有了公钥证书。有证书如见机构,于是就可以解开瓶颈。CA证书。只需要证书有一个机构来签发即可。CA即为证书机构。会有多级代理的情况。RA注册机构专门负责验证和签发证书。

X.509

web上用的几乎都是X.509证书。其他也有如spki和cvc等。509证书上有CA信息,自己的信息和公钥,签名。

root CA证书的公钥提前预置在了软件和操作系统里了。rootCA证书自己进行签名。中间还会有中间CAs。各种各样的机构非常多。所以有一个信任链,会一级一级验证下来,从rootCA开始,每级的证书验证到域名本身。

威胁模型

检测安全问题

漏洞评估,静态代码分析,动态分析-渗透测试,故障发生,威胁模型-甚至可以在写代码之前开始帮助检测安全问题。

建模

要做一个系统抽象,用来考虑什么会出问题。图形比数学要强。软件可以帮忙:数据流图 UML等等。

什么要建模:聚焦资产比较难发现,不推荐。聚焦攻击者,风险在于低估带来风险。聚焦软件和数据流,大多数用这个。

数据流图DFD描述一系列的进程或者系统,比较好的建模办法,攻击者也往往是关心数据如何流的。DFD自身也有不同的级别,L0的就是上下文图,只是看个大概,简单描述和外界的关系。L1的开始更多细节描述主要的流程和数据。L2更加复杂地描述到子流程去。

DFD里用圆圈表示处理流程,箭头表示数据流,双横线表示数据存储,方的长方形表示外部实体。

信任边界就是设置需要更高权限才能访问的界限。跨边界访问显示了信任级别的变化。用信任边界来提示我们此处需要验证和鉴权。信任边界不能切开流程或者数据存储,只能越过数据流。

威胁建模怎么建

模型+威胁列举+威胁管理+审阅和反馈

威胁列举办法:STRIDE+DESIST+DREAD+CIA等 攻击库(CAPEC等) 攻击树(比较正式)

STRIDE:Spoofing冒用(进程,文件,机器,人,角色),Tampering篡改数据(改文件,改内在,改网络流量),Repudiation否认(否认行为,攻击日志),Information Disclosure信息暴露(进程数据,数据存储暴露,数据流),Denial of Service拒绝服务(进程资源费尽,数据存储压跨,数据流占满),Elevation of Privilege提权(入侵进程提权,认证检测bug提权,数据修改提权)

补充

攻击库,更加关注特定攻击。来自MITRE的CAPEC共有546个模式,分到9种机制6个领域。还有OWASP。

攻击树,更正式的更方法学的去描述各种攻击,其根节点为此次攻击的目标,叶子节点为达到目标的各种各样的路径。

建模后处理

解决威胁,深度优先vs广度优先。重新设计以消除威胁,使用标准的处理办法,发明新的处理办法(不推荐),接受漏洞。发明mitigation是很难的,涉及到的领域有加密学数据库网络等等,使用标准的mitigation才是王道。

Spoofing冒用:保authentication 认证 - 加密学,非加密学,如果是人的话生物特征。操作系统上,IAM,ID提供商。

Tampering篡改数据:保 integrity 完整性- 加密学,靠系统权限,日志和审核。操作系统,相关监控,审核和工程人员。

Repudiation否认:保 non-repudiation不可否认 - 加密学,日志,诈骗防止技术。系统拥有人,授信第三方。

Inf. disclousure信息暴露:保 confidentiality保密性 - 加密学,访问控制,混淆技术。操作系统,相关监控,应用组件,机器硬件。

DoS拒绝服务:保 Availability可用性 - 限制每个用户的资源,限制频率,弹性资源。开发者,系统设计人员,系统管理员。

EoP提权:保authorization授权 - 限制特权程序,权限管理,最少权限原则。操作系统,相关监控。

验证建模后结果的质量。

持续流程:图表-》识别-》缓解-》验证-》图表。。。

#cyber security