安全

在此免费白皮书中了解有关WordPress核心软件安全的更多信息。 您还可以下载 PDF格式

概述

本文档是对WordPress核心软件开发及其相关安全流程的分析和说明,也是对软件直接内置的固有安全的检查。评估WordPress作为内容管理系统或WEB应用框架的决策者应通过本文档进行分析和决策,开发者也可以参考本文档来熟悉软件的安全组件和最佳实践。

本文档中的信息是软件的最新稳定版本,即WordPress 4.7版本发布时的最新信息,但由于向后兼容性是WordPress开发团队的重点,因此也应该被认为与最新版本的软件相关。由于已将特定的安全补丁和更改添加到特定版本的核心软件中,因此要予以注意。强烈鼓励大家始终运行最新的WordPress稳定版本,以确保尽可能的安全体验。

执行摘要

WordPress是一个动态的开源内容管理系统,为数百万个网站、WEB应用和博客提供动力。目前,在互联网上排名前1000万的网站中,有超过43%的网站使用WordPress。WordPress的可用性、可扩展性和成熟的开发社区使其成为各种规模网站的流行且安全的选择。

自2003年成立以来,WordPress经历了不断的加强,其核心软件能够处理和减轻常见的安全威胁,包括在开放Web应用程序安全项目(OWASP)中列出的十大常见安全漏洞,本文将对此进行讨论。

WordPress安全团队与WordPress核心领导团队合作,在WordPress全球社区的支持下,致力于真别和解决可在WordPress.org上发布和安装的核心软件中的安全问题,并为第三方插件和主题作者推荐和记录安全最佳实践。

站点开发者和管理员应特别注意正确使用核心API和底层服务器配置,这些都是常见漏洞的根源,同时确保所有用户使用强密码来访问WordPress。

WordPress 概要

WordPress是一个自由和开源的内容管理系统(CMS)。它是世界上使用最广泛的CMS软件,它为超过43%的前1000万个网站提供动力1,使它在所有使用CMS的网站中占据了约62%的市场份额。

WordPress 使用通用公共许可证(GPLv2或更高版本)授权,该许可证提供了四项核心自由,被认为是WordPress的“权利法案”:

  1. 为任何目的运行程序的自由。
  2. 可以自由地研究程序的工作原理,并对其进行更改以使其按您的意愿进行。
  3. 重新分发的自由。
  4. 将您修改后的版本分发给他人的自由。

WordPress 核心领导团队

WordPress项目是一个优胜劣汰的项目,由一个核心领导团队管理,并由其联合创始人和首席开发者Matt Mullenweg领导。该团队管理项目的各个方面,包括核心开发、WordPress.org和社区活动。

核心领导团队由Matt Mullenweg,五位首席开发者和十几位拥有永久提交权限的核心开发者组成。这些开发者拥有技术决策的最终权力,并领导架构讨论和实施工作。

WordPress有许多贡献开发者,其中有些是以前的或现在的提交者,有些可能是未来的提交者。这些贡献开发者都是WordPress值得信赖的资深贡献者,他们在团队中拥有很高的信誉。根据需要,WordPress也有访客提交者,即被授予提交访问权的其他贡献者,有时是临时或试用的特定组件的提交访问权。

核心贡献者和贡献开发者主要指导WordPress的开发。每个版本,都有数百名开发者为WordPress贡献代码。这些核心贡献者都是志愿者,他们以某种方式为核心代码库做出贡献。

WordPress版本发布周期

每个 WordPress 版本发布周期由一个或多个核心 WordPress 开发者领头。发布周期从最初的范围界定会议到版本发布通常需要4个月左右。

版本发布周期遵循以下模式 2

  • 阶段1:规划并确保团队领导。这是在Slack上的#core频道讨论中进行的。发布负责人讨论WordPress下一个版本的功能及特性。WordPress的贡献者们也会参与到讨论中。发布负责人将为每个功能的团队确定负责人。
  • 阶段2:开发工作开始。团队负责人组建团队,并就其分配的功能开展工作。定期举行讨论会议,以确保开发工作不断向前推进。
  • 阶段3:测试阶段。发布Beta测试版本,并要求Beta测试者开始报告错误。从此阶段开始,不再进行新的增强功能或功能请求的提交。我们鼓励第三方插件和主题作者根据即将到来的更新测试其代码。
  • 阶段4:等待发布。从这一阶段开始,将不再添加新的可翻译字符串。开发工作将进入回归测试和重大漏洞修复阶段。
  • 阶段5: 启动。发布WordPress版本,并在WordPress管理中提供更新。

