首页 存档 技术 查看内容

漏洞:小心Python新型的字符串格式化

2018-3-30 13:00 |来自: 互联网 259 0

摘要: Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。 写于2016年12月29日,星期四 长时间以来,这对我来说,应该是很明确的了,但是直到今天早些时候,我才真正意识到这个问题的严重性,即当不可信的 ...

Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。

写于2016年12月29日,星期四

长时间以来,这对我来说,应该是很明确的了,但是直到今天早些时候,我才真正意识到这个问题的严重性,即当不可信的用户输入时,由str.format所引起的问题的严重性。它以一种允许你获取无权限访问的信息的方式成为绕开Jinja2 沙盒的一种办法,这就是为什么我刚刚为此推出了一个安全版本的原因。

然而,我认为这个普通的问题是相当严重的,而且需要讨论讨论,因为大多数人很可能没有意识到这个问题是多么容易被利用。

核心问题

从Python 2.6开始,一种新的格式化字符串的语法登陆了,这是由.NET所启发的。而且Rust及其它一些编程语言也支持同样的语法。

对字节和unicode字符串,.format()函数都是适用的(在Python 3上,只适用于unicode字符串)而且它也反映在自定义的string.Formatter API中。

它的特性之一是,你可以向将要格式化的字符串传送位置参数和关键字参数,而且可以在任何时候明确地重排元素顺序。然而,最大的特点是,你可以访问对象的属性及各个项目。在这里,后者就是引发问题的原因。

基本上,一个人是可以做如下事情的:

实质上,任何控制了格式化字符串的人都可能访问对象的内部属性。

这个问题发生在哪里?

第一个问题是为什么一个人能够控制格式化的字符串。有一些地方它会暴露出来:

  • 用不可信的翻译器翻译字符串文件时。这是个大问题,因为很多被翻译成多语言的应用程序,会使用新式的Python字符串格式化的方法,而且不是每个人都会审查所有进来的字符串。

  • 用户泄露了配置。一些系统的用户可能被允许去配置一些系统特性,且这特性可能会以格式化字符串的形式泄露出去。尤其是,我已经在用户可以配置通知邮件,日志信息格式或网页程序中的其它基本模板的地方看到了这个问题。

危险级别

对于给格式化字符串只传递C解释器对象的情况,你就会稍微安全些,因为你可以发现的最坏事儿就是一些内部reprs对象如以上事实所示的某个东西是一个整数类。

然而,一旦Python对象被传进来,事情就会变得糟糕。原因是从Python函数暴露出的东西的数量是相当惊人的。这里有一个例子,一个假想会泄露密钥的网页应用程序设置的例子。

在这里,用户如果可以注入format_string,就可以发现像这样的密钥字符串:

将格式化过程装入沙盒

因此,如果你真的需要让别人提供格式化的字符串,你会怎么做?你可以通过使用还未写入文档的内部构件来改变这种行为。

现在,你可以使用safe_format函数来替换str.fromat了:


英文原文:http://lucumr.pocoo.org/2016/12/29/careful-with-str-format/
译者:Xiaogang


声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

相关分类

返回顶部