코드 난독화 기술...변환의 수준 및 단위, 변환의 시점 및 방식, 대상 등 분류 가능
[보안뉴스 김영명 기자] ‘안티탬퍼링(Anti-Tampering)’이란 무기체계 코드 기술보호기법으로, 외부에서 기술 자산을 탈취할 수 없도록 방어하는 기술을 의미한다. 안티탬퍼링은 단순한 물리적인 방책부터 고도의 기술을 이용해 전문적인 지식 없이는 접근할 수 없는 방책까지 다양하다. 이 기술은 유·무형의 자산을 어우르기 때문에 우리의 삶에서 인지하지 못하는 부분까지 다양하게 적용돼 있다.

[이미지=gettyimagesbank]
한국과학기술원(KAIST) 사이버보안연구센터(차상길 센터장, CSRC)는 ‘소프트웨어 안티탬퍼링의 정의 및 분류 그리고 기반 기술’에 대해 소개했다. 안티탬퍼링을 가장 쉽고 간편하게 설명할 수 있는 사례를 보면 미국 애플(Apple)사의 아이폰(iPhone)에 적용된 나사를 들 수 있다.
아이폰의 하단부 충전 단자 양쪽을 보면 두 개의 나사로 조여져 있는데, 나사의 머리 부분은 흔히 일상에서 사용하는 ‘+’ 혹은 ‘-’가 아닌 ‘★’모양인 것을 알 수 있다. 이 특이한 나사는 ‘Pentalobe Security Screw’로 국내에서는 ‘별 렌치’라고 부르는 보안 나사다. 이를 풀고 조이기 위해선 같은 모양의 도구가 필요하며, 모양이 다른 드라이버로 강제로 풀거나 조이기 위해 힘을 가하게 되면 나사가 손상돼 더 이상 조일 수도 풀 수도 없게 된다. 이 나사는 2009년부터 애플사의 제품에 적용돼 사용 중이다. 이 외에도 일상에서 쉽게 접하지는 못하지만 다양한 보안 나사들이 존재한다. 이는 외부에서 손쉽게 기기의 외장을 열지 못하게 하려는 단순한 수준의 하드웨어 안티탬퍼링 기술이다.

▲아이폰의 ‘Pentalobe Security Screw’ 및 다양한 모양의 스크류(좌부터)[자료=카이스트 CSRC]
소프트웨어 분야에는 어떤 방식으로 안티탬퍼링을 적용할 수 있을까? 역공학을 통해 소프트웨어를 분석, 위변조를 막는 기술인 소프트웨어 안티탬퍼링은 기술의 적용 목적에 따라 △억지 △예방 △탐지 △대응 등으로 구분할 수 있다. ‘억지’ 기술은 공격 시도 자체를 포기하게 하는 방법으로, 공격을 방어하는 측면에서 기본적인 방법이자 최선의 방어 기술인 안티탬퍼링이다. 보안 나사의 경우가 억지 기술의 일종이며, 소프트웨어의 경우 해시코드, 체크섬 및 스템프로 무결성을 검증해 공격을 사전에 억지할 수 있다. ‘예방’ 기술은 소프트웨어 리버싱을 어렵게 하기 위해 암호화 및 난독화 방법을 적용하는 것으로, 데이터의 가공(변형) 또는 은닉 기술을 이용해 데이터를 숨기거나 복잡도를 증가시켜 중요한 데이터 획득을 어렵게 하는 방법이다.
‘탐지’ 기술은 인증, 접근제어, 무결성 검사와 같은 기술을 이용해 위·변조 시도를 탐지하는 기술이다. ‘대응’ 기술은 공격 시도 탐지 후 로그 기록 분석, 모니터링 강화, 레포팅, 자산 복구, 취약점 패치와 같은 기술을 이용한 사후 보안 강화 기술을 의미한다. 이 네 가지 대응 기술 중 예방 기술 부분에서 ‘안티 리버싱’과 ‘난독화’에 대해 살펴본다.
합법적으로 소스코드를 취득할 수 없는 소프트웨어를 위·변조하기 위해서는 역공학을 통한 소프트웨어 분석이 선행돼야 하는데, 이를 방해하는 방법이 바로 ‘안티 리버싱’ 기술이다. 안티탬퍼링은 안티 리버싱을 포괄하는 의미다.
안티 리버싱은 적용하는 방식에 따라 네 가지로 구분한다. 먼저, ‘소프트웨어의 심볼 정보 제거’는 텍스트와 같은 의미를 내포해 유추 가능한 정보를 삭제하는 방식이다. 클래스명, 클래스 멤버명, 전역 변수 등 다양한 정보를 제거해 분석을 어렵게 한다. ‘안티 디버깅’은 프로그램을 분석하기 위해 역공학을 진행할 때 디버그 분석을 불가능하게 하는 방식이다. 디버거가 연결된 경우 디버거를 손상하거나 비활성화하는 작업을 의도적으로 수행하게 하는 것이다.
‘안티 디스 어셈블리’는 역공학을 통해 바이너리를 분석하기 위해 디스 어셈블링을 하거나 디컴파일 과정을 거치게 되는데, 이러한 역공학을 막기 위해 프로그램 내 특수한 코드와 데이터를 사용해 실제 실행과 다른 명령어들을 보이게 해 디스 어셈블러나 디컴파일러 도구를 방해하기 위해 사용한다. ‘난독화’ 기법은 역공학을 시도하더라도 코드의 분석 및 이해를 어렵게 해 정보를 쉽게 획득하지 못하게 하는 기술이다. 난독화 기법은 대상, 목적, 방법 등 다양한 관점에서 이뤄진다. 여러 안티 리버싱 중 가장 활발히 연구되는 분야는 난독화 기법이다.

▲난독화 기술의 다양한 분류[자료=카이스트 CSRC]
난독화 기법의 목적은 역설계를 통해 프로그램의 기능을 파악하려는 공격자가 코드를 읽을 수 있다 하더라도 내용을 이해하지 못하도록 하는 기술이다. 난독화가 적용된 코드는 사람이 이해하기 힘들게 변조되어 은닉되지만, 소프트웨어의 본래 기능은 원본과 동일하게 작동된다. 코드 난독화 기술은 크게 △변환의 수준 △변환의 단위 △변환의 시점 및 방식 △변환의 대상 등 네 갈래로 분류할 수 있다.
‘변환의 수준’은 개발 언어 및 난독화 시점에 따라 코드 변환 수준을 결정할 수 있다. 예를 들어 C언어의 경우 바이너리와 소스코드 수준에서의 난독화를 수행하지만, 자바(JAVA)의 경우에는 소스코드 수준에서 중점적으로 난독화 기술이 연구·개발되고 있다. 개발 언어의 특징이나 구조에 따라 변환 대상의 수준이 달라 어떠한 기술이 우월하다고 단정지을 수는 없다.
‘변환의 단위’는 목적에 따라 변환 명령어, 기본 블록, 순환(Loop), 함수, 프로그램, 시스템 등 단위별로 세분해 난독화 수준을 선택할 수 있다. 명령어 수준 변환에서 소스코드는 중간 언어 혹은 어셈블리 명령어로 구성될 수 있으며, 이 단계에서 개별 명령어나 명령어의 시퀀스에 변환을 적용한다. 기본 블록 수준 변환에서 기본 블록은 하나의 진입점과 분기 명령어로 끝나는 순차 명령어 모음을 의미하며, 명령어들을 포괄하는 단위가 된다. 순환 수준 변환은 개발자가 프로그램 내에 삽입한 순환 구조에 변환을 주는 수준을 말한다.
함수 수준 변환에서 특정한 서브 루틴의 기본 블록 및 여러 명령어에 변환을 주며, 함수와 연관된 스택 및 힙 메모리에도 영향을 준다, 프로그램 수준 변환은 애플리케이션 내부의 여러 함수를 대상으로 변환하며, 프로그램의 전역 변수 및 정적 변수와 같은 데이터 세그먼트와 할당된 메모리도 변환의 대상이 된다. 시스템 수준 변환은 운영 체제 또는 런타임 환경을 대상으로 하며 다른 프로그램과 상호작용을 할 때, 변환의 영향을 끼친다.
‘변환의 시점 및 방식’은 변환 시기에 따라 정적·동적 변환으로 구분될 수 있다. 정적 변환은 프로그램 설계 주기 중 한 번 적용되며, 동적 변환은 프로그램 실행 중 변환이 가능하다. 동적 변환은 더욱 분석을 어렵게 하는 장점은 있지만, 실행 중 쓰기 및 실행이 허용돼 원격 공격에 노출될 수 있으며, 과도한 동작으로 인한 성능 문제를 일으킬 수도 있다.
‘변환의 대상’은 크게 ‘데이터’와 ‘코드’로 분류할 수 있다. 먼저, 데이터 변환은 애플리케이션에 하드 코딩된 값의 표현과 위치를 변환해 난독화를 진행한다. 바이트 배열 혹은 정수, 변수 등의 상수 데이터를 다른 데이터의 값으로 치환해 인코딩하는 정적 데이터 변환과 가변 메모리값의 표현이나 구조를 수정하는 가변 데이터 변환 등이 대표적인 난독화 기술이다.
코드 변환은 코드 논리 및 코드 추상화 변환으로 분류해 앱의 제어흐름과 알고리즘, 자료구조 등 코드의 논리 및 제어를 변형하는 코드 논리 변화와 변수명, 주석, 들여쓰기(공백 문자 및 탭) 등의 높은 수준의 코드 추상화 변환이 주요 기술이다.
CSRC 관계자는 “네 가지의 난독화 기술 외에도 다양한 기술이 존재한다”며 “일반적으로 다양한 난독화 기술을 섞어 복잡도를 증가시켜 소프트웨어를 보호하고, 보호 효과가 매우 높다”고 말했다. 이어 “다만 중첩된 난독화 기술로 인해 소프트웨어의 성능 저하가 발생하고, 파일의 크기가 증가하는 문제가 있어 최적화 작업이 필요하다는 단점도 존재한다”고 덧붙였다.
[김영명 기자(boan@boannews.com)]
<저작권자: 보안뉴스(www.boannews.com) 무단전재-재배포금지>