版本编号和安全发行

一个主要的WordPress版本是由前两个序列决定的。例如,3.5是一个主要版本,3.6、3.7或4.0也是一个主要版本。没有“WordPress 3”或“WordPress 4”,每个主要版本都以其编号来表示,例如,“WordPress 3.9”。

主要版本可能会增加新的用户功能和开发者API。在软件世界里,通常一个“主要”版本意味着会破坏向后兼容性,但WordPress会努力做到尽量不破坏向后兼容性。向后兼容是该项目最重要的理念之一,目的是让用户和开发者的更新更加容易。

WordPress 的次要版本是由第三个序列决定的。3.5.1 版本和 3.4.23 一样,都是次要版本。次要版本只用于修复安全漏洞和解决关键性错误。由于 WordPress 的新版本发布非常频繁——目标是每4-5个月发布一次主要版本,而次要版本则根据需要发布——因此只需要发布主要版本和次要版本即可。

版本向后兼容性

WordPress项目对向后兼容性有坚定的承诺。这一承诺意味着,当WordPress核心软件更新时,主题、插件和自定义代码仍能继续运行,并鼓励网站所有者将他们的WordPress版本更新到最新的安全版本。

WordPress 和安全性

WordPress 安全团队

WordPress安全团队由大约50的专家组成,包括主要开发者和安全研究人员——大约一半是Automattic公司(WordPress.com的开发者,网络上最早和最大的WordPress托管平台)的员工,还有一些人在网络安全领域工作。该团队与知名且值得信赖的安全研究人员和托管公司3进行合作。

WordPress安全团队经常与其他安全团队合作,共同解决常见依赖项中的问题,例如解决WordPress 3.9.24中的PHP XML解析器的漏洞,该漏洞是WordPress随附的XML-RPC API使用的。此漏洞的解决方案是WordPress和Drupal安全团队共同努力的结果。

WordPress 安全风险,进程,和历史

WordPress安全团队相信负责任的披露,立即提醒安全团队任何潜在的漏洞。潜在的安全漏洞可以通过WordPress HackerOne5向安全团队发出报警。安全团队通过私有 Slack 频道进行交流,并在封闭的私密 Trac 中工作,以跟踪、测试和修复漏洞和安全问题。

每个安全报告在收到后都会被确认,团队会努力验证漏洞并确定其严重性。如果得到确认,安全团队就会计划提供一个补丁来修复问题,该补丁可以提交至即将发布的WordPress版本,也可以根据问题的严重性,将其作为一个即时的安全维护版本推送。

对于即时安全版本更新,安全团队会在WordPress.org新闻站点6上发布一则公告,以告知用户新版本的发布并详细介绍其变更。在公告中会对负责任的漏洞披露的行为进行表扬,以鼓励和加强今后继续能够保持负责任的报告。

当有新版本可用时,WordPress软件的管理员会在其网站仪表盘上看到一条有关升级的通知,并且在进行手动升级后,用户将被重定向到“关于WordPress”屏幕,其中会对改进进行详细介绍。 如果管理员启用了自动后台更新,则他们将在升级完成后收到一封电子邮件。

安全发行版本的自动后台更新

从3.7版开始,WordPress为所有次要版本7(例如3.7.1和3.7.2)引入了自动后台更新。 WordPress安全团队可以识别,修复和推出针对WordPress的自动化安全增强功能,而站点所有者无需在终端上做任何事情,并且该安全更新将自动安装。

当WordPress的当前主要版本有安全更新推送时,核心团队也会为所有自WordPress3.7起能够进行后台更新的主要版本推送安全更新,因此WordPress的叫就主要版本的最新次要版本仍然会获得最新的安全家强和补丁修复。

个人站长可以选择通过简单的修改配置文件来移除后台自动更新功能,但核心团队强烈建议保留该功能,同时运行最新稳定版本的WordPress。

2013 OWASP Top 10

开放WEB应用程序安全项目(OWASP)是一个致力于WEB应用安全性的在线社区。OWASP Top 10 8的重点是为众多组织确定最严重的应用程序安全风险。结合可用性,可检测性和影响估计的共识,对前10个项目进行选择并确定优先级。

以下部分说明了WordPress用来加强核心软件和第三方插件和主题的API、资源及政策,以应对这些潜在的风险。

A1 - 注入

