Trojan Source: Invisible Vulnerabilities

개요

얼마전에 ANSI 제어코드 관련한 글을 포스팅하였는데 마침 재미난 취약점 소식을 우연찮게 접하게 되었다.

취약점 자체는 기술적으로 복잡하지 않지만, 상당히 흥미로운 공격 방식이다. 저자들 또한 이 단순한 공격 방식에 의하여 공급망에 위협이 될 수 있음을 지적하고있다.

사실 우리는 손쉬운 공격 기법에 의하여 위협이 발생되는 사례들을 자주 접해왔다. 이 취약점 자체도 과거에 공개되었던 여러 방식들과 상당히 유사하다. 다음 글로는 비슷한 방식의 ANSI 제어코드 글을 써볼까 한다.

취약점 정보

공격자는 악의적인 기능을 수행하기 위하여 악성 코드를 소스에 주입시키는 방식의 백도어 공격을 시도할 수 있다. 프로젝트가 제대로 관리되지 않거나 코드가 매우 복잡한 경우에는 이러한 공격이 효율적일 수 있으나 코드 리뷰 과정에서 들통날 수 있다.

발표된 취약점은 유니코드의 제어 문자를 사용하여 사람이 코드를 읽더라도 악의적인 명령을 확인할 수 없게한다. 사람과 컴파일러가 인식하는 코드가 다르기 때문에 정상적으로 보이는 코드라하더라도 악성 기능을 포함할 수 있다.

유니코드의 이런 트릭을 사용한 유사한 공격 기법들은 실제로도 공격에 잘 활용되었다. 대표적인 방법 중 하나가 RLO (Right-to-Left Override) 이다. 우리는 한글을 자연스럽게 왼쪽에서 오른쪽 방향으로 쓰고 있지만 히브리나 아랍어처럼 반대의 방식을 사용하는 언어들도 있으며 필요에 따라 반대 순서로의 표현을 사용하기도한다. 2011년 동아일보의 기사를 보면 오래전부터 네티즌 사이에도 잘 알려져 있음을 알 수 있다.

댓글 거꾸로 다는 법, ‘&#8238’의 원리는?… “우와 신기!”

이 장난같은 기법은 파일명에 사용되어 실제 확장자를 혼동하게 만들어 무심코 실행 파일을 실행하게하는 공격에 사용되어왔다.

한글이력서 파일 위장 표적형 공격 주의!
신천지 비상연락처 위장한 Bisonal 악성코드 유포 중 (2020.03.05)

공개된 취약점도 이와 유사하게 유니코드의 제어코드를 사용한다. 아래 링크의 보안뉴스 기사에서 관련된 내용이 쉽게 설명되어있다.

트로얀 소스, 소스코드를 몰래 감염시키는 신박한 공급망 공격 기법

아스키 문자 이외를 허용하지 않는 일반적인 프로그램의 코드에는 제어 문자가 포함된 유니코드 문자열을 사용하기 어려울 수 있다. 발표 내용에서는 소스코드에 제어 문자를 사용하기 위하여 주석과 문자열 리터럴(literal)을 사용하였다.

유니코드 제어 문자를 주석과 문자열에 사용하여 코드의 순서를 뒤바꾸면 마치 애너그램(Anagram)처럼 생성된 코드에 의하여 사람이 제대로 식별하기 어렵게 할 수 있다.

다양하게 공개된 예제코드를 살펴보면 이해가 더 쉽다.
https://github.com/nickboucher/trojan-source

github에 공개된 아래 예제는 동일한 이름의 isAdmin의 함수가 사용된것 처럼 보이지만 다른 하나는 보이지 않는 글자의 유니코드가 포함된 가짜 함수이다. 코드 내에서는 가짜 함수가 사용되도록 조작되었다. 예제를 보면 바로 눈치 챌 수도 있으나 복잡한 프로젝트라면 발견하기 어려울 수도 있다.

제어코드로 인하여 동일이름의 중첩된 isAdmin 함수

터미널에서도 코드를 확인해보면 감쪽같다.

제어코드에 의해 눈속임된 코드

코드에 포함된 제어코드를 출력시켜보면 중복된 함수명의 차이를 알 수 있다.

코드에 포함된 제어코드 문자 확인

비슷한 예제로는 알파벳과 유사해 보이는 다른 글자를 사용하는 고전적인 예도 있다. 아래 코드의 함수명에 사용된 H 글자는 서로 다르지만 자세히 살펴보아야만 구분할 수 있다.

동일한 함수명처럼 보이는 코드

VI에서 확인하는 경우에도 감쪽같다.

VI 에디터에서 확인한 소스코드

제어코드를 포함하여 출력해보면 차이가 있음을 알 수 있다.

아스키 이외의 문자가 포함된 함수명

워드프레스의 코어와 플러그인에서 악의적인 제어코드가 주입되었는지 검사하였으나 발견되지 않았다고 한다.

WordPress and Trojan Source

해당 취약점은 CVE-2021-42574, CVE-2021-42694로 보고되었다.

해당 기술과 관련된 더 상세한 내용은 발표된 보고서 링크에서 확인할 수 있다.

결론

가끔은 옛 방식들이 유용할 때가 있다. 내 눈에 보이는게 다가 아니다. Ctrl C+V 할 때 조심하자.

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다