高中生,一年,从 0 到 0day 的秘密
在第35届混沌通信大会上 (35C3),今年上大一的 Jonathan Jacobi 发表了题为《从0到 0day》讲述了自己如何从安全基础几乎为零的情况下,用了一年多点的时间在 Edge 浏览器中找到了自己的首个 0day 漏洞。他希望对有志于从事安全事业的新手带来一些帮助,同时希望对学习更多关于浏览器漏洞和利用知识的老手带来一些启发。以下是360代码卫士团队根据他的演讲视频整理的内容:
演讲稍长,但绝对有料好看,甚至值得一读再读~
我是谁?
大家好,我叫 Jonathan,现在18岁,是一名计算机科学和数学专业的学生,对漏洞研究感兴趣,也是微软 MSRC-IL 的一名安全研究员。我也打 CTF 比赛,所在团队是 Perfect Blue。
我在去年才开始接触安全研究,这次演讲的第一部分主要说一下我在一年中都学了什么以及是如何学的;第二部分说一下我是如何从 ChakraCore 中找到第一个 0day 漏洞(JIT类型混淆漏洞)的。可能你刚刚接触安全领域,只知道一些基础的编程知识,但可能你也能听懂。虽然我会讲很多代码,但还好,不是太复杂。最后,我们看下演示。好的,我们开始吧。
知识和实践准备
我为什么要研究漏洞?对我而言,漏洞就像是一个谜,非常具有挑战性的东西。我们必须找到开发人员未考虑到的一些缺陷。至少对我而言这很具有挑战性,也非常有意思。我觉得挖漏洞是个很棒的事情。
那么,什么是漏洞呢?关于漏洞的定义很多。当你想了解某件事的时候,你就会去维基百科上搜索。上面有很多不同的解释,而且有一些看起来很古怪,比如有一个解释是这么说的,“某资产无法抵御威胁攻击动作的可能性”。我不懂它到底说的是什么。我的理解是,漏洞就是程序中出现的各种缺陷,你可以用来改变程序的控制流。这就是我对漏洞的理解,但定义没有告诉我如何找到一个漏洞。
那么,我们怎么才能找到漏洞呢?我当时开始找漏洞时有一些编程基础,我不是写程序最优秀的开发,也就是“还行”的水平,知道C语言、汇编语言,学了一些操作系统内部知识,了解操作系统是会如何运作的,能读一些 python 代码。所以我虽然并不是最优秀的开发,但我具备一些相关知识。比如,我从一本很不错的希伯来语书中了解了一些 C++ 语言的知识,以便我真正地开展漏洞研究。
下一步,我了解了一些漏洞的基础知识,如一些基础的漏洞类型像典型的堆缓冲溢出问题、整数溢出等。之后我就开始通过模拟演习开始实践自己所学的知识。模拟演习是可以在线下解决的安全挑战,这些挑战问题包括找到漏洞并利用它。最开始的时候我败得一塌糊涂,但随着时间的推移,我认为失败了也没关系,因为我看了解决方案、write-up,我知道了如何写解决方案,如何解决问题。所以最开始失败没关系,因为我们每个人都是这样过来的。之后我开始参加 CTF 比赛。
CTF 比赛要求团队作战,这就是我找到团队成员的方式,我们通过 CTF 相识,然后一起打比赛。有时候我们输得很惨,有时候我们打得不错进了决赛,还一起周游世界,因为有时候赛事主办方会支付差旅费,哈哈。我们去了很多很酷的地方,真的很爽。
我认为 CTF 比赛是进入安全领域的一个很好的方式。
之后我决定“潜入深水区”。一旦你了解了基础知识之后,不要在“浅水区”停留太长的时间,这一点很重要,我们要给自己一些挑战。刚开始我害怕失败,但是随着时间的流逝,我想明白了,失败也没什么可怕的。失败后我能找到解决问题的技术。所以我认为这一点很重要:不要害怕失败,即使失败了,我们也能从别人的解决方案中学到东西。
LiveOverflow 发的一条推文说得很好:学到基础后,尽快去做自己不懂的更难的事;不断地接触自己不懂的事情,然后重新来看自以为懂但实际上不懂的事情;然后从各种资源了解信息,学习从多个角度和方向一步步解决问题。
我认为这样做很重要。LiveOverFlow 也有 YouTube 频道,我也在看,讲的是漏洞和安全问题。推荐大家也可以关注他。
我具备一些知识后,通过 CTF 比赛、模拟演示等不断实践、实践、再实践。不断实践、自己解决问题很重要,因为这样你才能知道解决问题的技巧,然后再自己解决遇到的问题。一些漏洞是有特定模式的,要了解这些模式,你就需要多看几次。发现这些模式的一种好方法就是不断解决问题。这也是我为什么喜欢解决真实漏洞问题的原因,很多网站提供不少这样的途径,比如 Project Zero 的 0day 项目,你可以读取一些漏洞信息等。
我还发现CTF 和真实环境中的漏洞之间存在很大的关联,它们同时存在于 CTF 和真实世界中。漏洞实际上就是由 bug引起的。你在真正着手开始进行研究时遇到的最大问题就是代码库过于庞大(因此你可能会头大)。但实际上即使代码框架很庞大,但漏洞还是在具体某处。所以,不要发愁看代码库,因为漏洞很可能就恰好在你开始查看具体的某些代码时出现。之后你可以开始尝试解决问题,即开始了解真正的代码库。
经过一些实践后,我在想我们如何发现漏洞呢?当我们开始真正重复解决问题、实践的过程后,我发现漏洞研究就是关于找到 bug,而我们是通过读代码实现这个目标的。因此,审计代码很重要,因为我们想从中找到漏洞,对吧?而这需要我们真正审计代码,需要实践。因此实践在漏洞研究中起着非常重要的作用。因此我们搞砸了的时候可能就是更接近找到漏洞的时候。因此我认为实践很重要。
那我是如何发现漏洞的?我之前说过漏洞存在模式,而模式是通过时间的积累发现的。但我并没有研究很长的时间,只有短短的一年,那么我是如何发现漏洞的?实际上就是通过不断实践发现的。像我之前说过的那样,多实践能弥补开始晚的问题。我发现漏洞里面有一些模式,比如编程错误像整数溢出或类型混淆问题,这些问题实际上是存在的,因为人总是会犯错的。人类会犯错,我们并不是完美的。下面的代码就是一个很好的例子。
在第35届混沌通信大会上 (35C3),今年上大一的 Jonathan Jacobi 发表了题为《从0到 0day》讲述了自己如何从安全基础几乎为零的情况下,用了一年多点的时间在 Edge 浏览器中找到了自己的首个 0day 漏洞。他希望对有志于从事安全事业的新手带来一些帮助,同时希望对学习更多关于浏览器漏洞和利用知识的老手带来一些启发。以下是360代码卫士团队根据他的演讲视频整理的内容:
演讲稍长,但绝对有料好看,甚至值得一读再读~
我是谁?
大家好,我叫 Jonathan,现在18岁,是一名计算机科学和数学专业的学生,对漏洞研究感兴趣,也是微软 MSRC-IL 的一名安全研究员。我也打 CTF 比赛,所在团队是 Perfect Blue。
我在去年才开始接触安全研究,这次演讲的第一部分主要说一下我在一年中都学了什么以及是如何学的;第二部分说一下我是如何从 ChakraCore 中找到第一个 0day 漏洞(JIT类型混淆漏洞)的。可能你刚刚接触安全领域,只知道一些基础的编程知识,但可能你也能听懂。虽然我会讲很多代码,但还好,不是太复杂。最后,我们看下演示。好的,我们开始吧。
知识和实践准备
我为什么要研究漏洞?对我而言,漏洞就像是一个谜,非常具有挑战性的东西。我们必须找到开发人员未考虑到的一些缺陷。至少对我而言这很具有挑战性,也非常有意思。我觉得挖漏洞是个很棒的事情。
那么,什么是漏洞呢?关于漏洞的定义很多。当你想了解某件事的时候,你就会去维基百科上搜索。上面有很多不同的解释,而且有一些看起来很古怪,比如有一个解释是这么说的,“某资产无法抵御威胁攻击动作的可能性”。我不懂它到底说的是什么。我的理解是,漏洞就是程序中出现的各种缺陷,你可以用来改变程序的控制流。这就是我对漏洞的理解,但定义没有告诉我如何找到一个漏洞。
那么,我们怎么才能找到漏洞呢?我当时开始找漏洞时有一些编程基础,我不是写程序最优秀的开发,也就是“还行”的水平,知道C语言、汇编语言,学了一些操作系统内部知识,了解操作系统是会如何运作的,能读一些 python 代码。所以我虽然并不是最优秀的开发,但我具备一些相关知识。比如,我从一本很不错的希伯来语书中了解了一些 C++ 语言的知识,以便我真正地开展漏洞研究。
copyright 无奈人生
下一步,我了解了一些漏洞的基础知识,如一些基础的漏洞类型像典型的堆缓冲溢出问题、整数溢出等。之后我就开始通过模拟演习开始实践自己所学的知识。模拟演习是可以在线下解决的安全挑战,这些挑战问题包括找到漏洞并利用它。最开始的时候我败得一塌糊涂,但随着时间的推移,我认为失败了也没关系,因为我看了解决方案、write-up,我知道了如何写解决方案,如何解决问题。所以最开始失败没关系,因为我们每个人都是这样过来的。之后我开始参加 CTF 比赛。
CTF 比赛要求团队作战,这就是我找到团队成员的方式,我们通过 CTF 相识,然后一起打比赛。有时候我们输得很惨,有时候我们打得不错进了决赛,还一起周游世界,因为有时候赛事主办方会支付差旅费,哈哈。我们去了很多很酷的地方,真的很爽。
我认为 CTF 比赛是进入安全领域的一个很好的方式。
之后我决定“潜入深水区”。一旦你了解了基础知识之后,不要在“浅水区”停留太长的时间,这一点很重要,我们要给自己一些挑战。刚开始我害怕失败,但是随着时间的流逝,我想明白了,失败也没什么可怕的。失败后我能找到解决问题的技术。所以我认为这一点很重要:不要害怕失败,即使失败了,我们也能从别人的解决方案中学到东西。
本文来自无奈人生安全网
LiveOverflow 发的一条推文说得很好:学到基础后,尽快去做自己不懂的更难的事;不断地接触自己不懂的事情,然后重新来看自以为懂但实际上不懂的事情;然后从各种资源了解信息,学习从多个角度和方向一步步解决问题。
我认为这样做很重要。LiveOverFlow 也有 YouTube 频道,我也在看,讲的是漏洞和安全问题。推荐大家也可以关注他。
我具备一些知识后,通过 CTF 比赛、模拟演示等不断实践、实践、再实践。不断实践、自己解决问题很重要,因为这样你才能知道解决问题的技巧,然后再自己解决遇到的问题。一些漏洞是有特定模式的,要了解这些模式,你就需要多看几次。发现这些模式的一种好方法就是不断解决问题。这也是我为什么喜欢解决真实漏洞问题的原因,很多网站提供不少这样的途径,比如 Project Zero 的 0day 项目,你可以读取一些漏洞信息等。
我还发现CTF 和真实环境中的漏洞之间存在很大的关联,它们同时存在于 CTF 和真实世界中。漏洞实际上就是由 bug引起的。你在真正着手开始进行研究时遇到的最大问题就是代码库过于庞大(因此你可能会头大)。但实际上即使代码框架很庞大,但漏洞还是在具体某处。所以,不要发愁看代码库,因为漏洞很可能就恰好在你开始查看具体的某些代码时出现。之后你可以开始尝试解决问题,即开始了解真正的代码库。 内容来自无奈安全网
经过一些实践后,我在想我们如何发现漏洞呢?当我们开始真正重复解决问题、实践的过程后,我发现漏洞研究就是关于找到 bug,而我们是通过读代码实现这个目标的。因此,审计代码很重要,因为我们想从中找到漏洞,对吧?而这需要我们真正审计代码,需要实践。因此实践在漏洞研究中起着非常重要的作用。因此我们搞砸了的时候可能就是更接近找到漏洞的时候。因此我认为实践很重要。
那我是如何发现漏洞的?我之前说过漏洞存在模式,而模式是通过时间的积累发现的。但我并没有研究很长的时间,只有短短的一年,那么我是如何发现漏洞的?实际上就是通过不断实践发现的。像我之前说过的那样,多实践能弥补开始晚的问题。我发现漏洞里面有一些模式,比如编程错误像整数溢出或类型混淆问题,这些问题实际上是存在的,因为人总是会犯错的。人类会犯错,我们并不是完美的。下面的代码就是一个很好的例子。
www.wnhack.com