4 분 소요

정보컴퓨터공학부 이수빈

요약

컴파일러는 소프트웨어 개발의 핵심 구성요소입니다. 하지만 아쉽게도 여전히 다양한 버그들이 존재합니다. 버그를 찾아내기 위한 방법이 “Fuzz Testing”이고, 이는 의도적으로 만들어진 다양한 코드 조각을 컴파일러에 입력해 새로운 버그나 보안 취약점을 찾는 방식입니다. “DEEPFUZZ”는 이러한 테스트를 돕기 위해 개발된 도구로, 기존의 C 프로그램 코드를 학습하여 새로운 코드를 자동으로 생성합니다. 이렇게 생성된 코드를 컴파일러에 입력해 어떻게 반응하는지 관찰합니다. “DEEPFUZZ”를 사용한 결과 코드의 다양한 면에서 테스트의 효율성이 향상되었고, 또한 8개의 새로운 버그를 발견할 수 있었습니다.

서론

컴파일러는 소프트웨어 개발의 핵심 구성요소로, 그 신뢰성은 매우 중요하며 높은 수준을 유지해야 합니다. 그럼에도 불구하고, 실제로 많은 컴파일러들은 다양한 버그와 보안 취약점을 내포하고 있습니다. 예를 들어, GCC와 같은 대표적인 컴파일러는 과거부터 현재까지 3,400개 이상의 버그와 보안 취약점이 발견되었으며, 이는 계속해서 증가하고 있습니다. 이러한 컴파일러의 버그는 의도하지 않은 프로그램 실행을 유발할 수 있고, 보안이 중요한 응용 프로그램에서는 치명적인 결과를 초래할 수 있습니다. 현재 GCC의 코드 기반은 약 1500만 라인에 달하며, 이 규모는 계속해서 확장되고 있습니다.

전통적인 컴파일러 테스트 방법은 주로 수동적인 특성을 가지고 있어, 인력이 많이 필요하고 테스트 범위가 제한적인 경우가 많습니다. 이에 비해 “Fuzzing”은 자동화된 테스트 방법으로서, 프로그램의 충돌 및 비정상적인 동작을 자동으로 감지하기 위해 코드를 생성하고, 다양한 입력을 반복적으로 제공함으로써 버그와 보안 취약점을 식별합니다. 이는 테스트에 필요한 인력을 크게 줄일 수 있으며, 특히 컴파일러와 같은 복잡한 시스템에서 효과적입니다. 이 글에서는 특히 “DEEPFUZZ”를 활용한 컴파일러 Fuzzing 테스트 방법에 중점을 둘 것이며, 이를 통해 어떻게 다양한 버그 및 보안 취약점을 효과적으로 찾아낼 수 있는지를 알아볼 것입니다

본론

DEEPFUZZ 디자인

컴파일러를 검증하기 위해 “DEEPFUZZ”라는 도구를 소개합니다. 이 도구는 C 프로그램 코드를 자동으로 생성하여, 컴파일러에 계속적으로 새로운 코드를 입력함으로써 이를 테스트합니다. DEEPFUZZ는 크게 ‘전처리’와 ‘샘플링 변형’, 그리고 ‘생성 전략’의 세 단계로 구성되어 있습니다.

전처리 단계 훈련이 시작되기 전에, 몇 가지 전처리 작업이 이루어집니다.

  • 주석 처리: 정규식 패턴을 사용하여 코드에서 주석(한 줄 주석 및 블록 주석)을 제거합니다.
  • 공백 처리: 다양한 종류의 공백 문자(예: 탭, 줄 바꿈 등)를 하나의 공백으로 통일합니다.
  • 매크로 처리: C 언어의 매크로는 코드 조각에 새로운 이름을 부여하는 기능을 합니다. DEEPFUZZ에서는 매크로 이름이 사용되는 모든 위치를 해당 매크로의 내용으로 치환합니다.


샘플링 변형 단계

새로운 C 프로그램 코드를 생성하기 위해, DEEPFUZZ는 Sequence-to-Sequence 모델을 활용합니다. 여기서는 몇 가지 샘플링 방법을 적용합니다.

  • NoSample: 주어진 접두사에 대해, 가장 확률이 높은 다음 문자를 직접 선택합니다.
  • Sample: 다음 문자를 무작위로 샘플링 하여, 예측 문자를 선택합니다.
  • SampleSpace: 접두사 시퀀스가 공백으로 끝나면, 확률 임계 값 이상의 문자만을 다음 문자로 샘플링 합니다.


생성 전략 단계

  • G1 전략: 동일한 접두사 시퀀스를 기반으로 새로 생성된 코드를 원래 프로그램의 특정 위치에 삽입합니다.
  • G2 전략: 새 코드 조각을 생성하지만, 원본 프로그램에서 임의로 선택된 다른 접두사 시퀀스를 사용하여 생성하고, 다시 삽입합니다.
  • G3 전략: 원본 프로그램의 접두사 시퀀스 뒤에서 두 줄을 잘라내고, 잘린 부분에 새로 생성된 코드를 삽입합니다.


