首页> 中国专利> 一种防止冷启动攻击的U盘加密密钥存放方法

一种防止冷启动攻击的U盘加密密钥存放方法

摘要

本发明涉及一种防止冷启动攻击的U盘加密密钥存放方法,属于数据安全技术领域。本发明方法通过修改Android内核源代码,在使用AES加密算法加密U盘时改变密钥在内存中存放位置,使得无法被冷启动工具取得密钥。具体是通过修改crypto加密解密算法信息结构体的内存申请的代码,使得此结构体保存在内存中固定位置,即设备启动时存放命令行参数的内存,也即距内存起始地址偏移量为0x100的内存,在系统重启时此密钥数据被命令行参数覆盖,从而无法被冷启动攻击取得密钥。对比已有技术,本发明通过对Android设备启动镜像修改,改变Android设备的加密算法的密钥保存位置,使得设备重新启动后密钥信息被覆盖,无法使用冷启动攻击获得加密密钥,进而获得手机的隐私数据。

著录项

  • 公开/公告号CN104809414A

    专利类型发明专利

  • 公开/公告日2015-07-29

    原文格式PDF

  • 申请/专利权人 深圳市创世达实业有限公司;

    申请/专利号CN201510222001.5

  • 发明设计人 赵旭强;张全新;高天星;周汉鹏;

    申请日2015-05-04

  • 分类号G06F21/79(20130101);G06F21/34(20130101);

  • 代理机构

  • 代理人

  • 地址 518112 广东省深圳市龙岗区南湾街道布澜路联创科技园4栋3楼

  • 入库时间 2023-12-18 10:16:50

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2019-08-13

    专利权人的姓名或者名称、地址的变更 IPC(主分类):G06F21/79 变更前: 变更后: 申请日:20150504

    专利权人的姓名或者名称、地址的变更

  • 2017-07-07

    授权

    授权

  • 2017-06-23

    著录事项变更 IPC(主分类):G06F21/79 变更前: 变更后: 申请日:20150504

    著录事项变更

  • 2015-08-26

    实质审查的生效 IPC(主分类):G06F21/79 申请日:20150504

    实质审查的生效

  • 2015-07-29

    公开

    公开

说明书

技术领域

本发明涉及一种Android系统的U盘加密密钥存放方法,特别涉及一种防止冷启动攻击的U盘加密密钥内存存放方法,属于数据安全技术领域。

背景技术

Android操作系统是目前智能设备上最主流的操作系统。而Android设备的安全性问题也越来越严重。自Android 3.0以来,Google为其添加了一些简单的加密功能。自Android 4.0以来,Android系统可以对设备的整个分区进行加密,用户可以选择对设备的整个存储部件(例如用户数据分区,SD卡等)上的数据进行加密,从而防止绕过屏幕锁的针对性的攻击,保护用户的敏感信息。Android设备在加密这些数据时是使用AES加密算法的。AES(Advanced EncryptionStandard,高级加密标准)是目前对称密钥加密中最流行的算法之一,其加密数据区块长度固定为128比特,密钥长度则可以是128,192或256比特。

在Android 4.0发布之后,存储在Android设备中的数据将经过AES加密,因此,除非能强行破解屏幕锁,否则司法部门和企业IT人员也无法获取其中的数据。然而,如果可以获得AES的加密密钥,通过拷贝存储器上的数据并解压缩,就可以得到用户的个人数据。Mueller等研究人员通过“FROST”冷启动攻击,即一种通过冷冻手机并快速重启手机并从手机RAM中根据启发式算法寻找AES加密密钥的攻击,便能从智能手机的RAM中提取出磁盘加密密钥。这种攻击方法利用了RAM的剩磁效应,温度越低,剩磁效应越明显。其攻击过程如图1所示,首先,将手机的温度降低到1-15度,然后打开后盖,扣掉电池并迅速装回去,按住特殊按键进入Fastboot模式,然后刷入FROST恢复镜像,然后重启至Recovery模式,就可以使用其工具寻找到AES加密密钥,进而获得手机中用户数据。

普通的Android内核使用AES加密U盘的方式为,首先在RAM中申请一段空闲空间,将AES加密算法信息结构体存放在里头,然后将密钥和加密初始向量写入到信息结构体中,然后调用内核中的加密API对U盘中的数据进行加密,加密完成后将信息结构体空间释放。由于申请到的加密算法信息结构体的空间在内存中位置是随机的,因此遍历整个RAM即可找到AES加密密钥,其流程图如图2。

