우리 퍼징 고르게 고르게
[essay] 2 min read
Abstract
다중 지향성 퍼징에서 여러 오류를 노리는 효과적인 방법으로 각 목표에 고르게 접근하는 것이 있다. 현재는 목표별로 퍼징의 내부 정보를 따로 구별하면 할수록 성능이 나아지고 있다. 하지만 미래에는 일부 내부 정보를 합산하여 상호 보완적인 효과를 노릴 수도 있지 않을까?
본문
다중 지향성 퍼징에서 각 오류가 언제 재현될지 미리 내다볼 방법이 없다면, 제한시간 내 많은 오류를 찾기 위해서 각 목표 지점에 자원을 고르게 분배하는 것은 가장 직관적인 해결책이다.
목표별로 자원을 고르게 분배할 때에는 목표별 퍼징 정보가 구별될 필요성이 있다. 퍼징은 입력을 실행하고 까먹는 게 아니라 이전에 실행한 모든 우수한 입력의 실행 정보를 기억하며 스스로를 발전시킨다. 이 정보들은 평균내어져 실시간 입력이 얼마나 우월한지를 계산하는 등 퍼징의 휴리스틱에 관여한다.
어려운 점은 퍼징의 정보를 목표별로 분리하는 작업이 애매하다는 것이다. 입력값부터가 원래 노리던 목표와, 그 자손이 노리던 목표가 다른 경우가 많다. 이는 단일 지향성 대비 다중 지향성의 큰 장점이기도 한 것이다. 입력부터가 완벽하게 목표별로 목적을 구분하는 게 어려우니, 하물며 입력별 기록인 퍼징 내부정보가 구분이 쉽사리 되진 않는다. 이 문제를 현재는, 인위적으로 정보 기록 단계에서부터 목표별로 따로 기록하도록 퍼징을 변형해 해결 중이긴 한다.
지금은 무 자르듯이 정보를 쪼개놓았지만, 미래에는 이러지 않아도 목표별로 자원을 고르게 분배할 방법을 찾기를 희망한다. 여기에는 앞서 말한 목표별 정보 구분이 어렵다는 이유 말고도, 목표별 정보를 잘 합산하면 상호 이득을 가져다주리라는 기대가 들어 있다. 퍼징의 내부정보는 아니지만, 다중 지향성이 사용하는 목표별 가이드라인은 실제로 각 목표에 최적화되지 못한 경우가 많아, 오히려 다른 목표로 가는 가이드라인이 공유될 때 상호 이득을 가져다주는 경우가 잦다. 앞서 말한 퍼징 입력들도 목표별로 교차되어 상호 이득을 주는 걸 보면, 퍼징 내부 정보들도 상호 보완적인 효과를 낼 수 있을 방법이 있으리라 기대하고, 지금도 눈에 불을 켜고 찾아보고 있다.
기타
퍼징은 자체 딕셔너리를 만들어, 대상 프로그램에서 자주 쓰이는 단어 등을 모아두기도 한다. 개중 일부는, 목표간에 섞여 들어가게 되면 퍼징의 성능을 크게 줄이는데, 이는 목표별로 내부 정보가 현저히 다른 경향을 띠고 이가 다시 각 목표로 퍼징을 유도하는 되새김질을 방해하기 때문이다.