[보안뉴스= 정동재 KAIST 사이버보안연구센터 악성코드 분석팀 팀장] 제어 흐름 공격을 막기 위해 많은 전문가들이 제어 흐름 무결성(CFI: Control Flow Integrity)을 연구했지만, 모든 제어 흐름 공격을 막을 수는 없었습니다. CFI는 정적 분석을 통해 CFG(Control Flow Graph)를 생성하고, 실행 시점에 CFG 정책을 준수하는지 확인하는데, 프로그램의 경로는 프로그램의 ‘문맥’에 의해 좌우되므로 CFG를 생성하는 시점에서는 정확한 경로를 알 수 없기 때문입니다. 그 이유는 CFG는 정적 분석에서 생성되는데, 이때는 여러 경로의 정상적인 실행 흐름에 대한 여러 후보만 파악할 수 있으며, 단 하나의 정확한 경로로 특정하는 것은 오직 실행 시의 ‘문맥’에 의해 결정되기 때문입니다.

[이미지=utoimage]
좀 더 구체적으로 접근해 보면, 간접 제어 분기문에서 분기될 수 있는 A, B의 경로가 존재할 때, 정적 분석을 통해 생성된 CFG는 본래의 프로그램에서 두 개의 정상적인 경로가 존재합니다. 하지만, 실행 시점에서 프로그램이 A로 분기되도록 의도되어 실행되더라도, 공격으로 인해 변조되어 B로 분기될 수 있습니다. 이 경우에도 CFI는 A, B 경로 모두 정상적인 실행 흐름으로 간주하기 때문에 공격을 탐지하지 못합니다.
이러한 상황에서 제어 흐름 공격을 정확하게 판단하기 위해서는 어떻게 해야 할까요? 정상적인 실행 흐름에 대한 정의를 더욱 세분화할 필요가 있습니다. 예를 들어, A, B 각각의 경로로 가기 위한 조건에 대한 정보를 추가하는 것이 가능합니다. 변수 x의 값에 x가 0보다 크면 A 경로, x가 0보다 작을 때 B경로로 분기될 때, 변수 x의 값도 경로를 판단하는 정보로 추가하는 것입니다. 여기서 변수 x의 값은 실행 시점에서 경로를 결정짓는 중요한 역할을 담당합니다. 이처럼 CFG 정책에서 간접 제어 분기문이 여러 경로로 분기될 수 있을 때, 각각의 경로로 분기되기 위한 추가적인 조건을 분석하여 CFG와 함께 검사할 수 있습니다.
실제로 최신 연구 동향을 살펴보면 이러한 방식으로 CFG 정책을 더욱 세밀하게 제한함으로써 보안성을 더욱 향상하는 방식이 주를 이루고 있습니다. 간접 제어 흐름과 관련된 프로그램의 문맥을 분석하여 간접 제어 분기문의 경로를 결정짓는 데이터를 기준으로 경로를 더욱 세분화하는 방식으로 접근합니다. 이러한 데이터는 간접 제어 분기문의 값을 직접 변경하는 데이터 또는 간접적으로 영향을 끼치는 데이터가 포함됩니다.
예를 들어, 함수 포인터가 존재할 때 이 포인터는 데이터 x가 0보다 클 때 함수 A를 할당하고, x가 0보다 작거나 같을 때 함수 B를 할당한다고 할 때, A와 B는 포인터의 값에 직접적으로 영향을 끼칩니다. 마찬가지로 데이터 x의 경우, x의 값에 의해 제어 흐름이 변경되어 포인터의 값에 간접적으로 영향을 끼치는 데이터에 해당합니다. 기존의 CFG에서는 함수 포인터는 경로 A 또는 B로 갈 수 있다고 정의되지만, 이 데이터들을 분석하여 적용하면, 포인터의 값이 A이고 데이터 x가 0보다 클 때, 경로 A로 분기한다는 추가적인 정보를 바탕으로 경로를 확정 지을 수 있습니다.

▲정동재 KAIST 사이버보안연구센터 악성코드 분석팀 팀장[사진=KAIST]
이 연구들의 공통점은 간접 제어 분기문의 값을 변경시키는 데이터를 정의하고 분석한 뒤, 이 데이터의 값에 따라서 변경되는 간접 제어 분기문의 경로를 추가로 제한하는 더욱 세분화된 CFG 정책을 작성했다는 것입니다. 다만, ‘어떤 데이터를 이용해서 CFG 정책을 더욱 제한하는가?’의 차이점만 존재할 뿐입니다.
인텔에서 최근에 탑재된 CET(Control-flow Enforcement Technology) 기술 또한 프로그램의 ‘문맥’을 알 수 없다는 한계점을 가지기 때문에 실행 시 문맥에 의해 결정되는 정확한 경로를 알 수 없기에 완벽한 보안을 제공하지 못합니다. 이를 통해 우리가 생각해야 할 교훈은 하나의 최신 보안 기술이 나오더라도 그 기술이 모든 보안 문제를 해결해 줄 수 있는 것은 아니라는 점입니다. 다양한 보안 기술들이 서로 보완하면서 기능할 때 비로소 안전한 시스템이 완성되지 않을까 생각합니다. CFI 또한 자신의 역할을 충실히 할 수 있도록 더욱 향상된 기법이 연구되어 완전무결한 CFI의 종착점에 도달하길 기대합니다.
[글_ 정동재 KAIST 사이버보안연구센터 악성코드 분석팀 팀장]
<저작권자: 보안뉴스(www.boannews.com) 무단전재-재배포금지>