我了解操作系统有时会在发送信号时(通常在崩溃时)生成核心转储。有没有办法通过#define或编译器标志从inside C / C ++告诉操作系统,否,或者可以通过该可执行文件生成特定受限制的核心转储?我知道控制它的唯一方法是通过ulimit -c。我的测试系统是Linux。仅针对特定程序,无核心转储不需要在系统范围内实现。
[有兴趣的人,这与比特币核心的bitcoin-qt中的CVE-2019-15947有关,而该Ct仍然没有解决方案。
一些讨论在Bitcoin GitHub bug tracking page。
另一个选择是混淆和/或加密内存中的wallet.dat,这样就很难通过核心转储来检索它。请注意,尽管默认情况下未启用第二个选项,但已经可以完成它。
根据您对“在代码/编译时”的定义,您可以安装信号处理程序并在接收到该信号后擦除内存。
但是,崩溃由内核处理,而不是由编译器或可执行文件处理。无论您做什么,都无法阻止内存被内核从可执行文件内部转储到内核中。
因此,其他选项听起来最好。
您要使用的key primitive是madvise(..., MADV_DONTDUMP)
,它通知Linux(自3.4起)您不希望转储中包含一系列页面。该标志在内核空间中也称为madvise(..., MADV_DONTDUMP)
。 (请注意,某些版本的gdb VM_DONTDUMP
此标志,可能与do not respect或其他帮助程序而不是内核所生成的内核有关。)>
[您还需要确保在处理存储在这些页面中的密钥和其他敏感数据时,信息不会通过寄存器公开或溢出到足以危及安全的堆栈中,而在此之后没有进行内核转储。
理论上可以在程序中使用gcore
设置极限: