引言
PM2 是一个非常优秀的 Node.js 进程管理工具,可以方便的管理 Node.js 应用的进程,包括启动、重启、停止、监控等操作。但是 PM2 存在着一个较为严重的安全漏洞 - 进程守护和日志记录时存在任意文件读取漏洞,可能会导致敏感信息泄露和系统被攻击入侵。那么我们如何解决这个问题呢?接下来我们就来一起探究。
漏洞原理
在 PM2 日志记录及进程守护中,存在一个参数 - log output,用于设置日志输出文件的路径。当这个参数被设置为相对路径或者环境变量时,就会产生安全漏洞,攻击者就可以利用这个漏洞,读取系统上的任意文件。具体的原理在下面给出一个指令的例子:
pm2 start app.js --name myapp --log "logs/$NAME-error.log"
在这个例子中,$NAME 是一个环境变量,攻击者可以通过设置这个变量为包含敏感信息的路径来获取系统上的任意文件。
解决方案
- 最简单的方案就是禁止在 log output 参数中使用相对路径和环境变量,而是使用绝对路径,比如:
pm2 start app.js --name myapp --log /var/log/myapp/logs/$NAME-error.log
- 通过 PM2 提供的include和exclude参数来限制日志输出路径,比如:
pm2 start app.js --name myapp --log ./logs/myapp.log --merge-logs --log-date-format="YYYY-MM-DD HH:mm Z" --time --include="**/app.js$"
在这个例子中,我只允许任何进程只包含app.js文件的路径中存在logs文件夹并写入限制好的日志文件。
- 如果还需要更强的安全防护,可以使用专业的日志管理系统如ELK、Splunk等来代替 PM2 特定的日志输出。 ELK 是一款常用的开源日志系统,可以将多个日志源的信息集中到一起,实现对日志的集中、检索、分析和报告,十分强大,可以通过它来帮助我们更好的防范安全漏洞。
最佳实践
最后我们给出一个简单的最佳实践:
- 使用 PM2 start 的时候,必须使用绝对路径,而不是相对路径或者环境变量
- 日志路径推荐放在 /var/log 目录下,因为这个目录需要 root 权限访问,防止一些非授权行为。
- 在使用 log output 时限制日志输出路径,允许使用 include 和 exclude 参数,同时明确用户可访问的文件夹,限定文件的权限,例如:
pm2 start app.js --name myapp --log /var/log/myapp/$NAME-error.log --exclude-status-codes="4xx,5xx" --include="**/app.js$" --no-colors --min-uptime "1m" --max-restarts 3
以上做法,除了提高安全性外,在日志方面也将有所提升。
结论
任意文件读取漏洞是一个非常严重的漏洞,可带来非常多的风险。本文针对PM2进程守护和日志记录中的任意文件读取漏洞,提出了详细的分析和解决方案,并给出了简单的示例代码和最佳实践建议。希望通过本文的介绍,大家可以更好的了解该漏洞及其解决方案,提高安全防护意识,更好的保障互联网应用的安全。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6731ec340bc820c5823b33d7