读书人

加载linux kernel 的保险机制分析

发布时间: 2013-10-29 12:07:57 作者: rapoo

加载linux kernel 的安全机制分析

参考文件:system/core/libmincrypt/sha.c

system/core/mkbootimg/mkbootimg.c

首先,一般bootimage 的结构如下

(1 page 有可能是2048或4096,具体看flash的类型)
** +-----------------+
** | boot header | 1 page
** +-----------------+
** | kernel | n pages
** +-----------------+
** | ramdisk | m pages
** +-----------------+
ramdisk,很多配置文件放在此处,且不能修改
下载的时候什么样子,以后就是什么样子

打包的时候会计算kernel,ramdisk分区数据的sha值,并把其存放在boot header
(注意:计算的时候不包含boot header本身)

    SHA_init(&ctx);    SHA_update(&ctx, kernel_data, hdr.kernel_size);    SHA_update(&ctx, &hdr.kernel_size, sizeof(hdr.kernel_size));    SHA_update(&ctx, ramdisk_data, hdr.ramdisk_size);    SHA_update(&ctx, &hdr.ramdisk_size, sizeof(hdr.ramdisk_size));    SHA_update(&ctx, second_data, hdr.second_size);    SHA_update(&ctx, &hdr.second_size, sizeof(hdr.second_size));    sha = SHA_final(&ctx);    memcpy(hdr.id, sha,           SHA_DIGEST_SIZE > sizeof(hdr.id) ? sizeof(hdr.id) : SHA_DIGEST_SIZE);


当然不同的厂家,为了安全是可以修改如下的字符串:

void SHA_init(SHA_CTX* ctx) {    ctx->state[0] = 0x67452301;    ctx->state[1] = 0xEFCDAB89;    ctx->state[2] = 0x98BADCFE;    ctx->state[3] = 0x10325476;    ctx->state[4] = 0xC3D2E1F0;    ctx->count = 0;}


当从prelaoder 或者 uboot等加载kernel的时候,就会去重新计算sha值,
从而保证bootimage,被别人因为某些目的而直接修改bin文件。(如根文件系统的某些配置或属性文件)

读书人网 >UNIXLINUX

热点推荐