I. 서론
최근 몇 년간 Internet of Things (IoT) 기기의 급격한 증가로 인해 전 세계적으로 연결된 장치의 수가 기하급수적으로 늘어나고 있다. Statista의 보고에 따르면, 2021년에는 약 100억 개의 IoT 장치가 활성화되었으며, 2025년까지 이 수치가 300억개를 넘어설 것으로 예측한다[1]. 이러한 급격한 증가는 편의성과 효율성을 제공하는 반면, 심각한 보안 위협을 동반한다. 2020년 Unit 42의 보고서에 따르면 IoT 기기의 98%가 암호화되지 않은 트래픽을 전송하고 있으며, 57%가 중간 또는 높은 수준의 취약점에 노출되어 있는 실정이다[2].
이러한 보안 위협에 대응하기 위해, 임베디드 펌웨어 바이너리에 대한 취약성 분석이 중요한 연구 분야로 대두되고 있다. 따라서, 현재 많은 정적 분석 기법들이 개발되어 다양한 취약점들을 효과적으로 탐지하고 있다. 예를들어 Shoshitaishvili et al.[3]의 연구에서는 Firmalice라는 바이너리 분석 프레임워크를 제안했다. 이 프레임워크는 정적 분석과 심볼릭 실행을 결합하여 펌웨어의 인증 우회 취약점을 탐지한다. 또한, Firmalice는 펌웨어 바이너리를 입력으로 받아 제어 흐름 그래프를 생성하고, 이를 바탕으로 인증 루틴을 식별하여 잠재적인 취약점을 찾아내는 기능을 수행한다. Redini et al.[4]의 연구에서는 KARONTE라는 크로스 바이너리 분석 도구를 제안했다. 이 도구는 임베디드 펌웨어의 여러 바이너리 컴포넌트 간 정보 흐름을 추적하여 보안 취약점을 탐지하는 기능을 수행한다.
기존 연구[5,6,7,8]들이 전체 시스템 수준의 소스-싱크 분석이나 크로스 바이너리 분석에 중점을 둔 반면, 본 연구에서 제안하는 방법은 코드 패턴에 초점을 맞추고 있다. 우리의 접근법은 미리 정의된 소스와 싱크에 의존하지 않고, 잠재적으로 위험한 코드 구조를 직접 식별함으로써 새로운 유형의 취약점도 효과적으로 탐지할 수 있는 방법이다.
본 연구에서는 코드 패턴을 이용한 새로운 싱크 정의 방법과 패턴 내부로 제한된 데이터 의존성 분석을 통해 확장된 싱크 탐지 기법을 제안한다. 특히, 반복문 패턴에 초점을 맞추어 메모리 증가와 관련된 취약점을 식별하는 방법을 제안한다.
본 연구의 주요 목적은 다음과 같다. 첫째, 기존의 싱크 함수 기반 분석 방식에 의존하지 않고 더 다양한 유형의 취약점을 탐지할 수 있는 방법 제안한다. 둘째, 코드 패턴 기반의 싱크 정의 및 취약점 탐지 도구를 개발한다. 셋째, 실제 임베디드 펌웨어 바이너리를 대상으로 한 실험을 통해 제안된 방법의 효과성 입증한다.
본 논문의 구성은 다음과 같다. 2장에서는 관련 연구와 배경지식을 소개하고, 3장에서는 동기 부여 사례와 함께 메모리 증가 패턴에 대해 설명한다. 4장에서는 설계에 대해 상세히 설명하고, 5장에서는 구현에 대한 설명을 진행한다. 6장에서는 실험 결과에 대한 평가를 진행하고, 7장에서 향후 연구 방향 및 한계점을 논의한다. 마지막으로 8장을 결론으로 마친다.
II. 관련 연구 및 배경지식
본 장에서는 임베디드 펌웨어 바이너리 분석과 취약점 탐지에 관한 최근 연구들을 살펴보고, 현재 기술의 동향과 한계점을 논의하며 관련 배경지식을 설명한다.
Redini et al.[4]은 임베디드 기기 펌웨어를 위한 정적 분석 접근 방식을 제안했다. 특히 멀티 바이너리 상호작용 모델링을 통해 단일 바이너리 분석의 한계를 극복하였다. 해당 연구는 바이너리 간 오염 정보를 전파하여 안전하지 않은 상호작용과 취약점을 탐지하며, 899개의 다양한 펌웨어 샘플에 대한 분석을 통해 그 확장성을 입증했다.
Chen et al.[9]은 임베디드 기기의 웹 서비스 취약점 탐지에 특화된 정적 오염 분석 솔루션이다. 해당 연구는 웹 인터페이스의 문자열 리터럴을 활용하여 백엔드 바이너리의 입력 지점을 식별하고, 타겟팅된 데이터 흐름 분석을 통해 신뢰할 수 없는 사용자 입력의 위험한 사용을 정확하게 탐지한다.
Chen et al.[10]은 실시간 운영 체제(RTOS)를 위한 슬라이스 기반 퍼저로, 정적 분석과 동적 분석 방식을 결합해 RTOS의 모놀리식 바이너리에서 독립적인 태스크를 식별하고 분석하는 데 초점을 맞추었다. SFuzz는 사용자 입력 처리 함수부터 시작하여 전방 슬라이싱을 통해 실행 트리를 구축하고, 효과적인 퍼징을 방해하는 요소들을 대규모 범위에서 탐지하고 처리한다. 또한, 전방 및 후방 슬라이싱을 활용하여 경로 제약 조건을 추적하고 검증함으로써 취약점을 식별한다.
Gibbs et al.[11]는 IoT 펌웨어의 오염 스타일 취약점을 대규모로 분석하기 위한 새로운 접근 방식을 제시했다. Gibbs et al.은 모든 바이너리를 분석할 수 있도록 정적 분석을 확장하고, 값 분석과 데이터 의존성 분석을 결합한 새로운 바이너리 데이터 흐름 분석 기법인 MANGODFA를 제안했다. 이 접근 방식은 평균 분석 시간을 크게 단축했다. 또한, 타 연구에서 발견할 수 없는 취약점을 탐지해 그 효과성을 입증했다.
Li et al.[14]는 패턴 기반의 코드 가젯과 딥러닝을 통해 취약점을 탐지하는 방안을 제시했다. Li et al.은 전문가의 특징 정의 없이 취약점을 탐지할 수 있는 방법을 제시했지만, 소스 코드를 필요로 하며 C와 C++에 대해서만 처리가 가능하다. 따라서 펌웨어 바이너리에는 적용할 수 없으며, 학습을 위한 데이터가 필요하다는 한계점이 존재한다.
Boudjema et al.[15]은 angr[18]를 기반으로 패턴 기반의 취약점을 탐지하는 방안을 제시했다. 하지만 Boudjema et al.의 취약점 패턴은 프로그램 실행 중 발생할 수 있는 행위 패턴을 기호 실행을 통해 탐지하는 방식으로, angr에 의존적이다. 따라서 angr로 분석되지 않는 펌웨어 바이너리에 존재하는 취약점(cve-2022-24355)은 탐지할 수 없다는 한계점이 존재한다.
Chen et al.[16]은 리눅스 커널의 out-of-bounds 쓰기 취약점에 대한 익스플로잇 생성을 자동화하는 방안을 제시했다. Chen et al.은 out-of-bounds 취약점을 모델링하고, 추출하여 익스플로잇을 생성한다. 하지만 소스 코드가 필요하며, 퍼징 기법과 같은 동적 분석이 필요하고, 외부 도구에 의존적이기 때문에 큰 규모의 응용 프로그램, 다양한 아키텍처에 적용할 수 없다는 한계점이 존재한다.
Sejfia et al.[17]은 Apache Tomcat에 대한 취약점을 패턴 기반으로 탐지하는 방법을 제시했다. Sejfia et al.은 취약점 데이터를 수집하고 분석하기 위해 Tomcat의 패치 정보와 소스 코드가 필수적이다. 따라서 연구에서 제안하는 방식은 확장성이 부족하고, 적용 범위가 제한적이라는 한계점이 존재한다.
2.1 현재 기술의 한계
이러한 최근 연구들은 임베디드 펌웨어 분석과 취약점 탐지 분야에서 상당한 진전을 이루었지만, 여전히 다음과 같은 한계점들이 존재한다.
한계 1) 싱크 함수 중심의 분석. 대부분의 현재 분석 기법들은 미리 정의된 싱크 함수에 크게 의존하고 있다. 이로 인해 비전형적인 취약점이나 취약점의 행위 패턴을 탐지하는 데 한계가 있다. 예를 들어, Redini et al.[4]와 Chen et al.[9]는 strcpy와 같은 잘 알려진 싱크 함수를 중심으로 분석을 수행하며, 이는 다른 형태의 잠재적 취약점을 놓칠 수 있는 위험이 있다.
Gibbs et al.[11]은 이러한 문제를 일부 해결하려 했지만, 여전히 다양한 유형의 취약점 패턴을 포괄하지는 못하고 있다.
한계 2) 코드 구조의 다양성 고려 부족. Chen et al.[10]는 특정 유형의 시스템(예: RTOS)에 특화되어 있어, 다양한 코드 구조와 프로그래밍 패턴을 가진 임베디드 시스템 전반에 대한 일반화된 분석이 어렵다. 이는 특히 반복문이나 복잡한 제어 흐름을 가진 코드에서 발생할 수 있는 취약점을 놓칠 수 있는 가능성을 내포한다.
본 연구에서는 이러한 한계점들을 극복하기 위해, 싱크 함수에 의존하지 않는 코드 패턴 기반의 취약점 탐지 기법을 제안한다. 구체적으로, 다음과 같은 접근 방식을 채택했다:
1. 반복문 중심의 분석: 특히 반복문 내에서의 메모리 관련 취약점 탐지에 초점을 맞추었다. 이는 기존 연구들이 주로 다루지 않았던 영역으로, 임베디드 시스템에서 발생하는 버퍼 오버플로우 취약점을 효과적으로 식별할 수 있게 한다.
2. 코드 패턴 기반 접근: 싱크 함수에 의존하지 않고, 대신 메모리 접근 및 조작과 관련된 특정 코드 패턴을 정의하고 이를 탐지하는 방식을 채택했다. 이를 통해 코드 구조에 대응할 수 있는 유연성을 확보했다.
이러한 접근 방식을 통해, 본 연구는 임베디드 시스템의 특정 코드 패턴에 대응할 수 있는 보다 확장성 있는 분석 방법을 제시하고자 한다.
2.2 배경지식
2.2.1 Ghidra
Ghidra[13]는 미국 국가안보국(NSA)이 개발한 오픈 소스 역공학 프레임워크로, 바이너리 코드의 디스어셈블리, 디컴파일, 그리고 다양한 분석 기능을 제공한다. 이 도구는 다양한 프로세서 아키텍처와 파일 포맷을 지원하며, 사용자 정의 스크립트와 플러그인을 통해 기능 확장이 가능하다. Ghidra는 복잡한 소프트웨어의 역공학 분석을 효율적으로 수행할 수 있도록 강력한 GUI와 자동화된 분석 도구를 제공한다.
2.2.2 P-code
P-code는 Ghidra에서 사용되는 중간 표현(Intermediate Representation, IR) 언어로, 기계어 코드를 프로세서에 독립적인 형태로 추상화한다. 이를 통해 다양한 아키텍처의 바이너리 코드에 대한 통일된 분석이 가능해진다. P-Code는 각 기계어 명령을 작은 단위의 연산으로 분해하여 표현하며, 이는 데이터 흐름 분석과 제어 흐름 분석에 활용된다. P-Code를 사용함으로써 프로그램의 로우 레벨 동작을 고수준에서 이해하고 분석할 수 있다.
2.2.3 Varnode
Varnode는 Ghidra의 P-Code에서 사용되는 기본 데이터 단위로, 프로그램의 변수, 상수, 메모리 위치 등을 표현한다. 각 Varnode는 특정한 주소 공간에서의 위치와 크기를 나타내며, 이를 통해 메모리나 레지스터와 같은 저장소의 상태를 추적할 수 있다. Varnode는 프로그램의 데이터 흐름을 분석하는 데 핵심적인 역할을 하며, 변수의 정의와 사용 관계를 명확히 파악할 수 있도록 도와준다. 이를 활용하여 정적 분석 과정에서 잠재적인 취약점을 식별할 수 있다.
2.2.4 SSA(Static Single Assignment) form
SSA 폼은 프로그램의 각 변수가 단 한 번만 할당되는 형태로 변환된 중간 표현이다. 이 형식을 사용하면 변수의 정의와 사용 관계가 명확해져 데이터 흐름 분석이 단순화된다. SSA 폼에서는 동일한 변수가 재할당될 때마다 새로운 이름의 변수가 생성되므로, 변수의 값 추적이 용이하다. 이는 컴파일러 최적화 과정에서 죽은 코드 제거, 상수 전파, 그리고 중복 계산 제거 등 다양한 최적화 기법에 활용된다.
2.2.5 강결합 구성 요소(Strongly Connected Components, SCC)
SCC는 방향 그래프에서 모든 노드 쌍에 대해 서로 도달 가능한 최대 부분 그래프를 의미한다. 프로그램의 제어 흐름 그래프(Control Flow Graph)나 호출 그래프(Call Graph)에서 SCC를 식별하면, 순환 구조나 재귀 호출과 같은 복잡한 제어 흐름을 분석할 수 있다. SCC 분석은 프로그램의 모듈성 평가, 최적화 기회 탐색, 그리고 잠재적인 무한 루프나 교착 상태와 같은 결함 탐지에 중요한 역할을 한다.
III. 동기 부여 사례
본 장에서는 제안하는 방법론의 필요성을 설명하기 위한 동기 부여 예제로 TP-Link TL-WR940N 라우터에서 발견된 CVE-2022-24355[12] 취약점을 살펴본다. 이 취약점은 기존의 strcpy와 같은 싱크 함수를 사용하지 않기 때문에, 알려진 싱크 함수 기반의 분석 방법으로는 탐지하기 어려운 특성을 가지고 있다. 따라서 CVE-2022-24355 취약점은 본 연구에서 제안하는 새로운 접근 방식의 필요성을 잘 보여준다.
3.1 예제 코드
Fig. 1.은 19번 라인에 버퍼 오버플로 오류가 포함된 코드를 보여준다. 해당 코드 스니펫은 외부에서 수신된 데이터에 대한 파일 이름 확장자를 구문 분석하는 기능을 수행한다.

