执行中间人攻击(CNG 示例)

下一代加密技术 (CNG) 安全通信示例演示了中间人攻击,即第三方 (Mallory) 将自身插入到了两个通信终结点(Alice 和 Bob)之间。

CNG 示例使用命名管道提供进程间通信。Alice 始终充当命名管道服务器,Bob 始终充当命名管道客户端。Mallory 充当 Alice 的客户端角色(即:他模拟 Bob)和 Bob 的服务器角色(即:他模拟 Alice)。这称为替换,是经典的中间人攻击。

有关此方案的详细信息,请参见分步执行密钥和消息交换(CNG 示例)

在 CNG 示例中,“模拟”一词用于指代 Mallory 替换 Bob,或 Mallory 替换 Alice。但是,关于命名管道,模拟还有特定含义,具体如 NamedPipeServerStream.RunAsClient(PipeStreamImpersonationWorker) 方法的文档中所述。

数字签名

数字签名通常用来防止中间人攻击。通常,签名密钥由公钥基础结构 (PKI) 提供并维护。PKI 一般不在计算机本地,而通常由安全组或管理组或者一个证书颁发机构支持。这样的基础机构的使用超出了本示例的范围。本示例演示如何使用 CNG 类来创建本地数字签名密钥。

插入点

中间人攻击需要在信号链中有一个插入点。当处理消息传递的物理硬件设备被破坏时就会发生这种情况。例如,线路可能被切换或重新路由,电信服务器可能被破坏并可能在电力上重新配置。但是,更可能的技术涉及重新配置维护网络的软件。例如,端口可能重新分配或重新路由,软件插入点可能建立在通信应用程序中。

一个小漏洞

如果以写模式打开一个文件,则该文件会被锁定,其他应用程序无法使用。同样,当一个管道客户端连接到管道服务器时,该管道会变为锁定,而仅供该客户端专用,并在该客户端断开连接之前保持锁定状态。

已建立的客户端/服务器通道很难被攻破。但是,在 CNG 示例中,Mallory 能够轻松地截获并更改 Alice 与 Bob 之间的消息。实际上 Mallory 并没有攻破已建立的管道通道,而是利用了一个被公司的通信协议忽略的小漏洞。

Alice 和 Bob 被指示使用 PublicChannel 管道来共享专用通道的名称,然后使用专用通道来交换销售联系人信息。这些指令使 Mallory 能够获得专用通道的名称并将自己插入到 Alice 和 Bob 之间。下面两节说明了具体的操作方法。

计时

通常,中间人攻击的成功取决于某些细节,例如计时。CNG 示例演示了这一概念。

Mallory 知道公司新开发的即时消息 (IM) 软件依赖于命名管道。他知道 Alice 和 Bob 将打开一个名为 PublicChannel 的管道。他还知道 Alice 将向 Bob 发送另一个管道的名称。Alice 和 Bob 将关闭 PublicChannel 管道,然后打开并使用第二个管道来交换销售联系人信息。

为窃取销售联系人信息,Mallory 必须从 Alice 处获取第二个管道的名称并防止 Bob 获取它。为此,他只需先于 Bob 打开 PublicChannel 管道的客户端即可。

为实现此截获,源代码在 Bob 的 Run 方法的 System.Threading.Thread.Sleep(200) 语句中使用了一个 200 毫秒的等待。由于此示例的目的是演示中间人攻击,因此 wait 语句是故意加上去的并且具有高度的可见性。在实际情况中,安全方案会更加难以分析,它们涉及软件应用程序、传输协议、网络身份验证、用户帐户、日志记录、权限、用户培训、通信监视以及其他分析技术的组合。

尽管有这些复杂的方法,但网络服务器中一个简单的 200 毫秒传播延迟可能会轻松地通过,而在数个月内都不会被注意到。这就是在最终击败截获之前创建了 CNG 示例的五个不同版本的原因。

替换

通过截获第二个管道的名称 (AliceAndBobChannel),Mallory 能够侦听 Alice 和 Bob 的通信,并更改他们互相发送的消息。下面说明了他是如何实现这一替换的:

  1. Alice 以服务器模式打开 PublicChannel 管道,并等待 Bob 连接。

  2. Mallory 以客户端模式连接到 PublicChannel 管道,并从 Alice 那里接收第二个管道的名称 (AliceAndBobChannel)。

  3. Alice 和 Mallory 关闭 PublicChannel 管道。

  4. Alice 以服务器模式打开 AliceAndBobChannel 管道,Mallory 以客户端模式连接到它。

  5. Mallory 作为服务器通过 PublicChannel 管道连接到 Bob,同时 Bob 作为客户端连接。

  6. Mallory 向 Bob 发送管道名称 AliceAndBobChannel1(即,他对该名称做了细小改动)。Bob 认为他是从 Alice 那里接收到的该信息。

  7. Mallory 和 Bob 从 PublicChannel 管道断开连接。

  8. Mallory 作为服务器打开 AliceAndBobChannel1 管道,同时 Bob 作为客户端连接。

现在 Mallory 已经成功地插入到了 Alice 和 Bob 之间。

Mallory 继续充当 Alice 的客户端(通过 AliceAndBobChannel 管道),并继续充当 Bob 的服务器(通过 AliceAndBobChannel1 管道)。现在他可以随意读取、更改和转发消息。Alice 和 Bob 都没有发现有人截获并更改了他们的消息。

成功的中间人攻击通常是很微妙的。为了避免被发现,Mallory 一直保持低调并仅仅对销售联系人信息做细小更改。他不希望他的更改被注意到。

结束语

发现中间人需要时间、耐心和密切关注。该示例考虑到了一个 200 毫秒的等待。五分之一秒足够危及整个销售部门的安全。

请参见

概念

加密服务

.NET Framework 加密模型

加密服务

其他资源

加密任务