퍼징이 뭐지?
퍼징(fuzzing)은 ‘소프트웨어 취약점’ 찾을 때 쓰는 방법 중 하나에요. 퍼즈 테스팅(Fuzz testing)이라고도 하는데, 퍼징이라고 더 많이 표현하는 것 같아요. 소프트웨어 취약점이라는 건 컴퓨터 쓸 때 사용하는 [인터넷 브라우저, mp3 플레이어, (문서 작성도구인)한컴오피스 한글] 같은 프로그램에 정상이 아닌 데이터를 넣어서, 프로그램이 꼬여서 터지는 걸 말해요.
이런 화면 본 적 있는 분도 계시고 못 보신 분도 계실텐데, 이게 프로그램 터졌을 때 나오는 화면이에요. 이런 화면이 떴을 때, [크래시 났다, 터졌다, 크래시가 발생했다] 이렇게 얘기해요. 퍼징은 이런 크래시를 찾기 위해서 몇 가지 프로그램들을 이용해, 입력할 파일(또는 값)을 만들고(생성), 프로그램(인터넷브라우저 같은)을 켜고(실행), 프로그램이 파일을 열고(입력) 크래시가 발생하는지 관찰 후 크래시가 발생하는지 아닌지에 따라 이때 사용한 파일과 로그를 저장하거나 폐기(분류) 같은 절차를 자동화(또는 반자동화)한 테스트 방법이에요.
프로그램을 터트려서 뭐하냐?
그래서 터트리면 뭐가 좋다고 비싼 컴퓨터로 퍼징을 돌리냐 이렇게 생각하실텐데, 그럴만한 이유가 있죠. 프로그램이 터질 때 안에서 코드가 꼬여서 터지는건데, 꼬이는 코드를 잘 이용하면, 내 마음대로 프로그램을 동작시킬 수 있거든요. (아! 근데 모든 크래시가 이렇게 내 맘대로 프로그램을 동작시킬 수 있는 건 아니고, 특정한 경우가 있는데, 이 내용은 조금 나중에 다룰께요. 어쨌든) 프로그램을 맘대로 동작시키면 뭐하냐? 이게 이제 궁금할텐데, 여기부터는 보안이랑 관련이 돼요. 마이크로소프트 엑셀을 예로 들어볼께요.
드라마 유령에 나오는 한 장면인데요, “신월동” 씨가 메신저로 어떤 엑셀파일을 보냈어요. 그래서 이 파일을 여는데요. 어떤 일이 일어날까요? 아래 그림을 보세요.
컴퓨터에 달린 웹캠이 동작하면서, 촬영을 하는건데요. 사진만 보면 어쨌다는 건지 모르겠지만 드라마를 보면, 이 화면이 해커의 컴퓨터 화면에 그대로 나오게 되거든요. 이게 어떻게 된걸까요? 간단하게 설명하면, 엑셀 프로그램 크래시를 이용해서 웹캠 촬영 화면을 해커한테 보낸거에요. 앞에서 크래시를 잘 이용하면 프로그램을 내 맘대로 동작시킬 수 있다고 했잖아요. 이 상황에선 “웹 캠을 동작시켜서 내 컴퓨터로 화면을 전송해라”가 “내 맘대로”에 해당하는 상황인 거에요.
웹캠을 전송하는 것 말고 다른 일들도 할 수 있겠죠? 다양한 일들을 하고 싶을 수 있는데, 그걸 이 엑셀파일에 구현하려면 복잡하겠죠? 그래서 일반적으로 원격 조종 툴을 설치하는 동작을 하도록 만들어요. 원격조종툴이 설치되고 나면, 해커가 그 컴퓨터에 접속해서 원하는 거의 모든 작업들을 할 수 있기 때문이에요. 개인한테 이런 파일을 보낸 게 아니라, 경쟁사의 간부한테 보내서 원격조종툴을 설치했다고 상상해보세요. 이 공격이 성공하면 경쟁사의 기밀문서들을 훔칠 수 있을꺼에요. 요즘처럼 정보가 돈이되는 세상에서 경쟁사의 기밀은 엄청난 금전적 가치가 있을꺼에요.
페이스북 창업자 마크 주커버그 아시죠? 한번 화제가 됐던 사진인데, 혹시 왜 화제가 됐는지 아시나요? 주커버그 뒤에 책상에 랩탑이 놓여있는데, 자세히 보면 웹캠이랑 마이크에 테이프가 붙여져 있어요. 보이시나요? 주커버그도 이런 정보 유출 위험 때문에 테이프를 붙여놓은 것 같아요.
결론적으로, “프로그램 터트리면 뭐하냐?”에 대한 질문에 “돈으로 만든다”라고 답할 수 있어요. 꼭 경쟁 회사가 없어도 크래시로 돈을 벌 수 있는 이유는, 크래시 자체가 거래되는 시장이 있기 때문이에요. 양지랑 음지에서 거래되는데, 음지에서 일어나는 거래는 범죄를 목적으로 한다고 설명할 수 있고, 양지에서 일어나는 거래는 ‘버그바운티’ 로 설명할 수 있는데,
버그바운티가 뭐냐하면, (페이스북, 마이크로소프트 이런 회사들도 다 하는 건데) 자사 프로그램에서 취약점을 찾아 제보 했을 때 포상금을 지급하는 제도에요. 페이스북은 2011년부터 버그바운티를 운영했는데 보안 취약점을 제보하면, 검토 후에 최소 500달러부터 시작하는 액수의 포상급을 준다고 해요. 구글은 100달러에서 2만달러까지, 마이크로 소프트는 최소 5000달러라고 하네요. 국내 기업들 중에도 이미 버그바운티를 운영하는 곳이 있어요, 그리고 앞으로 점점 운영하는 기업이 많아질 것으로 예상 돼요.
나도 크래시를 찾을 수 있을까?
퍼징할 때 쓰는 툴을 퍼져(fuzzer) 라고 하는데, 간단하게 구성하면 파이썬 10줄이면 돌릴 수 있어요. 코드를 보기 전에 퍼져에 있어야 할 필수 기능 몇가지를 알아볼까요? 퍼져는 크게 3가지 기능이 필요한데, 그 기능은 먼저 입력값을 생성하는 기능, 프로그램을 실행하는 기능, 결과를 분류하는 거에요.
아래 코드는 2012 codeengn 발표 자료 Everyone has his or her own fuzzer에 있는 코드인데 파일을 생성하고 실행하는 작업이 파이썬 언어로 10줄밖에 안될 정도로 간단하게 표현되어 있어요.
import os, sys, random
def go():
return random.randrange(0, 0x100)
filesize = os.path.getsize("./sample.xxx")
fp = open("./sample.xxx", "rb++")
tmpoffset = random.randrange(0, filesize)
fp.seek(tmpoffset, 0)
fp.write("%c%c%c%c" % (go(), go(), go(), go())) # 값 조작(입력값 생성)
fp.close()
os.system("target_binary sample.xxx") # 실행
프로그램이 터지는지 확인해서 처리하는 부분을 넣고 반복문을 추가해서 작업을 반복시키면 정말 간단하게 퍼져가 완성되네요. 더 좋은 작업 효율을 위해서는 여러 기능들이 추가 되어야 하겠지만요.
간단하게 퍼징을 알아봤는데요. 다음 연재에는 윈도우 운영체제에 설치해서 간단하게 사용할 수 있는 minifuzz 라는 도구를 사용해서 fuzzing 을 해볼께요.