《密码与安全新技术专题》课程总结报告

每次讲座内容总结

(1)讲座的主题为网络(Web)安全与与内容安全

张老师从Web应用安全和隐私安全两个方面为我们带来了一场精彩的讲座。
信息化发展凸显了信息安全问题

2010年6月 震网病毒(stuxnet病毒) -> 证明物理隔离也不一定安全
2015年9月 XcodeGhost -> 证明编译层面也可能存在安全漏洞

网络威胁惊人,每天超过亿次GPT攻击,攻击方式:可探测 -> 可访问 -> 可掌控

威胁方-防护方的非对称性:
攻防技术非对称,大量自动化攻击工具的出现,使得入侵网络与信息系统的门槛降到极低。,攻防成本非对称,攻防技术的非对称带来了攻防成本的非对称。风险成本也极低。对于国家安全而言,攻防成本的非对称性具有特殊的意义。伪基站短信照片案例层出不穷。

常见的Web漏洞
SQL注入
SQL注入本质是由于输入检查不充分,导致SQL语句将用户提交的非法数据当作语句的一部分来执行。攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令。 攻击者通过在应用程序预先定义好的SQL语句结尾加上额外的SQL语句元素,欺骗数据库服务器执行非授权的查询,篡改命令。

按提交字符类型可分为:数字型、字符型、搜索型。
按HTTP提交方式可分为:GET、POST、Cookie。
按注入方式可分为:盲注、union注入、报错注入。
SQL注入工具
SQLMAP、Havij、Pangolin。

防御SQL注入
1、 参数化查询。参数化查询已被视为最有效的可防御SQL注入攻击的防御方式。目前主流的ORM 框架都内置支持并且推荐使用这种方式进行持久层封装。
2、 Web站点接入的数据库应遵循用户角色最小权限原则, 针对不同类型的操作, 创建对应权限的数据库用户, 最大限度地降低SQL注入的危害。
3、 可以从应用层防止SQL注入攻击, 目前国内主流的安全厂商都有一些专业的Web应用防护设备, 例如绿盟科技的WAF with MSS, 启明星辰的天清Web应用安全网关等。这些WAF设备自身定义了许多SQL注入过滤规则, 攻击者输入的危险字符会先经过应用层的WAF设备, 再提交给Web的后端数据库, 一定程度地降低了Web应用的安全风险。

XSS跨站脚本攻击
当用户访问网页时, 攻击代码在用户的浏览器上被执行, 就形成了一次XSS跨站脚本攻击。根据XSS漏洞的原理可以将XSS跨站攻击划分成反射性XSS和存储型XSS。对于反射性XSS, 攻击者需要欺骗用户点击一个恶意URL才能攻击成功。存储型XSS的危害相对来说更大一些, 攻击者提交的恶意代码, 会被Web服务器端接收并存储, 访问该网页的用户, 他们的浏览器会执行这段恶意代码。

防御XSS攻击?
1、 输入过滤。对用户表单输入的数据进行过滤,对javascript代码进行转义,然后再存入数据库。
2、 输出编码。在信息的展示页面,也要进行转义,这样的话,如果用户输入一些HTML的脚本,也会被当成普通的文字,而不会成为目标页面HTML代码的一部分得到执行。
3、 Cookie防盗。尽可能地避免在Cookie中泄露隐私,如用户名、密码等。我们可以将Cookie信息利用MD5等Hash算法进行多次散列后存放。为了防止重放攻击,也可以将Cookie和IP进行绑定,这样也可以阻止攻击者冒充正常用户的身份。

CSRF跨站请求伪造
攻击者使用被攻击者的身份,以其名义发送恶意请求,会造成个人隐私泄露以及财产安全。

防御CSRF攻击
1、 所有需要用户登录之后才能执行的操作属于重要操作,这些操作传递参数应该使用 POST 方式,更加安全。
2、 Token。为防止跨站请求伪造,我们在某次请求的时候都要带上一个csrf_token参数,用于标识请求来源是否合法,csrf_token参数由系统生成,存储在SESSION中。
3、 验证码。验证码不单单用来防止注册机的暴力破解,还可以有效防止CSRF的攻击。

隐私安全
当前许多企业和公司会对用户轨迹进行分析,导致用户隐私安全受到威胁。
通过这次讲座我们知道了什么是SQL注入漏洞、SQL注入分类以及如何判断等等。
还学习到什么是XSS跨站脚本攻击, XSS漏洞分为两类:①反射型XSS ②存储型XSS,认识到XSS的危害,了解持久型跨站脚本攻击场景等等。
学习什么是CSRF跨站请求伪造漏洞,跨站请求伪造(CSRF)场景,如何上传漏洞、解析漏洞,什么是弱口令。

(2)讲座的主题是量子密码

通过本次讲座我们知道量子密码与传统的密码系统不同,它依赖于物理学作为安全模式的关键方面而不是数学。实质上,量子密码术是基于单个光子的应用和它们固有的量子属性开发的不可破解的密码系统,因为在不干扰系统的情况下无法测定该系统的量子状态。

传统密码的挑战
然而,这种传统密码受到了来自量子密码的挑战:基于大数分解的Shor算法和基于快速搜索的Grover算法能够迅速破解传统密码。

Shor算法(大数分解算法)
Shor算法能在多项式时间内解决大数分解难题,从而使RSA等大多数公钥密码受到冲击。

