Libsass: sasscのスタックオーバーフロー

作成日 2019年10月07日  ·  4コメント  ·  ソース: sass/libsass

スタックオーバーフローがsasscバイナリで見つかり、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
POCPOC.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$
Fuzzy Invalid - Not Reproducible

最も参考になるコメント

ねえ@NicoleG25 、いいえ、現在、スタックオーバーフローに対処していません。これは、適切なOSを使用すると、クラッシュが発生するためです。 すべての環境で再帰下降パーサーを使用してこれを回避する方法を教えていただければ、私はすべての耳です。 これは、大きすぎるソースファイルをGCC/Clangまたはその他のコンパイラにフィードする場合と似ています。 LibSassはその点で違いはなく、コンパイル中に与えるスタックスペースの量に依存します。 特定のOSでこれを改善する可能性があります。 WindowsでStructuredExecptionをキャッチするか、rlimitを設定するか、LinuxでSIGSEGVを設定します。 しかし、すべてのシステムで完全に節約されることは決してありません。

全てのコメント4件

CVE-2019-18797として追跡されています。

これは私にとっては問題なく機能します。sasscにどのスタックサイズを指定しましたか?

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

ASANで完全にテストしていないので、開いたままにしておきます。
しかし、確かにスタックサイズは単純に小さすぎるようです。

@mgreterこの問題はこれまでに対処されましたか?
上記のとおり、再現性はないとおっしゃっていましたが、この問題に関してはまだCVEがアクティブになっています。
あなたはそれについて異議を唱えることを考えていますか?
前もって感謝します !

ねえ@NicoleG25 、いいえ、現在、スタックオーバーフローに対処していません。これは、適切なOSを使用すると、クラッシュが発生するためです。 すべての環境で再帰下降パーサーを使用してこれを回避する方法を教えていただければ、私はすべての耳です。 これは、大きすぎるソースファイルをGCC/Clangまたはその他のコンパイラにフィードする場合と似ています。 LibSassはその点で違いはなく、コンパイル中に与えるスタックスペースの量に依存します。 特定のOSでこれを改善する可能性があります。 WindowsでStructuredExecptionをキャッチするか、rlimitを設定するか、LinuxでSIGSEGVを設定します。 しかし、すべてのシステムで完全に節約されることは決してありません。

このページは役に立ちましたか?
0 / 5 - 0 評価