在WordPress中,有一组函数和API可以帮助开发者确保未经授权的代码不能被注入,并帮助他们验证和消毒数据。关于如何使用这些API来保护、验证或消毒HTML、URL、HTTP头中的输入和输出数据,以及与数据库和文件系统交互时的最佳实践和文档 9。管理员还可以通过过滤器进一步限制可以上传的文件类型。

A2 - 中断的身份验证和会话管理

WordPress核心软件管理用户账户和身份验证,并在服务器端管理用户ID、名称和密码等详细信息以及身份验证cookies。密码在数据库中使用标准的盐化和扩展技术进行保护。对于4.0之后的WordPress版本,现有的会话会在注销时被销毁。

A3 - 跨站脚本(XSS)

WordPress提供的一系列函数可助于确保用户提供的数据的安全性10。受信用户,即单WordPress安装中的管理员和编辑,或是WordPress 多站点安装中的网络管理员,他们可以根据需要在文章或页面中发布未经过滤的HTML或JavaScript。默认情况下,通过wp_kses函数使用KSES库对不受信任的用户和用户提交的内容进行过滤以除去危险实体。

举例来说,在WordPress 2.3版本发布之前,WordPress核心团队就注意到大多数主题作者滥用了函数the_search_query(),他们没有将函数的输出转义到HTML中使用。在WordPress 2.3中,该函数的输出被修改为了预转义,这是一个略微破坏的向后兼容性的情况。

A4 - 不安全的直接对象引用

WordPress经常提供直接的对象引用,例如用户账户或URL或表单字段中可用内容的唯一数字标识符。虽然这些标识符会直接披露系统信息,但WordPress丰富的权限和访问控制系统可以防止未经授权的请求。

A5 - 安全性配置错误

大多数WordPress的安全配置操作仅限于单个授权管理员。核心团队会对WordPress的默认设置进行长久评估,WordPress核心团队提供文档和最佳实践来加强运行WordPress站点的服务器配置安全11

A6 - 敏感数据泄露

WordPress用户账户密码基于Portable PHP Password Hashing Framework12进行盐化和哈希处理。WordPress的权限系统用于控制对私人信息的访问,如注册用户的PII、评论者的电邮地址、私密发布的内容等。在WordPress 3.7中,核心软件中加入了密码强度计,为用户设置密码提供了额外的信息和增加强度的提示。WordPress还有一个可选择的配置设置,就是要求使用HTTPS。

A7 - 缺少功能级访问控制

在执行操作之前,WordPress会检查任何函数级访问请求的授权和权限。在没有经过认证的情况下访问或查看管理URL、菜单和页面时,会与认证系统紧密结合,以防止未经授权的用户访问。

A8 - 跨站请求伪造攻击

WordPress使用被称为nonces13的加密令牌来验证授权用户的操作请求意图,以防止潜在的CSRF威胁。WordPress提供了一个生成这些令牌的API,用于创建和验证唯一的临时令牌,令牌仅限于特定用户、特定操作、特定对象和特定时间段,可以根据需要添加到表单和URL中。此外,所有非ces在注销时都会失效。

A9 - 使用具有已知漏洞的组件

WordPress核心团队密切关注WordPress集成的少数几个包含核心功能的库和框架。在过去,核心团队对一些第三方组件做出了贡献,使其更加安全,比如在WordPress 3.5.214中,更新修复了TinyMCE的跨站漏洞。

如有必要,核心团队可能会决定对关键的外部组件进行fork或替换,比如在3.5.2中,SWFUpload库被Plupload库正式替换,安全团队对SWFUpload进行了安全的fork<15,供那些短期内继续使用SWFUpload的插件使用。

A10 - 未经验证的重定向和转发

WordPress的内部访问控制和身份验证系统能够防止将用户转向至不想访问的目标或自动重定向。该函数也通过API,wp_safe_redirect()16向插件开发者提供。

进一步的安全风险和担忧

XXE(XML外部实体)扩展攻击

在处理XML时,WordPress会禁用自定义XML实体的加载,以防止外部实体和实体扩展攻击。除了PHP的核心功能外,WordPress没有为插件作者提供额外的安全XML处理API。

SSRF(服务端请求伪造)攻击

对WordPress发出的HTTP请求进行过滤,以防止访问环回和私有IP地址。此外,只允许访问某些标准HTTP端口。

WordPress 插件和主题安全

默认主题

WordPress需要启用一个主题才能在前端呈现可见的内容。核心WordPress的默认主题(目前是"第二十四届")已经过主题开发团队和核心开发团队的严格审查和安全测试。

默认主题可以作为自定义主题开发的起点,站点开发者可以创建子主题,该子主题包括一些自定义内容,但大多数功能和安全性都依赖于默认主题。如果不需要,管理员可以很容易地删除默认主题。