Grover算法
Grover算法(快速搜索算法)可以加速搜索密钥,从而使DES、AES等对称密码受到冲击。

量子密码
量子秘钥分配(QKD)的特点:

可以检测到潜在窃听行为。
基于物理学原理,理论上可达到无条件安全。
也就是说,量子密码可达到无条件安全的保密通信。

典型协议--BB84量子密钥分配协议
量子密钥分配是1984年物理学家Bennett和密码学家Brassard提出了基于量子力学测量原理的BB84协议,量子密钥分配从根本上保证了密钥的安全性。
在光系统中,BB84协议使用四个光子的偏振态来传输信息,这四个量子态又可以分成相互非正交的两组,而且每组中的两个光子的偏振态是正交的同时这两组又是相互共轭的。如果是单光子通信系统,则这四个量子态分别为光子的水平偏振态 、垂直偏振态 、 偏振方向的偏振态 (记作↗)、 偏振方向的偏振态 (记作↘)。 其中,前两个态为一组测量基,后两个态为一组测量基。当发送方Alice与Bob进行通信时,不是只使用某一组测量基,而是按照一定的概率同时使用两组基。

(3)讲座主题是基于深度学习的密码分析与设计

金鑫老师充满活力的给我们带来一个精彩的讲座——基于深度学习的密码分析与设计。我发现人工智能需要我们的知识储备非常足,要有很好的数学基础,密码学基础等等。本次讲座使我对人工智能、机器学习和深度学习增加了系统性的认知,以及对深度学习的应用有了更为宽阔的了解。我发现自己对人工智能、深度学习有点感兴趣,可是知识储备远远不够,希望后期自己能够努力培养这方面的知识。

用AI和ML解决安全问题(让安全更智能):
计算机取证、垃圾邮件检测、身份验证、网络钓鱼检测与预防、僵尸网络监测、入侵检测和响应、异常行为检测、恶意软件标识、数据匿名/反匿名、社会网络安全、大数据安全分析等。

用安全性解决A问题(让AI更安全):
分布式安全推理与决策、安全的多方计算和加密方法、隐私保护数据挖掘、差异隐私、验证码的设计与分析、人工智能信任和声誉方法、通过智能探测进行漏洞测试、生成训练和测试集的技术和方法等。

密码分析与机器学习
密码分析与机器学习之间有天然的相似性:
x -> F(x) -> y

对于机器学习:
x为输入样本,F(x)为机器学习的模型(可以理解为一个函数),y为输出,如果是分类,则y是分类标签,如果是回归,则y是真实值向量。

对于密码分析:
x为输入的明文,F(x)为密钥(可以理解为一个函数),y为加密后得到的密文。

从研究趋势来看,越来越多的密码分析方法开始使用机器学习结束,例如破解DES的遗传算法、用于侧信道分析的支持向量机算法等。

(4)讲座的主题是信息隐藏

信息隐藏主要包括水印、可视密码、隐写等。随着多媒体技术在通信领域的广泛应用和飞速发展,信息隐藏及隐写分析技术成为信息安全领域的研究热点。通过夏老师的这次课让我对信息隐藏和隐写分析技术等有了基础的了解。最重要的一点是夏老师给我们提出的四点建议让我感受颇深。首先我们要在平时学习专业课之余去看一些最新的顶会、期刊文章,增加自己的知识储备。当然,要想看懂顶会期刊就必须拥有一定的英语水平。老师建议我们去抽时间学习英语,说好英语,写好英语。作为一名计算机的学生,编程自然是少不了的。要想在科研工作上走的更远,需要拥有良好的编程能力。老师告诉我们要利用好资源,GitHub上有很多优秀的代码,很多牛人都值得我们去学习。

信息隐藏
信息隐藏是指将特定用途的信息隐蔽地藏于其他载体(Cover)中,使得它们难以被发现或者消除,通过可靠提取隐藏的信息,实现隐蔽通信、内容认证或内容保护功能。

信息隐藏主要包括水印、可视密码、隐写等。

鲁棒水印(Robust Watermaking)
鲁棒水印是重要的数字产权管理与安全标识技术之一,指将与数字媒体版权或者购买者有关的信息嵌入数字媒体中,使攻击者难以在载体不遭到显著破坏情况下消除水印,而授权者可以通过检测水印实现对安全所有者或者内容购买者等信息的认定。

可视密码(Visual Cryptography)
可视密码技术使Naor和Shamir于1994年首次提出的,其主要特点是恢复秘密图像时不需要任何复杂的密码学计算,而是以人的视觉即可将秘密图像辨别出来。其做法是产生n张不具有任何意义的胶片,任取其中t张胶片叠合在一起即可还原出隐藏在其中的秘密信息。

隐写(Steganography)
隐写是基于信息隐藏的隐蔽通信或者隐蔽存储方法,将秘密信息难以感知地隐藏在内容可公开的载体中,保护保密通信或者保密存储这些行为事实。
称隐写后的载体为隐写媒体Stego。

(5)讲座的主题是区块链

这次讲座为我们详细地讲解了区块链的产生和发展,由匿名作者中本聪发布的《比特币:一种点对点的电子现金系统》白皮书,演化成为今天这个比特币体系。这次讲座让我对比特币、区块链的历史有了系统的了解,对于区块链的技术也有了较为详细的认识,明白了这个机制是怎么正常运作的。