Fig. 1. Pseudocode of motivation example
세부적으로는 라인 13-16에서 파일 확장자를 추출한다. 이 반복문은 param_1의 끝에서 역방향으로 탐색하여 마지막 ‘.’ 문자의 위치를 찾는다.
문자의 위치를 식별한 후, 라인 17-20에서 확장자의 길이를 계산한다. 이때 반복문의 조건이 버퍼의 크기를 고려하지 않아 버퍼 오버플로우가 발생한다.
기존의 정적 분석 기법, 특히 싱크 함수 기반의 분석 방법들은 Fig. 1.과 같은 취약점을 탐지하는 데 여러 한계를 보인다. 이러한 방법들은 주로 잘 알려진 위험 함수들을 중심으로 분석을 수행하기 때문에, 커스텀 구현된 로직에서 발생하는 취약점을 효과적으로 식별하지 못하는 경우가 많다. 특히, 복잡한 제어 흐름과 사용자 정의 메모리 조작이 포함된 코드에서는 이러한 한계가 더욱 두드러진다.
3.2 메모리 증가 패턴 정의
본 절에서는 CVE-2022-24355와 같은 취약점을 일반화하여 표현할 수 있는 메모리 증가 패턴을 정의한다. 이 패턴은 루프 내에서 발생하는 메모리 접근 및 조작 과정을 추상화하여 나타낸다. Fig. 3.은 이러한 일반화된 메모리 증가 패턴을 보여준다.

