Libsass: Estouro de pilha em sassc

Criado em 7 out. 2019  ·  4Comentários  ·  Fonte: sass/libsass

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$
Fuzzy Invalid - Not Reproducible

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.

Todos 4 comentários

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.

Esta página foi útil?
0 / 5 - 0 avaliações