作为Python,Jython和CPython之间的差异,我感到很困惑 . 我理解Jython是Java中的Python实现,CPython是相同的,除了它是用C实现的 .
但我真正感到困惑的是识别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
它说“在2.7.4之前的urllib2中的HTTPConnection.putheader函数和 CPython (又名Python)中的urllib中的CRLF注入漏洞允许远程攻击者通过URL中的CRLF序列注入任意HTTP头 . ”
这是否意味着CVE-2016-5699在Jython中不易受攻击?
整体而言 - 我想知道的是,Python中的漏洞是否意味着它在Jython中容易受到攻击?
2 回答
不必要 . 当你提到诸如“Python”之类的东西时,你可能指的是两个不同的东西:
Python语言
Python虚拟机(VM)或其他特定实现
通常,Python语言不会在不同的实现中发生变化(很多) . 语言的处理方式有哪些变化,包括调用哪些外部系统函数 .
没有任何其他区别的Python通常会引用标准实现CPython . 如上所述,其他人是Jython和IronPython . 其中每个都在不同的VM中运行:Jython的JVM和IronPython的dotnet . 例如,这些VM可能以不同方式分配内存,从而防止在不同的VM中发生基于内存的错误 . 在提到的CVE-2016-5636的情况下,注意到Jython调用Java版本的zip,而CPython可能调用了zip版本的C版本 .
简而言之 - 如果在语言如何解决问题时出现缺陷,则可能会影响所有实现 . 否则,您需要逐个检查每个平台的漏洞 .
附录:根据the Red Hat tracker for CVE-2016-5699,这是语言错误,因此很可能(但不能保证)在所有实现中都容易受到攻击,直到更新为止 .
不一定,这一切都取决于Python标准库JPython使用哪些部分,哪些部分被修改,哪些部分被重新实现,哪些被省略...
urllib
是标准Python发行版的一部分,您可以在标准CPython和JPython的Lib
文件夹中找到urllib.py
. 可悲的是,他们甚至在代码中说明了这一点:所以你不能依靠它来弄清楚Python代码本身是否有错(并且它是在特定版本中修复的) .
此外,漏洞利用不必与围绕较低级别字节码的实际Python包装以及最终解释器相关 - 它可以是任何这些东西,或它们的组合 . 这就是为什么他们说特定CPython版本中不存在漏洞利用的原因,因为假设整个堆栈与标准库一起更新 .
因此,除非漏洞专门说明问题出现在Python代码本身中(例如在您的示例中为
urllib.py
)并且它已在所述模块的特定版本中修复,否则您无法确定它不是由于底层解释器,如果是 - 是否同样适用于PVM和JVM .