Libsass: Stapelüberlauf in sassc

Erstellt am 7. Okt. 2019  ·  4Kommentare  ·  Quelle: sass/libsass

Wir haben Stack Overflow in der sassc-Binärdatei gefunden und sassc ist mit Clang kompatibel, das ASAN ermöglicht.

Maschineneinrichtung

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

Kompilierung : CC=afl-clang-fast CXX=afl-clang-fast++ AFL_USE_ASAN=1 make -C sassc -j4
POC : POC.scss.zip

ASAN-Ausgabe

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

Hilfreichster Kommentar

Hey @NicoleG25 , nein wir adressieren derzeit nicht wirklich Stapelüberläufe, da dies bei einem anständigen Betriebssystem zu einem Absturz führen wird. Wenn Sie mir sagen können, wie ich dies mit einem rekursiven Parser für alle Env vermeiden kann, bin ich ganz Ohr. Dies ähnelt dem Einspeisen einer zu großen Quelldatei in GCC/Clang oder einen anderen Compiler. LibSass ist in dieser Hinsicht nicht anders und hängt davon ab, wie viel Stack-Speicherplatz Sie ihm während der Kompilierung geben. Wir könnten dies auf bestimmten Betriebssystemen verbessern, z. durch Abfangen von Structured Execption unter Windows oder Festlegen von rlimit oder SIGSEGV unter Linux. Aber wir werden nie auf allen Systemen ganz sicher sein.

Alle 4 Kommentare

Das funktioniert für mich in Ordnung, welche Stapelgröße hast du sassc gegeben?

Error: Stack depth exceeded max of 1024
        on line 1:23494 of test.scss

Ich werde es offen halten, da ich es unter ASAN nicht vollständig getestet habe.
Aber es scheint sicher, dass Ihre Stapelgröße einfach zu klein ist.

@mmeter wurde dieses Problem jemals angesprochen?
Ich sehe oben, dass Sie sagten, es sei nicht reproduzierbar, aber es gibt immer noch ein aktives CVE zu diesem Problem.
Denken Sie darüber nach, dagegen anzukämpfen?
Vielen Dank im Voraus !

Hey @NicoleG25 , nein wir adressieren derzeit nicht wirklich Stapelüberläufe, da dies bei einem anständigen Betriebssystem zu einem Absturz führen wird. Wenn Sie mir sagen können, wie ich dies mit einem rekursiven Parser für alle Env vermeiden kann, bin ich ganz Ohr. Dies ähnelt dem Einspeisen einer zu großen Quelldatei in GCC/Clang oder einen anderen Compiler. LibSass ist in dieser Hinsicht nicht anders und hängt davon ab, wie viel Stack-Speicherplatz Sie ihm während der Kompilierung geben. Wir könnten dies auf bestimmten Betriebssystemen verbessern, z. durch Abfangen von Structured Execption unter Windows oder Festlegen von rlimit oder SIGSEGV unter Linux. Aber wir werden nie auf allen Systemen ganz sicher sein.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen