ZDNet的一份报告概述了成千上万个CMS插件和PHP库是如何使用户处于危险之中的。


上周,ZDNet的Catalin Cimpanu报告了一个首先由Paragon Initiative Enterprise的Scott Arciszewski提出来的问题:一批数量惊人的CMS插件和PHP库正在禁用SSL/TLS证书验证。


“更糟糕的是,许多这些插件和库都被用来建立了与付款服务器的连接,通过这些服务器,他们之后就可以传输敏感的用户数据或处理金融交易。”


其结果是,由于大量插件的作者不正确的配置,那些与建立在内容管理系统(如WordPress)上的热门网站进行交互的、数以百万计的互联网用户可能就会受到攻击。


因此,这是什么意思呢?为什么会有这样的麻烦?你能做些什么来确保你不会在不经意间危害你的客户?


让我们来讨论一下。


内容管理系统及其插件和库的简要介绍


让我们从头开始。不同于建立他们自己的解决方案,许多网站都会依赖一个可以根据其需要进行配置的、现成的CMS(如WordPress、Drupal等)。我们为Hashed Out也采用了一个CMS。SSL Store在自己搭建的、由我们的开发团队进行管理的CMS上运行,但是考虑到Hashed Out每天都需要发布文章,我们使用的是WordPress。


许多这些CMS平台最吸引人的特性之一是,它们所使用的插件和库能够帮助你避免构建自己的web应用程序和进行大量额外的开发工作。这些插件的优点是,当它们正常工作时(大多数都是这样),它们能够帮助你节省大量的时间和精力。缺点是由于你对第三方过于信任,以至于当第三方犯了错误时,会伤害到你的网站和用户。


既然我们已经讨论到了这一点,让我们来讨论一下这些插件和PHP库的问题。


错误配置的代码和cURL选项


cURL是一个库和命令行工具,广泛存在于现代服务器上。它主要是用于在远程服务器之间来回传输数据,并被打包成许多CMS插件和PHP库。很多时候,系统都更倾向于使用cURL,而不是打开一个实际的浏览器会话来进行连接。


cURL支持许多协议,但与本文最密切相关的两个协议是HTTPS和SSL/TLS。


让我们来看一个实际的例子。假设你正在运行一个WordPress网站,而该网站会使用一个插件来将支付卡信息传输到付款提供商的服务器上。典型的做法是通过为HTTPS配置的cURL——cURL还能处理连接的SSL/TLS身份验证问题。


“但是Arciszewski最近发现,当cURL用来通过HTTPS连接下载或发送数据时,许多CMS插件和PHP库的开发人员都会禁用cURL安全特性。”


这显然是有问题的,因为禁用以下任何一种设置都可能导致无数问题。


第一个设置是“CURLOPT_SSL_VERIFYPEER”,它应该设置为(或者值为1)。不幸的是,许多插件都将其设置为了假(0),这意味着它遭到了禁用,cURL将不再验证它所连接的网站的URL。我真的觉得所有人都不需要很多额外的上下文,就能理解为什么这句话是非常危险的。


当“CURLOPT_SSL_VERIFYPEER”被设置为假时,cURL与网站进行连接所需的唯一东西就是一个有效的SSL/TLS证书。无论谁发行了它,无论它是否是来自可以任意进行签发的免费CA的免费DV证书,只要它是有效的,cURL就会连接。


另一个被错误配置的cURL设置是“CURLOPT_SSL_VERIFYHOST”。这也依赖于一个值。它应该设置为2,因为系统需要对服务器的SSL/TLS证书进行更严格的验证。许多插件都将其设置为了0,这意味着cURL甚至将可以接受自签名证书。同样,不需要太多的上下文我们就可以理解为什么这是十分危险的——尤其是当我们讨论付款插件时。


为什么会这样,我能做什么?


让我们从原因开始。对于这些插件和库的创建者来说,这与其说是一种恶意行为,不如说是一种逃避行为。当这些插件和库配置了更多的安全优先的关注时,它们往往会产生一些错误,而这些错误会对用户提出警告。这是很糟糕的,尤其是当转化率处于平衡状态时。


因此,为了避免错误消息和警告所带来的负面影响,这些创建者便将赌注下在了无知是福上,并且禁用了这些特性以避免引起公众注意。


“正如Arciszewski所阐释的那样,这些错误的原因是,cURL需要根据已知的和有效的SSL/TLS证书列表来验证远程HTTPS服务器的证书。在许多地方都可以下载到真实证书颁发机构(一些允许颁发SSL/TLS证书的组织)列表。不幸的是,部分web托管服务根本不会存储这个列表,同时许多服务器会将其存储在不同的服务器位置上,这就使得为能够在所有服务器上无缝工作的CMS插件和PHP库配置cURL设置变得不可能了。”


为了解决这个问题,Arciszewski创建了一个名为Certainty的自定义PHP库,该PHP库可以从cURL主页定期下载一个名为CACERT.pem的文件,并将它托管在本地,以便所有网站都能够拥有最新的CA列表。


对于我来说,一个起源于一些简单的事情(如服务器没有一个有效的CA列表),但却可能带来真正灾难性后果的问题总是很好笑的。


但是,如果你在CMS上运行你的网站,并且你担心你的某个插件可能出现问题,请尝试Scott的解决方案。你是绝对承受不起SSL/TLS加密遭到破坏的严重后果的。