通过C取消核心转储#定义(或其他代码/编译时间解决方案)?

问题描述 投票:6回答:3

我了解操作系统有时会在发送信号时(通常在崩溃时)生成核心转储。有没有办法通过#define或编译器标志从inside C / C ++告诉操作系统,否,或者可以通过该可执行文件生成特定受限制的核心转储?我知道控制它的唯一方法是通过ulimit -c。我的测试系统是Linux。仅针对特定程序,无核心转储不需要在系统范围内实现。

[有兴趣的人,这与比特币核心的bitcoin-qt中的CVE-2019-15947有关,而该Ct仍然没有解决方案。

一些讨论在Bitcoin GitHub bug tracking page

另一个选择是混淆和/或加密内存中的wallet.dat,这样就很难通过核心转储来检索它。请注意,尽管默认情况下未启用第二个选项,但已经可以完成它。

c++ c bitcoin coredump crash-dumps
3个回答
1
投票

根据您对“在代码/编译时”的定义,您可以安装信号处理程序并在接收到该信号后擦除内存。

但是,崩溃由内核处理,而不是由编译器或可执行文件处理。无论您做什么,都无法阻止内存被内核从可执行文件内部转储到内核中。

因此,其他选项听起来最好。


0
投票

您要使用的key primitivemadvise(..., MADV_DONTDUMP),它通知Linux(自3.4起)您不希望转储中包含一系列页面。该标志在内核空间中也称为madvise(..., MADV_DONTDUMP)。 (请注意,某些版本的gdb VM_DONTDUMP此标志,可能与do not respect或其他帮助程序而不是内核所生成的内核有关。)>

[您还需要确保在处理存储在这些页面中的密钥和其他敏感数据时,信息不会通过寄存器公开或溢出到足以危及安全的堆栈中,而在此之后没有进行内核转储。


0
投票

理论上可以在程序中使用gcore设置极限:

© www.soinside.com 2019 - 2024. All rights reserved.