比特币
比特币(Bitcoin)的概念最初由中本聪在2008年11月1日提出,并于2009年1月3日正式诞生。根据中本聪的思路设计发布的开源软件以及建构其上的P2P网络。比特币是一种P2P形式的虚拟的加密数字货币。点对点的传输意味着一个去中心化的支付系统。

每一位所有者(A)利用他的私钥对前一次交易T1和下一位所有者(B)的公钥(俗称:地址)签署一个随机散列的数字签名, A将此数据签名制作为交易单T2并将其(交易单T2)广播全网,电子货币就发送给了下一位所有者。

与所有的货币不同,比特币不依靠特定货币机构发行,它依据特定算法,通过大量的计算产生,比特币经济使用整个P2P网络中众多节点构成的分布式数据库来确认并记录所有的交易行为,并使用密码学的设计来确保货币流通各个环节安全性。P2P的去中心化特性与算法本身可以确保无法通过大量制造比特币来人为操控币值。基于密码学的设计可以使比特币只能被真实的拥有者转移或支付。这同样确保了货币所有权与流通交易的匿名性。比特币与其他虚拟货币最大的不同,是其总数量非常有限,具有极强的稀缺性。该货币系统曾在4年内只有不超过1050万个,之后的总数量将被永久限制在约2100万个。

(6)讲座主题为漏洞挖掘及攻防技术。

通过这次讲座,对漏洞挖掘有个基本的了解。我认为想提高漏洞挖掘能力的方法要做到细心、耐心、会看、会记、懂收集、勤动手、爱学习。 细心放在第一位,是因为细心真的是非常非常非常重要。耐心同细心一样重要,可以说是一对cp。 会看,会记就是要多看多记,多看漏洞详情,多看技术文章,漏洞详情可以在乌云看,还有网上很多人分享的案例,主要是乌云。勤动手,当你看了大量漏洞,记了大量笔记,这个时候,我相信你最需要的,就是实战,实战是可以把所学所看融会贯通的最快方法,没有之一,只有实战可以锻炼自己的挖洞能力,和效率。看到新的漏洞多去搭建环境复现,这也是对能力的一种提升。

常见漏洞挖掘技术
手工测试
定义:由测试人员手工分析和测试被测目标,发现漏洞的过程,是最原始的漏洞挖掘方法。
优点:手工测试结合了人的主观能动性,可以针对性测试,挖掘漏洞
缺点:在大规模漏洞发现或无规律可循的条件下,较难进行
补丁对比
定义:补丁比对技术主要用于黑客或竞争对手找出软件发布者已修正但未尚公开的漏洞,是黑客利用漏洞前经常使用的技术手段。
优点:发现速度块
缺点:只能发现已知漏洞,对于未知漏洞难以发现
程序分析 (包含静态和动态程序分析)
定义::是指在不运行计算机程序的条件下,通过词法分析、语法分析、语义分析、控制流分析、污点分析等技术对程序代码进行扫描,验证代码是否满足规范性、安全性等指标的一种代码分析技术。
优点:漏洞检测范围大,覆盖率达100%,自动化程度高
缺点:存在漏报和误报的可能性
二进制审核
定义:源代码不可得,通过逆向获取二进制代码,在二进制代码层次上进行安全评估
存在问题:逆向会导致信息丢失,理解困难,甚至引入逻辑错误
二进制及编辑工具: IDA Pro、Ollydbg、UltraEdit、Hex Workshop以及WinHex
模糊测试
定义:通过向被测目标输入大量的畸形数据并监测其异常来发现漏洞
关键:测试用例构造,自动化
优点:无需源码、误报低、自动化程度高
缺点:覆盖率低
工具:Peach、Sulley、Autodafe、SPIKE等

各组同学汇报总结

(1)Finding Unknown Malice in 10 Seconds: Mass Vetting for New Threats at the Google-Play Scale

详见我们小组的鲍同学博客链接,和我的博客链接

论文题目:Spectre Attacks: Exploiting Speculative Execution

论文来源:39th IEEE Symposium on Security and Privacy(Oakland)

Spectre Attacks(幽灵攻击)
现代处理器使用分支预测和推测执行来最大化性能。 例如,如果分支的目标取决于正在读取的内存值,则CPU将尝试获取目标并尝试提前执行。 当内存值最终到达时,CPU丢弃或提交推测计算。 推测逻辑在执行方式上是不忠实的,可以访问受害者的内存和寄存器,并且可以执行具有可测量副作用的操作。
幽灵攻击涉及诱使受害者以规范的方式执行在正确的程序执行期间不会发生的操作以及泄漏受害者的操作,可以通过侧信道向外界提供的机密信息。幽灵攻击结合了来自侧信道攻击,故障攻击和回归导向编程的方法,可以从受害者的内存中读取任意任意位置的内容。 更广泛地说,推测性执行实施违反了支持数字软件安全机制的安全假设,包括操作系统进程分离,静态分析,容器化,即时(JIT)编译以及对缓存的定时/侧通道攻击的对策。 这些攻击对实际系统构成严重威胁,因为在用于数百万台设备的英特尔,AMD和ARM的微处理器中发现了漏洞预测执行的功能。
幽灵攻击就像字面所说的意思一样,来无影去无踪,当攻击发生时受害者在毫无察觉的情况下就被CPU的预测执行功能“出卖”了。

Speculative Execution(预测执行)
预测执行简单来说是一些具有预测执行能力的新型处理器,可以估计即将执行的指令,采用预先计算的方法来加快整个处理过程。

预测执行的设计理念是:加速大概率事件。

预测执行是高速处理器使用的一种技术,通过考虑可能的未来执行路径并提前地执行其中的指令来提高性能。例如,当程序的控制流程取决于物理内存中未缓存的值时,可能需要几百个时钟周期才能知道该值。除了通过空闲浪费这些周期之外,过程还会控制控制流的方向,保存其寄存器状态的检查点并且继续在推测的路径上推测性地执行该程序。当值从存储器中偶然到达时,处理器检查最初猜测的正确性。如果猜测错误,则处理器将寄存器状态恢复为存储的检查点并丢弃(不正确的)预测执行,如果猜测是正确的,则该部分代码已被执行过,不需要再次执行,因此带来了显著的性能增益。

可以发现,如果预测错误,即便程序真正执行到这里时错误结果被丢弃,但错误的结果还是短暂的出现在寄存器中,在被丢弃之前,这部分数据就很容易被泄露。

欺骗分支预测器
下面是一段可能被分支预测器错误预估的代码:

对于这段代码,攻击者首先使用有效的x调用相关代码,训练分支预测器判断该if为真。 然后,攻击者设置x值在array1_size之外。 CPU猜测边界检查将是真的,推测性地使用这个恶意x读取array2 [array1 [x] * 256]。 读取array2使用恶意x将数据加载到依赖于array1 [x]的地址的高速缓存中。当处理器意识到这个if为假时,重现选择执行路径,但缓存状态的变化不会被恢复,并且可以被攻击者检测到以找到受害者的存储器的一个字节。 通过使用不同的x值重复,可以利用该构造来读取受害者的存储器。

该段代码的通常执行过程如下:
进入if判断语句后,首先从高速缓存查询有无array1_size的值,如果没有则从低速存储器查询,按照我们的设计,高速缓存一直被擦除所以没有array1_size的值,总要去低速缓存查询。

查询到后,该判断为真,于是先后从高速缓存查询array1[x]和array2[array1[x]*256]的值,一般情况下是不会有的,于是从低速缓存加载到高速缓存。

在执行过几次之后,if判断连续为真,在下一次需要从低速缓存加载array1_size时,为了不造成时钟周期的浪费,CPU的预测执行开始工作,此时它有理由判断if条件为真,因为之前均为真(加速大概率事件),于是直接执行下面的代码,也就是说此时即便x的值越界了,我们依然很有可能在高速缓存中查询到内存中array1[x]和array2[array1[x]*256]的值,当CPU发现预测错误时我们已经得到了需要的信息。

相似的攻击手段:meltdown
Meltdown是一种类似的微体系结构攻击,它利用无序执行来泄漏目标的物理内存。 Meltdown在两个主要方面与Spectre Attacks截然不同。 首先,与Spectre不同,Meltdown不使用分支预测来实现推测执行。 相反,它依赖于观察,当一条指令导致一个软中断时,正在无序执行的指令中止。第二,Meltdown利用特定于英特尔处理器的特权升级漏洞,由此 推测执行的指令可以绕过内存保护。 结合这些问题,Meltdown从用户空间访问内核内存。 此访问会导致软中断,但在发出软中断之前,访问后面的代码会通过缓存通道泄漏所访问内存的内容。与Meltdown不同,Spectre攻击适用于非Intel处理器,包括AMD和ARM处理器。 此外,KAISER补丁已被广泛应用于对Meltdown攻击的缓解,但不能防止幽灵攻击。

论文名称:SafeInit: Comprehensive and Practical Mitigation of Uninitialized Read Vulnerabilities

SafeInit: 全面而实用的未初始化读取漏洞缓解

未初始化漏洞
未初始化值的使用仍然是C / C ++代码中的常见错误。这不仅导致未定义的和通常不期望的行为,而且还导致信息泄露和其他安全漏洞。

我们都知道C/C++中的局部变量,在未初始化的情况下,初值为随机值。

以C++中局部变量的初始化和未初始化为例:(int x;和int x = 0;)

编译器在编译的时候针对这两种情况会产生两种符号放在目标文件的符号表中,对于初始化的,叫强符号,未初始化的,叫弱符号。连接器在连接目标文件的时候,如果遇到两个重名符号,会有以下处理规 则:

1、如果有多个重名的强符号,则报错。
2、如果有一个强符号,多个弱符号,则以强符号为准。
3、如果没有强符号,但有多个重名的弱符号,则任选一个弱符号。

未定义行为
简单地说,未定义行为是指C语言标准未做规定的行为。编译器可能不会报错,但是这些行为编译器会自行处理,所以不同的编译器会出现不同的结果,什么都有可能发生,这是一个极大的隐患,所以我们应该尽量避免这种情况的发生。

介绍
由于C/C++不会像C#或JAVA语言,确保变量的有限分配,要求在所有可能执行的路径上对它们进行初始化。所以,C/C++代码可能容易受到未初始化的攻击读取。同时C/C++编译器可以在利用读取未初始化的内存是“未定义行为”时引入新的漏洞。

在本文中,提出了一种全面而实用的解决方案,通过调整工具链(什么是工具链)来确保所有栈和堆分配始终初始化,从而减轻通用程序中的这些错误。 SafeInit在编译器级别实现。

