Tag: 安全

寻找iOS内核符号

上周,谷歌零号项目的伊恩·比尔(Ian Beer)在Twitter上宣布,他将发布一些东西,以帮助任何希望引导iOS 11内核安全性研究的人,通过task_for_pid_0或tfp0提供对内核内存的读/写访问。 尽管围绕此公告感到非常兴奋的是有可能进行新的越狱,但我想以此为契机再次花时间在移动安全上。 我过去的大部分经验都是在应用程序级别测试中进行的,但我想深入了解操作系统本身的精髓。 乔纳森·莱文(Jonathan Levin)承诺提供了一个工具包,“对于那些在处理过程中最终获得对kernel_task端口(aka tfp0)的发送权,但又不知道下一步要做什么的人”,这似乎很棒潜水的机会。 贝尔先生的漏洞公告和PoC代码已于昨天发布,非常漂亮。 极好的文档(包括ASCII艺术堆栈示例!),干净,并且相对容易阅读和推理。 我已经准备好开始测试,但是很快遇到了麻烦。 贝尔先生很客气,可以为几种设备添加内核符号,但是我没有打算使用它。 幸运的是,作为该文档的一部分,他提供了有关如何查找符号的详细提示,因此我已准备好应对挑战。 这篇文章的其余部分将逐步介绍我寻找符号的过程,希望它可能对您增加对设备的支持也很有用。 除了未删除的符号外,我没有找到任何其他有关执行此操作的文档,因此我想为其他人员(和我自己)记录此过程。 视乔纳森·莱文(Jonathan Levin)的工具包中的内容而定,这可能不是必需的,但我认为这是一个有趣的学习练习。 查找符号的第一步是获取目标iOS版本的kernelcache 。 我跳到https://ipsw.me/并为我的iPad Mini 2以及已经在symbols.c定义了符号的设备之一下载了11.1.2固件。 拥有已经定义好的固件对确认我用来查找每个符号的过程是否正确非常有帮助,因为我们已经知道该设备应该使用的正确符号。 解压缩.ipsw文件后,我抓住了Levin先生的工具Joker。 在使用了一些选项之后,我将其指向带有-j和-m选项的kernelcache文件,以转储所有可用的符号。 输出包含我需要的以下符号的地址: KSYMBOL_OSARRAY_GET_META_CLASS KSYMBOL_IOUSERCLIENT_GET_META_CLASS KSYMBOL_IOUSERCLIENT_GET_TARGET_AND_TRAP_FOR_INDEX KSYMBOL_CSBLOB_GET_CD_HASH KSYMBOL_KALLOC_EXTERNAL KSYMBOL_KFREE KSYMBOL_OSSERIALIZER_SERIALIZE KSYMBOL_KPRINTF KSYMBOL_UUID_COPY 9点下来,10点走。 其余部分必须已被剥离(或首先没有像JOP小工具那样标记),因此是时候在IDA Pro中加载kernelcache文件了。 您当然可以为此使用其他反汇编程序,例如Binary Ninja,Hopper或radare2。 在此之前,我们需要解码kernelcache文件。 我从Joshua Wright找到了本指南来准备文件。 *在十六进制编辑器中打开kernelcache并查找0xFFCFFAEDFE,注意偏移量(435) * wget -q http://nah6.com/%7Eitsme/cvs-xdadevtools/iphone/tools/lzssdec.cpp* g ++ -o lzssdec lzssdec.cpp * ./lzssdec […]

在iOS钥匙串中保存数据

您应该在哪里存储用户数据? 这是有关移动开发中用户数据安全性的最流行和最热门的主题之一。 不幸的是,它仍然没有一种好的实践。 有时,您的后端团队无法实施该解决方案以允许将凭据存储在散列中的设备中,或者您需要在该设备上保存多个帐户🤔。 在本文中,我将向您展示iOS系统中的钥匙串到底是什么,如何使用它来存储数据以及根据将敏感数据存储在设备上的一些最佳做法。 听起来不错👍? 走吧! iOS系统有一个有趣的东西,称为keychian🔐。 钥匙串只是用于存储所有敏感数据(如密码,证书等)的数据存储。 第二个问题-为什么安全? 因为钥匙串使用的是全面加密。 这意味着用密钥保护其中存储的数据。 密钥是基于唯一的设备数据和该设备的代码生成的(仅所有者知道)。 最小加密算法有128位AES。 自2016年以来,Apple启用了名为iCloud钥匙串的服务,这意味着用户可以在一个AppleID中的设备之间共享他的钥匙串。 嗯……看起来一切都在进行中,并且使用1.2版本的TLS加密进行同步,但是毕竟我意识到具有我所有凭据的文件都位于Apple服务器上的某个地方,这并没有让我感到高兴。 我不确定该解决方案,但我让您选择。 有关钥匙串本身的更多信息,请访问以下Apple支持频道:https://support.apple.com/zh-cn/HT202303 钥匙串是存储敏感数据的唯一相对安全的地方。 据推测,您将应用程序的配置数据保存在UserDefaults中。 但是您必须记住,这不是在此处存储敏感数据的安全场所,因为黑客很容易窃取它(足以访问设备)。 钥匙串并不是那么容易,只有用用户的密码才能破解。 好的,那么我们应该在钥匙串中存储哪些数据? 登录名和密码(哈希) 付款数据 加密算法的密钥 如果我再提醒自己一些东西,我会加it 将数据存储在钥匙串中还有另一个优势-如果用户决定从设备中删除该应用程序,然后又决定再次安装该应用程序,则该数据仍会保存(当然,如果用户不手动删除它,😅 )。 好了,是时候编写一些代码了! 访问钥匙串很容易实现。 Apple为我们完成的几乎全部工作➡️您只需从此处下载示例代码👉https://developer.apple.com/library/content/samplecode/GenericKeychain/Introduction/Intro.html,然后将其粘贴到您的项目结构中。 我总是在钥匙串配置中添加一个额外的结构: 好了,武器库可以使用🔫了。 首先,我们将关心将数据保存在钥匙串中。 注意:在本文中,我仅关注使用钥匙串,以便将数据保存为纯文本。 但是您必须记住有关以加密格式存储数据的信息。 函数setPasswordToKeychain()为我们的登录创建新的钥匙串对象,然后使用savePassword()方法保存密码。 此函数可能会引发错误,因此我正在使用docatch结构。 好的,它工作正常。 现在,我想从钥匙串下载用户名的密码。 我正在创建函数getPassword(): func getPassword(forUser用户:String)-> String? {} 情况很简单-方法以用户的登录名作为参数,然后以钥匙串形式返回密码,如果用户名未存储密码,则返回nil。 就是这样,它起作用了! 如前所述,我仅向您展示了一种从钥匙串保存和读取数据的方法。 请记住,您应该保护您的数据,即使用TouchID或一些额外的加密。 钥匙串还能做什么? 如果您有好奇心(作为开发人员,您应该是😁),我想您已经从Apple复制了支持文件。 如您所见,还有更多功能可以显示钥匙串可以提供的更多功能。 除了保存和读取密码外,钥匙串还允许您更改帐户名(用户登录名): 变异func […]