1. 前言

最近,我读了Prof. Zhiyun Qian《如何在计算机应用领域寻找研究想法》一文,还看完了Prof. Yueqi Chen团队的四个研究分享(视频1视频2视频3视频4),以及后者为“Advanced System Security”课程制定的课程安排和该课程最后一节课“Research Contribution in System Security”的课件。受益匪浅。因此,我打算在这篇笔记中记录一下这些分享的精华部分,以指导未来的安全研究。

在此之前,我阅读过Prof. Yueqi Chen所在团队的若干论文,并写过一些笔记:

另外,学术论文浩如烟海,应该建立一个有效的研究归类体系,将自己读过的论文进行合理归类。对此,我将在本文的最后给出一个研究归类框架。这个框架结合了前人的经验、截至目前我读论文所收获的经验,和从业界到学界一路走来我对信息安全的理解。这个框架还比较粗糙,需要在后续研究的过程中不断改善。

2. Prof. Zhiyun Qian:如何寻找研究想法

首先是对Prof. Zhiyun Qian的分享的总结——这篇文章的内容非常丰富。Prof. Zhiyun Qian主要给出了“学会阅读论文及培养自己的兴趣”、“认清产生研究思路的范式”和“养成思考研究思路的好习惯”三个方面的建议。本节部分参考了InForSec的中文翻译

Prof. Zhiyun Qian认为,直接接受别人提供的研究想法是在逃避一个研究项目中最困难的一步——想出一个好的研究思路。你失去了训练自己独立寻找研究思路的机会。你应该尽早开始训练自己寻找研究思路的能力。

2.1 阅读论文,培养兴趣

思路不是突然冒出来的,大部分学术研究也并不是空中起楼阁,而是建立在前人的基础上。因此,应该多阅读论文,从中获得灵感。同时,写论文阅读笔记,记录自己的观点和有建设性的想法。在这个阶段,不必追求理解一篇论文的全部技术细节,这会浪费你的时间。

尝试去欣赏或批判论文中的研究想法,找到你最感兴趣的论文类型,并问自己为什么。不同的论文可能有不同的研究领域(如操作系统、网络协议等)、研究风格(如攻击面分析、防御方案设计等)、研究方法(如人工分析、程序分析、形式化方法、人工智能方法等)。

找到你喜欢的论文类型,培养你的研究兴趣,最终形成你的研究思路。

Prof. Zhiyun Qian早期沉迷于新型攻击技术,总是会自问:这些人是如何找到缺陷的?开展这样的研究需要什么技能?问题将促成相应思维和和研究方法的培养。另外他认识到,没有适当的自动化技术,可持续和可扩展将无法实现。因此,程序分析、形式化方法、机器学习等技术是必要的。

2.2 认清产生研究思路的范式

论文背后通常都有一个独特的故事,其产生则可以归类为几种思维范式。Prof. Zhiyun Qian总结了几种研究范式,并推荐了Prof. Philip Guo的一篇关于研究范式的博客文章(文章原链接已失效)。

范式1:填补空白

读几篇关于某一主题的论文,记下这些论文在系统、方法、技术、数据集等方面提供的前提假设、证明支撑/属性特点等方面的差异,即下面所提到的“维度”,然后画一张表(不一定是二维的)来进行“维度”比较。找到其中的“空白”,即未被考虑或涉足的部分,这些都是潜在的新的研究思路(事实上,许多好的论文使用这样一个表格来清晰地表明自身的研究与相关研究的区别)。

下面是一个“填补空白”范式的简单示例:

领域/技术 静态分析 动态分析
UAF ? Yes
OOB Yes Yes

如上面的表格所示,如果你通过广读论文发现还没有人用静态分析技术研究过UAF漏洞,那么或许你就可以开展这方面的研究。

这一范式的应用有三个条件(不一定是一开始你都满足的,但是研究即将结束时你应该都满足):

  1. 你熟悉各类程序分析技术;
  2. 你了解不同类型的安全漏洞;
  3. 你做到了广读论文,确定某个细分点确实没有人研究过。

范式2:扩充延伸

这是“填补空白”范式的自然递进。正如上文所提到的,绘制空间中一些好的“维度”可能是最具挑战性的一步。但是,如果你在某个方向已经有了一些研究思路(例如发表了一两篇论文),就可以从特别的角度看到别人不容易找到的“维度”。

在我看来,降低攻击或防御技术的成本和条件,以及提高攻击或防御技术的准确率、稳定性和速度等指标,都属于这一范式。一言蔽之,你在已有研究上找到了某个可优化的隐藏维度。

