소개

https://github.com/google/graphicsfuzz

이 문서는 VMware에서 glsl 퍼저를 돌리는 방법을 설명한다. Vulkan 드라이버가 작동하지 않을 때 어떻게 작동할 수 있을지에 대해 이야기한다.

본론

퍼저 구조

퍼저는 전체적으로 서버와 클라이언트 구조로 되어 있다. 서버의 경우 클라이언트들을 웹 환경으로 관리할 수 있으며 클라이언트는 서버로부터 파일을 받아 이를 구동시키는 역할을 한다. 클라이언트의 경우 worker로 불리며 서버 웹 페이지를 이용하여 worker에 일을 할당할 수 있다.

https://github.com/google/graphicsfuzz/releases/tag/v1.3

서버의 경우 prebuilt binary (위 링크의 graphicsfuzz.zip)를 통해 구동할 수 있다. 압축을 풀고난 뒤 python/drivers에 가면 glsl-server가 있다. 해당 서버를 구동하면 된다.

예시 : glsl-server --port 31337 (pwd는 작업할 위치로 바이너리 위치와 상관 없이 따로 생성해야 한다)

클라이언트의 경우 마찬가지로 prebuilt binary (위 링크의 gles-worker-desktop.jar)가 있으며 이를 다운로드 받아서 실행시켜주어야 한다. VM guest 안에서 실행시켜주면 되며 마찬가지로 폴더를 하나 생성해서 그 안에서 실행시켜주면 된다.

예시 : java -ea -jar gles-worker-desktop.jar --server http://localhost:31337

자세한 퍼저 작동은 링크에 있다. 해당 문서의 Running the servergles-desktop-worker 파트를 보면 된다.

준비물

준비물은 간단하다. Release에 동봉되어 있는 (graphicsfuzz.zip) 셰이더 파일들을 준비해주면 된다. 해당 파일들을 통해 이후 단계에서 variant를 생성할 것이기 때문에 이를 미리 준비해놓자.

퍼저 구동

퍼저를 구동하기 위해서 3가지 단계를 거쳐야 한다.

  1. glsl-generate 실행
  2. glsl-server 실행, worker 실행
  3. worker에 job 할당

glsl-generate

glsl-generate의 경우 shader family를 생성하는데 사용된다. 지금 단계에서 생성하는 shader family는 퍼징을 수행할 때 worker가 실행하는 입력으로 들어가게 된다. 아래 명령어를 통해 실행할 수 있다.

glsl-generate ../prebuilt/shaders/samples/100 ../prebuilt/shaders/samples/100 100 family_100 shaderfamilies

첫째로 reference와 donor를 요구하는데 둘 모두 같은 위치로 shader 파일들이 들어있는 폴더를 지정하면 된다.
둘째로 variant를 몇개 생성할 것인지 요구한다. 위 예시에서는 100을 주었다.
셋째로 variant 이름을 지정한다. 위에서는 family_100으로 주었다.
넷째로 variant를 만들 대상 폴더를 지정한다. 위에서는 shaderfamilies 폴더로 지정했으며, 해당 이름은 고정으로 필수로 shaderfamilies로 주어야 한다. (다른 이름을 사용할 경우 서버 실행에 옵션으로 주어야 한다)

glsl-server 실행

shaderfamilies가 있는 곳에 pwd를 옮기고 glsl-server를 실행한다. --port 옵션으로 포트를 지정할 수 있다.

서버를 실행하고 나면 http://<ip address>:<port>/webui로 웹 인터페이스를 볼 수 있다.

job 할당

Job 할당의 경우 Run shader families on workers를 선택한 후 worker와 shader families를 지정해주면 된다. 이 이전에 worker가 실행되어야 worker 목록에 나오게 된다.

Worker를 실행하는 방법은 매우 간단히 주어진 gles-worker-desktop.jar 를 실행하면 된다.

예시 : java -ea -jar gles-worker-desktop.jar

--server 옵션으로 서버를 지정할 수도 있다. webui가 열려있는 서버를 지정해주면 된다.

예시 : java -ea -jar gles-worker-desktop.jar --server http://localhost:31337

'보안 > Fuzzing' 카테고리의 다른 글

AFLNET: A Greybox Fuzzer for Network Protocols  (0) 2021.01.19

+ Recent posts