WordPress.org 主题和插件代码仓库

WordPress.org网站上大约有50,000+的插件和5,000+的主题。这些主题和插件由作者提交,并由志愿者手动审核,然后才会在官方仓库中公布。

将插件和主题纳入官方仓库并不保证其没有安全漏洞。我们提供了指导准则,供插件作者在提交至仓库之前参考17,并在WordPress.org网站上提供了大量关于如何进行WordPress主题开发的文档18

每个插件和主题都可以由插件或主题所有者持续开发,任何后续的修复或功能开发都可以上传到仓库,以提供给安装了该插件或主题的用户,并提供其说明和改进。占点管理员会通过其管理仪表盘看到需要更新插件的通知。

当WordPress安全团队发现插件漏洞时,他们会联系插件作者,共同修复并发布插件的安全版本。如果没有得到插件作者的回应,或者漏洞严重,则会将该插件/主题从公共目录中移除,在某些情况下,安全团队会直接修复和更新。

主题审核团队

主题审核团队是志愿者组成的,由WordPress社区的核心和既定成员领导,职责是审阅并通过那些意在包括于WordPress官方主题目录中的主题的提交申请。主题审核团队维护官方的主题审核指导19、主题单元测试数据20,以及主题检查插件21,并尝试推动和指导WordPress主题开发者社区遵循最佳开发实践。其人员由WordPress开发团队的核心提交者甄选。

主机服务提供商在WordPress安全方面起到的作用

WordPress可以安装在多种平台上。尽管WordPress核心软件提供了许多操作安全Web应用程序的规定,这些规定已在本文档中介绍,但操作系统和托管该软件的底层Web服务器的配置对于确保WordPress应用程序的安全同样重要。

关于WordPress.com和WordPress安全的说明

WordPress.com是世界上最大的WordPress安装,由Automattic公司拥有和管理,Automattic公司由WordPress项目的联合创始人Matt Mullenweg创立。WordPress.com运行在WordPress核心软件上,有自己的安全防护流程、风险应对措施和解决方案22。本文档指的是WordPress.org提供的、可下载的、可安装在世界任何服务器上的自我托管的开源WordPress软件的安全问题。

附录

核心 WordPress APIs

WordPress核心应用编程接口(API)由几个独立的API23组成,每个API都涵盖了涉及和使用一组给定功能的函数。这些共同构成了项目接口,它允许插件和主题与WordPress核心功能进行安全可靠的交互、改变和扩展。

虽然每个WordPress API都提供了与WordPress核心软件交互和扩展WordPress核心软件的最佳实践和标准化方法,但以下WordPress API与加强WordPress安全性最为相关:

数据库 API

WordPress 0.71中添加的数据库API24提供了正确的方法来访问数据库层中存储的命名值数据。

文件系统 API

WordPress 2.626中添加的文件系统 API25最初是为WordPress自己的自动更新功能创建的。在各种主机类型上,文件系统 API提取了安全地完成将本地文件读写到文件系统所需的功能。

其通过WP_Filesystem_Base类极其子类来实现,这些子类实现了连接本地文件系统的不同方式,取决于个别主机服务器的支持。任何需要在本地写入文件的主题或插件都应使用WP_Filesystem系列的类来执行。

HTTP API

HTTP API27,在WordPress 2.728中加入,在WordPress 2.8中进一步扩展,对WordPress的HTTP请求进行了标准化。API处理Cookie、gzip编码和解码、级chunk解码(如果是HTTP 1.1)及其他类型HTTP协议的实现。API对请求进行标准化,在发送之前对每个方法进行测试,并根据您的服务器配置,使用合适的方法进行请求。

权限和当前用户 API

权限和当前用户API 29 是一组函数,有助于验证当前用户执行任何任务或操作请求的权限,并能进一步防止未经授权的用户访问或执行超出其允许范围的功能。

白皮书内容许可证

本文档中的文字(不包括WordPress Logo或商标)在CC0 1.0通用(CC0 1.0)公共领域专用下获得授权。您可以复制、修改、分发和执行该作品,甚至用于商业目的,所有这些都无需征得许可。

特别感谢Drupal的安全白皮书提供的一些灵感。

附加阅读


作者 Sara Rosso

贡献者来自 Barry Abrahamson, Michael Adams, Jon Cave, Helen Hou-Sandí, Dion Hulse, Mo Jangda, Paul Maiorana

2015年3月1.0版


脚注