我们在 sassc 二进制文件中发现了 Stack Overflow,并且 sassc 符合启用 ASAN 的 clang。
机器设置
Machine : Ubuntu 16.04.3 LTS
gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.11)
Commit : 4da7c4b
Command : sassc POC
编译:CC=afl-clang-fast CXX=afl-clang-fast++ AFL_USE_ASAN=1 make -C sassc -j4
POC : POC.scss.zip
ASAN 输出
fuzzer<strong i="17">@fuzzer</strong>:~/victim/libsass/sassc/bin$ ./sassc -v
sassc: 3.6.1-5-g507f0
libsass: 3.6.2
sass2scss: 1.1.1
sass: 3.5
fuzzer<strong i="18">@fuzzer</strong>:~/victim/libsass/sassc/bin$
fuzzer<strong i="19">@fuzzer</strong>:~/victim/libsass/sassc/bin$ ./sassc in/POC.scss
ASAN:DEADLYSIGNAL
=================================================================
==23322==ERROR: AddressSanitizer: stack-overflow on address 0x7ffdfae50e58 (pc 0x00000049382c bp 0x7ffdfae516b0 sp 0x7ffdfae50e30 T0)
#0 0x49382b in __interceptor_strcmp.part.24 (/home/fuzzer/victim/libsass/sassc/bin/sassc+0x49382b)
#1 0x9d6aed in std::type_info::operator==(std::type_info const&) const /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/typeinfo:124:5
#2 0x9d6aed in Sass::Variable* Sass::Cast<Sass::Variable>(Sass::AST_Node*) /home/fuzzer/victim/libsass/src/ast.hpp:114
#3 0x9d6aed in Sass::Eval::operator()(Sass::Binary_Expression*) /home/fuzzer/victim/libsass/src/eval.cpp:570
#4 0x9d7a5e in Sass::Eval::operator()(Sass::Binary_Expression*) /home/fuzzer/victim/libsass/src/eval.cpp:582:13
#5 0x9d7a5e in Sass::Eval::operator()(Sass::Binary_Expression*) /home/fuzzer/victim/libsass/src/eval.cpp:582:13
#6 0x9d7a5e in Sass::Eval::operator()(Sass::Binary_Expression*) /home/fuzzer/victim/libsass/src/eval.cpp:582:13
#7 0x9d7a5e in Sass::Eval::operator()(Sass::Binary_Expression*) /home/fuzzer/victim/libsass/src/eval.cpp:582:13
#8 0x9d7a5e in Sass::Eval::operator()(Sass::Binary_Expression*) /home/fuzzer/victim/libsass/src/eval.cpp:582:13
// SNIPPED //
#252 0x9d7a5e in Sass::Eval::operator()(Sass::Binary_Expression*) /home/fuzzer/victim/libsass/src/eval.cpp:582:13
#253 0x9d7a5e in Sass::Eval::operator()(Sass::Binary_Expression*) /home/fuzzer/victim/libsass/src/eval.cpp:582:13
SUMMARY: AddressSanitizer: stack-overflow (/home/fuzzer/victim/libsass/sassc/bin/sassc+0x49382b) in __interceptor_strcmp.part.24
==23322==ABORTING
fuzzer<strong i="20">@fuzzer</strong>:~/victim/libsass/sassc/bin$
被跟踪为CVE-2019-18797 。
这对我来说没问题,你给 sassc 的堆栈大小是多少?
Error: Stack depth exceeded max of 1024
on line 1:23494 of test.scss
我将保持打开状态,因为我尚未在 ASAN 下对其进行全面测试。
但看起来你的堆栈大小确实太小了。
@mgreter这个问题曾经解决过吗?
我在上面看到您说它不可重现,但仍然有一个 CVE 在此问题上处于活动状态。
你在考虑争论吗?
提前致谢 !
嘿@NicoleG25 ,不,我们目前并没有真正解决堆栈溢出问题,因为对于一个不错的操作系统,这将导致崩溃。 如果你能告诉我如何在所有任何环境中使用递归解析器来避免这种情况,我会全神贯注。 这类似于将太大的源文件提供给 GCC/Clang 或任何其他编译器。 LibSass 在这方面没有什么不同,它取决于你在编译期间给它多少堆栈空间。 我们可能会在某些操作系统上改进这一点,例如。 通过在 windows 上捕获结构化执行或在 linux 上设置 rlimit 或 SIGSEGV。 但是我们永远不会完全保存在所有系统上。
最有用的评论
嘿@NicoleG25 ,不,我们目前并没有真正解决堆栈溢出问题,因为对于一个不错的操作系统,这将导致崩溃。 如果你能告诉我如何在所有任何环境中使用递归解析器来避免这种情况,我会全神贯注。 这类似于将太大的源文件提供给 GCC/Clang 或任何其他编译器。 LibSass 在这方面没有什么不同,它取决于你在编译期间给它多少堆栈空间。 我们可能会在某些操作系统上改进这一点,例如。 通过在 windows 上捕获结构化执行或在 linux 上设置 rlimit 或 SIGSEGV。 但是我们永远不会完全保存在所有系统上。