Skip to main content
QUICK REVIEW

[논문 리뷰] How a simple bug in ML compiler could be exploited for backdoors?

Baptiste David|arXiv (Cornell University)|2018. 11. 27.
Security and Verification in Computing참고 문헌 1인용 수 4
한 줄 요약

이 논문은 Microsoft의 MASM 컴파일러에서 발생하는 제로데이 버그를 폭 드러내며, NOT 연산자를 포함한 조건부 논리 구문을 암묵적으로 잘못 컴파일하여, 소스 코드를 수정하지 않은 채로 컴파일된 바이너리에 도사리진 스텔스 백도어를 삽입할 수 있도록 허용한다. 이 결함은 정상적인 경우에는 정상적인 동작을 유지하면서도 특정 조건에서 악성 코드가 실행되도록 하여, 전통적인 소스 코드 감사를 우회하고 중요한 소프트웨어에 탐지하기 어려운 장기적인 백도어를 가능하게 한다.

ABSTRACT

Whenever a bug occurs in a program, software developers assume that the code is flawed, not the compiler. In fact, if compilers should be correct, they are just normal software with their own bugs. Hard to find, errors in them have significant impact, since it could result to vulnerabilities, especially when they silently miscompile a critical application. Using assembly language to write such software is quite common, especially when time constraint is involved in such program. This paper exposes a bug found in Microsoft Macro Assembler (ml for short) compiler, developed by Microsoft since 1981. This assembly has the characteristics to get high level-like constructs and high level-like records which help the developer to write assembly code. It is in the management of one of this level-like construct the bug has been found. This study aims to show how a compiler-bug can be audited and possibly corrected. For application developers, it shows that even old and mature compilers can present bugs. For security researcher, it shows possibilities to hide some unexpected behavior in software with a clear and officially non-bogus code. It highlights opportunities for including stealth backdoors even in open-source software.

연구 동기 및 목표

  • Microsoft의 MASM(ml) 컴파일러에서 발견된 이전에 알려지지 않은 암묵적 컴파일러 버그를 폭 드러내어 조건부 논리가 잘못 컴파일되는 원인을 밝히는 것.
  • 이러한 버그가 공격자가 소스 코드를 수정하지 않고도 컴파일된 소프트웨어에 스텔스 백도어를 삽입할 수 있도록 악용될 수 있음을 보여주는 것.
  • 특히 성숙한 그러나 결함이 있는 컴파일러를 사용해 컴iles된 핵심 시스템에서 소스 코드 감사를 유일한 보안 수단으로 의존하는 위험성을 부각하는 것.
  • 보안 커뮤니티가 컴파일러를 잠재적 공격 표면으로 간주하고 소스 코드뿐 아니라 컴파일러 동작까지 감사해야 한다고 촉구하는 것.
  • 켄 톰슨의 유명한 컴파일러 트로이 목적으로 유사한 방식으로, 컴파일러 수준의 취약성을 통해 탐지하기 어려운 장기적인 백도어를 만들 수 있음을 설명하는 것.

제안 방법

  • MASM의 매크로 어셈블리 처리에서 NOT 연산자를 사용한 조건문 표현식에서 발생하는 문법 수준의 버그를 특정함.
  • 논리적 부정을 수행해야 하는 MASM 문법을 사용한 테스트 케이스를 제작하여, 실제로는 잘못된 x86 기계어로 컴파일되는지 확인함.
  • WinDbg와 같은 도구를 사용해 컴파일된 출력을 역분석하여 생성된 어셈블리 코드가 의도한 논리와 일치하지 않음을 검증함.
  • 잘못 컴파일된 코드가 예상되는 점프를 건너뛰거나 의도하지 않은 분기로 이어지는 등 의도하지 않은 제어 흐름을 유도할 수 있음을 입증함.
  • Microsoft에 이 문제를 보고하여, 이제는 이러한 구조에 대해 문법 오류(A2154)를 발생시켜 암묵적 잘못된 컴파일을 방지하는 패치가 적용됨.
  • 역공학 및 바이너리 분석을 통해 실제 컴파일된 바이너리에서 이 논리 오류의 존재와 악용 가능성 확인함.

실험 결과

연구 질문

  • RQ1MASM처럼 널리 사용되며 오랫동안 사용된 어셈블러에서 발생하는 컴파일러 버그가 어떻게 조건부 논리의 암묵적 잘못된 컴파일을 초래할 수 있는가?
  • RQ2이러한 잘못된 컴파일이 어떻게 소스 코드를 수정하지 않고도 컴파일된 소프트웨어에 스텔스성이고 탐지하기 어려운 백도어를 삽입하는 데 이용될 수 있는가?
  • RQ3소스 코드가 정상적으로 보이고 오픈소스일 경우, 왜 개발자와 감사자가 이러한 백도어를 탐지하기 어려운가?
  • RQ4특히 펌웨어와 시스템 수준 코드에서 컴파일러의 정확성이 소프트웨어 보안 평가에 미치는 영향은 무엇인가?
  • RQ5컴파일러 버그가 소스 코드를 수정하지 않고도 소프트웨어 업데이트 동안 지속성을 확보하는 데 어떻게 활용될 수 있는가?

주요 결과

  • MASM 컴파일러에서 복잡한 조건부 구조에서 NOT 연산자를 사용할 경우, 암묵적으로 잘못된 컴파일이 발생하여 생성된 바이너리에서 잘못된 제어 흐름이 발생함.
  • 이 버그는 유효한 문법을 따르고도 의도한 소스 코드 논리와 다른 x86 어셈블리 지시어를 생성함. 이는 소스 코드가 정상적으로 보이더라도 발생함.
  • 정적 소스 코드 분석을 통해는 탐지할 수 없으며, 코드가 정상적으로 보이고 표준 MASM 관례를 따르기 때문임.
  • 이 취약성은 특정 조건에서만 작동하는 백도어를 삽입할 수 있게 하여 매우 스텔스성이고 탐지하기 어려움.
  • Microsoft는 이러한 구조에 대해 문법 오류(A2154)를 도입함으로써 향후 암묵적 잘못된 컴파일을 방지했으며, 이는 기존 호환성에 영향을 주지 않음.
  • 특히 소스 코드는 자주 감사되지만 컴파일러 동작은 감사되지 않는 펌웨어, 커널, 보안 도구와 같은 핵심 시스템에서는 공격 표면이 특히 위험함.

더 나은 연구,지금 바로 시작하세요

논문 읽기부터 검토까지, 연구 시간을 획기적으로 줄여보세요.

카드 등록 없음 · 무료 플랜 제공

이 리뷰는 AI가 만들고, 인간 에디터가 검토했습니다.