未受保护的API端点导致1.5万医生用户名和哈希密码泄露
背景
我白天是一名全科医生,晚上则是安全研究员。我的道德黑客目标之一是尽可能多地学习,以便能够审计医疗保健产品、应用程序、网站或基础设施的安全性。今天,我们将审视荷兰全科医生协会(NHG)和荷兰全科医生联盟(LHV)的安全性。
侦察开始
NHG和LHV都有许多在线应用程序,允许医生登录和交互。例如HAweb.nl(医生在线社区)和richtlijnen.nhg.org(允许医生在专业指南中添加个人笔记)。
大多数LHV和NHG应用程序共享一个使用域hawebsso.nl的单点登录(SSO)认证方法。SSO是一种认证方法,允许用户使用一组登录凭据访问多个应用程序和服务。
发现漏洞
登录页面引用了一个名为admin.js的JavaScript文件。该文件包含以下代码:
|
|
存在一个端点,管理员可以访问该端点以返回用户的不同角色。在这种情况下,是/admin用户。奇怪的是,这段代码被分享在主登录屏幕上。
端点没有正确检查谁请求它,并返回所有用户信息,包括电子邮件、全名、密码哈希和一些会员详细信息。
如果我们访问相同的端点并将/admin替换为ID,例如尝试访问ID 15000:https://hawebsso.nl/api/v1/user/15000
用户ID 15000存在,所有账户详细信息都与我们共享,包括密码。
我们现在展示了这个端点的影响,它泄露了所有注册SSO服务hawebsso.nl的用户详细信息。
在技术术语中,我们称这种错误为IDOR(不安全的直接对象引用)。
无需认证
我们现在展示了一个特定的端点泄露了用户详细信息,但是它需要认证吗?可以在未登录的情况下访问此端点吗?
在浏览器的隐身模式下打开相同的端点。没有设置cookie,我没有登录。所有用户详细信息都被返回。
答案是肯定的。此端点不需要任何登录。在技术术语中,我们现在有另一个错误,关键功能缺少认证。
密码哈希如何破解?
现在我们有了密码的哈希。使用密码哈希减少了数据泄露的影响,因为必须首先破解哈希才能检索密码。
过去,像MD5这样的密码哈希很容易通过使用彩虹表等方法破解;预先计算的所有可能哈希的列表,以破解哈希。
如今,通过使用更安全的哈希算法和包含盐值来解决这个问题。
通过将我的密码更改为相同的密码,我可以确认生成了一个新的唯一哈希。这给我们一个线索,彩虹表可能在这里不起作用(例如,如果它们为每个用户包含一个唯一的盐)。
用于测试的哈希(无担心,这是我自己的哈希,带有虚拟密码): em1EijmR7gmSA0NC2fbbl488pWDpX6YEfPtU4BNRsu01VX9VZFRuvSBAPaaIwVe5KC0enebMfwJC1AGZVNFbRsZ+7Pa7hj718HfKfIolp/5rDgsp/52UOqawXrNGHgwCHYsd+S0gG4K+ba3zjsjg5cVXCpIrqvlJbO45DkPqZ+B/REWhOmkBdRdie76z9oWk1qp7LFa9l/4Z3TtCgucS+m0Sl66mYcWwafRZkAas5a5z15v9iweiZK4WyEbkmUFQDgAqXMAsljftoJxSP0QN/BbXUtAm0wENIGvt7PPTg7dGxdUoySbUFpmnzm/eTeCcgbEpsJhb3bwAulMVl0F3
通过黑客一段时间,您可以通过查看它来识别大多数哈希类型,就像皮肤病一样。
- 098f6bcd4621d373cade4e832627b4f6 - MD5
- 5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8 - SHA-256
- $2y$12$xyq65gSoKygKl5kxKYDbjeTocAh8BcbuprbohD.kkX0PZr73pH5LC - Bcrypt
然而,这里我现在不知道使用了哪种哈希算法。在联系我的一位道德黑客同事后,我被告知这看起来像一个base64编码的字符串,解码后正好是255字节长。
从我们的侦察中知道ASP在服务器上运行,我们可能会从Microsoft提供的文档中获得更多线索:https://learn.microsoft.com/en-us/aspnet/core/security/authentication/identity
后来我找到了这篇(5年前)关于不同哈希算法的博客https://andrewlock.net/exploring-the-asp-net-core-identity-passwordhasher/,并发现了以下有趣的部分:
ASP.NET Core Identity版本3:PBKDF2与HMAC-SHA256,128位盐,256位子密钥,10000次迭代
这给了我一个提示,ASP开箱即用地使用了一个适当的哈希算法,一个我目前无法轻易破解的算法。关于PBKDF2和未来的一些有趣讨论可以在这里阅读。
目前,我放弃了破解这些哈希。
结论
我们发现了一个数据泄露,泄露了荷兰所有全科医生使用的电子邮件和密码哈希。这个端点未受保护,不需要任何授权。由于它是一个通用路径,黑客可以很容易地猜到它。此外,对此端点的引用隐藏在登录页面包含的admin.js文件中,像LinkFinder这样的工具会告知任何扫描黑客这个特定端点。
讨论
LHV在其网站上发布了一个负责任的披露政策,允许我进行这项研究:https://www.lhv.nl/cvd-coordinated-vulnerability-disclosure/这是一个如何支持道德黑客的好例子。
此外,他们试图通过制定如何处理数据泄露的指南来提高初级医疗保健的整体安全性。最近,他们在全科医生阅读的一本杂志中发表了关于此的文章:https://www.syntheshis.nu/wp-content/uploads/2022/12/Synth-2022-03-Totaal.pdf(荷兰语,第22页)。相关成员能够查看此指南:https://www.lhv.nl/product/praktijkwijzer-informatiebeveiliging/
然而,如果每个人都能访问这份文档,那将是很棒的,我们分享得越多,就越能对抗风险。在初级医疗保健中,我与学生、数据管理员和许多不是LHV成员的人一起工作;如果我能轻松分享这些文档,那将有所帮助(我倾向于不分享过时的PDF)。
另一件重要的事情是在每个在线资产上添加负责任的披露政策。例如,hawebsso.nl不包含任何引用。此外,使用SSO的NHG.org网站也没有分享任何在线负责任的披露政策。一个好事情是尽快发布此政策,并让所有在NHG工作的人熟悉这种良好实践;参见https://www.ncsc.nl/onderwerpen/cvd-beleid/cvd-beleid-opstellen以了解如何作为组织进行。
防止此类数据泄露的一个好方法是双因素认证(2FA),HAwebsso.nl支持此功能,但默认未激活。我的建议是激活它,以便在密码泄露时使攻击者更难访问您的账户。此外,重要的是不要重复使用密码,如本报告所示,当泄露(和破解)时,它可能在其他服务上被滥用;凭据填充。
如何避免此类错误?
这个错误存在了约3年,所以有很长时间来发现它。
有不同方法来处理这个问题。一个是在管理层面;获得认证并采用行业标准。
行业标准
如今,我们有不同的国际行业标准(例如ISO 27001)或国家标准(例如NEN 7510),描述了如何管理信息安全。将一些良好的信息安全实践嵌入组织的好方法。实施它,请审计员确认一切实施正确,营销可以分享您安全的好消息。
“先生,我们已通过ISO 27001认证,我们超级安全” - 每个销售部门
证书是好的,但不能保护您免受黑客攻击。
正如我们今天将看到的,没有认证会阻止您被黑客攻击。然而,这并不意味着我们不应该这样做。每一种结构化改进安全的方式都值得实施。
渗透测试顾问与道德黑客
另一种方法是执行定期渗透测试;聘请一家公司并要求他们黑客攻击您。这个错误非常直接,很可能在渗透测试中被发现。
然而,这些渗透测试通常在特定时间段进行,这不是一个持续的过程。因此,在渗透测试之间发布的资产中的任何新错误可能会被忽视。
一个解决方案可能是创建一个道德黑客社区,使用漏洞赏金平台(如HackerOne或BugCrowd),并开始投资于在您的资产中发现错误的道德黑客。在荷兰,我们有一些关于如何创建社区的好例子:Hack the Hague。
威胁建模
我是INCLUDESNODIRT.com方法的忠实粉丝;聚集一群人(例如开发人员、道德黑客、全科医生、产品所有者和隐私官),填写问卷并 brainstorming 20分钟。每当您引入新资产、向应用程序添加功能或组织发生变化(例如合并和收购)时。在这个例子中,人们会问自己“新添加的Admin功能是否 properly secured from unauthorized access? If yes, explain how.”
数字医疗的威胁建模
我还没有看到该方法在生产中使用,但我很想听听已经实施它的其他人的故事。我们可以从中学到什么,它真的有效吗?
透明度就是信任
从开始到结束这个特定错误报告,LHV隐私官对我的电子邮件非常响应。他经常发送更新,这帮助我确信所有利益相关者都理解错误的影响,并且正在迅速修复。他做得很好,是其他人如何处理此类报告的榜样,谢谢!
在任何组织中,透明度就是信任。如果是关于数据泄露,我们有好的流程图帮助我们如何 proceed and transparently inform the end users(例如能够发布像这样的博客)。
这份报告展示了 crowd 的力量,透明度和适当的披露政策使世界上所有道德黑客能够帮助您变得更安全。您可以将此 crowd 模型应用于组织中的所有其他层面,并更快地实现您的目标。
最后,我们都希望明天有一个更好、更安全的初级医疗保健,并从过去的错误中学习。
时间线
- 2022年12月4日 - 发现错误,通过电子邮件报告给LHV隐私官
- 2022年12月5日 - 隐私官回复确认错误
- 2022年12月6日 - 隐私官更新
- 2022年12月8日 - 隐私官更新:错误存在3年(自2019年底以来),过去2年的日志中没有滥用迹象
- 2022年12月11日 - 撰写此博客
- 2022年12月12日 - 通过电子邮件将此博客草稿发送给隐私官
- 2022年12月12日 - LHV和NHG通过电子邮件通知所有成员数据泄露;要求成员重置密码
- 2022年12月13日 - LHV建议一些微小更改
- 2022年12月14日 - 发布博客
- 2022年12月15日 - 读者告知我Admin.js文件存在于2017年;https://web.archive.org/web/20170905141113/https://hawebsso.nl/Js/admin/admin.js 这是否意味着错误存在了+5年?向LHV询问了一些见解,得到回复他们将与开发人员 double check。