本文实现了

提出了safeinit,一种基于编译器的解决方案,结合强化分配器,确保堆和栈上的初始化来自动减轻未初始化值读取。
提出的优化可以将解决方案的开销降到最低水平(< 5%)并可以在现代编译器中实现
基于clang和LLVM的SafeInit原型实现,并表明它可以应用于大多数真实的C / C ++应用程序而无需任何额外的手动工作。
CPU-intensive 、 I/O intensive (server) applications 和 Linux kernel测试验证了现实世界的漏洞确实被缓解
背景
在几乎所有应用程序中,内存不断被重新分配,因此被重用。

在栈中,函数激活帧包含来自先前函数调用的数据
在堆上,分配包含来自先前释放的分配数据
如果在使用之前不覆盖这些数据,就会出现未初始化数据的问题,从而将旧数据的生命周期延长到新分配点之外。

内存也可能只是部分初始化; C中的结构和联合类型通常是故意不完全初始化的,并且出于简单性或性能原因,通常为数组分配比存储其内容所需的(最初)更大的大小。实际上,重用内存不仅常见,而且出于性能原因也是可取的。 当不清楚变量是否在使用之前被初始化时,唯一实用且安全的方法是在所有情况下初始化它。

存在的四点威胁

  • 敏感数据泄露
    由于未初始化数据而导致信息泄露的最明显危险是直接敏感数据的泄露,例如加密密钥,口令,配置信息和保密文件的内容。

  • 数据生命周期持续时间长于预期,可能会产生许多无意的数据副本。
    不是所有情况下编译器可以提供memset优化调用,如果数据不再有效并且因此在该点之后不再使用,编译器可以通过调用memset来优化这些调用。但是如果之后的数据还有效,禁止编译器优化的替代函数(例如memset_s和explicit_bzero)并不是普遍可用的。
    未初始化数据的使用受到不可信输入的影响,必须考虑各种潜在的攻击媒介,这种不同的攻击面意味着应该认真对待所有未初始化的数据漏洞。

  • 绕过安全防御
    现代软件防御依赖于敏感元数据的保密性,同时,未初始化的值提供了指针公开的丰富资源。

例如:地址空间布局随机化(ASLR)之类的防御一般取决于指针的保密性,并且由于这通常仅通过随机化一个基地址来完成,因此攻击者仅需要获取单个指针以完全抵消保护。 这样的指针可以是代码,堆栈或堆指针,并且这些指针通常存储在栈和堆上,因此未初始化的值错误提供了阻止这种信息隐藏所需的指针公开的丰富源。

软件开发
未初始化数据导致的其他漏洞允许攻击者直接劫持控制流。常见的软件开发的错误是:无法在遇到错误时在执行路径上初始化变量或缓冲区。

两个例子分别是:

Microsoft描述了由于2008年Microsoft Excel中未初始化的堆栈变量导致的任意写入漏洞
Microsoft的XML解析器中的一个错误使用存储在局部变量中的指针进行虚函数调用,该局部变量未在所有执行路径上初始化。
检测工具
有些工具试图在开发过程中检测未初始化变量,而不是试图减轻未初始化的值错误,允许它们由程序员手动校正。有些工具试图在开发过程中检测它们,而不是试图减轻未初始化的值错误,允许它们由程序员手动校正。更重要的是,编译器警告和检测工具只报告问题,而不是解决问题。 这可能会导致错误和危险的错误。

堆栈变量
函数堆栈帧:在堆栈中为当前正在运行的函数分配的区域、传入的参数。返回地址以及函数所用的内部存储单元都存储在堆栈帧中。

函数堆栈帧包含局部变量的副本,或具有被忽略的局部变量,同时还包含其他局部变量和编译器生成的临时变量的溢出副本,以及函数参数,帧指针和返回地址。 鉴于堆栈内存的不断重用,这些帧提供了丰富的敏感数据源。

现代编译器使用复杂的算法进行寄存器和堆栈帧分配,这种方式减少了内存使用并改善了缓存局部性,但意味着即使在函数调用之前/之后清除寄存器和堆栈帧也不足以避免所有潜在的未初始化变量。

论文名称:Convolutional Neural Networks for Sentence Classification(卷积神经网络用于句子分类)