이렇게 생성된 새로운 코드 조각들을 활용하여, DEEPFUZZ는 컴파일러를 지속적으로 테스트하고, 그 결과를 분석하여 버그를 찾아냅니다.

평가

DEEPFUZZ 설계로 생성된 C 프로그램 코드를 컴파일러에 입력해 효율성을 평가했습니다. 평가의 주요 지표로는 “합격률”, “커버리지”, 그리고 “새로운 버그 발견”이 포함되어 있습니다.

합격률

합격률은 생성된 C 프로그램 중에서 구문이 올바른, 즉 유효한 프로그램의 비율로, Sequence to Sequence 모델이 얼마나 정확하게 C 언어의 패턴을 학습하고 인코딩했는지를 측정하는 지표입니다. 테스트는 다양한 에포크 값들에 대해 진행되었고, 10~30 에포크 동안 합격률이 점차 증가하는 경향을 보였습니다. 그러나 30 에포크를 초과하면서 합격률이 점차 감소하는 추세를 확인할 수 있었습니다.

세 가지 샘플링 방법(“Nosample”, “Sample”, “SampleSpace”)을 비교한 결과, “Nosample”이 모든 모델에서 가장 높은 합격률을 보이며, 최대 82.63%의 합격률을 기록하였습니다.

샘플링 생성전략 합격률(%)
NoSample G1 82.63%
NoSample G2 79.86%
NoSample G3 73.23%
     
Sample G1 79.56%
Sample G2 68.25%
Sample G3 73.47%
     
SampleSpace G1 81.23%
SampleSpace G2 78.82%
SampleSpace G3 77.12%

생성 전략

새로운 프로그램의 지속적인 생성을 위해, 다음과 같은 세 가지 전략을 적용하였습니다

G1) 한 위치에 두 개의 새로운 코드 라인을 삽입합니다.

G2) 두 개의 새 코드 라인을 다른 위치에 삽입합니다.

G3) 두 개의 새 코드 라인으로 기존 라인을 교체합니다.

이러한 전략에 따른 합격률은 82.63%, 79.86%, 73.23%로 나타났습니다.

커버리지

커버리지는 코드의 여러 측면(라인, 기능, 분기 등)에서 어떻게 테스트가 진행되었는지를 측정합니다. 다양한 샘플링 및 생성 전략을 통해 커버리지 향상을 분석하였고, GCC-5와 Clang-3에서의 라인, 기능, 분기 수를 포함한 커버리지 정보를 기록하였습니다.

“Sample” 샘플링 방법이 커버리지 향상 측면에서 가장 좋은 결과를 보였습니다. 전략 비교 시, G1은 가장 낮은 성능을, G2는 가장 높은 성능을 보였습니다.

생성 전략 샘플링 라인 커버리지 함수 커버리지 분기 커버리지
G1 NoSample 0.33% 0.08% 0.26%
G1 Sample 0.38% 0.19% 0.86%
G1 SampleSpace 0.36% 0.17% 0.82%
         
G2 NoSample 5.41% 1.22% 3.12%
G2 Sample 7.76% 2.13% 3.11%
G2 SampleSpace 7.14% 2.44% 3.12%
         
G3 NoSample 3.32% 0.87% 2.20%
G3 Sample 6.87% 1.33% 2.68%
G3 SampleSpace 6.23% 1.72% 2.97%

새로운 버그의 발견

DEEPFUZZ의 주된 목표는 컴파일러에서 버그를 찾아내는 것이기 때문에, 발견된 버그의 수는 이 도구의 효과를 평가하는 중요한 지표입니다. 실험 결과, DEEPFUZZ는 GCC에서 총 8개의 새로운 버그를 발견하였습니다.

이를 통해, DEEPFUZZ는 자동화된 C 프로그램 생성을 통해 컴파일러 테스팅에 효과적으로 사용될 수 있음을 보여줍니다.

결론

“DEEPFUZZ”는 컴파일러 테스트 도구로서, C 프로그램 코드를 지속적으로 자동 생성하며, 82.63%라는 높은 정확도와 라인, 함수, 분기 커버리지 측면에서 탁월한 테스트 효율성을 보였습니다. 또한, 이 도구를 통해 8개의 새로운 버그를 성공적으로 발견할 수 있었습니다. 이러한 결과는 퍼징 기술이 소프트웨어 테스팅과 버그 탐지에 매우 효과적이라는 것을 재확인하였습니다.

하지만, 우리의 소프트웨어 개발 환경은 컴파일러 영역만으로 제한되지 않습니다. 웹 어플리케이션, 데이터베이스, 네트워크 프로토콜 등 다양한 영역에서의 안정성과 보안도 마찬가지로 중요한 이슈입니다. 특히 웹 어플리케이션의 경우, SQL Injection과 같은 다양한 취약점이 존재하며, 이는 심각한 보안 위협을 가지고 있습니다. 따라서, 저는 DEEPFUZZ와 같은 퍼징 도구의 개발과 활용이 웹 어플리케이션 및 다른 소프트웨어 영역에서도 활발하게 이루어져야 한다고 생각합니다.

카테고리:

업데이트: