【漏洞预警】Tornado某缺陷可能造成文件读取漏洞 (updated @ 2015-03-04)
昨晚,wooyun上有用户报告Tornado框架某缺陷可能造成文件读取漏洞。该用户没有在公开描述中提到更多的信息。
1. 影响版本
起始版本未知,至少影响3.1及以上版本。
2. 漏洞描述
可能造成不应被读取的文件被读取。
洞主没有明确说明被读取的文件需要满足何种条件。
根据我的猜测,应为全平台,但文件名需满足特定条件(见第4节)。
3. 网友观点
在v2ex的讨论贴(/t/173839)中,用户RIcter认为该漏洞可能是StaticFileHandler造成的,利用条件为:Windows环境,且文件名与指定的静态文件目录名一致,因此利用价值不大。不过,这个说法还没有得到乌云洞主的肯定,不能确定是否是一个问题。
4. 我的观点
下面我根据自己的理解,给出第3节这个说法的分析,最终结论与该网友有所区别:
设静态目录为tstatic(绝对路径C:\tornado\project\tstaic)。
设要打开的URL为:http://localhost:8000/static/lvl1\\..\\..\\tstatic.jpg。
a) StaticFileHandler -> get -> self.path = self.parse_url_path(path)
本方法的目的是将”/”变更为服务器所在操作系统的目录分隔符。
此步过后,得到的self.path = ‘lvl1\\..\\..\\tstatic.jpg’
b) StaticFileHandler -> get -> self.get_absolute_path(self.root, self.path)
本方法的目的是得到请求文件的绝对路径。
这里的self.root为静态目录的相对路径,对本例而言为’tstatic’;self.path为a)得到的结果。
此步执行的操作为os.path.abspath(os.path.join(root, path))
,得到
绝对路径’C:\\tornado\\project\\tstatic.jpg’
c) StaticFileHandler -> get -> self.absolute_path = self.validate_absolute_path(self.root, absolute_path)
本方法的目的是验证得到的路径是否合法,不合法的请求给出错误。
在这里,程序进行了如下验证:
1 2 3 |
if not (absolute_path + os.path.sep).startswith(root): raise HTTPError(403, "%s is not in root static directory", self.path) |
其中:
absolute_path + os.path.sep = ‘C:\\tornado\\project\\tstatic.jpg\\’
root = ‘C:\\tornado\\project\\tstatic’ (已变为绝对路径)
可知本if语句的raise没有被执行,即认为是合法的请求了,而后续的代码里也没有与此相关的验证,最终返回’C:\\tornado\\project\\tstatic.jpg’。
可以看出,在Windows系统中,如果请求的文件名是以静态目录名称起始,且与静态目录同级的情况下,会被请求到不该被请求到的文件。
那么,Linux系统中就不成立了吗?
实际上并不是!
只不过在使用浏览器请求的时候,”../”可能被浏览器直接处理了,才造成Linux下没有这个漏洞的错觉。
因此,利用条件应为:全平台,请求文件名以静态目录名为前缀,请求文件与静态目录同级。
那么,这个利用条件比较苛刻,因此这个漏洞还是很鸡肋的。当然,洞主也许说的并不是这个漏洞。
4. 解决方法
官方暂未对该漏洞提供解决方案。
不过,在web.py的StaticFileHandler类的docstring中提到:
1 2 3 |
This handler is intended primarily for use in development and light-duty file serving; for heavy traffic it will be more efficient to use a dedicated static file server (such as nginx or Apache). |
StaticFileHandler类主要用于开发环境和轻型的文件服务,建议用户在线上的大流量环境中使用更加专注的静态文件服务器(如nginx/Apache)。
膜拜大神,看到INTRODUCTION to Tornado的翻译,拜访过来的。因为在线看不方便,所以做成了epub电纸书,我不会外传的,只是跟翻译的人说一下
学习啦,
http://demo.pythoner.com/itt2zh/ch5.html
5.1 异步Web请求
第三段twitter第一次出现写成了twotter
感谢!
请问一下楼主用的wordpress的高亮代码的是什么插件?
Crayon Syntax Highlighter