|
|
|
@ -1895,196 +1895,132 @@ param_st parse_fsanitize(aflcc_state_t *aflcc, u8 *cur_argv, u8 scan) {
|
|
|
|
|
these have_*, otherwise they may not work as expected.
|
|
|
|
|
*/
|
|
|
|
|
void add_sanitizers(aflcc_state_t *aflcc, char **envp) {
|
|
|
|
|
<<<<<<< HEAD
|
|
|
|
|
if (getenv("AFL_USE_ASAN") || aflcc->have_asan) {
|
|
|
|
|
if (getenv("AFL_USE_MSAN") || aflcc->have_msan)
|
|
|
|
|
FATAL("ASAN and MSAN are mutually exclusive");
|
|
|
|
|
if (getenv("AFL_HARDEN"))
|
|
|
|
|
FATAL("ASAN and AFL_HARDEN are mutually exclusive");
|
|
|
|
|
if (aflcc->compiler_mode == GCC_PLUGIN && !aflcc->have_staticasan) {
|
|
|
|
|
insert_param(aflcc, "-static-libasan");
|
|
|
|
|
}
|
|
|
|
|
add_defs_fortify(aflcc, 0);
|
|
|
|
|
if (!aflcc->have_asan) {
|
|
|
|
|
insert_param(aflcc, "-fsanitize=address");
|
|
|
|
|
insert_param(aflcc, "-fno-common");
|
|
|
|
|
}
|
|
|
|
|
aflcc->have_asan = 1;
|
|
|
|
|
} else if (getenv("AFL_USE_MSAN") || aflcc->have_msan) {
|
|
|
|
|
if (getenv("AFL_USE_ASAN") || aflcc->have_asan)
|
|
|
|
|
FATAL("ASAN and MSAN are mutually exclusive");
|
|
|
|
|
if (getenv("AFL_HARDEN"))
|
|
|
|
|
FATAL("MSAN and AFL_HARDEN are mutually exclusive");
|
|
|
|
|
add_defs_fortify(aflcc, 0);
|
|
|
|
|
if (!aflcc->have_msan) { insert_param(aflcc, "-fsanitize=memory"); }
|
|
|
|
|
aflcc->have_msan = 1;
|
|
|
|
|
}
|
|
|
|
|
if (getenv("AFL_USE_UBSAN") || aflcc->have_ubsan) {
|
|
|
|
|
if (!aflcc->have_ubsan) {
|
|
|
|
|
insert_param(aflcc, "-fsanitize=undefined");
|
|
|
|
|
insert_param(aflcc, "-fsanitize-undefined-trap-on-error");
|
|
|
|
|
insert_param(aflcc, "-fno-sanitize-recover=all");
|
|
|
|
|
}
|
|
|
|
|
if (!aflcc->have_fp) {
|
|
|
|
|
insert_param(aflcc, "-fno-omit-frame-pointer");
|
|
|
|
|
aflcc->have_fp = 1;
|
|
|
|
|
}
|
|
|
|
|
aflcc->have_ubsan = 1;
|
|
|
|
|
}
|
|
|
|
|
if (getenv("AFL_USE_TSAN") || aflcc->have_tsan) {
|
|
|
|
|
if (!aflcc->have_fp) {
|
|
|
|
|
insert_param(aflcc, "-fno-omit-frame-pointer");
|
|
|
|
|
aflcc->have_fp = 1;
|
|
|
|
|
}
|
|
|
|
|
if (!aflcc->have_tsan) { insert_param(aflcc, "-fsanitize=thread"); }
|
|
|
|
|
aflcc->have_tsan = 1;
|
|
|
|
|
}
|
|
|
|
|
if (getenv("AFL_USE_LSAN") && !aflcc->have_lsan) {
|
|
|
|
|
insert_param(aflcc, "-fsanitize=leak");
|
|
|
|
|
add_defs_lsan_ctrl(aflcc);
|
|
|
|
|
aflcc->have_lsan = 1;
|
|
|
|
|
}
|
|
|
|
|
if (getenv("AFL_USE_CFISAN") || aflcc->have_cfisan) {
|
|
|
|
|
if (aflcc->compiler_mode == GCC_PLUGIN || aflcc->compiler_mode == GCC) {
|
|
|
|
|
if (!aflcc->have_fcf) { insert_param(aflcc, "-fcf-protection=full"); }
|
|
|
|
|
} else {
|
|
|
|
|
if (!aflcc->lto_mode && !aflcc->have_flto) {
|
|
|
|
|
uint32_t i = 0, found = 0;
|
|
|
|
|
while (envp[i] != NULL && !found) {
|
|
|
|
|
if (strncmp("-flto", envp[i++], 5) == 0) found = 1;
|
|
|
|
|
}
|
|
|
|
|
if (!found) { insert_param(aflcc, "-flto"); }
|
|
|
|
|
aflcc->have_flto = 1;
|
|
|
|
|
}
|
|
|
|
|
if (!aflcc->have_cfisan) { insert_param(aflcc, "-fsanitize=cfi"); }
|
|
|
|
|
if (!aflcc->have_hidden) {
|
|
|
|
|
insert_param(aflcc, "-fvisibility=hidden");
|
|
|
|
|
aflcc->have_hidden = 1;
|
|
|
|
|
}
|
|
|
|
|
aflcc->have_cfisan = 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
=======
|
|
|
|
|
|
|
|
|
|
// 如果启用了 ASAN (地址消毒器),则进行相关配置
|
|
|
|
|
if (getenv("AFL_USE_ASAN") || aflcc->have_asan) {
|
|
|
|
|
|
|
|
|
|
// 如果同时启用了 MSAN (内存消毒器),则报错,因为 ASAN 和 MSAN 不能同时使用
|
|
|
|
|
if (getenv("AFL_USE_MSAN") || aflcc->have_msan)
|
|
|
|
|
FATAL("ASAN and MSAN are mutually exclusive");
|
|
|
|
|
|
|
|
|
|
// 如果启用了 AFL_HARDEN,则报错,因为 ASAN 和 AFL_HARDEN 不能同时使用
|
|
|
|
|
if (getenv("AFL_HARDEN"))
|
|
|
|
|
FATAL("ASAN and AFL_HARDEN are mutually exclusive");
|
|
|
|
|
|
|
|
|
|
// 如果是 GCC 插件模式,并且没有启用静态 ASAN 库,则添加静态 ASAN 库的选项
|
|
|
|
|
if (aflcc->compiler_mode == GCC_PLUGIN && !aflcc->have_staticasan) {
|
|
|
|
|
|
|
|
|
|
insert_param(aflcc, "-static-libasan");
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 添加 fortify 配置,0表示没有额外的强化
|
|
|
|
|
add_defs_fortify(aflcc, 0);
|
|
|
|
|
if (!aflcc->have_asan) {
|
|
|
|
|
|
|
|
|
|
// 如果没有启用 ASAN,则添加相应的编译选项来启用地址消毒
|
|
|
|
|
if (!aflcc->have_asan) {
|
|
|
|
|
insert_param(aflcc, "-fsanitize=address");
|
|
|
|
|
insert_param(aflcc, "-fno-common");
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
aflcc->have_asan = 1;
|
|
|
|
|
|
|
|
|
|
} else if (getenv("AFL_USE_MSAN") || aflcc->have_msan) {
|
|
|
|
|
aflcc->have_asan = 1; // 标记已经启用了 ASAN
|
|
|
|
|
}
|
|
|
|
|
// 如果启用了 MSAN (内存消毒器),则进行相关配置
|
|
|
|
|
else if (getenv("AFL_USE_MSAN") || aflcc->have_msan) {
|
|
|
|
|
|
|
|
|
|
// 如果同时启用了 ASAN,则报错,因为 ASAN 和 MSAN 不能同时使用
|
|
|
|
|
if (getenv("AFL_USE_ASAN") || aflcc->have_asan)
|
|
|
|
|
FATAL("ASAN and MSAN are mutually exclusive");
|
|
|
|
|
|
|
|
|
|
// 如果启用了 AFL_HARDEN,则报错,因为 MSAN 和 AFL_HARDEN 不能同时使用
|
|
|
|
|
if (getenv("AFL_HARDEN"))
|
|
|
|
|
FATAL("MSAN and AFL_HARDEN are mutually exclusive");
|
|
|
|
|
|
|
|
|
|
// 添加 fortify 配置,0表示没有额外的强化
|
|
|
|
|
add_defs_fortify(aflcc, 0);
|
|
|
|
|
|
|
|
|
|
// 如果没有启用 MSAN,则添加相应的编译选项来启用内存消毒
|
|
|
|
|
if (!aflcc->have_msan) { insert_param(aflcc, "-fsanitize=memory"); }
|
|
|
|
|
aflcc->have_msan = 1;
|
|
|
|
|
|
|
|
|
|
aflcc->have_msan = 1; // 标记已经启用了 MSAN
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 如果启用了 UBSAN (未定义行为消毒器),则进行相关配置
|
|
|
|
|
if (getenv("AFL_USE_UBSAN") || aflcc->have_ubsan) {
|
|
|
|
|
|
|
|
|
|
// 如果没有启用 UBSAN,则添加相应的编译选项来启用未定义行为消毒
|
|
|
|
|
if (!aflcc->have_ubsan) {
|
|
|
|
|
|
|
|
|
|
insert_param(aflcc, "-fsanitize=undefined");
|
|
|
|
|
insert_param(aflcc, "-fsanitize-undefined-trap-on-error");
|
|
|
|
|
insert_param(aflcc, "-fno-sanitize-recover=all");
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 如果没有启用帧指针,则添加相应的选项来启用帧指针
|
|
|
|
|
if (!aflcc->have_fp) {
|
|
|
|
|
|
|
|
|
|
insert_param(aflcc, "-fno-omit-frame-pointer");
|
|
|
|
|
aflcc->have_fp = 1;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
aflcc->have_ubsan = 1;
|
|
|
|
|
|
|
|
|
|
aflcc->have_ubsan = 1; // 标记已经启用了 UBSAN
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 如果启用了 TSAN (线程消毒器),则进行相关配置
|
|
|
|
|
if (getenv("AFL_USE_TSAN") || aflcc->have_tsan) {
|
|
|
|
|
|
|
|
|
|
// 如果没有启用帧指针,则添加相应的选项来启用帧指针
|
|
|
|
|
if (!aflcc->have_fp) {
|
|
|
|
|
|
|
|
|
|
insert_param(aflcc, "-fno-omit-frame-pointer");
|
|
|
|
|
aflcc->have_fp = 1;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 如果没有启用 TSAN,则添加相应的编译选项来启用线程消毒
|
|
|
|
|
if (!aflcc->have_tsan) { insert_param(aflcc, "-fsanitize=thread"); }
|
|
|
|
|
aflcc->have_tsan = 1;
|
|
|
|
|
|
|
|
|
|
aflcc->have_tsan = 1; // 标记已经启用了 TSAN
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 如果启用了 LSAN (泄漏消毒器),则进行相关配置
|
|
|
|
|
if (getenv("AFL_USE_LSAN") && !aflcc->have_lsan) {
|
|
|
|
|
|
|
|
|
|
// 添加编译选项来启用泄漏消毒
|
|
|
|
|
insert_param(aflcc, "-fsanitize=leak");
|
|
|
|
|
|
|
|
|
|
// 添加 LSAN 控制的定义
|
|
|
|
|
add_defs_lsan_ctrl(aflcc);
|
|
|
|
|
aflcc->have_lsan = 1;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
aflcc->have_lsan = 1; // 标记已经启用了 LSAN
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 如果启用了 CFISAN (控制流完整性消毒器),则进行相关配置
|
|
|
|
|
if (getenv("AFL_USE_CFISAN") || aflcc->have_cfisan) {
|
|
|
|
|
|
|
|
|
|
// 如果是 GCC 插件模式或 GCC 模式,则启用完整的控制流保护
|
|
|
|
|
if (aflcc->compiler_mode == GCC_PLUGIN || aflcc->compiler_mode == GCC) {
|
|
|
|
|
|
|
|
|
|
// 如果没有启用控制流保护,则添加相应选项
|
|
|
|
|
if (!aflcc->have_fcf) { insert_param(aflcc, "-fcf-protection=full"); }
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
|
|
// 如果没有启用 LTO (链接时优化),则添加 LTO 选项
|
|
|
|
|
if (!aflcc->lto_mode && !aflcc->have_flto) {
|
|
|
|
|
|
|
|
|
|
uint32_t i = 0, found = 0;
|
|
|
|
|
while (envp[i] != NULL && !found) {
|
|
|
|
|
|
|
|
|
|
if (strncmp("-flto", envp[i++], 5) == 0) found = 1;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!found) { insert_param(aflcc, "-flto"); }
|
|
|
|
|
aflcc->have_flto = 1;
|
|
|
|
|
|
|
|
|
|
aflcc->have_flto = 1; // 标记已经启用了 LTO
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 如果没有启用 CFISAN,则添加相应选项来启用控制流完整性消毒
|
|
|
|
|
if (!aflcc->have_cfisan) { insert_param(aflcc, "-fsanitize=cfi"); }
|
|
|
|
|
|
|
|
|
|
// 如果没有启用隐藏符号,则启用隐藏符号选项
|
|
|
|
|
if (!aflcc->have_hidden) {
|
|
|
|
|
|
|
|
|
|
insert_param(aflcc, "-fvisibility=hidden");
|
|
|
|
|
aflcc->have_hidden = 1;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
aflcc->have_cfisan = 1;
|
|
|
|
|
|
|
|
|
|
aflcc->have_cfisan = 1; // 标记已经启用了 CFISAN
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
>>>>>>> e12b99bad19de97a02e9fe14b9b2c048338b2ab7
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Add params to enable LLVM SanCov, the native PCGUARD */
|
|
|
|
@ -2635,10 +2571,13 @@ void add_gcc_plugin(aflcc_state_t *aflcc) {
|
|
|
|
|
/* Add some miscellaneous params required by our instrumentation. */
|
|
|
|
|
void add_misc_params(aflcc_state_t *aflcc) {
|
|
|
|
|
|
|
|
|
|
// 如果环境变量 AFl_NO_BUILTIN 或其他相关环境变量被设置,或者启用了 LTO 模式
|
|
|
|
|
// 则禁用内置的字符串和内存比较函数
|
|
|
|
|
if (getenv("AFL_NO_BUILTIN") || getenv("AFL_LLVM_LAF_TRANSFORM_COMPARES") ||
|
|
|
|
|
getenv("AFL_LLVM_LAF_ALL") || getenv("AFL_LLVM_CMPLOG") ||
|
|
|
|
|
aflcc->lto_mode) {
|
|
|
|
|
|
|
|
|
|
// 禁用常见的字符串和内存比较函数的内置实现,防止与模糊测试产生冲突
|
|
|
|
|
insert_param(aflcc, "-fno-builtin-strcmp");
|
|
|
|
|
insert_param(aflcc, "-fno-builtin-strncmp");
|
|
|
|
|
insert_param(aflcc, "-fno-builtin-strcasecmp");
|
|
|
|
@ -2650,31 +2589,46 @@ void add_misc_params(aflcc_state_t *aflcc) {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!aflcc->have_pic) { insert_param(aflcc, "-fPIC"); }
|
|
|
|
|
// 如果没有启用位置无关代码(PIC),则添加 -fPIC 参数
|
|
|
|
|
if (!aflcc->have_pic) {
|
|
|
|
|
insert_param(aflcc, "-fPIC");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 如果环境变量 AFL_HARDEN 被设置,启用栈保护等安全选项
|
|
|
|
|
if (getenv("AFL_HARDEN")) {
|
|
|
|
|
|
|
|
|
|
// 启用所有函数的栈保护
|
|
|
|
|
insert_param(aflcc, "-fstack-protector-all");
|
|
|
|
|
|
|
|
|
|
if (!aflcc->fortify_set) add_defs_fortify(aflcc, 2);
|
|
|
|
|
|
|
|
|
|
// 如果未设置 Fortify,设置 Fortify 防护等级
|
|
|
|
|
if (!aflcc->fortify_set)
|
|
|
|
|
add_defs_fortify(aflcc, 2);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 如果环境变量 AFL_DONT_OPTIMIZE 未设置,启用优化选项
|
|
|
|
|
if (!getenv("AFL_DONT_OPTIMIZE")) {
|
|
|
|
|
|
|
|
|
|
// 启用调试符号生成
|
|
|
|
|
insert_param(aflcc, "-g");
|
|
|
|
|
if (!aflcc->have_o) insert_param(aflcc, "-O3");
|
|
|
|
|
if (!aflcc->have_unroll) insert_param(aflcc, "-funroll-loops");
|
|
|
|
|
|
|
|
|
|
// 如果没有设置 -O 优化级别,设置为 -O3(最高优化)
|
|
|
|
|
if (!aflcc->have_o)
|
|
|
|
|
insert_param(aflcc, "-O3");
|
|
|
|
|
|
|
|
|
|
// 如果没有设置循环展开,启用循环展开优化
|
|
|
|
|
if (!aflcc->have_unroll)
|
|
|
|
|
insert_param(aflcc, "-funroll-loops");
|
|
|
|
|
|
|
|
|
|
// 以下代码被注释掉了,但如果有指定架构优化选项(如 -march),也可以启用
|
|
|
|
|
// if (strlen(aflcc->march_opt) > 1 && aflcc->march_opt[0] == '-')
|
|
|
|
|
// insert_param(aflcc, aflcc->march_opt);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 如果设置了 x_set 标志,插入 -x none 参数
|
|
|
|
|
if (aflcc->x_set) {
|
|
|
|
|
|
|
|
|
|
insert_param(aflcc, "-x");
|
|
|
|
|
insert_param(aflcc, "none");
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|