首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有可能告诉libfuzzer忽略某些代码?

有没有可能告诉libfuzzer忽略某些代码?
EN

Stack Overflow用户
提问于 2020-12-23 05:29:05
回答 1查看 175关注 0票数 1

我使用libfuzzer,到目前为止,它是一个很棒的体验。我在fuzz下的代码充满了这样的分支:

代码语言:javascript
复制
bool fuzzingThisFunc() {
  if(!checkSomething()) {
    fmt::printf("error log");
    return false;
  }

  ...

  return true;
}

其中,fmt::printf是第三方库(http://github.com/fmtlib/fmt)中的函数。

我感觉在几次迭代之后,fuzzer进入了这个函数,并有效地开始模糊其中的所有分支(就像当它使用DFS而不是BFS时)。

我想在fuzzer中添加一些屏障或指令,以避免在第三方库中插入插装,这样我的fuzzer将尝试只覆盖我的代码。

有可能吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-22 23:25:14

Libfuzzer支持源文件级别的插装。一种选择是构建不带-fsanitize=fuzzer标志的第三方库。检查传递给这些库的配置的CFLAGS,以删除此标志。

仅包含头文件的库通常包括模板,fmt就是这种情况。它们必须在编译时实例化。我看不到简单的方法来处理这些问题。您可以找到所有使用的模板参数,创建与这些参数一起使用它们的thunk代码,将这些代码从指令插入中排除,并修改您的调用代码以使用这些实例化的函数,但这非常困难。

当你不想插装的代码只做日志记录或其他可以跳过的活动而不修改你的应用程序的行为时,你可以使它成为编译的条件。Libfuzzer docs建议使用FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION定义来标记你不想为模糊构建的代码。在fmt情况下,这将是:

代码语言:javascript
复制
bool fuzzingThisFunc() {
  if(!checkSomething()) {
#ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
    fmt::printf("error log");
#endif
    return false;
  }

  ...

  return true;
}

或修改库代码:

代码语言:javascript
复制
template <typename S, typename... Args,
          FMT_ENABLE_IF(detail::is_string<S>::value)>
inline int printf(const S& format_str, const Args&... args) {

#ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
  using context = basic_printf_context_t<char_t<S>>;
  return vprintf(to_string_view(format_str),
                 make_format_args<context>(args...));
#else
  return 0; //C printf returns number of characters written, I assume same for fmt.
#endif
}

第二种情况更容易编码(每个排除的函数一个修改),但每次获得新的fmt版本时,您都必须添加此修改。在第一种情况下,你必须修改每个被排除的函数调用点。

对于这两种情况,您都应该将-DFUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION添加到configure的CFLAGS中,以便进行模糊目标构建。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65416024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档