用CNN(卷积神经网络)对句子分类?

  • (1)特征提取的高效性
    机器学习首先需要选取好特征,每一个特征即为一个维度,特征数目过少,我们可能无法精确的分类出来,即我们所说的欠拟合;如果特征数目过多,可能会导致我们在分类过程中过于注重某个特征导致分类错误,即过拟合。这样就需要我们在特征工程上花费很多时间和精力,才能使模型训练得到一个好的效果。然而神经网络的出现使我们不需要做大量的特征工程,譬如提前设计好特征的内容或者说特征的数量等等,我们可以直接把数据灌进去,让它自己训练,自我“修正”,即可得到一个较好的效果。
  • (2)数据格式的简易性
    在一个传统的机器学习分类问题中,我们“灌”进去的数据是不能直接灌进去的,需要对数据进行一些处理,譬如量纲的归一化,格式的转化等等,不过在神经网络里我们不需要额外的对数据做过多的处理。
  • (3)参数数目的少量性
    在面对一个分类问题时,如果用SVM来做,我们需要调整的参数包括核函数,惩罚因子,松弛变量等等,不同的参数组合对于模型的效果也不一样,想要迅速而又准确的调到最适合模型的参数需要对背后理论知识的深入了解(当然,如果全部都试一遍也是可以的,但是花的时间可能会更多)。对于一个基本的三层神经网络来说(输入-隐含-输出),我们只需要初始化时给每一个神经元上随机的赋予一个权重w和偏置项b,在训练过程中,这两个参数会不断的修正,调整到最优质,使模型的误差最小。所以从这个角度来看,我们对于调参的背后理论知识并不需要过于精通(只不过做多了之后可能会有一些经验,在初始值时赋予的值更科学,收敛的更快罢了)。
    尤其是在图像领域,用传统的神经网络并不合适。因为图像是由一个个像素点构成,每个像素点有三个通道,分别代表RGB颜色,那么,如果一个图像的尺寸是(28,28,1),即代表这个图像的是一个长宽均为28,channel为1的图像(channel也叫depth,此处1代表灰色图像)。如果使用全连接的网络结构,即,网络中的神经与与相邻层上的每个神经元均连接,那就意味着我们的网络有28 * 28 =784个神经元,hidden层采用了15个神经元,那么简单计算一下,我们需要的参数个数(w和b)就有:7841510+15+10=117625个,这个参数太多了,随便进行一次反向传播计算量都是巨大的,从计算资源和调参的角度都不建议用传统的神经网络。

模型介绍
下图是原论文中给出的用于句子分类的CNN模型:

输入矩阵

CNN输入矩阵的大小取决于两个因素:
A.句子长度(包含的单词的个数)
B.每个字符的长度

假设输入X包含m个单词,而每个单词的字嵌入(Word Embedding)长度为d,那么此时的输入就是md的二维向量。对于I like this movie very much!来说,当字嵌入长度设为5时,输入即为75的二维向量。
卷积过程

文中使用了2种过滤器(卷积核),每种过滤器有三种高度(区域大小),即有6种卷积结构。每个卷积核的大小为filter_sizeembedding_size。

A.filter_size代表卷积核纵向上包含单词个数,即认为相邻几个词之间有词序关系,代码里使用的是[3,4,5]。

B.embedding_size就是词向量的维数。每个卷积核计算完成之后我们就得到了1个列向量,代表着该卷积核从句子中提取出来的特征。有多少卷积核就能提取出多少种特征。
池化过程

这篇文章使用MaxPooling的方法对Filter提取的特征进行降维操作,形成最终的特征。每个卷积的结果将变为一个特征值,最终生成一个特征向量。
池化层采用MaxPooling,大小为22,步长为1,取每个窗口的最大值更新,那么图片的尺寸会由33变成22。
注意:这一步统一了维度!
补充:池化方法一般有两种:MaxPooling:取滑动窗口里最大的值;AveragePooling:取滑动窗口内所有值的平均值。

全连接层(含Dropout和Softmax)

A.要处理的问题
二分类问题:正面评价;负面评价。
B.全连接层
把权重矩阵与输入向量相乘再加上偏置,实际上就是三层神经网络的隐层到输出层的映射。
C.添加Dropout
由于实验中所用的数据集相对较小,很容易就会发生过拟合现象,所以要引入Dropout来减少过拟合现象。
神经元激活的概率,可以在参数 dropout_keep_prob 中设置。这篇文章里选择的是0.5。
D.Softmax分类层
我们可以应用Softmax函数来将原始分数转换为归一化概率,从而得到概率最大的输出,最终达到预测的目的。

补充:Dropout的作用原理
按照一定的概率来“禁用”一些神经元的发放。这种方法可以防止神经元共同适应一个特征,而迫使它们单独学习有用的特征。

论文题目:With Great Training Comes Great Vulnerability: Practical Attacks against Transfer Learning

现在很多企业都在做深度学习,但是监督学习训练需要非常大的标记数据集,比如在视觉领域ImageNet模型的训练集包含了1400万个标记图像,但是小型公司没有条件训练这么大的数据集或者无法得到这么大的数据集。

论文中提到对于这个问题,当前一个普遍的解决方案就是迁移学习:一个小型公司借用大公司预训练好的模型来完成自己的任务。我们称大公司的模型为“教师模型“,小公司迁移教师模型并加入自己的小数据集进行训练,得到属于自己的高质量模型”学生模型”。

总结来看迁移学习主要解决了目前机器学习中存在的两个问题:

第一,是数据量不足的问题。虽然互联网和移动互联网催生了数据量的爆炸式增长,但在一些非互联网领域仍然存在数据量小的困境。医疗领域就是一个典型,有一些发病率较低的疾病样本数量很少,但会存在与它相关联的疾病和治疗方法,我们就可以通过已有的模型进行迁移,从而对疑难杂志进行大数据分析从而得出有效的诊疗方案。
第二,是个性化推荐的问题。每个人的喜好兴趣都不相同,通过数据可以分析出一个人的用户画像,对他进行内容的精准推荐。但如何给一个没有书籍浏览信息的人进行阅读推荐呢?这可以通过迁移学习,对他的音乐、艺术作品兴趣,包括学习经历等一系列信息,与他的阅读兴趣进行关联,从而实现在没有该领域数据积累下的个性化推荐。