研究示例:

范式3:造锤找钉

如果你拥有独一无二的专业知识、技术、系统、甚至数据集(其他人无法轻易得到的),你就可以充分利用它们寻找有趣的问题来进行解决。通过这种方式积累专业知识的好处是,一旦你深入到某一个主题中,你就会更容易找到新的问题来解决。

Prof. Zhiyun Qian举了Prof. Peter Chen团队在虚拟机方向的专业知识、他的团队在网络侧信道的专业知识、UCSB的Angr工具和UCSD的独特数据集等例子。然而,Prof. Zhiyun Qian还指出:

在我看来,尽管这是一种很好的研究方式,有一定的影响力并且可持续研究,但并不一定适用于所有人。首先,构建专门知识、系统或基础设施直到开始有收益,可能会非常耗时。其次,这类计划有时需要整个团队来进行构想、计划和组织(通常超过博士生个人的能力)。最后,只有少数群体主导着一个领域,除非你有独特的视角,否则要超越他们是非常困难的。换句话说,如果你能找到很多人需要的东西,但目前还没有好的解决方案,那么它可能是值得考虑的。

范式4:以小见大

这个范式指的是,从一些微小或偶然的发现开始,深入研究,看看这一发现能否支撑一篇文章。如果你觉得这个现象很有趣、背后有深层次的解释,并且还能发现类似的现象,那么很有可能这个发现是值得深入研究的。

研究示例:

另外,近期我读过的发表在USENIX Security 2023上的Attacks are Forwarded: Breaking the Isolation of MicroVM-based Containers Through Operation Forwarding也很符合“以小见大”范式的特征。

范式5:推陈出新

这个范式强调对前人成果的复现,从中发现作者的错误、某些对结果产生影响的因素,或试验方法、数据集的局限性和片面性。前人工作的局限意味着提升的空间。

复现的结果要比原文所展示的结果消极许多。对造成这一消极结果的原因的深入挖掘促成了一种可以绕过现有防范体系的新的攻击方法的提出。

范式6:外部资源(工业界、新闻等)

对于网络安全这种实践性较强的领域,与业内人士建立联系、了解其需求和痛点可能会给你的研究带来全新思路。相比学术界,工业界拥有更多的资源,但其思维方式与处理技术问题的优先级却和学术界有所不同:工业界通常强调抗拒风险,对方案的可靠性要求较高。而学术界的好处是:探索性的工作是被允许的,不会要求一次性地解决所有的问题。如果解决某个问题,某种意义上甚至可以自己定义“解决”的标准。如果你正在研究一个行业中亟待解决的问题,并且对该问题尚无完善的解决方案,那么对这个研究项目来说,其“成功”门槛(相对其他较为成熟的领域)会大为降低。

研究示例:

由业界的“打补丁”流程存在的问题启发的研究:

由民间流行的Android Root工具启发的研究:

其他范式

除了上述范式之外,信息安全研究中有两种特别的范式:

  1. 对抗性研究。此消彼长的攻防对抗,无论在工业界还是学术界都非常受关注。
  2. 流程自动化。前面提到的程序分析、机器学习等技术都是流程自动化的范畴。事实上,现在很多流程自动化技术正在从学术界走进工业界。

2.4 养成思考研究思路的好习惯

