Compiler Bomb!

Compiler Bomb라고 들어보셨나요? 취약점 분석 하다가 알게된 부분인데, 종종 상황에 따라 테스팅이 필요할 수도 있어서 간략하게 정리해둡니다.

Preprocess

소스코드가 빌드되는 과정은 여러개의 처리 과정으로 나뉘어집니다. 그리고 컴파일전에 Preprocess를 통해 컴파일러에게 전달하기 전 연산 처리를 먼저 진행합니다.

https://www.codingunit.com/cplusplus-tutorial-Preprocessoror-directives

예를 들어 피보나치 수열 코드가 있다고 합시다.

template<int n>
struct fib {
    static const int value = fib<n-1>::value + fib<n-2>::value;
};
template<> struct fib<0> { static const int value = 0; };
template<> struct fib<1> { static const int value = 1; };

int main() {
    int a = fib<10>::value; // 55
    int b = fib<20>::value; // 6765
    int c = fib<40>::value; // 102334155
}

마치 프로그램이 실행 중 연산을 처리할 것 같지만 컴파일 후 objdump로 내용을 보면 계신식이 어셈코드에는 이미 계산되어서 들어가있는 걸 볼 수 있습니다. 즉 로직이 실제 실행이 아닌 빌드 단계에서 실행된거죠.

g++ bomb.cpp -o bomb
objdump -M intel -d bomb

#... snip ...
#00000000000005fa <main>:
# 5fa:    55                       push   rbp
# 5fb:    48 89 e5                 mov    rbp,rsp
# 5fe:    c7 45 f4 37 00 00 00     mov    DWORD PTR [rbp-0xc],0x37
# 605:    c7 45 f8 6d 1a 00 00     mov    DWORD PTR [rbp-0x8],0x1a6d
# 60c:    c7 45 fc cb 7e 19 06     mov    DWORD PTR [rbp-0x4],0x6197ecb
# 613:    b8 00 00 00 00           mov    eax,0x0
# 618:    5d                       pop    rbp
# 619:    c3                       ret    
# 61a:    66 0f 1f 44 00 00        nop    WORD PTR [rax+rax*1+0x0]

이렇게 실행이 아닌 빌드 단계에서 원하는 코드를 넘겨 동작시킬 수도 있기 때문에 과도한 연산 등이 들어가는 경우 빌드 단계에서 큰 부하를 받게 됩니다.

Compiler Bomb

말 그대로 컴파일러 폭탄, 즉 빌드 단계에서 문제를 일으키는 코드를 말합니다. C를 예시로 보면 아래와 같습니다.

// C Code
main[-1u]={1};
gcc -mcmodel=medium 1.c -o out
# .... 무한루프 ....

이렇게 빌드 단계에서 컴파일러가 쓸데없는 연산을 하게 만들어 과도한 자원을 소모하게 하는 공격입니다. Python의 경우에도 큰 숫자 연산을 수행하여 실행 단계에서 부하를 줄 수 있습니다.

# Python code
(1<<19**8,)*4**7

pyc 파일을 보면 32TB 보다 큰 파일이 나오게 됩니다 😵‍💫

// C# Code
class X<A,B,C,D,E>{class Y:X<Y,Y,Y,Y,Y>{Y.Y.Y.Y.Y.Y.Y.Y.Y y;}}

위 케이스는 28MB의 파일이 생성됩니다.

스택오버플로엔 이런 Compiler Bomb를 공유하는 챌린지가 있엇고 재미있는 내용들이 많습니다 :D

Conclusion

실제로 악용하기엔 매우 어려운 공격이라고 봅니다. 보안 테스팅하며 사용할 일은 거의 없겠지만, 그래도 알아보면서 학생 때 배웠던 내용들 다시 돌아볼 수 있어서 재미있었네요!