Encontramos Stack Overflow en sassc binary y sassc cumple con Clang que permite ASAN.
Configuración de la 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
Compilación : CC=afl-clang-fast CXX=afl-clang-fast++ AFL_USE_ASAN=1 make -C sassc -j4
POC : POC.scss.zip
Salida 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$
Siendo rastreado como CVE-2019-18797 .
Esto funciona bien para mí, ¿qué tamaño de pila le diste a sassc?
Error: Stack depth exceeded max of 1024
on line 1:23494 of test.scss
Lo mantendré abierto ya que no lo he probado completamente bajo ASAN.
Pero seguro que parece que el tamaño de tu pila es demasiado pequeño.
@mgreter ¿Se abordó alguna vez este problema?
Veo arriba que dijiste que no es reproducible, pero todavía hay un CVE activo en este problema.
¿Estás pensando en impugnarlo?
Gracias por adelantado !
Hola @NicoleG25 , no, actualmente no abordamos los desbordamientos de pila, ya que con un sistema operativo decente, esto provocará un bloqueo. Si puede decirme cómo evitar esto con un analizador recursivo en todos los entornos, soy todo oídos. Esto es similar a cuando envía un archivo fuente demasiado grande a GCC/Clang o cualquier otro compilador. LibSass no es diferente en ese sentido y depende de cuánto espacio de pila le des durante la compilación. Podríamos mejorar esto en ciertos sistemas operativos, por ejemplo. capturando la excepción estructurada en Windows o configurando rlimit, o SIGSEGV en Linux. Pero nunca seremos completamente salvos en todos los sistemas.
Comentario más útil
Hola @NicoleG25 , no, actualmente no abordamos los desbordamientos de pila, ya que con un sistema operativo decente, esto provocará un bloqueo. Si puede decirme cómo evitar esto con un analizador recursivo en todos los entornos, soy todo oídos. Esto es similar a cuando envía un archivo fuente demasiado grande a GCC/Clang o cualquier otro compilador. LibSass no es diferente en ese sentido y depende de cuánto espacio de pila le des durante la compilación. Podríamos mejorar esto en ciertos sistemas operativos, por ejemplo. capturando la excepción estructurada en Windows o configurando rlimit, o SIGSEGV en Linux. Pero nunca seremos completamente salvos en todos los sistemas.