Encontramos o Stack Overflow no binário sassc e o sassc está em conformidade com o clang habilitando ASAN.
Configuração da máquina
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
Compilação : CC=afl-clang-fast CXX=afl-clang-fast++ AFL_USE_ASAN=1 make -C sassc -j4
POC : POC.scss.zip
Saída 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$
Sendo rastreado como CVE-2019-18797 .
Isso funciona bem para mim, qual o tamanho da pilha que você deu ao sassc?
Error: Stack depth exceeded max of 1024
on line 1:23494 of test.scss
Vou mantê-lo aberto, pois não o testei totalmente no ASAN.
Mas com certeza parece que o tamanho da sua pilha é simplesmente pequeno.
@mgreter esse problema já foi abordado?
Vejo acima que você disse que não é reproduzível, mas ainda há um CVE ativo sobre esse problema.
Você está pensando em contestá-lo?
Desde já, obrigado !
Ei @NicoleG25 , não, atualmente não abordamos estouros de pilha, pois com um sistema operacional decente isso resultará em uma falha. Se você puder me dizer como evitar isso com um analisador recursivo em todos os ambientes, sou todo ouvidos. Isso é semelhante a quando você alimenta um arquivo de origem muito grande para o GCC/Clang ou qualquer outro compilador. LibSass não é diferente a esse respeito e depende de quanto espaço de pilha você fornece durante a compilação. Podemos melhorar isso em certos sistemas operacionais, por exemplo. capturando Structured Execption no Windows ou definindo rlimit, ou SIGSEGV no linux. Mas nunca estaremos completamente salvos em todos os sistemas.
Comentários muito úteis
Ei @NicoleG25 , não, atualmente não abordamos estouros de pilha, pois com um sistema operacional decente isso resultará em uma falha. Se você puder me dizer como evitar isso com um analisador recursivo em todos os ambientes, sou todo ouvidos. Isso é semelhante a quando você alimenta um arquivo de origem muito grande para o GCC/Clang ou qualquer outro compilador. LibSass não é diferente a esse respeito e depende de quanto espaço de pilha você fornece durante a compilação. Podemos melhorar isso em certos sistemas operacionais, por exemplo. capturando Structured Execption no Windows ou definindo rlimit, ou SIGSEGV no linux. Mas nunca estaremos completamente salvos em todos os sistemas.