在这部分,Prof. Zhiyun Qian给出了五个建议(InForSec的中文翻译非常棒,这里直接引用了):

  1. 要认识到一个项目的落地和一个想法的产生及形成是根本不同的。不要完全沉浸于你所进行的项目中并把自己和外界割裂开来(很多学生都会犯这个错误)。要坚持定期阅读论文,尤其是当某一会议刚刚举行、论文大量公布的时候。你可以至少把这些论文的标题都“扫”一遍,并阅读你所感兴趣的论文的摘要。如果阅读摘要后你发现这篇论文确实是你感兴趣的,那你应该将其更为深入地阅读。你需要确保自己了解论文作者的研究思路,而不能仅仅停留在了解论文中所提到的技术的层面。
  2. 你需要严肃对待论文审稿。 导师经常将论文审稿的工作交给学生,然后与学生讨论这些待审稿的论文。参与论文审稿是学习“如何写好一篇论文”的好机会。这是因为在通常情况下,你只会阅读到新奇、有影响力的,且文风优雅的论文;而论文审稿时,你将通过审视被拒收的论文,了解其为何被拒收,进而提升你的论文写作能力
  3. 你需要对不同领域的论文保持好奇和开放的心态。 我的建议是,你应该“博览群书”。计算机科学的每个单独的领域(如系统、网络、安全、软件工程)都处在越来越成熟的阶段,许多令人惊艳的想法来自于不同领域交叉时碰撞出的思维火花。在我读书期间,尽管我的导师的主要研究方向是计算机网络,但我一直在研读系统和程序分析方向的论文,我认为这种所谓“跨领域”的阅读对我后来的教授生涯帮助很大。
  4. 你需要多参加阅读小组、多参与讨论并多提出问题。 对于一些讨论量很大的会议(如你所在的研究小组所举办的会议),一定要尝试参加。如果你害怕表达自己的意见(这可能是因为你觉得自己知识不足或经验欠缺),你需要记住:你的导师正在努力帮助小组中的每一个人(尤其是低年级学生)成长和进步,没有人会因为你问一个所谓“愚蠢”的问题而嘲笑你。如果你真的觉得腹中无物不知从何问起,那在讨论前你也可以试着阅读将要讨论的论文。这样,你至少可以在会上讨论下“何种思维令该文章得以成型”。当你经过这样的一两次尝试后,你会感受到这样做的回报(即获得了能进行良好讨论的能力)。长此以往,你便会越来越适应“讨论”这件事本身。对我个人而言,我非常喜欢的事情之一就是辩论某个想法是否“足够优秀”(尽管其已经在相当好的会议上发表)。一些学生扮演攻击者的角色,指出这个想法的弱点和局限性;其他学生则负责“捍卫”这个想法。这种论文审稿模拟有助于让你养成判断某个想法是否足够完善的眼力。
  5. 多和你的实验室伙伴们聊天,去了解他们并和他们保持良好的关系。 你和他们共处的时间可能会超过你和你的导师相处的时间,所以为什么不让这种共处成为一种愉悦的体验?就某一个研究课题开展一场天马行空的对话,就某篇论文进行一个小小的辩论,在交流中碰撞出思维的火花——这种感觉真是太棒了。建立起这种人际关系的方法之一是定期与他们交谈:向他们询问项目进展,提供给他们真诚的反馈。他们很可能会用相同的方式回馈于你,最终有利你的研究进展。除此之外,当你因为某些原因而感到“卡住”时,和他人的交谈可能能带给你一个审视问题的全新视角,进而帮助你走出困境——我自己便曾在这样的场景中获益。

3. Prof. Yueqi Chen:系统安全领域的研究贡献

我一直关注着Prof. Yueqi Chen和他前后两个团队的研究,从中学到不少知识和方法。尽管对于我来说,很多东西只是看到,而掌握尚需时日,但它们也起到了非常好的引领作用。

在CU Boulder,Prof. Yueqi Chen主讲两门课程:“Advanced System Security”和“Modern Offense and Defense in Cybersecurity”。其中,后者目前尚未有公开资料放出,我只在YouTube上找到一个Prof. Yueqi Chen的同题演讲;对于前者,Prof. Yueqi Chen在个人网站上公开了课程安排和推荐论文列表和该课程最后一节课“Research Contribution in System Security”的课件

从课程安排和推荐论文列表来看,“Advanced System Security”是一个论文选读课,涉及Kernel Security、Type Confusion & Code-Reuse、Control-Flow Integrity、Code Diversification & JIT-ROP Protection、Live ASLR、Code-Pointer Integrity、Information Hiding、Side-Channel等主题的超过一百篇相关论文,大多数论文均选自顶会。

Xnip2023-06-05_17-39-29

该课程的最后一节课则讲解了系统安全领域常见的研究贡献类型。这部分介绍对于新手尤其有帮助。在日常阅读论文的过程中,我们也总在文章的“Introduction”部分看到作者列出的不同类型的贡献,它们都能归到这一节课介绍的不同的贡献类型上面。

image-20230604132709767

