상세 컨텐츠

본문 제목

[PAPER REVIEW] VecSeeds: Generate fuzzing testcases from latent vectors based on VAE-GAN

ANALYSIS/Paper Review

by koharin 2023. 7. 11. 22:00

본문

728x90
반응형

BACKGROUND

fuzzing

  • 랜덤한 입력을 줘서 crash나 hang과 같은 런타임 상태를 모니터링하고 잠재적인 보안 취약점을 찾는 동적 취약점 탐지 기술

MOTIVATION

전통적인 입력 변형 방식에서의 입력 포맷에 맞는 입력 생성의 어려움

  • 테스트케이스는 최소한으로 충족해야 할 포맷 형태가 있으며 포맷에 의존성이 높고 포맷 파서에 의해 체크를 통과되어야 타겟 프로그램에서 해당 입력으로 실행될 가능성이 있다.→ 신경망과 기계학습의 발전으로, 퍼징에서 입력 포맷을 충족하는 입력을 생성하는데 신경망이 적용되고 있다.
  • → 생성모델은 타겟 프로그램의 복잡한 입력 포맷을 학습하는데 사용해서 잘 구성된 테스트케이스를 빠르게 생성 가능
  • → 전통적인 퍼징에서 테스트케이스 생성은 mutation 기반으로 이루어지며, 해당 입력으로 코드 커버리지, 예외 트리거나 다른 요인과 같이 퍼징 성능을 높이기 위해서는 타겟 프로그램에 맞는 최소한의 입력 포맷을 충족해야 하지만, 입력 포맷 분석에는 많은 노력이 필요하다.

 

기존의 퍼징에 생성 모델을 적용한 연구의 문제

  1. 생성 모델의 커버리지 학습 속도가 느리다.
    • 훈련 초기에 판별자가 생성기를 압도할 경우 생성된 샘플의 품질을 오랫동안 개선하기 어려울 수 있다.
  2. GAN의 mode collapse 문제
    • 판별자를 속일 수 있는 소수의 포맷 타입만 훈련 과정에서 학습되고 생성기는 학습을 중단하여 생성의 다양성이 감소한다.
  3. 생성 방식에 개선의 여지가 있다.
    • 기존 연구는 무작위로 샘플링된 잠재 벡터를 디코딩하여 테스트케이스를 생성하기 때문에 생성 절차에 대한 가이드가 부족하고 훈련 세트의 정보를 제대로 활용하지 못한다.
  • 일반적인 생성적 적대적 신경망은 학습 불안정성, 단일 생성 방식과 생성되는 테스트케이스가 단조로운 문제가 있다.

→ 본 연구에서는 VAE-GAN 기반의 퍼징 입력 생성 기술을 제안하여 테스트케이스의 문자 정보를 사용하여 학습하고 학습 안정성을 개선하고 다양한 테스트케이스를 생성


DESIGN

data preprocessing

  • 저장된 파일을 수치 벡터 셋으로 변환 → 신경망이 학습할 수 있는 형태
  • 다양한 입력 타입으로 타겟 프로그램 테스트하기 위해 학습 데이터셋의 전처리 필요
  • 바이너리 스트림을 기반으로 파일 벡터화 기술을 사용 → 테스트케이스 파일을 바이너리 스트림 형태로 읽어서 수치적인 벡터로 변환
  • 전처리 과정
    • 모든 파일 마지막에 0을 추가한 후 동일한 바이트 길이로 통일
    • 각 파일을 바이너리 형태로 읽은 후 바이너리 데이터를 대응하는 16진수 값으로 변환
    • 16진수 값을 일반화를 통해 $[0,1]^n$ 공간을 갖는 수치 벡터로 변환 ($n$: 바이트 형태의 파일 길이의 n제곱)
  • RapidFuzz에 의하면, 바이너리 스트림이 생성된 테스트케이스에서의 reject 비율을 낮출 수 있음

 

