banner
홈페이지 / 소식 / 숨바꼭질하기
소식

숨바꼭질하기

Nov 03, 2023Nov 03, 2023

2022년 10월 21일

1부에서는 Intel SGX 엔클레이브가 무엇이며 랜섬웨어 작성자에게 어떤 이점이 있는지 설명했습니다. 2부에서는 가상의 단계별 구현을 살펴보고 이 방법의 한계를 간략하게 설명합니다.

CrowdStrike Falcon® 플랫폼과 CrowdStrike Falcon Complete™ 관리형 탐지 및 대응 팀이 랜섬웨어로부터 보호하는 방법을 알아보려면 이 라이브 공격 데모를 시청하세요.

이 섹션에서는 비대칭 암호화를 위해 엔클레이브를 사용하는 랜섬웨어의 단계별 예를 구축합니다. 랜섬웨어는 두 부분으로 나뉩니다.

여기에 제시된 코드 추출은 애플리케이션의 일반 코어(main.c) 또는 enclave(enclave.c)에서 제공됩니다. 엔클레이브는 한 쌍의 RSA 키를 생성하고 개인 키를 봉인하며 Intel SGX API를 사용하여 엔클레이브 내부의 피해자 데이터를 암호화합니다. 이것이 어떻게 수행되는지 그리고 애플리케이션의 핵심이 엔클레이브와 상호 작용하는 방법을 살펴보겠습니다.

첫째, 애플리케이션의 일반 코어는 엔클레이브 생성 및 설정을 포함하여 랜섬웨어 실행에 필요한 리소스를 초기화합니다. 엔클레이브를 로드하려면 sgx_urts.lib.1의 sgx_create_enclave() 함수를 사용합니다. 함수 프로토타입은 다음과 같습니다.

이 함수의 인수는 컴파일 모드 또는 이전 로드에 대한 정보와 같은 일부 enclave 속성을 나타냅니다. 예를 들어, sgx_launch_token_t는 엔클레이브 시작 토큰을 나타내는 불투명 구조입니다. 토큰 정보는 실행 전반에 걸쳐 엔클레이브에 대한 정보를 보유하며 향후 엔클레이브 로드를 용이하게 하기 위해 저장할 수 있습니다.

그림 1. 엔클레이브를 생성하는 코드 추출(확대하려면 클릭)

엔클레이브가 로드되면 애플리케이션의 일반 코어는 ECALL을 실행하여 키 생성 프로세스를 시작할 수 있습니다.

엔클레이브 내에서 키 생성은 sgx_tcrypto.lib라는 Intel SGX SDK를 기반으로 합니다. 이는 엔클레이브에서 직접 호출할 수 있는 문서화된 API입니다. 내부적으로 API는 인텔이 개발한 다른 암호화 라이브러리인 통합 성능 프리미티브(인텔® IPP) 및 인텔® 소프트웨어 가드 확장 SSL 암호화 라이브러리(인텔® SGX SSL)2를 기반으로 하며, 둘 다 OpenSSL을 기반으로 합니다. .

이 프로세스의 첫 번째 단계는 sgx_create_rsa_key_pair() 함수를 사용하여 엔클레이브에서 개인 키와 공개 키에 대한 RSA 구성 요소를 생성하는 것입니다. 이는 사전 정의된 RSA 키 모듈러스 크기 및 공개 지수를 준수하는 구성 요소를 생성하기 위해 사용되는 키를 생성하는 함수 호출 이전에 수행되는 예비 호출입니다.

그림 2. RSA 키 구성요소를 생성하는 코드 추출(확대하려면 클릭)

이러한 RSA 키 구성 요소에서 우리는 sgx_create_rsa_pub1_key() 함수를 사용하여 피해자의 파일을 암호화하는 데 사용될 RSA 공개 키를 생성합니다.

그림 3. RSA 공개 키를 생성하는 코드 추출(확대하려면 클릭)

다음 논리적 단계는 일반적으로 공개 키와 마찬가지로 개인 키를 생성하는 것입니다. 하지만 이 경우 개인 키는 아직 필요하지 않습니다. 개인 키는 피해자가 랜섬웨어 작성자의 요구 사항을 준수해야 하는 경우에만 해독 목적으로만 사용되기 때문입니다. 현재로서는 향후 검색을 위해 개인 키 구성 요소를 안전하게 저장하고 숨기면 됩니다. 이를 위해 우리는 데이터 봉인 방법을 사용하여 개인 키가 OS 일반 메모리에 일반 텍스트로 표시되지 않고 디스크에 암호화되어 기록되고 저장될 수 있도록 보장합니다.

이를 수행할 수 있는 한 가지 방법은 개인 키를 생성한 다음 이를 디스크에 직접 봉인하는 것이지만 이 방법으로는 진행하지 않겠습니다. 아래 표시된 개인 키를 생성하는 Intel SGX SDK3의 함수 프로토타입을 고려해 보세요.

개인 키 값은 void**에 기록되지만 내부적으로 사용되는 실제 구조는 OpenSSL 라이브러리에서 시작된 복잡한 구조인 EVP_PKEY 구조입니다.

그림 4. openssl 라이브러리에서 EVP_PKEY 구조를 정의하는 코드 추출(확대하려면 클릭)