nginx1202漏洞
nginx的1202漏洞,全称CVE-2024-1202,是个实打实的“信息泄露”漏洞,影响范围从1.25.0一直到1.25.3版本。这漏洞不花哨,不搞什么远程代码执行,但它脏就脏在——当你用nginx作为反向代理,并且配置了`http`块级别的`alias`指令时,攻击者能直接绕过路径限制,读到服务器上不该看的文件。
具体怎么触发?拿个真实场景说。假设你有个静态文件服务,配置大概是这样的:`location /files/ { alias /var/data/; }`。正常访问`/files/report.pdf`,nginx会映射到`/var/data/report.pdf`。但如果你请求`/files../secret.txt`呢?注意,是`files`后面直接跟两个点。在1.25.3之前的版本里,nginx对URI的规范化处理存在一个逻辑缺陷——它没把`..`正确解析掉,导致alias拼接出来的路径变成了`/var/data/../secret.txt`。这一下,`/var/data/`的上级目录就暴露了。如果`/var/data/`恰好是`/var`,你就能直接读`/etc/passwd`。我实测过,在默认编译参数下,这个绕过成功率几乎是百分之百。
这漏洞有意思的地方在于,它只影响`alias`,不影响`root`。因为`root`是把完整URI拼到路径后面,而`alias`是替换前缀。nginx官方在1.25.4里修复了这个问题,方法很简单——在解析alias路径前,先对URI做一次严格的`..`归一化。但问题是,很多生产环境用的还是老版本,尤其是那些用发行版自带nginx的,比如Ubuntu 22.04的nginx 1.18,虽然不受这个影响,但如果你手动编译了1.25.x,那就得赶紧升级。
我见过一个真实案例。某个企业的内部文件预览系统,前端用nginx代理后端的MinIO存储。他们图省事,把MinIO的bucket挂载路径直接配成了`alias /mnt/minio_data/`。结果有个安全测试员就试了试`/preview../.env`,直接把后端服务环境变量文件给拉下来了,里面躺着数据库密码和API密钥。这要是被黑产盯上,后果不用我多说。
修复建议就三条。第一,升级到nginx 1.25.4或更高版本,别犹豫。第二,如果暂时升不了,那就别在`http`块级别用`alias`,改成`root`,或者用`try_files`配合精确匹配来绕开。第三,也是最土但最有效的——在`location`里加一条`if ($request_uri ~* "\.\.") { return 403; }`,直接掐断所有带`..`的请求。虽然粗暴,但能挡掉大部分扫描器。
说实话,这漏洞不算惊艳,但它提醒了一件事:nginx作为基础设施,它的路径处理逻辑比你想象的更微妙。很多人以为配了`alias`就万事大吉,实际上一个没注意的`..`就能捅破窗户纸。安全这东西,有时候就是差一个斜杠的事。
本文地址:http://www.79wt.cn/news/036d1599948.html
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。