与Prof. Zhiyun Qian提到的范式有重合的地方,这里Prof. Yueqi Chen将研究贡献在横向按照攻、防做了切分,然后在纵向划分成七个类别(如上图所示)。针对这些类别的解释和需要思考的问题如下:

  1. Empirical contribution:通常是基于观察和数据收集的新发现。自问:这些发现重要吗?发现的过程中使用的方法sound吗?
  2. Artifact contribution:通常是原型(prototype)、新系统、新架构、新工具(套件)和新技术。自问:这些产出有什么价值?它是如何工作的?
  3. Methodological contribution:通常是开展工作的新知识(方法)。自问:新方法的实用性(utility)、可复现性(reproducibility)、可靠性(reliability)和有效性(validity)如何?
  4. Theoretical contribution:通常是新的或改进的概念、定义、模型、原理或框架。自问:在描述(预测、解释)给定研究对象方面,它的新颖性(novelty)、稳健性(soundness)和能力如何?
  5. Dataset contribution:通常是新的、有用的语料库(corpus),附带针对它的特征的分析。自问:它提供了一个何等程度上有效、具有代表性的数据?
  6. Survey contribution:通常是对趋势和缺口(空白)的揭露。自问:针对给定话题的现有工作,它在已有材料组织和未来研究方向(机会)提示两方面做的如何?
  7. Opinion contribution:通常是通过论证来使读者改变原有看法。自问:论证的有效性和力度如何?

4. 思考:研究的定位与归类

最后,结合自己之前的研究工作经验,我尝试在两位的基础上梳理出一套自己的研究归类体系。如前所述,学术论文浩如烟海,我们应该建立一个有效的研究归类体系,将自己读过的论文进行合理归类。

总体上,我从研究问题(Problems)、研究方法(Approaches)、研究对象(Objects)和研究度量(Metrics)四个维度为一个研究(论文)打标签:

  1. 这篇论文的研究问题是什么?
  2. 针对该问题,这篇论文提出的研究方法是什么?
  3. 该问题的实际研究对象是什么?(例如,如果问题是漏洞挖掘,实际研究对象可能是Linux内核)
  4. 这个研究在各项研究度量指标上表现如何?(准确率、速度、性能、成本等)

在此基础上,每个维度都是可以展开的。整个归类体系的思维导图如下所示:

Security Research

其中,研究问题更多指的是抽象问题,而非具体问题。我想从“事前-事中-事后”的角度来划分研究所处的阶段,进而划分不同的抽象研究问题(发现新漏洞类型、安全系统设计、漏洞挖掘、缓解措施、AEG、溯源等)。然而,这样一来,似乎这个框架又没有涉及到狭义的具体问题,如各种类型的漏洞等。因此,我在上图中添加了一个自由节点来作为狭义问题的示例——漏洞,如UAF、DF、Double Fetch、OOB等。

有了这一框架,我们就可以对看到的研究进行归类,并且明确自己的研究所处的位置。例如,“基于程序分析的Linux内核UAF漏洞挖掘”研究的研究问题是UAF漏洞挖掘,研究方法是程序分析,研究对象是Linux内核。研究的评估部分可能会涉及到在若干度量指标上的表现。

从这一框架出发,新的研究可以通过两种方法产生:

  1. 在研究问题、研究方法和研究对象之间进行组合;
  2. 在研究度量上进行优化。

需要指出的是,系统安全实在是一个很大的话题,相关的研究也已经数不胜数。我已经发现一些研究并不能很好地嵌入这个框架,而每个维度上其实又会有大量的细分场景(例如,机器学习作为一种带有跨学科性质的研究方法,自身有着庞大的体系),但是它确实能够帮助我梳理很大一部分研究了。

更新:2023-06-28

经过进一步思考,我认为需要区分“研究问题”和“安全问题”:前者是领域无关的,后者则是信息安全研究的核心,如漏洞、恶意软件、攻击(抽象层次由低到高)。将前面我们说的研究问题简单地拆成“操作”(Operations)和“问题”(Problems)能够更好地覆盖更多的研究。例如,操作可以是“挖掘”,问题可以是某种类型的“漏洞”;操作可以是“检测”,问题可以是“APT攻击”……

因此,我们可以将之前总结的四个维度进一步扩展修改为:

Approaches, Objects, Operations, Problems + Metrics (AOOP + M)

根据经验,我们可以对AOOP四个维度上每个小点上的研究做树型展开,在M维度上评估、比较研究效果;我们可以将已有研究在这五个维度上进行归纳,并通过维度组合找出潜在的新研究点。

Approach Object Operation Problem Metrics
Program Analysis Linux Kernel Discovery UAF Vulnerability FP/FN

5. 总结

在本文中,我整理了一下最近看到的各种值得借鉴的做学问的经验,以及自己的思考。

本文并未涉及技术细节,那样可能就会显得凌乱了。事实上,本文开头给出的四个视频链接分别对应Prof. Yueqi Chen对于他自己的研究的梳理讲解和他及团队在Linux Security Summit上分享的HotBPF、HotBPF++两项很有意思的研究成果。

欢迎有想法的朋友一起交流探讨。