Moodle是开源基于PHP的学习管理系统,全球数以万计的大学都在使用它,然而,近日Moodle中发现的漏洞可能让服务器及其数据受到攻击。根据发现该漏洞的研究人员表示,Moodle安全漏洞实际由几个小漏洞组成,它可使攻击者在相关服务器执行PHP代码。那么,这个漏洞执行条件是什么,以及我们应该如何阻止它?
Michael Cobb:Vaultra公司安全研究人员兼首席执行官Netanel Rubin发现,通过利用一系列小漏洞,他可将它们链接起来在运行Moodle的服务器远程执行代码。
Moodle是一个开源学习管理系统,它存储着大量敏感信息,例如学生成绩、测试和隐私数据,这使其成为黑客的攻击目标。Moodle安全漏洞被跟踪为CVE-2017-2641以及Moodle Tracker问题MDL-88010。
这种攻击几乎可在所有Moodle版本执行,因此管理员应该升级到最新版本3.2.2,以尽快解决该问题。除了更新到最新版本,管理和还应该检查Moodle内任何新管理员、插件或者模板,并在文件系统中搜索任何新文件,以防服务器遭到入侵。
Moodle系统的规模和复杂性导致这些编码和逻辑缺陷,也最终产生这个Moodle安全漏洞;Moodle系统包含数千个文件、数百个组件以及大约200万行PHP代码,由不同开发人员在不同时间编写和更新。
此前,Moodle中添加了一个新函数update_user_preferences来替换update_users函数,它会进行特权检查,因此即使攻击者可通过用户偏好设置来更改设置,也只能以自己的权限更改。
虽然这个新函数消除了更改每个用户属性的可能性,但该代码无法检查哪些偏好设置被更改。前面的函数使用setuserpref.php文件来检查需要更新的偏好设置列在ajax_updatable_user_prefs数组中,该数组定义了可通过Ajax更改的偏好设置,以确保不会更改关键值。
具有讽刺意味的是,为了减少对该用户属性更新功能的任何潜在滥用情况,这个新的特权检查实际上引入了Moodle安全漏洞。开发人员可能认为用户偏好设置不可能被利用来加载全面攻击,因为它们只是影响图形用户界面部分。
然而,缺乏包含让对象注入攻击可更新整个数据库的任何行,例如管理员账户、密码和站点配置。Rubin发现,在代码开发过程中做出的这个假设和其他假设可能被利用来最终执行PHP代码。
逻辑漏洞可能出现在任何具有大型代码库的系统中,特别是在由不断变化的开发团队在长时间开发的系统。
根据《Code Complete》作者Steve McConnell表示,超过512000行代码的软件项目平均每千行代码中有4到100个编码错误。典型的Web应用会使用多种语言,例如Java、HTML、PHP、Python、CSS、第三方库和组件等,很少有开发人员知道或者了解如何使用和整合它们,而不会引入任何安全漏洞。
为了减少开发人引入逻辑漏洞或者省略安全及验证检查,应该要求他们使用约定的注释风格来添加最低级别的代码注释,以及更详细的支持文档。维基百科有完整的注释样式列表。
尽管花时间评论和记录代码会减缓开发速度,但这可确保在未来更改代码的开发人员可完全了解函数的作用、操作方式以及需要对处理的数据进行哪些检查。同样重要的是当函数在接收其他函数传递的数据时,不能认为数据已经经过检查,因为前面的函数可能通过不同的要求或规则对其进行检查。
这方面很好的示例是电话号码,从数据库检索和显示用户电话号码的函数可能会接收+和()符号,但如果该函数将数据传递给实际拨打号码的函数,且在处理前没有移除这些符号,可能会导致该函数失效。