针对这种攻击方式,Johannes Gotzfried等人提出了一种完全使用CPU内部寄存器进行AES加密的方式(ARMORED)以避免被上述冷启动攻击破解。ARMORED是在ARM上运行AES加密算法而不涉及RAM。在智能手机的整个运行过程中,密钥,密钥调度和AES的所有中间值被完全单独存储在CPU多媒体寄存器组NEON中。然而,为了避免将中间值(特别是轮密钥)存储在内存中,经常要为新的输入模块重新计算AES的中间值。因此其加密效率有所降低。同时,此加密算法不能被中断,否则可能会产生副作用(如上下文切换的导致寄存器中内容被移动到RAM中),导致算法失效,冷启动攻击即可获得加密密钥。

综上可知,现有的Android系统的AES加密算法实现不能完全不被冷启动攻击所破解。

发明内容

本发明的目的是为解决上述缺陷,提出一种防止冷启动攻击的U盘加密密钥内存存放方法。

任何在手机中运行的进程,都需要使用手机的内存RAM,即使是完全使用CPU内部寄存器进行数据加密的方法和冷启动攻击本身。完全使用CPU内部寄存器进行数据加密方法也需要将需要加密的数据和加密后的数据等存放在内存中,冷启动攻击本身也需要一定的内存,更普遍的,这两个程序都是运行在Android系统中的,而Android系统本身也需要使用RAM。因此,对于冷启动攻击,如果将加密算法的加密密钥存放在冷启动攻击及其上下文执行环境所需要使用的那段内存中,当冷启动攻击将要执行时,便将原来的加密算法的密钥覆盖,冷启动攻击便无法找到密钥。

因此,首先需要找到冷启动攻击必须使用的物理内存,使之加载时覆盖加密密钥。在冷启动攻击中,该Android可加载内核模块运行时需要申请一段内存空间,而此内存空间是由内核分配的,其物理位置不固定,因此无法将加密密钥保存在冷启动攻击进程需要的内存RAM中。

在安装有Android系统的设备中,有若干种不同的启动模式,正常模式进入我们常见的系统,Recovery模式进入恢复模式。而冷破解的方法便是通过Recovery模式进行破解的。无论是正常启动还是Recovery模式启动,首先需要启动的是Bootloader。Android在启动时,在设备加电之后,首先从NorFlash开始运行,将自身代码搬到CPU内部的RAM中,然后初始化各种硬件,然后将Boot分区中或者Recovery分区中的镜像解包,将Linux内核解压缩到内存中,并且把需要传递的内核参数拷贝到RAM的固定位置。然后跳到RAM中的内核处去启动Linux内核。

从上述Android系统的初级启动阶段可以看到,在Android系统启动时,将会把内核解压到RAM中固定位置,然而,内核代码是一直贮存在内存中的,如果在运行时修改,极有可能导致系统崩溃。同时也可看到,启动时,Bootloader将会把启动命令行参数拷贝到RAM中固定的位置,而这个命令行参数在内核启动之后便不再使用,因此可以考虑将加密密钥保存在RAM中存放命令行参数的位置。这样,在每次系统启动时,包括正常模式或者Recovery模式,加密算法的密钥将会被命令行参数覆盖,而冷启动攻击是需要重新启动进入Recovery模式的,因此其无法得到加密密钥。

本发明是通过以下技术方案实现的:

一种防止冷启动攻击的U盘加密密钥内存存放方法,包括以下步骤:

A.获得Android设备的对应内核源代码;

B.修改内核源代码中加密算法的密钥空间申请及释放内存代码并重新编译;

C.提取Android设备启动分区镜像并解包;

D.重新打包boot.img启动分区镜像;

E.将新的boot.img启动分区镜像刷入所述Android设备启动分区中;

F.重新启动所述Android设备。

在所述B中,密钥申请及释放的源代码位于/crypto/api.c文件中。原源代码中,使用kzalloc()函数申请内存,得到的内存位置为随机的;需要将其修改为将固定物理内存映射到虚拟内存作为密钥保存位置。而Bootloader把命令行参数拷贝到RAM中的位置固定,这个固定位置为系统RAM的首地址加上0x100。所以首先要使用pfn_to_page()函数将物理地址转换为内存页号,然后使用kmap()函数将上述页号映射到虚拟地址上,赋值给AES加密的结构体。在释放内存的代码中,需要将原释放源代码进行修改,否则会由于kmap()得到的内存无法释放而导致系统崩溃。然后对源代码进行编译,得到arch/arm/boot/zlmage内核镜像。

所述E中,将修改后的Android设备启动分区镜像刷入Android设备启动分区中,设备启动时将使用新的启动分区镜像启动,在使用加密算法时将会把密钥结构存放在固定的物理内存中,如果被执行冷启动攻击,在Recovery模式启动时将会把密钥信息覆盖,使得冷启动攻击失败。

因此,一种防止冷启动攻击的U盘加密密钥内存存放方法,其Android内核AES加密算法的流程如图3,首先,加密程序申请加密算法信息结构体,系统首先获得系统RAM的起始位置,然后将其转换到虚拟地址,并将偏移量为0x100(=256)的地址返回,作为加密算法信息结构体的内存空间。然后加密程序设置加密密钥和初始向量,然后进行数据加密;完成加密之后,在释放内存时判断并不对此信息结构体做Free处理(物理内存转换到的这段虚拟地址不需要Free)。这样,即使被冷启动攻击,在冷启动工具安装时进入Recovery模式时此信息结构体内存被覆盖,从而无法得到加密密钥。

有益效果

本发明方法通过对Android设备启动镜像修改,改变Android设备的加密算法的密钥保存位置,使得设备重新启动后密钥信息被覆盖,无法使用冷启动攻击获得加密密钥,进而获得手机的隐私数据。

附图说明

图1为冷启动攻击过程示意图;

图2为普通的Android内核使用AES加密的流程示意图;

图3为本发明实施例Android内核使用AES加密的流程示意图;

图4为本发明实施例I9500内核开源代码下载列表示意图;

图5为本发明实施例I9500内核代码下载许可凭证示意图;

图6为本发明实施例I9500内核源代码根目录列表示意图;

图7(1)和图7(2)为本发明实施例编译内核配置部分帮助列表示意图;

图8为本发明实施例配置三星I9500内核编译配置示意图;

图9为本发明实施例编译Android内核源代码示意图;

图10为本发明实施例三星I9500分区情况示意图;

图11为本发明实施例解包I9500的启动分区镜像情况示意图;

图12为本发明实施例初始时刻手机的系统RAM起始页的内容示意图;

图13为本发明实施例AES加密后RAM起始页的内容示意图;

图14为本发明实施例快速重启手机后RAM起始页的内容示意图。

具体实施方式

为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明的一种防止冷启动攻击的U盘加密密钥内存存放方法进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。

下面将按照上面所介绍的步骤,详细介绍各个步骤的具体实施方式。

实施例

本实施例使用三星I9500手机作为实施平台,其Android版本为4.2.2,内核版本为3.4.5。本方法需要在Linux环境下编译Android内核源代码,本实施例中的Linux系统版本为Ubuntu12.04。本实施例所涉及的加密算法为AES加密算法。同时,编译Android内核源代码需要使用NDK交叉编译环境,本实施例中使用android-ndk-r9c中的arm-linux-androideabi-4.8。实施例具体步骤如下:

A.获得相应手机的对应内核源代码

