JSRC 安全小课堂第116期,邀请到l0ca1作为讲师就Nodejs安全为大家进行分享。


京安小妹:常见的nodejs web框架有哪些?

l0ca1:

现在流行的 nodejs web 框架有 epxress,koa。koa 是也 express 团队打造的,express 的框架自带的中间件更加齐全,koa2 支持 async/await,解决了 epxress 中回调嵌套的问题,koa本身不自带什么中间件,很多中间件需要靠自己实现或者借助一些第三方包。我现在开发 web 平台基本使用的 koa 框架的。


京安小妹 :他们的安全性如何?

l0ca1:

他们本身只作为最基础的 web 框架,自身并没有什么安全处理。但是基于这两个框架而衍生的 node js 框架,如 Thinkjs,egg等,他们提供一套 web 框架结构,同时内置一些安全处理。如 egg 本身提供安全插件 egg-security ,来保证项目的默认安全,如 xss 过滤,csrf 防御,ssrf 防御等。Thinkjs提供 logic层用来对接受数据进行过滤,同时封装了多种数据库处理,无需手动拼接 sql 语句,保证了数据库查询的安全性。在这些框架的文档中,都会提到安全规范,通常按照文档规范来写,是可以避免很多安全问题的。对于自己开发的 web 框架架构,安全处理大多会使用中间件来处理。还有就是这几个 nodejs web 框架社区都保持比较高的活跃度,很多问题都可以及时修复和解决。


京安小妹:常见的 nodejs 安全漏洞会有那些?

l0ca1:

我们常见的一些 web 漏洞,都可能出现在 nodejs 的项目中。如 sql 注入,xss ,命令执行,csrf  等都可能出现。

如上次看一个项目,他在大多数地方都使用文档规范来调用 sql 查询,但在一处处理稍麻烦,sql 拼接稍复杂的点,使用了手动拼接,而在拼接时未对数据进行处理,导致注入。

const res = await this.model('mysql').query(`SELECT * FROM __SEARCH__ WHERE ${sql} order by search_id DESC LIMIT ${(currentPage - 1) * numsPerPage},${numsPerPage}`);

如接受不安全输入,调用 child_process.spawn 拼接语句执行系统命令。

如:https://github.com/facebook/create-react-app/pull/4866/commits/4165185c3ad44ea80c6e35a8e4e4857a31327bdd

一部分会出现在自己写的代码上,一部分可能会是引用的第三方库的问题。第三方库如果存在安全问题,及时我们写的代码本身不存在问题,也可能导致漏洞的利用。

 还有 ReDos 也是 nodejs web 中常见的漏洞,在其他语言中不怎么常见。



京安小妹:在 nodejs 开发中,我们该如何检测这些漏洞?

l0ca1:

我们可以使用 eslint 的一些插件,比如 eslint-plugin-security,它包含很多检测规则,可以提前检测我们的项目中可能存在的安全问题。

https://www.npmjs.com/package/eslint-plugin-security

我们可以简单的看一下他的规则,来完善一下这些规则,编写更多的安全检测规则。

https://www.npmjs.com/package/eslint-plugin-security

使用一些工具和平台,来检查我们 node_modules 中依赖的安全性,比如 https://app.snyk.io 或者 nsp 

更多的还是靠我们在开发过程中的安全审计和安全规范。


京安小妹: 那么我们应该如何避免?

l0ca1:

常见的处理包括 添加安全防护的 http 头,比如 X-XSS-Protection,Content-Security-Policy,x-content-type-options等,都可以通过中间件的方式,对网站请求响应做处理。

如对用户输入进行预处理,在框架请求处做处理,比如使用koa 时,在 bodyparser 对各种类型的数据进行处理,json数据的处理防止 nosql 注入。 比如thinkjs 框架中 logic层对数据的预处理。

还有其他很多方面,比如session的默认配置,沙箱的使用,正则的使用,并发请求的处理。

在使用框架进行开发时,需要多关注框架的更新,理解框架的安全处理,尽量按照框架文档的规范来进行开发,这样才能保证我们项目的基础安全性。


京安小妹: 可以通过哪些途径去学习 nodejs 安全?

l0ca1:

我们可以多关注 npm 官方的安全平台 平台 https://www.npmjs.com/advisories,他会公,他会公布一些依赖包的漏洞类型和版本。

关注 node 的 bug 更新,会涉及到一些二进制安全和内置模块的安全更新。

关注 node 本身的基础库的 github issues,像http 库, tls 库,cache库等

爱上代码,多写代码,哈哈哈。


源链接

Hacking more

...