是否可以通过分配内存来恢复秘密数据(例如用于解密的空闲内存中的RSA私钥)?

İbr*_*pek 5 c malloc cryptography

例如,让我们采用伪代码,该伪代码尝试free使用此方法将RSA私钥存储在已分配(然后是d)的内存中:

int main(){
    bigNum priKey;


    while(true) {
        void *mem = malloc(2024); //allocate a good amount of chunk

        if(rsaKeyIn(mem, &priKey))
            break;
    }

    printf("RSA PRK found: %s", priKey.getText())

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

问题:这可能吗?还是有可能恢复其他秘密数据?

还是free为了安全起见,操作系统将'd内存归零?如果不是这种情况,我们应该在释放内存之前手动用零填充已分配的内存吗?

dbu*_*ush 4

这是可能的,因为释放内存并不一定意味着它被清除。

例如,给出以下代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
    int i, len = 20;
    char *p = malloc(len);
    strcpy(p, "this is a test!!");
    printf("&p=%p, p=%s\n", &p, p);
    for (i=0; i<len; i++) {
        printf("%02x ", p[i]);
    }
    printf("\n");
    free(p);
    // undefined behavior below: dereferencing freed memory
    printf("p=%s\n",  p);
    for (i=0; i<len; i++) {
        printf("%02x ", p[i]);
    }
    printf("\n");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我的系统输出以下内容:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
    int i, len = 20;
    char *p = malloc(len);
    strcpy(p, "this is a test!!");
    printf("&p=%p, p=%s\n", &p, p);
    for (i=0; i<len; i++) {
        printf("%02x ", p[i]);
    }
    printf("\n");
    free(p);
    // undefined behavior below: dereferencing freed memory
    printf("p=%s\n",  p);
    for (i=0; i<len; i++) {
        printf("%02x ", p[i]);
    }
    printf("\n");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

因此,如果您的程序存在安全漏洞,允许攻击者控制它,他们就可以转储此释放内存的内容并暴露敏感数据。

因此,包含秘密数据的内存一旦不再需要就应该被擦除。简单的方法是调用memset内存块,但是如果许多编译器发现该内存在该点之后不再使用,则会对其进行优化。

C 标准中定义了一个函数,称为memset_s保证不会被优化,但并非所有实现都有它。您需要找到一些库调用来清除我不会优化的内存。当您调用 OpenSSL 等库的清理例程时,它们会为您执行此操作(请参阅本文作为示例)。