Fig. 2. Overview of Pattern Based Detection Tool

Fig. 3. Genaralized Memory Increase Pattern in Loops
이 알고리즘은 다음과 같은 주요 특징을 가진다:
⦁ 라인 2: 알고리즘은 base 주소부터 시작하여 size 크기의 할당된 메모리 영역에 대한 접근을 모델링한다.
⦁ 라인 3: 사용자 입력 input이 루프의 동작과 메모리 접근 패턴에 영향을 미칠 수 있음을 나타낸다.
⦁ 라인 4: 함수 f(i)를 통해 계산되는 access_index는 메모리 접근의 동적 특성을 표현한다.
⦁ 라인 5: access_index가 할당된 메모리 범위를 벗어나는지 확인하여 잠재적인 out-of-bounds 접근을 탐지한다.
⦁ 라인 8: 함수 g를 통해 입력 데이터를 처리하고 메모리에 저장하는 과정을 추상화한다.
⦁ 라인 9: 함수 h를 사용하여 메모리 주소의 증가를 모델링한다. 이는 선형적이거나 비선형적일 수 있다.
⦁ 라인 10: step 함수를 통해 반복자 i의 갱신을 표현하며, 이 또한 입력에 의존할 수 있다.
⦁ 라인 12: 루프 종료 후 접근한 메모리 범위가 할당된 크기를 초과하는지 확인하여 잠재적 버퍼 오버플로우를 탐지한다.
이 일반화된 패턴은 CVE-2022-24355와 같은 특정 취약점뿐만 아니라, 다양한 형태의 메모리 관련 취약점을 포괄할 수 있다. 예를 들어, 단순한 버퍼 오버플로우부터 복잡한 인덱스 조작을 통한 메모리 접근 오류까지 다양한 시나리오를 이 모델로 표현할 수 있다.
이러한 패턴 정의는 정적 분석 도구가 다양한 코드 구조에서 잠재적인 메모리 취약점을 식별하는 데 기반이 될 수 있다.
IV. 설계
본 연구에서는 Fig. 1.과 같은 취약점을 탐지할 수 있도록 도구를 설계한다. Fig. 2.은 도구의 전체적인 아키텍처를 나타낸다. 확장된 싱크 탐지를 위해 제안하는 설계는 코드 패턴 탐지 모듈와 도달 가능성 분석 모듈의 두 단계로 구성된다.
4.1 코드 패턴 탐지 모듈
코드 패턴 탐지 단계는 바이너리 내에서 잠재적 취약점을 나타낼 수 있는 특정 코드 구조, 특히 반복문 패턴을 식별한다. 이 과정은 다음과 같은 세부 단계로 구성된다.
4.1.1 제어 흐름 그래프 구축
각 함수에 대한 제어 흐름 그래프(Control Flow Graph, CFG)를 구축한다. Ghidra의 BasicBlockModel을 활용하여 함수의 기본 블록을 식별하고, 이를 바탕으로 CFG를 생성한다.
4.1.2 반복문 구조 식별
구축된 CFG를 바탕으로 Tarjan의 강연결 요소(Strongly Connected Component, SCC) 알고리즘을 사용하여 루프 구조를 식별한다. SCC는 그래프 내에서 모든 노드가 서로 도달 가능한 최대 부분 그래프를 의미한다. 프로그램에서 루프는 SCC로 표현되므로, 이 알고리즘을 통해 효과적으로 루프 구조를 탐지한다.
4.1.3 반복문 구성 요소 분석
식별된 각 반복문에 대해 반복문 헤더, 반복 에지, 탈출 에지를 분석한다. 루프 헤더는 루프로 진입하는 유일한 진입점으로, 루프의 시작을 나타낸다. 반복 에지는 루프의 끝에서 다시 헤더로 돌아가는 에지를 의미하며, 이를 통해 반복문의 반복 구조를 파악한다.
4.1.4 메모리 접근 패턴 분석
메모리 접근 패턴 분석의 주요 목적은 반복문 내부의 메모리 접근 행위를 정확히 식별하고, 프로그램의 메모리 사용 행태를 체계적으로 이해하는 것이다. 이를 위해 본 연구에서는 STORE 연산 식별과 데이터 의존성 분석을 수행한다. 데이터 의존성 분석은 프로그램 내 변수들 간의 복잡한 관계를 파악하고 데이터 흐름을 정밀하게 추적함으로써, 메모리 접근 패턴을 정확히 이해하고 잠재적인 취약점을 효과적으로 식별하는 데 필수적인 역할을 한다.
패턴 분석의 첫 단계로, 반복문 내의 중간 언어 표현 중에서 STORE 연산을 식별한다. STORE 연산은 메모리에 데이터를 쓰는 핵심적인 작업을 나타내며, 이는 반복문에서 메모리에 대한 반복적인 접근을 의미한다. 따라서 STORE 연산의 패턴은 잠재적인 버퍼 오버플로우 취약점을 나타내는 중요한 지표가 될 수 있다. 이를 위해 반복문의 각 기본 블록 내의 모든 중간 언어 표현을 철저히 검사하여 STORE 연산을 식별하고, 해당 연산의 특성과 컨텍스트를 상세히 분석한다.
4.1.5 SSA 기반 데이터 의존성 구축
데이터 의존성 구축의 목적은 변수들 간의 관계를 정확히 파악하고, 패턴을 상세히 분석해 의미있는 수식을 생성하기 위함이다. 수식을 통해서 반복문 내의 변수 변화를 추적할 수 있다.
식별된 STORE 연산을 시작으로 반복문 내부에 제한되는 데이터 의존성을 생성한다. P-code의 저장 공간을 일반화하기 위해 사용되는 varnode를 재귀적으로 분석하여 데이터 의존성을 생성한다. 이때 P-code가 정적 단일 할당(Static Single Assignment, SSA) 형석을 따른다는 특성을 이용한다.
데이터 의존성 생성 과정은 다음과 같다.
단계 1) STORE 연산 식별. 반복문 내부에서 STORE 연산을 식별한다. 이 연산은 메모리에 데이터를 쓰는 작업을 나타내며, 잠재적인 버퍼 오버플로우의 시작점이 될 수 있다.
단계 2) Varnode 분석. STORE 연산에 사용되는 varnode를 시작으로 재귀적 분석을 수행한다. Varnode는 P-code에서 저장 공간을 일반화하여 표현하는 객체로, 레지스터, 메모리 위치, 상수 등을 나타낼 수 있다.
단계 3) 재귀적 의존성 추적. 각 varnode의 정의(def)를 찾 역방향으로 추적한다. SSA 형식 덕분에 각 varnode는 단 한 번만 정의되므로, 이 과정이 명확하고 효율적으로 수행될 수 있다.
단계 4) 반복문 내부 연산 식별. 추적 과정에서 만나는 연산들 중 반복문 내부에 속한 것들만을 선별한다. 이는 반복문의 경계를 넘어가는 데이터 흐름을 제외하고, 순수하게 루프 내부의 동작에 집중하기 위함이다.
단계 5) 수식 표현 구성. 식별된 연산들을 바탕으로 데이터 의존성을 수학적 수식으로 표현한다. 이 과정에서 SSA 형식의 특성을 활용하여 각 변수의 버전을 명확히 구분한다.
단계 6) 수식 해결. 루프 반복에 따른 변수 값의 변화를 표현하기 위해 구성된 수식을 해결한다. 예를 들어, 루프 반복 횟수를 나타내는 변수 i를 도입하여 각 변수의 값이 i에 따라 어떻게 변하는지 표현한다.
Fig. 4.는 구축된 데이터 의존성을 통해 표현된 반복문 내부 수식을 나타낸다.