迁移学习
迁移学习过程
“学生模型”通过复制教师模型的前N-1层来初始化,并增加了一层全连接层用于分类,之后使用自己的数据集对学生模型进行训练,训练过程中,前K层是被冻结的,即它们的权重是固定的,只有最后N-K层的权重才会被更新。前K层之所以在训练期间要被冻结,是因为这些层的输出已经代表了学生任务中的有意义的特征,学生模型可以直接使用这些特征,冻结它们可以降低训练成本和减少所需的训练数据集。

迁移学习方法
根据训练过程中被冻结的层数K,可以把迁移学习分为以下3种方法:深层特征提取器(Deep-layer Feature Extractor)、中层特征提取器(Mid-layer Feature Extractor)、全模型微调(Full Model Fine-tuning)。

Deep-layer Feature Extractor:K=N-1,学生任务与教师任务非常相似,需要的训练成本最小
Mid-layer Feature Extractor:K<N-1,允许更新更多的层,有助于学生为自己的任务进行更多的优化
Full Model Fine-tuning:K=0,学生任务和教师任务存在显著差异,所有层都需要微调
迁移学习安全性
人工智能的应用不断多元化,不断深入日常的生活之中,迁移学习的安全性已经成了当前人工智能学科必须要面对的问题。由于迁移学习要选择“教师模型”有限缺乏多样性,用户只能从很少的教师模型中进行选择,同一个教师模型可能被很多个公司迁移,所以攻击者如果知道了教师模型就可以攻击它的所有学生模型。这就是这篇论文主要攻击的方法

对抗性攻击
对抗图像/对抗样本(Adversarial example/image):对抗样本是对干净图像进行处理后的样本,被故意扰乱(如加噪声等)以达到迷惑或者愚弄机器学习技术的目的,包括深度神经网络。
对抗扰动(Adversarial perturbation):对抗扰动是添加到干净图像中的噪声,使其成为一个对抗样本。
对抗性训练(Adversarial training):对抗性训练使用除了干净的图像之外的对抗样本来训练机器学习模型。
对手(Adversary):对手通常指创建一个对抗样本的代理。但是在某些情况下,我们也称对抗样本本身为对手。

黑盒攻击(Black-box attacks):黑盒攻击是在不了解一个目标模型的具体情况下,针对该模型,生成了对抗样本(测试阶段)。在某些情况下,假设对手对模型的了解有限(例如,它的训练过程或者架构),但绝对不知道模型参数。在其他情况下,使用任何关于目标模型的信息称为半黑盒攻击。这篇文献使用前一种约定。
白盒攻击(White-box attacks):白盒攻击假设具备了目标模型的完整知识,包括其参数值、体系结构、训练方法,在某些情况下还包括训练数据。它允许攻击者对模型进行无限制的查询,直至找到一个成功地对抗性样本。这种攻击常常在最小的扰动下获得接近100%的成功,因为攻击者可以访问深度神经网络的内部结构,所以他们可以找到误分类所需的最小扰动量。然而白盒攻击一般被认为是不切实际的,因为很少会有系统公开其模型的内部结构。
检测器(Detector):检测器是一种(仅)检测图像是否为对抗样本的机制。
欺骗率(Fooling ratio/rate):欺骗率表示在图像被扰动后,经过训练的模型改变其预测标签的百分比。
一次性/单步方法(One-shot/one-step methods):一次性/单步法通过执行单步计算产生对抗性扰动,例如计算一次模型的损失梯度。与之相反的是迭代方法( iterative methods),它多次执行相同的计算以得到一个单独的扰动。后者的计算成本通常很高。
近似无法察觉(Quasi-imperceptible):近似无法察觉扰动从人类感知而言对图像影响很小。(本文提出的DSSIM距离)
修正器(Rectifier):修正器修改一个对抗样本来恢复这个目标模型的预测结果同该样本未扰动前的预测。
针对性攻击(Targeted attacks):有针对性的攻击欺骗了一个模型,使对抗性图像错误地预测成特定标签。它们与非目标攻击相反,在非目标攻击中,被预测的对抗图像的标签是无关的,只要它不是正确的标签。

  • 威胁模型(Threat model):威胁模型指的是一种方法所考虑的潜在攻击类型,例如黑盒攻击。
    可转移性(Transferability):可转移性指的是一个对抗样本具有可转移能力,即使是除了用来产生它的模型以外,它仍然有效。
  • 通用扰动(Universal perturbation):通用扰动能够在任何图像上扰动并高概率欺骗一个给定模型。值得注意的是,通用性指的是一种与图像无关的扰动性质,区别于有很好的可转移性。
  • 目标攻击:将source image 𝑥_𝑠 误分类成target image 𝑥_𝑡 所属标签
  • 非目标攻击:将source image 𝑥_𝑠 误分类成任意其他的source image 所属标签

对抗性攻击思路
由于机器学习算法的输入形式是一种数值型向量(numeric vectors),所以攻击者就会通过设计一种有针对性的数值型向量从而让机器学习模型做出误判,这便被称为对抗性攻击。
和其他攻击不同,对抗性攻击主要发生在构造对抗性数据的时候,之后该对抗性数据就如正常数据一样输入机器学习模型并得到欺骗的识别结果。如给一个输入图像加入不易察觉的扰动,使模型将输入图像误分类成其他类别。

具体攻击策略

