İ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内存归零?如果不是这种情况,我们应该在释放内存之前手动用零填充已分配的内存吗?
这是可能的,因为释放内存并不一定意味着它被清除。
例如,给出以下代码:
#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 等库的清理例程时,它们会为您执行此操作(请参阅本文作为示例)。
| 归档时间: |
|
| 查看次数: |
99 次 |
| 最近记录: |