Fig. 4. Expressing data-dependent formulas restricted to inside a loop
구축된 데이터 의존성 모델은 STORE 연산의 주소 계산 과정을 명확히 파악할 수 있고, 수식 해결 과정을 통해 값 변화를 간단히 확인할 수 있다. 따라서 비교적 빠른 시간 안에 메모리 증가를 포함하는 반복문 패턴을 식별한다.
4.2 도달 가능성 분석 모듈
도달 가능성 분석 모듈은 식별된 취약점 후보(싱크)가 실제로 외부 입력으로부터 영향을 받을 수 있는지를 평가하는 역할을 한다. 이 모듈은 소스 함수로부터 식별된 싱크까지의 잠재적인 실행 경로를 분석하여 취약점의 위험도를 판단한다. 이 과정은 다음과 같은 단계로 구성된다:
4.2.1 소스 함수 식별
프로그램 내에서 외부 입력을 받는 함수들을 소스 함수로 정의한다. 본 연구에서는 분석을 통해 소스 함수를 식별했다.
4.2.2 함수 참조 분석
각 함수에 대해 참조(reference) 분석을 수행한다. 이 과정에서 직접 호출, 간접 호출, 데이터 참조를 식별해 각 함수가 어디에서 사용되는지 패턴을 파악한다.
4.2.3 호출 그래프 구축
참조 분석이 완료되면 소스부터 싱크까지 이어지는 호출 그래프를 구축한다. 호출 그래프를 통해 소스와 싱크의 관계를 간략히 식별하고, 단순히 코드 패턴 매칭이나 개별 함수 분석으로는 파악하기 어려운 취약점의 흐름을 제공함으로써, 더 정확하고 효율적인 분석을 가능하게 한다.
V. 구현
본 연구에서 제안하는 취약점 탐지 방법론을 검증하기 위해 프로토타입 시스템을 개발하였다. 이 시스템은 약 1,500줄의 Python 코드로 구현되었으며, 아키텍처 독립적인 속성을 유지하도록 Ghidra의 중간 표현(Intermediate Representation, IR)인 P-code를 기반으로 설계되었다.
Ghidra의 P-code를 기반으로 한 구현은 본 시스템에 중요한 아키텍처 독립성(architecture-independecy)을 부여한다. 이는 x86, ARM, MIPS 등 다양한 프로세서 아키텍처의 바이너리를 동일한 방식으로 분석할 수 있게 해주며, 특히 다양한 하드웨어 플랫폼을 사용하는 임베디드 시스템과 IoT 기기의 펌웨어 분석에 큰 강점을 제공한다. 저수준의 어셈블리 대신 보다 추상화된 IR을 사용함으로써, 복잡한 분석 로직을 간소화하고 코드의 가독성과 유지보수성을 높일 수 있었다.
VI. 평가
본 연구에서 제안한 취약점 탐지 방법론의 효과성을 평가하기 위해 두 가지 주요 연구 질문을 설정하고 실험을 수행한다. 실험은 우분투 20.04 호스트에 16GB 램과 3.2GHz의 6코어 인텔 i7-8700 CPU로 진행한다.
⦁ RQ1: 제안된 방법론이 다양한 아키텍처에서 반복문 내부의 메모리 증가를 효과적으로 추론할 수 있는가?
⦁ RQ2: 제안된 방법론이 기존의 정적 분석 도구들이 탐지하지 못하는 취약점을 식별할 수 있는가?
6.1 실험 설계 및 결과
6.1.1 RQ1에 대한 평가
본 연구에서는 메모리 증가 패턴이 포함된 코드 샘플을 작성하여 x86, x64, ARM, MIPS의 4가지 주요 아키텍처에 대해 실험을 진행한다. 실험 방법은 다음과 같다. 첫째, 메모리 증가 패턴이 포함된 C코드 샘플을 작성한다. Fig. 5.은 해당 코드 샘플을 나타낸다. 둘째, 아키텍처 독립성 확인을 위해 샘플을 4가지 아키텍처(x86, x64, ARM, MIPS)로 컴파일하고, 마지막으로, 각 아키텍처별로 메모리 증가 패턴 탐지 여부 평가한다. 해당 평가는 반복문의 내부 메모리 할당과, 메모리의 증가를 정적 분석을 통해 추론할 수 있는가를 알아본다. 따라서 코드 패턴 탐지 모듈로 컴파일된 바이너리에 대해 평가를 진행한다. Table 1.은 탐지 결과를 나타낸다.