model construction - VAE-GAN 모델

  • 학습 데이터셋을 기반으로 VAE-GAN 모델 구성하는 단계
  • 생성자와 판별자의 모델 학습 과정에서 모드 붕괴가 발생하기 쉬운 문제 해결 → VAE-GAN 모델 제안
  • encoder, generator(decoder), discriminator의 3개의 하위 모델로 구성
  • encoder
    • 학습 데이터 내의 샘플 $x$를 latent space 내의 feature vector $z$로 인코드
    • mean $\mu$와 확률 분포 $P_z$의 latent vector에 대한 분산 로드 $\epsilon = log \sigma^2$를 학습
    • 디코딩에 사용하기 위해 벡터 $z$를 리샘플 $\tilde{z} = \mu + \gamma \space \odot \space \frac{1}{2}exp(\epsilon)$
  • generator(decoder)
    • latent vector $\tilde{z}$를 입력 샘플 $\tilde{x}$로 디코드
    • encoder와 decoder의 과정은 변형 자동 인코더와 동일 → feature extraction 과정
  • discriminator
    • 판별기에 mean feature matching loss 적용하여 모델 안정성 향상
    • VAE-GAN에서 생성한 테스트케이스와 AFL에서 생성한 학습 입력을 통합하여 비교

 

model training

적절한 loss 함수를 선택하고 신경망 학습을 완료함

 

testcase generation

학습된 모델을 로드하여 테스트케이스 생성

재구성 방법: 학습 데이터셋 내 각 테스트케이스 $x$에 대해, encoder로 문자 벡터 $z$를 구하고 decoder로 문자 벡터를 디코드하여 테스트케이스 $\tilde{x} = Dec(z)$를 얻는다.

feature vector를 재구성하는 방식으로 테스트케이스를 생성


EVALUATION

다른 GAN 기반 연구 4개 중 3개보다 더 많은 unique tuple 트리거함

AFL mutation과 비교했을 때 VAE-GAN에서 생성된 테스트케이스가 코드 커버리지를 11.87% 개선


RELATED WORK

퍼징의 개념

  • 1990년 UNIX 프로그램의 안정성을 다루는 논문에서 퍼징이 처음 제안됨

신경망을 이용하여 퍼징의 테스트케이스를 생성하는 연구

  • 바이너리가 아닌 포맷 데이터를 학습하여 learn&fuzzy 알고리즘 통해 RNN 네트워크 기반으로 테스트케이스 생성

생성 모델

  • 2014년에 처음 제안됨
  • 생성기와 분류기로 구성되고 생성기는 false 데이터를 생성하고 분류기는 데이터를 구별하여

GAN에 RNN 사용하여 퍼징에 적용

  • Nichols et al. - 학습 시간, 생성 속도, 코드 커버리지 면에서 GAN이 이점이 있지만, 목표로 하는 데이터 유형이 충분하지 않아 제한적인 단점이 있음

GANFuzz

  • RNN을 GAN의 generator 역할을 하고 퍼징 프레임워크 만들어서 프로토콜의 public 또는 private 포맷을 학습하고 테스트케이스를 생성
  • passing rate을 40%로 하고 테스트케이스 생성

WGAN 이용하여 테스트케이스 생성

  • 테스트케이스를 학습 데이터셋에 수집하는 SmartSeed가 있고, WGAN은 포맷 정보를 학습하여 새로운 테스트케이스 생성

RapidFuzz

  • 복잡한 포맷에 대해 학습하고 생성하는 방법과 변형된 장소를 탐지하는 알고리즘 제안

GAN을 이용하여 소프트웨어를 테스트하는 프레임워크 제안

  • Guo et al.

CONCLUSION

Contribution

  • 다양한 테스트케이스 생성 위한 전통적인 GAN에 variational auto-encoder(VAE) 방식을 도입
  • 입력의 feature vector를 기반으로 테스트케이스 생성
  • 4개의 리얼월드 오픈소드 프로그램을 VAE-GAN 모델 적용하여 테스트해봤을 때 퍼징 효과와 샘플 다양성이 증가했다.

 

Summary

  • 변형 자동 인코더 학습 과정 → 네트워크 과정에 필요한 특징 추출하기 위해 사용
  • 테스트케이스 생성 ⇒ 특징 벡터 재구성하여 생성
  • VAE-GAN 모델 → 판별자에 평균 특징 매칭 손실 적용해 학습 안정성 향상

 

Future work

  • GAN으로 생성된 테스트케이스의 엣지 정보를 충분히 활용
  • 학습된 잠재 벡터를 추가로 조작하여 테스트케이스 생성
728x90
반응형

관련글 더보기