过去,人们对在某些环境中的生产中使用 ASAN 存在担忧:https://seclists.org/oss-sec/2016/q1/363。评论是2016年的——今天的风景怎么样?
是否建议在用户设备上运行的生产系统中使用消毒剂?应用程序接收来自其他方的不受信任的输入,并以各种方式处理这些输入。
使用它们是否会产生与安全相关的影响?添加的任何工具实际上是否可以更轻松地远程利用错误?
我正在考虑的应用程序是开源的,因此在这种情况下简化逆向工程不会成为问题。
我正在尝试让控制流完整性与 clang++ 一起使用,但我无法运行以下代码:
\n#include <memory>\n\nstruct X {\n X() {}\n virtual ~X() {};\n};\n\nint main() {\n std::shared_ptr<X> _asd = std::make_shared<X>();\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\n如果我编译并运行它
\nclang++ -fsanitize=cfi -fvisibility=hidden -flto -O2 -std=c++14 test.cpp\n./a.out\nRun Code Online (Sandbox Code Playgroud)\n编译后的程序输出:
\n[1] 45850 illegal hardware instruction (core dumped) ./a.out\nRun Code Online (Sandbox Code Playgroud)\n生成的程序在make_shared标准库内的函数调用内崩溃。
当我将析构函数设置为非虚拟时,它会成功终止,因此我最初认为它与此有关,cfi-vcall但它与该选项完美配合-fsanitize=cfi-vcall。
负责任的编译标志似乎是-fsanitize=cfi-unrelated-cast- 通过所有其他可用的检查,应用程序可以正常运行。
从反汇编来看,应用程序似乎是~X()在 make_shared 中调用(另请参阅下面的附加信息)?
这是一个编程错误吗?是在编译器、标准库还是我的代码中?
\n是否有解决方法可以使其在启用 CFI 的情况下编译和运行?
\n预先非常感谢!
\n