可以在open source release center网站(http://opensource.samsung.com/reception.do)下载三星i9500的内核源代码。本实施例中所使用的手机为三星i9500,因此,打开链接之后输入i9500并搜索,可以看到若干三星i9500的内核源代码,选择合适的版本,SM-N900_KK_Opensource_Update3.zip,如图4所示,点击进行下载,出现许可凭证如图5所示,选择同意(Agree),并选择下载资源的目的(Source download purpose),点击继续(Continue)即可进行下载。

B.修改内核源代码中AES加密算法的密钥申请及释放内存代码并重新编译

1.解压缩内核并配置内核编译环境并编译内核

将下载的Android内核源代码解压缩到Ubuntu系统中的home/user/android/i9500-kernel/kernel目录下,解压缩之后其目录内容如图6所示。

安装NDK交叉编译环境。将NDK安装包解压到Ubuntu系统下,本实施中NDK安装位置为/home/user/workspace/android-ndk-r9c。

配置交叉编译环境。打开Ubuntu系统的终端(Terminal),输入如下命令配置交叉编译环境:

编译Android内核源代码。进入Android内核源代码目录,使用如下命令获取make帮助,显示可以使用的配置文件很多,如图7所示。

make help

同时,I9500手机的设备名为ja3g,因此选择ja3g_00_defconfig作为配置选项。使用如下命令设置Android内核的编译配置,如图8所示。

make ja3g_00_defconfig

编译Android内核。使用如下命令进行Android内核源代码的编译,如图9所示。

make -j8

2.修改内核源代码中AES加密算法密钥申请及释放内存代码

在使用Android内核加密模块时,首先需要申请一个加密解密算法信息结构体crypto_tfm,这个结构体包含了算法的类型、加密模式、加密解密数据地址、密钥空间等等,它需要使用crypto_alloc_blkcipher()函数申请。申请到此结构体之后,设置密钥,初始向量等,这些重要的信息就会保存在crypto_tfm结构体中,然后就可以对数据进行加密或解密操作。加密解密工作完成后还需要释放结构体的占用内存。Android内核源代码中有关加密的文件夹路径为crypto/。

可以看出,Android内核加密体系的密钥(包括AES加密算法)是存放在crypto_tfm结构体中的,申请crypto_tfm的函数为crypto_alloc_tfm(),最终会调用_crypto_alloc_tfm()函数,其申请空间代码如下:

本专利所述方法中,需要将AES的加密密钥保存在内存中固定位置,即存放启动时内核命令行参数的位置,而内核命令行参数的位置为系统内存的第256(0x0100),同时需要将物理内存映射到虚拟内存。在每次加密过程中都要申请两次tfm,其中一次申请内存大小为84B,一次是548B,而大小为84B的tfm中不含有加密密钥信息,大小为548B的tfm含有密钥信息。因此,在申请tfm时,判断需要申’请的内存大小,如果申请的内存比较小,则正常分配内存,否则重新进行内存映射。故需要将tfm=kzalloc(tfm_size,GFP_KERNEL)申请内存的代码修改为:

最后在释放tfm内存的位置进行判断,如果是正常分配的内存,则需要释放内存,而内存映射的那部分内存不需要释放,否则会导致内核崩溃。

修改完内核代码之后,使用如下命令重新编译内核,得到新的内核镜像(arch/arm/boot/zlmage):

make -j8

C.提取Android设备启动分区镜像并解包

1.提取I9500手机的启动分区镜像

三星I9500手机的启动分区(名为Boot分区)为/dev/block/mmcblk0p9。使用ADB工具,进入手机/dev/block/platform/dw_mmc.0/by-name目录查看I9500分区情况,如图10所示,图中方框标示的内容表示I9500的Boot分区为mmcblk0p9,然后使用如下命令提取启动分区(Boot分区)数据,保存为文件boot.img。然后将提取的boot.img镜像拷贝到电脑中。

cat/dev/block/mmcblk0p9>/storage/sdcard0/boot.img

2.解包启动分区镜像

启动分区镜像是按一定格式打包的,要修改启动分区镜像,首先需要解包启动分区镜像,在Ubuntu下可以使用unmkbootimg工具可以解包,得到Android内核镜像zlmage和初始化文件系统镜像initramfs.cpio.gz,如图11所示。

D.重新打包boot.img启动分区镜像

将重新编译的Android内核镜像zlmage拷贝到步骤C.2中解压内核镜像的目录home/user/android/i9500-kernel/mkboot/中,覆盖原始的内核镜像zlmage,使用工具mkbootimg可以将解包后的内容重新打包为启动分区镜像,命名为new boot.img。

E.将新的boot.img启动分区镜像刷入Android设备启动分区中

修改之后的启动分区镜像为new-boot.img,未修改之前的启动分区镜像为boot.img,通过ADB连接手机,把new-boot.img放在手机中的/sdcard目录下,使用如下命令将修改后的启动分区镜像刷入手机启动分区:

cat/sdcard/new-boot.img>/dev/block/mmcblk0p9

new-boot.img刷入I9500启动分区/dev/block/mmcblk0p9中:

F.重新启动手机并验证

为了验证本专利提及方法不能被冷启动攻击攻破,实现一个查看Android系统RAM的可加载模块,此模块可以查看系统RAM开始的一个内存页(即2048B)的内容。其部分实现代码如下:

将此可加载模块编译,并拷贝到手机中,加载模块,得到内存中数据如图12所示。

同时,修改上述代码,使得将RAM开始的一页内容全部修改为0x0f。编译模块,拷贝到手机中并家在模块,则内存中首页内容被修改为0x0f。

使用256位密钥″0123456789abcdef0123456789abcdef″对U盘中数据进行加密,加密之后重新加载内存查看模块,可以看到内存中数据如图13所示,其中方框标出的部分为上述密钥的ASCII码,与修改内存之前相比较,前面一段内容被修改为0x0f。然后使用命令:

adb reboot

快速重启手机,重新查看内存,如图14所示,可以看到有关密钥数据的内存已被覆盖,此部分数据和图12中基本相同,已经完全没有密钥信息。同时,有大量数据为0x0f,可以说明内存中数据在重启时被保持,即模仿了冷启动攻击的剩磁效应。因此,在冷启动攻击中,无法获得加密密钥信息。

本领域的技术人员从上面描述的内容可以了解,本发明方法各步骤间没有严格的先后关系,只要一个步骤的实现不需要依赖另一个步骤的完成,就可根据实际情况调整顺序,如步骤A、B和步骤C。

以上所述的具体描述,对发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施例而已,并不用于限定本发明的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号