物联网开源组件安全:Node-RED白盒审计

2024-03-23 19:58

本文主要是介绍物联网开源组件安全:Node-RED白盒审计,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文|腾讯研发安全团队

Spine、martinzhou

背景

Node-RED是IBM开源的低代码物联网编排工具,在物联网领域有广泛应用,包括研华WISE PaaS、西门子Iot2000、美国groov EPIC/groov RIO等工业IoT硬件也都预装了Node-RED。此外,它亦常被作为低代码开发平台使用。

A large proportion of our users are individuals who run Node-RED on personal devices - a laptop, a Raspberry Pi or a virtual machine in the cloud. They are building solutions for themselves - whether it’s home automation, adding skills to their Alexa or Google Home, or doing the types of online services like IFTTT can provide.

Another group of users come from the companies who have integrated Node-RED into their own products and services. Hitachi, Siemens, Samsung, Particle and many others.

—Nick O'Leary, What's next with Node-RED?

基于腾讯自研SAST语义分析引擎“啄木鸟”,开展漏洞变体分析。我们对Node-RED平台进行了人工和自动化白盒代码审计,发现了多个通用高危漏洞(CVE-2021-21298、CVE-2021-21297、CVE-2021-3223、CVE-2021-25864等),并进一步探究了潜在利用方式及危害,本文将详述分析过程及典型案例。

攻击面及风险分析

Node-RED平台基于Express.js开发,我们从鉴权方式、http接口、客户端安全以及组件生态等多个维度入手开展分析。

2.1 鉴权方式

Node-RED的鉴权方式依赖配置,默认没有任何鉴权,当开启鉴权后,会对接口进行鉴权。相关权限在settings.js文件中定义:

2.1.1 登陆机制

如果开启了鉴权功能,Node-RED会通过passport中的OAuth策略对用户进行登录校验并提供访问token,token通过浏览器的Local Storage存储。OAuth策略中使用账号密码进行登陆校验,通过bcrypt对用户密码进行校验。

此处可以认为不存在绕过方式。access token使用bearer策略进行校验,主要函数是:

Tokens采用map存储,此处存在一个潜在的安全风险:

当传入accessToken为__proto__时,token会返回prototype的内容,从而绕过if(token)的检查,后续如果有一个原型链污染漏洞能伪造user(用户名)字段,即可绕过token检查。

2.1.2 权限机制

通过检测用户对象中的scope字段区分读写接口权限,当scope字段为 "*" 时,默认可以读写所有接口,admin默认权限就是 "*"。Node-RED在0.14版本之后对权限做了细分,详细可见:

https://nodered.org/docs/user-guide/runtime/securing-Node-RED#user-permissions,权限类型概述如下:

Node-RED的权限管控功能由needsPermission函数实现,用例如下:

该接口就需要一个settings.write权限才能读取。如果接口声明未能和它的行为相符,或者存在漏洞,那么也可以认为是一个越权漏洞。

2.2 http接口

Node-RED中存在3类http接口:

  • 原生http接口

  • 内置节点注册的http接口

  • 第三方节点注册的http接口

上一节描述了Node-RED的接口鉴权机制,原生http接口未鉴权的较少,其中2和3类接口通过以下两种方式暴露:

因此,可以在源码中批量搜索来找未鉴权的接口。在对第三方组件分析、扫描过程中,我们发现很多插件都没有采用needsPermission方式鉴权,存在较大安全隐患。

2.3 客户端安全

Node-RED通过http头来实现鉴权,这意味着传统的CSRF攻击不再奏效,也有对应的CORS安全策略。

因此,主要关注的风险是XSS漏洞。从功能设计上看,Node-RED 前端只有一个大页面,使用JS操作dom的方式渲染后端数据,这种机制一定程度上收敛了产生XSS漏洞的风险。各组件面临的XSS风险及框架采取的预防措施,如下:

这篇关于物联网开源组件安全:Node-RED白盒审计的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/839375

相关文章

Olingo分析和实践之OData框架核心组件初始化(关键步骤)

《Olingo分析和实践之OData框架核心组件初始化(关键步骤)》ODataSpringBootService通过初始化OData实例和服务元数据,构建框架核心能力与数据模型结构,实现序列化、URI... 目录概述第一步:OData实例创建1.1 OData.newInstance() 详细分析1.1.1

MySQL进行数据库审计的详细步骤和示例代码

《MySQL进行数据库审计的详细步骤和示例代码》数据库审计通过触发器、内置功能及第三方工具记录和监控数据库活动,确保安全、完整与合规,Java代码实现自动化日志记录,整合分析系统提升监控效率,本文给大... 目录一、数据库审计的基本概念二、使用触发器进行数据库审计1. 创建审计表2. 创建触发器三、Java

Nginx安全防护的多种方法

《Nginx安全防护的多种方法》在生产环境中,需要隐藏Nginx的版本号,以避免泄漏Nginx的版本,使攻击者不能针对特定版本进行攻击,下面就来介绍一下Nginx安全防护的方法,感兴趣的可以了解一下... 目录核心安全配置1.编译安装 Nginx2.隐藏版本号3.限制危险请求方法4.请求限制(CC攻击防御)

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

Java中常见队列举例详解(非线程安全)

《Java中常见队列举例详解(非线程安全)》队列用于模拟队列这种数据结构,队列通常是指先进先出的容器,:本文主要介绍Java中常见队列(非线程安全)的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一.队列定义 二.常见接口 三.常见实现类3.1 ArrayDeque3.1.1 实现原理3.1.2

Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析

《Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析》InstantiationAwareBeanPostProcessor是Spring... 目录一、什么是InstantiationAwareBeanPostProcessor?二、核心方法解

C++ RabbitMq消息队列组件详解

《C++RabbitMq消息队列组件详解》:本文主要介绍C++RabbitMq消息队列组件的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. RabbitMq介绍2. 安装RabbitMQ3. 安装 RabbitMQ 的 C++客户端库4. A

PyQt6中QMainWindow组件的使用详解

《PyQt6中QMainWindow组件的使用详解》QMainWindow是PyQt6中用于构建桌面应用程序的基础组件,本文主要介绍了PyQt6中QMainWindow组件的使用,具有一定的参考价值,... 目录1. QMainWindow 组php件概述2. 使用 QMainWindow3. QMainW

VSCode中配置node.js的实现示例

《VSCode中配置node.js的实现示例》本文主要介绍了VSCode中配置node.js的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一.node.js下载安装教程二.配置npm三.配置环境变量四.VSCode配置五.心得一.no

JAVA保证HashMap线程安全的几种方式

《JAVA保证HashMap线程安全的几种方式》HashMap是线程不安全的,这意味着如果多个线程并发地访问和修改同一个HashMap实例,可能会导致数据不一致和其他线程安全问题,本文主要介绍了JAV... 目录1. 使用 Collections.synchronizedMap2. 使用 Concurren