2017-02-17 42 views
2

lil混淆了Python,Jython和CPython之间的差异。 我知道Jython是Java中的Python实现,CPython除了在C中实现外,其余都是一样的。Python中认定的漏洞被认为是Jython中的漏洞吗?

但我真正困惑的是识别Python中的漏洞。 如下面的两个。

例如 - CVE-2016-5636 - 此处看来,该漏洞无法在Jython中再现。

https://bugzilla.redhat.com/show_bug.cgi?id=1345857

同样看 - CVE-2016-5699 https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-5699

它说 “CRLF注入中的urllib2和urllib的的HTTPConnection.putheader功能CPython的(又名Python)的前漏洞3.4.4之前的2.7.10和3.x允许远程攻击者通过URL中的CRLF序列注入任意HTTP头。“

这是否意味着CVE-2016-5699在Jython中不易受到攻击?

那么整体 - 我想知道的是,如果Python中的漏洞意味着它在Jython中很脆弱?

+0

我对自己的专业知识不够有信心,但这可能完全取决于漏洞利用的工作方式。当将指令编译为java字节码时,可能会发生额外的检查,并且特定于实现的错误(读取:有效的拼写错误)可能不会跨越解释器继续进行,除非源码相同..也就是说,很容易无意中继承语义错误在从一种语言翻译到另一种语言时使用代码。 – Aaron

回答

0

不一定,这一切都取决于它的Python标准库JPython的使用,它被修改,被重新实现,这是省略的部分...

urllib是Python标准版的一部分,而你可以在标准CPython和JPython的Lib文件夹中找到urllib.py。可悲的是,他们甚至说出它在其代码:

__version__ = '1.17' # XXX This version is not always updated :-(

所以你不能依赖于找出如果Python代码本身有故障(且它固定在一个特定的版本)。

此外,漏洞利用并不一定与实际的Python封装在较低级别的字节码和最终解释器之间有关 - 它可以在任何这些事物中,或它们的组合中。这就是为什么他们认为漏洞利用不存在于特定的CPython版本中,因为它假定整个堆栈与标准库一起更新。

因此,除非漏洞利用程序明确指出问题出在Python代码本身(例如,在您的示例中为urllib.py),并且它已在特定版本的模块中修复,否则您无法确定它不是应有的到底层解释器,如果是 - PVM和JVM是否同样适用。

0

不一定。当你把这样的东西作为“巨蟒”,你可能指的是两个不同的东西:

  • Python语言
  • Python的虚拟机(VM)或其它具体实施

常Python语言在不同的实现中不会改变(很多)。语言的处理方式有哪些变化,包括调用哪些外部系统函数。

没有任何其他区别的Python通常会引用CPython,即标准实现。正如你在上面提到的,其他的,就是Jython和IronPython。这些中的每一个都运行在不同的VM中:用于Jython的JVM和用于IronPython的dotnet。例如,这些虚拟机可能会分配不同的内存,从而防止在不同虚拟机中发生基于内存的错误。在提到CVE-2016-5636的情况下,注意到Jython调用Java版本的zip,而CPython可能调用C版本的zip。

简而言之 - 如果缺陷发生在语言接近问题的方式上,则可能会影响所有实施。否则,您需要逐个检查每个平台的漏洞。

附录:根据the Red Hat tracker for CVE-2016-5699,这是语言错误,因此可能(但不是保证)在所有实现中都易受攻击,直到更新。