当前位置: 首页 > 科技观察

使用第三方应用程序的各种代码注入技术窃取钥匙串

时间:2023-03-13 00:38:33 科技观察

在macOS上存储密钥是一项巨大的挑战,可以通过许多不安全的方式完成。我在漏洞赏金评估期间测试了许多Mac应用程序,发现开发人员倾向于将密钥放入首选项甚至隐藏的平面文件中。这种方法的问题是所有以标准权限运行的非沙盒应用程序都可以访问关键数据。平面文件(Flat-File),FlatFile是一种包含没有相对关系结构的记录的文件。此类型通常用于描述已从中删除文字处理和其他结构字符或标记的文本。在使用中,有一些歧义,比如换行符是否可以包含在“平面文件(flatfile)”中。无论如何,许多用户将保存为“纯文本”类型的MicrosoftWord文档称为“平面文件(flatfile)”。最终文件包含记录(一定长度的文本行数)但没有信息,例如,一行应该多长来定义标题或程序应该使用多长时间来格式化带有目录的文档。例如,macOS上的Signal将用于加密所有消息数据库的密钥存储在~/Library/ApplicationSupport/Signal/config.json中。macOSKeychain根据Apple的说法,Keychain是存储密码和加密密钥等小秘密的最佳场所。Keychain是一种非常强大的机制,允许开发人员定义访问控制列表(ACL)以限制对项目的访问。可以使用密钥组权限对应用程序进行签名,以访问其他应用程序之间的共享密钥。以下Objective-C代码会将密钥值保存在钥匙串中:执行后,您应该会看到条目已成功添加:第一种窃取技术第一种技术是验证应用程序使用的是“HardenedRuntime”还是“LibraryValidation”标志,Keychain无法检测代码注入。因此,只需使用以下命令:如果标志为0x0,并且没有__RESTRICTMach-O段(该段非常罕见),则只需将恶意dylib注入应用程序的主要可执行文件。创建一个包含以下内容的exploit.m文件:compile:andinject:SecondStealingTechnique如果可执行文件使用HardenedRuntime签名怎么办?这种绕过技术类似于我在XPCExploitation系列中向您展示的技术。获取未经过强化运行时签名的已分析二进制文件的旧版本,并将dylib注入其中。Keychain不会验证二进制文件的版本,但会向您显示密钥。对于开发人员建议的修复,创建一个“KeychainAccessGroup”并将密钥移到那里。无法获取此密钥,因为旧版本的二进制文件无法使用此钥匙串组权限进行签名,请单击此处了解详细信息。第三种窃取技术请记住,如果设置了“HardenedRuntime”,com.apple.security.cs.disable-library-validation将允许您注入恶意动态库。第四种窃取技术,如JeffJohnson在他的文章中所展示的,是TCC仅表面检查应用程序的代码签名。keychain也存在同样的问题,即使整个bundle的签名无效,keychain也只会验证主可执行文件没有被篡改。让我们以其中一个Electron应用程序(MicrosoftTeams、Signal、VisualStudioCode、Slack、Discord等)为例。Electron是一个用于创建本机应用程序的框架。基于Node.js和Chromium,实现了通过JavaScript、HTML、CSS等Web技术构建跨平台应用的能力。其中,Electron还封装了一些功能,包括自动更新、原生菜单和通知、崩溃报告、调试和性能分析等。即使您使用HardenedRuntime签署了Electron,恶意应用程序也可以更改包含实际代码的JavaScript文件。我们看一下GithubDesktop.app,在keychain中保存了用户的sessionkey:并且有效签名:接下来改一个JS文件,验证签名:可以看到签名坏了,但是Github上就没事启动并加载保存在钥匙串中的钥匙:为了防止修改,Electron实现了一种称为asar-integrity的机制。它计算一个SHA512哈希并将其存储在Info.plist文件中,问题是它不会停止注入。如果主要可执行文件没有使用HardenedRuntime或Kill标志进行签名并且不包含受限权限,则只需修改asar文件,计算新的校验和并更新Info.plist文件。如果设置了这些标志或权限,则始终可以使用ELECTRON_RUN_AS_NODE变量并在主可执行上下文中再次执行代码。因此,它可以窃取钥匙串条目。总之,钥匙链中的安全密钥存储确实很难实现,因为对请求的可执行文件的代码签名检查只是装饰性的,因此有多种方法可以绕过访问控制机制。最大的问题是Electron应用程序,它不能将密钥安全地存储在钥匙串中。请记住,任何在主要可执行文件之外存储实际代码的框架都可能被诱骗加载恶意代码。本文翻译自:https://wojciechregula.blog/post/stealing-macos-apps-keychain-entries/