加密和验证本地主机流量?

信息安全 加密 tls 网络 tcp
2021-08-23 08:39:56

我在同一台机器上有一些应用程序组件,但需要通信的语言不同。我正在使用 localhost 上的套接字通信来做到这一点。传输的数据是机密的。

这种通信是否应该加密?

我的意思是攻击者必须能够在机器上运行代码才能拦截它,在这种情况下用户无论如何都会丢失,对吧?

3个回答

您需要加密来阻止被动攻击者(监视线路并试图计算出数据内容的邪恶人员),并需要完整性(及其同级身份验证)来阻止在传输过程中更改数据的主动攻击者。SSL 两者都提供。但是,这仅在攻击者可以实际监视或更改传输中的数据的情况下才有意义。对于同一台机器上的两个进程,通过“localhost”网络进行通信,可以做到这一点的攻击者通常“已经获胜”。

细节可能因操作系统而异。但是,您的安全性通常取决于操作系统,而不是加密。例如,考虑一个有多个用户的 Unix 系统。如果您的两个进程相互通信,则其他用户的进程无法窥探数据交换(除非攻击者是root,然后他可以做任何事情);但是,他们可能会尝试模拟:在某些时候,您的一个组件必须连接到另一个组件,而 TCP 套接字的集合点是一个端口号。可以在机器上运行自己的代码(作为普通用户)的攻击者可能会维护一个假服务器,该服务器将接收连接请求以代替预期的组件。为了防止这种情况,客户端必须确保它与预期的服务器对话(反之亦然):可以使用 SSL 完成,但存在更好的解决方案(在这种情况下,使用具有受系统访问权限和/或保护的路径的 Unix 域套接字getpeereid())。

如果在您的情况下,本地机器被认为是“干净的”(机器上没有以任何身份运行恶意代码),那么与 localhost 的连接是安全的,不需要任何额外的保护。如果可能在机器上运行潜在的敌对但非特权代码(这是“共享多用户机器”模型,这是 1980 年代后期 Unix 系统的典型),那么您应该使用操作系统功能来确保确实传达了连接到正确的进程(即到以预期身份运行的进程)。SSL 将是矫枉过正。

那么,如果这两个程序都在本地主机上运行,​​为什么要使用网络通信呢?您可以使用任何 IPC(进程间通信),例如命名管道 您可以在调用 CreateNamedPipe 函数时为命名管道指定安全描述符。安全描述符控制对命名管道的客户端和服务器端的访问。

阅读访问控制模型以了解如何保护命名管道。 http://msdn.microsoft.com/en-us/library/windows/desktop/aa374876(v=vs.85).aspx 或者您可以简单地使用两个进程都知道秘密的对称加密算法,您可能会将秘密硬编码到代码中。

如果我理解正确,潜在威胁来自恶意进程(在本地运行)进入本地运行的同一应用程序的两个组件中间并通过 IPC 相互交互。事实上,这是一个被忽视的威胁模型,即使在密码管理器等安全关键软件中,像机器人 (MitMa)这样的欺骗本地攻击者也是一个真正的威胁。密码管理器将桌面应用程序作为一个组件,将浏览器扩展作为另一个组件,作为本地服务器和客户端运行。我认为 OP 的架构反映了类似的东西。

OP没有提到底层操作系统。IPC 的选择取决于底层操作系统、其对安全功能的支持或特定的 IPC 方法。因此,除了网络套接字(用于本地通信)之外,没有一个 IPC 适合所有概念。

在我看来,IPC 应该与网络通信一样谨慎对待。因此,如果要使用网络套接字,则很容易使用基于 TLS/SSL 的方法,就像它们在实际网络通信中所做的那样,以保护 IPC 通信可能很诱人。但是,请记住以下几点:

正如@Tom Leek 指出的那样,使用基于 TLS/SSL 的方法是不值得的。尽管它们为您的 IPC 组件提供了安全性,但必要的基础设施(包括证书颁发机构)可能是矫枉过正。这里的目标只是IP通道的两端(同一软件的两个进程或组件)的授权,而不是将它们绑定到强身份

对于其他 OS 和 IPC 方法,需要考虑以下几点:

  • 如果软件架构允许在两个相关进程(w..g parent-child)之间建立 IPC 通道,最好使用匿名管道套接字对由于这些情况下 IPC 通道的端点是由同一进程同时创建的,因此不受信任的进程无法进入中间。
  • MacOS 具有独特的 IPC 方法,在其他操作系统上不可用,例如CFMessagePort,其中 IPC 通道与各个登录会话相关联:因此,如果您担心来自具有另一个登录来源的邪恶进程,这里已经注意了一个登录会话的进程不能与另一个会话交互。
  • 正如@techno 所提到的,命名管道是一个合理的选择,前提是您的应用程序是特定于 Windows 的。但是,有几点需要考虑:
    • 命名管道放置在命名管道文件系统的根目录中,并安装在特殊路径\.\pipe\ 下,系统的每个用户(包括来宾)都可以访问该路径。假设您的软件使用命名管道并且它有一个特定的名称。当不存在具有该名称的管道时,任何本地进程都可以创建它来模拟 IPC 的一端。因此,安全描述符是必须的。
    • 第一个实例的创建者决定实例的最大数量并指定安全描述符,其中包括一个访问控制列表 (DACL),用于控制对命名管道的所有实例的访问。记住不要依赖默认描述符,它授予每个人读取访问权限。
    • 使用FILE_CREATE_PIPE_INSTANCEFILE_FLAG_FIRST_PIPE_INSTANCE标志。前者确保如果已存在同名命名管道的实例,则只有FILE_CREATE_PIPE_INSTANCE有权访问管道对象的进程才能创建新实例。另一方面,后者确保它正在创建第一个实例。