Fig. 5. Sample code with memory increase patterns
Table 1. Detection result of sample code

Table 2. Detection result of CVE-2022-24355

실험 결과, 개발한 코드 패턴 탐지 모듈은 x86, x64, ARM, MIPS의 4개 주요 아키텍처에서 메모리 증가 패턴을 성공적으로 탐지하였다. 이는 제안된 기법이 아키텍처 독립적으로 정적 분석을 통해 메모리 주소 증가를 추론할 수 있다는 것을 시사한다.
주목할 만한 점은 x64 아키텍처에서의 탐지 시간이 다른 아키텍처에 비해 약 2배 정도 높게 나타났다는 것이다. 이러한 현상은 64비트 주소 공간 처리의 복잡성에서 기인한 것으로 분석된다. 구체적으로, Ghidra 분석 도구가 x64 아키텍처를 처리할 때 내부적으로 더 많은 P-code 중간 언어를 생성하는 것으로 파악된다. 이는 x64 아키텍처의 확장된 주소 공간과 레지스터를 정확히 표현하기 위한 것으로 보인다.
그러나 이러한 처리 시간의 차이에도 불구하고, 탐지 모듈의 정확성은 모든 아키텍처에서 일관되게 유지되었다. 이는 본 연구에서 제안한 메모리 증가 패턴 탐지 기법이 아키텍처의 특성에 크게 영향을 받지 않는 견고성을 가지고 있음을 입증한다.
이러한 결과는 제안된 정적 분석 기반 취약점 탐지 기법이 다양한 컴퓨팅 환경에서 효과적으로 적용될 수 있음을 시사한다.
6.1.2 RQ2에 대한 평가
동기 부여 사례로 사용된 CVE-2022-24355에 대해서, 실제 해당 취약점이 존재하는 TP-Link TL-WR940N 라우터의 펌웨어 바이너리를 대상으로 실험을 진행하였다.
실험 결과, 최신 펌웨어 분석 도구인 Karonte와 SaTC의 경우, 해당 취약점을 탐지하지 못했다. 이러한 결과는 싱크 함수 의존성이 그 원인으로 분석된다. Fig. 6.과 Fig. 7.은 각각 Karonte와 SaTC의 실제 sink 함수를 나타낸다. Karonte와 SaTC는 미리 정의된 싱크 함수들을 기반으로 취약점을 탐지한다. 따라서 코드에 정의되어 있지 않은 함수나 취약점은 탐지할 수 없다.

