aiohttp目录穿越缝隙(CVE-2024-23334)分析
颁布功夫 2024-04-01一、缝隙概述
aiohtp 是构建于 Python l/0 框架 AsyncI0 之上的开源库,用于处置无需基于传统线程网络的大量并发HTTP要求。aiohttp支持HTTP客户端、HTTP服务端、WebSocket客户端、WebSocket服务端、服务端中央件等。aiohttp被宽泛使用,在网络中有大量基于该框架开发的在线系统。
宝运莱官方网站ADLab钻研员在缝隙谍报跟踪中发现了aiohttp目录遍历缝隙(CVE-2024-23334),并对其进行了深刻分析和验证。
二、影响版本
受影响版本:<3.9.2,请有关用户尽快升级到3.9.2及以上版本。
三、缝隙分析
该缝隙的关键信息如下[1]:
aiohttp is an asynchronous HTTP client/server framework for asyncio and Python. When using aiohttp as a web server and configuring static routes, it is necessary to specify the root path for static files. Additionally, the option 'follow_symlinks' can be used to determine whether to follow symbolic links outside the static root directory. When 'follow_symlinks' is set to True, there is no validation to check if reading a file is within the root directory. This can lead to directory traversal vulnerabilities, resulting in unauthorized access to arbitrary files on the system, even when symlinks are not present. Disabling follow_symlinks and using a reverse proxy are encouraged mitigations. Version 3.9.2 fixes this issue.
凭据关键信息,定位到开发文档的注明[2]:

凭据文档描述,follow_symlinks是一个设计上用于非出产环境的职能,并且已在文档中明确提醒启用该职能是一个安全风险。
编写如下的示例代码,测试follow_symlinks的职能:

在static目录下创建符号链接d,指向其它目录d:\test(该目录下存在测试文件123.txt)。

以follow_symlink=fasle的模式启动测试webserver,接见static/d/123.txt的了局如下所示(提醒找不到文件):

以follow_symlink=true的模式启动测试webserver,接见static/d/123.txt的了局如下所示(成功读取文件内容):

显然,凭据文档的描述,若是follow_symlink=true且存在符号链接,了局就是法式的正常预期职能。那么,该职能是若何被认定成缝隙?
缝隙的关键信息[1]中有一句沉要描述:缝隙不依赖于符号链接的存在性。但是,在要求蹊径中使用不存在的符号链接,底层又若何能接见到指标文件。
经过度析,发现底层处置要求的关键函数如下:

首先,获取要求文件名(filename)。以 GET /static/d/123.txt为例,filename就是d/123.txt。
而后,把filename转换为Path对象,并检测该对象是否存在anchor属性。若是存在,则回绝接见。在windows平台上,anchor对象就是盘符(好比d:\)。因而,此处存在安全检测,即不允许跨盘符接见。好比GET /static/d:\test\123.txt,会被视作犯法要求而回绝:

再而后,把static目录的Path对象和filename的Path对象做拼接,形成新文件蹊径filepath。最后,读取filepath的数据,并返回给客户端。
显然,若是filename蕴含不存在的符号链接,但能接见到指标文件,那注明对象拼接产生了非预期的了局。由于Path对象是尺度的python类,直接单独进行测试。
(1)设定directory=c:\test , filename = d:\test\123.txt,拼接代码和了局如下:

拼接了局指向指标文件d:\test\123.txt,但是fname蕴含anchor,无法通过前面的filename.anchor查抄。
(2)设定directory=c:\test , filename = ..\d:\test\123.txt,拼接代码和运行了局如下:

拼接了局读取到指标文件,且fname不蕴含anchor,能通过filename.anchor查抄。
(3)设定directory=c:\test , filename = ..\..\d:\test\123.txt,拼接代码和运行了局如下:

拼接了局也读取到了指标文件,且fname不蕴含anchor,能filename.anchor查抄。
因而,只有在filename之前加上..\就能直接引入盘符,违背原始职能设计中必要符号链接存在的限度,从而形成了能够读取磁盘上肆意文件的安全缝隙。
四、补丁分析
补丁关键代码如下:

补丁的主题思造是:蹊径拼接成unresolved_path后,首先挪用normpath处置unresolved_path来形成normalized_path,而后判定normalized_path是否位于静态目录_directory之下。
单独测试补丁机造的代码和了局如下:

显然,由于拼接后的蹊径不是static目录的子目录,所以触发了异常,导致后续代码不再读取拼接后蹊径下的文件,从而导致了该缝隙不再存在。
补丁不影响aiohttp的符号衔接支持,由于符号链接文件必须存在于static目录之下。使用符号链接文件来处置static资源自身就是一个潜在的安全风险,开发者仍必要引起足够的器沉,审慎使用该职能。


京公网安备11010802024551号