日期:2014-05-16  浏览次数:20809 次

加载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文件。(如根文件系统的某些配置或属性文件)