Fig. 6. Sink functions in Karonte

Fig. 7. Sink functions in SaTC
CVE-2022-24355와 같은 일부 취약점들은 이러한 전통적인 싱크 함수들과 직접적인 연관이 없다. 이로 인해 이러한 도구들은 특정 패턴을 가지는 취약점을 식별할 수 없다.
반면, 본 연구에서 제안한 방법론은 이러한 한계를 극복하고 CVE-2022-24355 취약점을 성공적으로 탐지한다. 이는 해당 접근법이 보다 유연하고 컨텍스트 인식적이며, 전통적인 싱크 함수에 의존하지 않는 취약점도 식별할 수 있고, 확장성을 제공할 수 있음을 시사한다.
6.1.3 성능 평가
제안된 방법의 시간복잡도를 측정하기 위해 TP-Link TL-WR940N 라우터 펌웨어 내부 여러 바이너리를 대상으로 분석 시간을 측정한다. 본 연구는 펌웨어 내부 바이너리를 대상으로 분석을 수행하기 때문에 동일한 환경에서 바이너리 크기에 따른 분석 시간을 기준으로 측정한다. Fig. 8.는 실험 결과를 나타낸다.

Fig. 8. Analysis time based on binary size
평가 결과 제안된 방법론은 바이너리 크기에 따라 분석 시간이 증가하는 것으로 평가된다. 그러나 이 관계는 완전히 선형적이지 않으며, 바이너리의 복잡성과 내부 구조에 따라 변동성을 보인다.
특히, 63KB 크기의 iptables 바이너리의 경우 114KB의 lld2d 바이너리보다 분석 시간이 더 길게 나타났다. 이는 바이너리의 크기뿐만 아니라 내부 구조의 복잡성이 분석 시간에 영향을 미칠 수 있음을 시사한다. 실제로 분석 결과 iptables 바이너리는 lld2d 바이너리보다 복잡한 반복문을 많이 포함하고 있었다.
전체적으로, 제안된 방법의 시간복잡도는 O(n log n)에 근사하는 것으로 추정된다. 여기서 n은 바이너리의 크기를 나타낸다. 그러나 일부 복잡한 구조를 가진 바이너리의 경우 이보다 더 높은 복잡도를 보일 수 있다.
VII. 논의
본 연구에서 제안한 방법론은 임베디드 시스템 펌웨어의 취약점 탐지에 있어 확장성을 보여주었다. 그러나 이 접근 방식에는 몇 가지 한계점과 향후 연구 방향이 존재한다.
7.1 한계점 및 향후 연구 방향
본 연구의 한계점으로는 첫째, 오탐(False positives) 발생 가능성이 여전히 존재한는 것이다. 특히 포인터 에일리어스(Pointer alias)와 같이 정확한 메모리 위치를 식별하기 어려운 코드 패턴이나 고도로 최적화된 바이너리에서는 정확한 취약점 식별이 어려울 수 있다. 둘째, 전역 변수 또는 바이너리 간 데이터 흐름과 같이 직접적으로 식별되지 않는 데이터 흐름에 대한 도달 가능성 분석이 어렵다. 셋째, 현재 접근 방식은 정적 분석에 중점을 두고 있어, 동적으로 생성되는 코드나 런타임 환경에 크게 의존하는 취약점을 탐지하는 데 한계가 있다. 마지막으로, 분석되지 않은 취약점 패턴에 대해서는 탐지하지 못한다는 점이다.
따라서 향후 연구로는 다음과 같은 방향을 제시한다. 첫째, 새로운 취약점 패턴에 대응하기 위해 다양한 패턴 정의 및 업데이트 메커니즘을 개발하는 것이다. 이는 지속적으로 다양한 공격 기법과 취약점 유형에 효과적으로 대처할 수 있게 해줄 것이다. 둘째, 최신 연구들의 데이터 분석 방법론을 반영한 싱크 함수 방식 적용. 이는 제안된 패턴 기반 탐지와 싱크 함수 방식이 결합되어 더 강력한 정적 분석 도구를 제안할 수 있을 것이다. 셋째, 동적 분석 기법과의 통합을 통해 더 포괄적인 분석이 필요하다. 정적 분석만으로는 런타임 환경에 의존적인 취약점을 놓칠 수 있으므로, 동적 분석과의 결합을 통해 분석의 정확도와 범위를 확장할 수 있을 것이다. 또한, 성능 최적화를 위해 병렬 처리 기법과 더 효율적인 알고리즘을 도입하여 대규모 펌웨어 분석 시의 처리 속도를 개선할 필요가 있다.
VIII. 결론
본 연구에서는 임베디드 시스템 펌웨어의 취약점 탐지를 위한 새로운 정적 분석 방법론을 제안하였다. 이 방법론은 코드 패턴 탐지, 데이터 의존성 분석을 통합하여 기존 접근법의 한계를 극복하고자 하였다. 주요 연구 결과는 다음과 같다: 다양한 아키텍처(x86, x64, ARM, MIPS)에서 메모리 증가 패턴을 탐지할 수 있음을 입증하였다. 기존의 정적 분석 도구들이 탐지하지 못하는 취약점(CVE-2022-24355)을 성공적으로 식별하였다.
또한 반복문 구조와 메모리 조작 패턴을 정확히 분석할 수 있는 능력은 IoT 기기의 보안 강화에 기여할 수 있다. 결론적으로, 본 연구는 날로 증가하는 IoT 기기의 보안 위협에 대응하기 위한 중요한 도구를 제공함으로써, 더 안전한 디지털 생태계 구축에 기여할 수 있을것이라고 기대한다.
References
- Statista, "Internet of Things (IoT) connected devices installed base worldwide from 2015 to 2025," https://www.statista.com/statistics/471264/iot-number-of-connected-devices-worldwide/, Jun. 2024.
- Palo Alto Networks, "2020 Unit 42 IoT Threat Report," https://unit42.paloaltonetworks.com/iot-threat-report-2020/, Jun. 2024.
- Yan Shoshitaishvili, Ruoyu Wang, Christopher Hauser, Christopher Kruegel, and Giovanni Vigna, "Firmalice - Automatic Detection of Authentication Bypass Vulnerabilities in Binary Firmware," Proceedings 2015 Network and Distributed System Security Symposium, pp. 1-15, Feb. 2015.
- Nilo Redini, Aravind Machiry, Ruoyu Wang, Chad Spensky, Andrea Continella, Yan Shoshitaishvili, Christopher Kruegel, and Giovanni Vigna, "Karonte: Detecting Insecure Multi-binary Interactions in Embedded Firmware," Proceedings of the 2020 IEEE Symposium on Security and Privacy, pp. 1544-1561, May. 2020.
- Kai Cheng, Dongliang Fang, ChuanQin, Huizhao Wang, and YaowenZheng, "Automatic Inference of TaintSources to Discover VulnerabilitiesinSOHO Router Firmware," 36thIFIPInternational Conference on ICT Systems Security and Privacy Protection, pp. 83-99, Jun. 2021
- Puzhuo Liu, Yaowen Zheng, Chengnian Sun, Chuan Qin, Dongliang Fang, Mingdong Liu, and Limin Sun, "FITS: Inferring Intermediate Taint Sources for Effective Vulnerability Analysis of IoT Device Firmware," Proceedings of 28th ACM International Conference on Architectural Support for Programming Languages and Operating Systems, vol. 4, pp. 138-152, Mar. 2023
- Sanchuan Chen, Zhiqiang Lin, and Yinqian Zhang, "SelectiveTaint: Efficient Data Flow Tracking With Static Binary Rewriting," 30th USENIX Security Symposium, pp. 1665-1682, Aug. 2021.
- K. Cheng, Y. Zheng, T. Liu, L. Guan, P. Liu, H. Li, H. Zhu, K. Ye, and L. Sun, "Detecting vulnerabilities in linux-based embedded firmware with sse-based on-demand alias analysis," Proceedings of the 32nd ACM SIGSOFT International Symposium on Software Testing and Analysis, pp. 360–372. Jul. 2023.
- Libo Chen, Yanhao Wang, Quanpu Cai, Yunfan Zhan, Hong Hu, Jiaqi Linghu, Qingkai Shi, and Yueqiang Cheng, "Sharing More and Checking Less: Leveraging Common Input Keywords to Detect Bugs in Embedded Systems," 30th USENIX Security Symposium, pp. 303-319, Aug. 2021.
- Libo Chen, Quanpu Cai, Zhenbang Ma, Yanhao Wang, Hong Hu, Minghang Shen, Yue Liu, Shanqing Guo, Haixin Duan, Kaida Jiang, and Zhi Xue, "SFuzz: Slice-based Fuzzing for Real-Time Operating Systems," Proceedings of the 2022 ACM SIGSAC Conference on Computer and Communications Security, pp. 485-498, Nov. 2022.
- Wil Gibbs, Arvind S Raj, Jayakrishna Menon Vadayath, Hui Jun Tay, Justin Miller, Akshay Ajayan, Zion Leonahenahe Basque, Audrey Dutcher, Fangzhou Dong, Xavier Maso, Giovanni Vigna, Christopher Kruegel, Adam Doupé, Yan Shoshitaishvili, and Ruoyu Wang, "Operation Mango: Scalable Discovery of Taint-Style Vulnerabilities in Binary Firmware Services," 33rd USENIX Security Symposium, pp. 7123-7139, Aug. 2024.
- MITRE, "CVE-2022-24355," https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-24355, Jun. 2024.
- GHIDRA, 'Ghidra Software Reverse Engineering Framework,' https://ghidra-sre.org/, Jun. 2024.
- Zhen Li, Deqing Zou , Shouhuai Xu§, Xinyu Ou, Hai Jin, Sujuan Wang, Zhijun Deng and Yuyi Zhong "VulDeePecker: A Deep Learning Based System for Vulnerability Detection," Proceedings 2018 Network and Distributed System Security Symposium, pp.1-15, Feb. 2018.
- El Habib Boudjema, Sergey Verlan, Lynda Mokdad and Christèle Faure, "VYPER: Vulnerability detection in binary code," Security and Privacy, vol. 3, no. 2, pp. e100, Mar. 2020. https://doi.org/10.1002/spy2.100
- Weiteng Chen, Xiaochen Zou, Guoren Li, and Zhiyun Qian, "KOOBE: Towards Facilitating Exploit Generation of Kernel Out-Of-Bounds Write Vulnerabilities," 29th USENIX Security Symposium, pp. 1093-1110, Aug. 2020.
- Adriana Sejfia and Nenad Medvidovic, "Strategies for Pattern-Based Detection of Architecturally-Relevant Software Vulnerabilities," IEEE International Conference on Software Architecture, pp. 92-102, Mar. 2020.
- Angr, "angr open-source binaryanalysis platform," https://angr.io/, Jun.2024.