在4月21日,基于python的开源web框架Django发布安全公告,称在≤1.5版本的Django中contrib.markup包存在任意文件包含漏洞,攻击者可通过docutils进行攻击。
关于docutils
Docutils项目的主要是为了创造一套将纯文本转换为一些常用格式的工具,这些常用格式包括:HTML、XML和LaTeX。
docutils数据包是渲染reStructuredText(reST)的标准数据包。而reST特征之一是将其他文件包含在一个文档中。在默认情况下处于启用状态。
在Django≤1.5中contrib.markup包依赖于docutils并提供模板过滤器用于按需将reST渲染到HTML,然而他在从文件系统包含本地文件时并没有禁用有问题的选项。如果docutils使用了用户输入的恶意语句来渲染,并且没有禁用指令,那么攻击者可以读取到主机上的任意文件(至少是运行WSGI容器用户可以访问的文件)。这样会泄露用户的一些敏感文件或配置信息。
虽然Django1.6删除了contrib.markup app,但许多Djangoverse中的第三方app仍然依赖于docutils并且复制了Django的模式:
[PHP] 纯文本查看 复制代码 docutils_settings = getattr(settings, ‘RESTRUCTUREDTEXT_FILTER_SETTINGS’, {})
parts = publish_parts(
source=smart_bytes(value),
writer_name=”html4css1″,
settings_overrides=docutils_settings
)
return force_text(parts[“fragment”])
要解决任意文件包含的问题,数据包维护者应当采用如下模式:这些包可能并未包含与Django文档一样的警告,但在任何情况下都应该默认禁用文件包含以保证安全,而不是依靠用户手动配置。
[PHP] 纯文本查看 复制代码 docutils_settings = {
‘raw_enabled': False,
‘file_insertion_enabled': False,
}
docutils_settings.update(getattr(settings, ‘RESTRUCTUREDTEXT_FILTER_SETTINGS’, {}))
parts = publish_parts(
source=smart_bytes(value),
writer_name=”html4css1″,
settings_overrides=docutils_settings
)
return force_text(parts[“fragment”])
使用上述模式的包用户还要更新项目设置,增加如下信息
[PHP] 纯文本查看 复制代码 RESTRUCTUREDTEXT_FILTER_SETTINGS = {
‘raw_enabled': False,
‘file_insertion_enabled': False,
} |