기호실행 (Symbolic Execution)

정보보안학
한 줄 정의: 프로그램 입력값을 구체적인 숫자 대신 기호(symbol)로 두고 실행 경로를 분석해, 어떤 입력이 특정 코드 경로나 버그를 유발하는지 수학적으로 찾아내는 프로그램 분석 기법입니다.

쉽게 풀면

보통 프로그램을 테스트할 때는 "입력값 5를 넣으면 결과가 뭐가 나오나" 하는 식으로 구체적인 숫자를 대입해봅니다. 기호실행은 이와 달리 입력값을 "x"라는 미지수로 놓고, 프로그램이 그 x를 가지고 어떤 조건 분기를 타는지 수학 방정식처럼 추적합니다. 예를 들어 "x가 10보다 크면 A 코드로, 아니면 B 코드로 간다"는 조건을 만나면, 두 경우를 모두 수식으로 기록해 각각의 경로가 성립하는 x의 범위를 계산합니다. 이렇게 하면 사람이 일일이 다양한 입력값을 시도해보지 않아도, 특정 위험한 코드 경로에 도달하려면 정확히 어떤 입력이 필요한지를 수학적으로 역산할 수 있습니다.

왜 중요한가

취약점 분석과 침투테스트에서 사람이 모든 입력 조합을 수작업으로 시도하는 것은 사실상 불가능하기 때문에, 기호실행은 자동으로 버그나 취약한 코드 경로를 찾아내는 강력한 수단으로 활용됩니다. 특히 소프트웨어의 특정 결함을 실제로 유발하는 구체적인 입력값을 자동 생성할 수 있어, 취약점 발견 및 검증 자동화 연구의 핵심 기법으로 다뤄집니다.

논문에서는 이렇게 쓰입니다

"본 도구는 기호실행을 활용하여 버퍼 오버플로우를 유발하는 구체적인 입력값을 자동으로 생성하는 데 성공하였다."

기호실행을 통해 실제 취약점을 재현하는 입력 데이터를 자동으로 만들어낸 연구 성과를 설명하는 문장입니다.

"경로 폭발(path explosion) 문제를 완화하기 위해 제약 조건 해결기(SMT solver)의 캐싱 전략을 개선하였다."

기호실행이 실무에서 흔히 겪는 성능 문제와 이를 해결하려는 연구 방향을 설명하는 문장입니다.

조금 더 깊게 보면

기호실행은 프로그램의 각 조건 분기마다 경로 조건(path condition)이라는 수식을 누적해나가며, 이 수식이 실제로 만족 가능한지를 SMT(Satisfiability Modulo Theories) 솔버라는 도구로 판별합니다. 프로그램의 분기 수가 많아질수록 탐색해야 할 경로의 수가 기하급수적으로 늘어나는 경로 폭발 문제가 대표적인 한계로 꼽히며, 이를 완화하기 위한 다양한 경로 선택 전략과 실제 실행을 일부 병행하는 컨콜릭 실행(concolic execution) 같은 변형 기법도 연구되고 있습니다.

주의할 점

기호실행은 이론적으로 강력하지만, 대규모 실제 프로그램에서는 경로 폭발과 외부 라이브러리 호출, 복잡한 자료구조 처리 등으로 인해 완전한 분석이 어려운 경우가 많습니다. 따라서 실무에서는 퍼징(fuzzing) 등 다른 취약점 탐색 기법과 함께 보완적으로 사용되는 경우가 흔합니다.

관련 용어