如果攻击目标是把source图猫误识别为target图狗,本文的攻击思路是:首先将target图狗输入到“教师模型”中,捕获target图在“教师模型”第K层的输出向量。之后对source图加入扰动,使得加过扰动的source图(即对抗样本)在输入“教师模型”后,在第K层在数值上产生非常相似的输出向量。由于前馈网络每一层只观察它的前一层,所以如果我们的对抗样本在第K层的输出向量可以完美匹配到target图的相应的输出向量,那么无论第K层之后的层的权值如何变化,它都会被误分类到和target图相同的标签。

如何选择攻击层
攻击者首先要判断学生模型是否使用了Deep-layer Feature Extractor,因为它是最易被攻击的方法。
如果学生模型的迁移学习方法是Deep-layer Feature Extractor ,攻击者需要攻击第N-1层以获得最佳的攻击性能;
如果学生模型的迁移学习方法不是Deep-layer Feature Extractor ,攻击者可以尝试通过迭代瞄准不同的层,从最深层开始,找到最优的攻击层。

给定学生模型如何确定教师模型
前面我们的误分类攻击是假设了攻击者知道教师模型是哪个的,接下来我们放宽这个条件,考虑攻击者不知道教师模型是哪个的情况。

基尼系数是经济学中的概念,在本文中如果基尼系数非常大,说明该学生模型对应的教师模型不在候选池中,或者该学生模型选择的不是Deep-layer Feature Extractor的迁移学习方法。

目标函数

公式含义为在扰动程度perturb_magnitude小于一定约束值(扰动一般经验值P)的前提下,最小化对抗样本(扰动后的source image)第K层的输出向量与target image 第K层的输出向量的欧式距离。之前计算扰动程度都是使用L2范数,但是它无法衡量人眼对于图像失真程度的感知。本文利用一种图像结构相似性DSSIM来度量图像加扰动前后的相似程度。
这意味着在实现的时候需要最优化两个loss,一个为DSSIM,一个为在k层两种不同输入的输出的欧式距离。

影响攻击效果的因素
扰动预算P的选择直接关系到攻击的隐蔽性。P越小攻击成功率越低,通过使用DSSIM度量方法测量图像失真,我们发现P=0.003是人脸图像的一个安全阈值。其对应的L2范数值明显小于前人的结果。
距离度量方法也会影响攻击效果,使用DSSIM产生的扰动不易察觉,使用L2的扰动更明显。DSSIM能考虑到图像的潜在结构,而L2平等对待每一个像素,并经常在脸部产生明显的“纹身样” 图案。
迁移学习方法也非常影响攻击效果,本文的攻击对于深层特征提取器是非常有效的,但对于全模型微调无效。

本文攻击的防御方法
论文还提出了3种针对本文攻击的防御方法,其中最可行的是修改学生模型,更新层权值,确定一个新的局部最优值,在提供相当的或者更好的分类效果的前提下扩大它和教师模型之间的差异。换句话说在教师模型第K层的输出向量和学生模型第K层的输出向量之间的欧氏距离大于一个阈值前提下,让预测结果和真实结果的交叉熵损失最小。

感想:

通过每一次论文的演讲,从前期的论文翻译学习到后期的演讲准备对自己都是一种挑战,论文学习过程中对新技术的一些基本概念及其模型有了更深入的了解,安全领域也有了全新的了解,最后感谢老师给了这次上课机会,收获很大。但是从我自身将来的研究方向来看,所讲的课程并没有太大的相关性,但是很好的补充了一些应该知道但是不知道的领域知识。之后的论文演讲不仅补充了研究方向的知识还加强了自身的演讲能力,是一次很好的挑战,总体来说收获很大。

建议与意见:

虽然通过这次课程我们学到了很多密码安全的新技术,但是,这次的课程非常紧促,每节课都只有两个小时给我们讲述当前的密码安全新技术。在每次上课的时候都不能够很好的去理解老师讲述的内容,由于缺少入门指导,我们在课下的自我学习效果并不是很好,但是我能够感受到老师想让我们通过这样的课程方式学到更多的东西。任何一节课所讲述的内容若是潜心研究,都能够供我们研究到博士毕业,只是单纯急促的两个小时加一篇博客不能够让我们深入理解这些内涵,还是希望老师在今后的课程中能够平衡课程的宽度与深度之间的关系,不希望一味的提升宽度而忽视了某个具体研究点的深度。

其他:

首先在由于之前没有先前的了解新技术,因此在理解新技术上有些吃力,不过多亏有鲍XX同学帮助我理解,带我弄明白。再者通过此次论文的演讲首先从知识上来说对科研方向从概念到模型都有了进一步的认识。通过此此我们认识了顶会论文,这些论文以我们身边的实例出发,更方便了我们对新技术的接收和了解。在以后写论文或者讲述一个较难理解的问题时我们可以从身边的实例讲起,这样更容易接受一个新知识。

其次通过此次上台讲解论文我们发现看懂到给同学们讲懂存在一定的差距,在这个过程中会引发我们更多的思考,不仅关于知识也关于描述方法。同时同学们也会想到我们没有思考到的问题,这样也促进了我们在知识方面的加深或者说是拓展。总之,通过此次上台的机会我们在知识理论和表达方面都取得了一定的进步。
最后:面对着这些前沿的新技术,作为一个研究生自己应该尽快找到一个自己真的愿意去深入研究的方向。

posted @ 2019-06-14 23:10  20189211  阅读(721)  评论(0编辑  收藏  举报