当前位置: 首页 > 科技观察

gRPC通信框架实现存在数据泄露等安全问题

时间:2023-03-15 14:53:52 科技观察

gRPC是一个高性能、开源、通用的RPC框架,专为移动端和HTTP/2设计。目前有C、Java和Go语言版本,分别是:grpc、grpc-java、grpc-go。C版本支持C、C++、Node.js、Python、Ruby、Objective-C、PHP和C#。目前,企业正在慢慢转向微服务架构以构建面向未来的应用程序。微服务使企业能够有效地管理基础架构,轻松部署更新或改进,并帮助IT团队创新和学习。它还帮助企业能够设计出可以根据需要轻松扩展的应用程序,此外,随着企业转变其架构(从传统的单体服务到微服务),微服务之间需要有效通信。客户端和服务器应用程序之间的这种关键和复杂的通信可以由gRPC处理,gRPC是一个促进连接系统之间透明和高效通信的框架。虽然它是相当新的(仅由谷歌在2015年开发),但它很快获得了普及和采用。在本文中,趋势科技讨论了开发人员在转向gRPC并在其项目中实施gRPC时可能面临的安全隐患。由于安全的gRPCAPI在整体应用程序安全中起着至关重要的作用,因此趋势科技提供了有关如何保护gRPC实施免受威胁和降低风险的建议。什么是gRPC?gRPC可用于设计需要准确性、效率和语言独立性的新协议,因为它支持服务器和客户端的多种语言。这是一个云原生计算(CNCF)项目,已被流行的视频流媒体网站Netflix、金融服务公司Square和平台即服务(PaaS)公司Docker等公司采用。将gRPC与其他RPC框架(如SOAP和REST)进行比较,虽然RESTfulAPI被广泛使用并且经常使用HTTP在应用程序或服务和JavaScriptObjectNotation(JSON)数据格式之间交换信息,但它们具有性能和基于文本的方向限制。许多组织已将其API从REST迁移到gRPC,以利用更适合服务间通信的gRPC二进制协议。默认情况下,gRPC使用HTTP/2(一种基于二进制的协议)作为底层。HTTP/2在一个TCP连接中支持多个流和请求。与其前身HTTP/1.0不同,HTTP/1.0被设计为具有“单一请求,单一响应”方案。HTTP/1.1中的HTTP流水线解决了这个问题,HTTP2.0仍然有更好的性能并且得到了更多的支持。HTTP/1.0在请求和响应方面与HTTP/2有何不同gRPC构建在ProtocolBuffers(或protobuf)之上,这是Google用于序列化结构化数据的平台和语言无关机制。序列化是将内存中的对象转换为可以轻松保存到文件或通过网络传输到其他应用程序的字节流的过程。开发人员只需描述一次数据接口,然后使用ProtocolBuffers编译器针对所选语言对其进行编译。对于gRPC,协议缓冲区也用于定义RPC接口。gRPC框架如何在产品和支付服务通过API交互的在线零售应用程序中工作的图示gRPC“HelloWorld”演示发送字符串消息gRPC漏洞的潜在威胁和风险示例gRPC支持多种编程语言,两种类型的实现用于支持的语言:使用语言本身的实现,以及封装gRPCC-core编写的代码。这些包装器可以将用不同支持的语言编写的调用转换为C调用。虽然C语言实现通常可以很好地执行,但是由于需要实现更多的功能,以及内存管理功能,开发人员将漏洞引入系统的可能性更高。另一方面,使用诸如Java或Go之类的语言,它们已经实现了很多功能并且还考虑了内存管理,这减少了开发人员将高影响bug引入系统的机会。值得注意的是,选择正确语言的重要性可能在保持系统更安全方面发挥重要作用。注意:1.可以使用纯C#实现或围绕C的C#包装器;2.绑定到gRPCC-core(使用C++附加组件)的纯JavaScript实现,用于远程中不安全的数据传输通道和通道凭据在过程调用期间,数据很可能会传输到目标服务器。这就是为什么开发人员应该优先为数据传输设置安全通道。这样做不仅可以防止数据泄露,还可以限制中间人(MiTM)攻击,因为熟练的攻击者可能会泄露服务数据或将恶意数据注入连接,从而干扰服务器。数据泄漏可能会泄露有关您的服务或基础设施的实施细节,这可能导致进一步的攻击,甚至导致服务或基础设施受到损害。下面是一个从不安全的gRPC调用中捕获数据包的示例:ExampleofcapturingpacketsfromaninsecuregRPCcallgRPCsupportsTLSovertheentireunderlyingHTTP/2protocolaswellasvariousauthenticationmechanisms,选择安全实现由开发人员负责.出于显而易见的原因,应避免使用“InsecureChannelCredentials”等关键字的复制和粘贴模式。趋势科技已在Github.com代码中搜索“InsecureChannelCredentials”关键字以及C++语言限制(这对于gRPC的使用很常见)。搜索产生了超过11,000个代码结果。趋势科技认为,大量搜索事件与演示和样本有关。但是,仍然有一些项目使用它们。“InsecureChannelCredentials”代码搜索结果程序执行漏洞同样,对于AWSLambda函数,最大的漏洞隐藏在实际的远程程序执行中。由于gRPC支持多种语言,趋势科技建议新手开发者使用内存安全的语言,以避免严重影响内存管理的漏洞,例如缓冲区溢出或导致远程代码执行(RCE)的UaF漏洞。然而,使用内存安全语言仍然不能减轻代码中可能存在的逻辑漏洞。为此,开发人员应为开发过程设定高标准,始终遵循安全软件开发最佳实践,并通过使用OWASP安全编码实践中的OWASP十大主动控制建议来实施主动控制。即使在孤立的网络或私有云中,也强烈建议对系统的关键部分使用集中式身份验证机制。如果配置错误,环境内部的漏洞可能会成为未经授权访问的入口点,这可能会严重破坏gRPC服务。趋势科技还建议不要硬编码或将gRPC身份验证详细信息提交给供应链管理(SCM)系统,尤其是面向公众的系统。与任何其他凭据信息一样,这些信息应存储在安全位置并仅在需要时访问。下面是趋势科技仅通过在GitHub上进行搜索就发现的gRPC凭证泄漏示例:在GitHub上发现的gRPC服务凭证示例拒绝服务攻击最后,我们想讨论趋势科技的拒绝服务(DoS)攻击发现。gRPC可以充当隔离环境中的“隐藏”消息服务,以及面向公众的RESTAPI服务的JSON格式API替代品。在此,趋势科技想警告C/C++gRPC用户注意一个已知但仍未修复的漏洞,该漏洞会在服务重新启动之前有效地拒绝服务调用。当短时间内打开大量连接时会触发该漏洞。实际上,这是由于Linux系统上打开的文件描述符数量有限所致。gRPC库的C/C++实现内部的DoS攻击示例根据我们的研究,当套接字连接短时间打开时会触发此漏洞,即使打开的套接字已关闭。趋势科技在Java和Go等C封装以外的语言中测试了此实现,发现它们不受此漏洞的影响。如果无法从一个平台切换到另一个平台,趋势科技建议采用以下解决方法来帮助降低DoS攻击的风险:1.通过执行“sudoulimit-nextendedNumber”来增加文件描述符限制。2.使用外部负载均衡器和服务监视器来减少单个实例的负载并密切关注服务状态。gRPC安全建议由于gRPC框架服务的可靠性和可扩展性,使用该框架的企业越来越多,因此应该有更广泛的意识来保护该协议免受攻击风险和威胁。尽管gRPC支持系统之间的高效通信,但必须强调的是,确保这些系统之间的通信安全是开发人员的责任。gRPC提供了有关将与协议一起使用的受支持身份验证机制的全面指南,例如开发人员应遵循的使用SSL/TLS(有或没有基于Google令牌的身份验证)的机制。或者,开发人员可以选择通过Credentials插件API插入他们自己的身份验证系统。开发人员还应该使用可以验证内容的安全解决方案,以确保没有恶意负载可以通过从客户端到服务器的消息渗透系统,反之亦然。确保关键数据在传输过程中保持安全、密切关注服务状态以及实施身份验证和授权以确保数据安全的解决方案对于企业也至关重要。gRPC框架是开发人员和企业构建API、应用程序和微服务的有效工具。但是,与其前身一样,它同样不受风险和威胁的影响。因此,应强调安全解决方案、检查和控制的必要性。本文翻译自:https://blog.trendmicro.com/trendlabs-security-intelligence/unsecure-grpc-implementations-compromise-apis-applications/如有转载请注明出处。