위협 인텔리전스

국내 보안 기업 코드 서명 인증서 유출: 북한 APT 그룹 연관성 조사

국내 보안 기업 코드 서명 인증서 유출: 북한 APT 그룹 연관성 조사

엔키화이트햇

2025. 4. 1.

요약

  • 2025년 2월 20일에 소만사가 국가 배후의 공격자에 의해 침해사고를 당해 코드 서명 인증서가 유출됐다는 기사가 보도됐다.

  • 엔키화이트햇 위협연구팀은 바이러스 토탈에서 소만사의 코드 서명이 적용된 악성코드를 발견했고 분석 결과 북한 APT 그룹과의 연관성을 확인했다.

  • 분석 과정에서 확인된 C&C 서버의 최상위 도메인이 p-e[.]kr이고, 이는 북한 APT 그룹이 자주 사용하는 도메인이다.

  • 악성코드 Rich Header 연관성 분석 결과, 북한, 중국, 이란 APT 그룹이 사용한 악성코드와 동일한 product id, build id가 확인됐다. 이는 악성코드 빌드 환경간의 연관성을 시사하며, 이 중 북한 APT 그룹 악성코드와 높은 연관성이 확인됐다.

1. 개요

국내 정보보안 기업 소만사의 코드 서명 인증서 유출 사실이 알려지고, 바이러스 토탈에서 소만사 코드 서명 인증서가 적용된 악성코드를 발견하였다.

분석 결과 백도어 행위를 수행하는 악성코드로 확인되었으며 사용된 C&C 서버와 Rich Header를 기반으로 연관성을 추적한 결과, 북한 APT 그룹과의 연관성을 확인하였다.

본 글에서는 악성코드에 대한 분석과 북한 APT 그룹과의 연관성에 대한 내용을 다룬다.

2. 배경

2025년 2월 20일에 정보보안 기업 소만사가 국가 배후의 공격자에 의해 침해사고를 당해 코드 서명 인증서가 유출되었다는 기사가 보도되었다.

20일 정보보호산업계와 한국인터넷진흥원(KISA)에 따르면, 소만사는 최근 고객사에 “국가 단위(국가배후) 외부 해킹그룹의 공격을 받아 제품의 코드서명 인증서가 유출된 정황이 발견됐다”고 공지했다.

그러면서 “지난 6일부터 KISA와 함께 2차 피해 방지를 위해 적극적으로 내부 시스템을 점검하고 있다”고 덧붙였다. 아직 조사가 진행 중이어서 해킹조직의 배후 국가가 어디인지는 알려지지 않았다.

소만사는 공지를 통해 “새로운 인증서로 패키지를 재서명하고 있으며 고객사의 패키지 업데이트 일정에 맞춰 업데이트를 진행할 예정”이라고 밝혔다.

-보안기업 '코드서명 인증서'까지 털렸다…국가배후 해킹조직 공격 발췌


2.1. 코드 서명

코드 서명은 Public Key Cryptography를 사용하여 프로그램의 출처와 무결성을 확인할 수 있도록 해주는 기술이다.

코드 서명은 Private Key를 사용하여 생성하고, 대응되는 Public Key로 검증할 수 있다. Public Key를 사용하여 Private Key를 얻는 것이 사실상 불가능하기 때문에 실질적으로 이 장치를 사용하여 프로그램의 출처를 알 수 있다. 하지만 이 경우와 같이 Private Key가 유출되면 이를 사용하여 직접 코드 서명을 생성할 수 있다.

윈도우 운영체제에서는 코드 서명을 적용하면 Windows Defender SmartScreen의 경고 여부에 영향을 줄 수 있다.

  • 코드 서명이 없다는 경고가 표시되지 않는다.

  • 같은 코드 서명이 적용된 프로그램들과 평판을 공유한다.

  • Certificate에 부여된 평판이 충분하다면 알려지지 않은 개발자라는 경고가 표시되지 않는다.

    • OV(Organization Validated) Certificate의 경우 기본적으로 충분한 평판이 부여되지 않아 경고가 표시된다.

    • EV(Extended Validation) Certificate의 경우 기본적으로 충분한 평판이 부여되어 신뢰되지 않은 출처라는 경고가 표시되지 않는다.

동일한 인증서로 서명된 프로그램은 일반적으로 평판을 공유하기 때문에 인증서가 유출되어 악용될 경우 해당 인증서로 서명된 모든 프로그램은 평판이 저하될 수 있다. 또한 인증서 유출이 확인되면 해당 인증서는 폐기될 수 있고, 이로 인해 인증서를 발급한 기관의 신뢰도 또한 하락하게 되어 새로운 인증서 발급이 어려워질 수 있다.

코드 서명 인증서가 유출될 경우 공격자는 해당 인증서를 악성코드에 적용하여 악성코드의 출처를 위조할 수 있다. 이는 공격자가 코드 서명에 기반한 신뢰를 악용하여 정상 코드 서명 인증서가 적용된 악성코드를 사용자로 하여금 실행하도록 유도할 수 있다.

3. 악성코드 분석

코드 서명 인증서의 유출이 확인되면서, 공격자가 유출된 인증서를 악성코드에 활용되었을 가능성이 있다고 판단하고 악성코드 확보를 시작하였다. 그 결과 바이러스 토탈에서 signature:"somansa" tag:signed 쿼리로 악성코드를 확보할 수 있었고, 해당 악성코드는 2025-02-21 05:25:56(UTC+0)에 대한민국에서 처음 바이러스 토탈에 업로드되었다.


악성코드분석 1
caption - 바이러스 토탈 업로드 이력

악성코드에 유효한 서명이 적용된 것을 확인할 수 있고, 인증서 유효 기간과 서명 시간은 각각 다음과 같다.

  • 유효 기간: 2024-03-26 00:00(UTC+0) ~ 2025-03-22 23:59(UTC+0)

  • 서명 시간: 2024-09-30 04:59:00(UTC+0)


악성코드 서명
caption - 코드 서명 정보

악성코드가 사용하는 대부분의 문자열은 간단한 단일 치환 암호로 암호화되어 있다. 복호화 방식은 다음과 같다.

  1. 문자열을 한 글자씩 분리

  2. 각 문자가 커스텀 알파벳에 포함되었는지 검사

    • 커스텀 알파벳 - 7Uzc5ngXl_ESWkj3t14Cw+aYLvyh0odZH8OReKiNIr-JM2GQAxpmVb=qPTuB9Ds6fF

  3. 커스텀 알파벳에 포함된 경우, 해당 인덱스 저장

    • ex) U일 경우 1

    • 포함되지 않을 경우 기존 문자 유지 후 다음 문자 검사

  4. custom_alphabet[(3에서 저장한 인덱스 + 41) % 커스텀 알파벳 길이] 문자와 기존 문자 치환

  5. 완료될 때까지 위 과정 반복


암호화된 문자열
caption - 문자열 복호화 루틴

암호화된 문자열들은 아래와 같다.

  • 라이브러리, 함수 이름

  • 자가 삭제 스크립트 일부(포맷 스트링 제외)

  • 이외 문자열 - C&C 서버, GDI 관련 문자열, 자가 삭제 스크립트 이름 등

Dynamic API를 이용하여 함수를 호출하며, 이때 사용되는 코드는 HackingTeam의 dynamic_import 코드를 수정한 것으로 보인다. 수정된 내용은 아래와 같다.

  • 문자열 복호화에 shiftBy1 대신 위에서 언급한 복호화 방식을 사용한다.

  • ReportExitProcess를 사용하지 않는다.


악성코드 분석 2
caption - 글에서 분석한 악성코드 Dynamic API 루틴
엔키화이트햇 악성코드 분석 3
caption - HackingTeam dynamaic_import 코드 Dynamic API 루틴

idapython을 이용하여 제작한 문자열 복호화 스크립트는 아래와 같다.

from idaapi import *
from idautils import *
from idc import *
from ida_segment import get_segm_by_name

def get_ins(ea):
   return [print_insn_mnem(ea), print_operand(ea, 0), print_operand(ea, 1)]

def get_name(ea):
    result = ""
    i = 0
    while True:
        if get_byte(ea + i) == 0:
            return result
        else:
            result += chr(get_byte(ea + i))
        i += 1

def check_ea(ea):
    func = get_func(0x1400011F0)
    for xref in XrefsTo(ea):
        if func.start_ea < xref.frm < func.end_ea:
            return True
    return False

def search_en_data(ea):
    while True:
        ins = get_ins(ea)
        if ins[0] == "lea" and ins[1] == "rcx":
            addr = get_name_ea_simple(ins[2])
            return get_name(addr)
        ea = prev_head(ea)

def decrypt(en_data):
    custom_alphabet = "7Uzc5ngXl_ESWkj3t14Cw+aYLvyh0odZH8OReKiNIr-JM2GQAxpmVb=qPTuB9Ds6fF"
    result = list(en_data)
    for i, data in enumerate(result):
        if data in custom_alphabet:
            j = custom_alphabet.index(data)
            result[i] = custom_alphabet[(j + 41) % 0x42]
            
    return "".join(result)

segm = get_segm_by_name(".text")
ea = segm.start_ea
end_ea = segm.end_ea

while True:
    if ea >= end_ea:
        break
    else:
        if check_ea(ea):
            ea = next_head(ea)
            continue
        elif "sub_1400013E0" in GetDisasm(ea):
            print (hex(ea), decrypt(search_en_data(ea)))
            set_cmt(ea, decrypt(search_en_data(ea)), 0)
        elif "sub_140001350" in GetDisasm(ea):
            print (hex(ea), decrypt(search_en_data(ea)))
            set_cmt(ea, decrypt(search_en_data(ea)), 0)
                
    ea = next_head(ea)

악성코드는 먼저 CPU 타이밍 지터를 기반으로 40비트 길이의 uid를 생성한다. 이를 위해 clock 함수의 반환값이 변할 때까지 걸리는 시간을 측정하고, 해당 시간의 패리티를 두 번 계산한다. 두 패리티 값이 서로 다를 경우 첫 번째 패리티 값을 엔트로피로 사용하며 이 과정을 40회 반복하여 uid를 생성한다.

UCRT(Unified C Runtime) clock 함수는 C 표준과 달리, 프로세스 실행 시간 기준이 아닌 CRT 초기화 시점을 기준으로 경과 시간을 반환한다. 따라서 생성되는 값은 CPU 상태나 시스템 부하 등 환경에 따라 달라질 수 있다.

흔하지 않은 방법으로 RNG를 구현한 것이 특징으로 볼 수 있다.


엔키화이트햇 악성코드 분석 3
caption - uid 생성 루틴

C&C 서버는 tcp://daumnet.p-e[.]kr:9980로, 통신할 때 송수신 데이터는 TLV(Type Length Value) 구조이다.


송수신 데이터 구조
caption - 송수신 데이터 구조

송수신 데이터는 xor 연산으로 암호화 및 복호화되며, 송신 과정은 다음과 같다.

  1. 먼저 type과 size 총 6바이트를 xor 키로 암호화하여 전송한다.

    • xor 키: 0x3b, 0xa0, 0x28, 0xcc, 0x41, 0x0f, 0xd6, 0x5e, 0xb7, 0x83, 0x92, 0xcf, 0xe4, 0x4a, 0xb8, 0x77

  2. data를 xor 키로 암호화하여 전송한다.

수신 과정도 송신 과정과 동일한 순서로 이루어진다.

C&C 서버 핸드셰이크 과정은 다음과 같다.

  1. 먼저 type = 0x3e9, size = 3 data = {0x1a, 0x3c, 0x5e}를 전송한다.

  2. 수신 데이터가 1에서 전송한 데이터와 동일하면 type = 0x3eb, size = 5, data = uid를 전송한다.


엔키화이트햇 악성코드분석
caption - 핸드셰이크 루틴

핸드셰이크가 완료되면 감염 시스템 정보를 수집한 뒤 type = 0x3e8, size = 수집한 데이터 크기, data = 수집 데이터 로 C&C 서버에 전송한다. 데이터 형식은 %d|%s|%s|%s|%s|%x이며, 수집하는 정보는 아래와 같다.

  • 관리자 그룹 소속 여부

  • IPv4 주소 목록

  • 컴퓨터 이름

  • 사용자 이름

  • 실행 파일 경로

  • 악성코드 PID

이후 C&C 서버와 지속적으로 통신하며, 수신 데이터가 존재하지 않으면 60초 뒤 재시도하는 방식으로 통신한다. C&C 서버와 통신하며 type에 따라 수행하는 행위는 아래 표와 같다.

| type | 행위 | 상세 내용 |
| --- | --- | --- |
| 0x3ed | 통신 악성코드 실행 종료 |  |
| 0x3ee | %Temp%\1.bat 자가 삭제 스크립트 실행, 악성코드 실행 종료 |  |
| 0x7d1 | 리버스셸 스레드 생성 | cmd.exe는 별도의 프로세스 그룹으로 실행되며 종료 하위 프로세스를 함께 종료하는 JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE 속성이 적용된 Job 객체에 포함된다.-n입출력은 파이프를 통해 연결되고, 출력은 10ms마다 폴링된다. 출력이 존재하면 C&C 서버에 전송한다. 전송 type은 0x7d3이다.  |
| 0x7d2 | 리버스셸 데이터 입력 | 리버스셸 입력 파이프에 수신 데이터 입력 |
| 0x7d4 | 리버스셸 스레드 종료 |   |
| 0xbb9 | 드라이브 정보 수집 | 감염 시스템에 존재하는 모든 드라이브의 전체 공간, 사용 가능 공간을 C&C 서버에 전송한다.-n전송 type은 0xbba이다. |
| 0xbbb | 파일 디렉토리 정보 수집 | 파일인 경우-n- 파일 이름, 생성 시간, 수정 시간, 파일 크기 전송, type은 0xbbd이다.-n디렉토리인 경우-n- 디렉토리 이름, 생성 시간, 수정 시간 type = 0xbbd-n에러 발생 type = 0xbbd 전송 |
| 0xce4 | 파일 삭제 스레드 생성 | 1. 파일 크기만큼 4KB 데이터를 반복해서 덮어쓴다. 덮어쓰여지는 데이터는 0x5f 1바이트와 나머지 null 데이터로 이루어져 있다.-n2. 파일 이름을 무작위 [a-z]{파일 이름 길이}문자들로 변경-n3. 파일 삭제 |
| 0xce5 | 파일 삭제 |  |
| 0xc1c | 파일 열기 | 지정된 파일을 열고, 파일 핸들을 전역 변수에 저장한다.-n성공 type = 0xc20 전송-n실패 type = 0xc1f 전송 |
| 0xc1d | 파일에 데이터 작성 | 0xc1c에서 저장된 파일 핸들을 이용하여, 수신 데이터를 파일에 작성한다.-n에러 발생 type = 0xc21 전송 |
| 0xc1e | 파일 핸들 닫기 | 에러 발생 type = 0xc21 전송 |
| 0xc80 | 파일 업로드 스레드 생성 | 1. 에러 발생 type = 0xc86 데이터를 전송한 종료한다.-n2. 파일 경로, 이름, 크기를 전송한다. 전송 type은 0xc81이다.-n3. 파일 데이터를 0x100000만큼 나눠서 전송한다. 전송 type은 0xc82이다. -n4. 파일 데이터 전송 완료 type = 0xc84전송한다. -n5. 에러 중단 없이 파일 전송이 완료되면 type = 0x0c85전송한다.-n디렉토리인 경우 해당 디렉토리에 존재하는 모든 파일을 업로드한다. |
| 0xc83 | 파일 업로드 중단 | 파일 업로드할 확인하는 전역 변수 값을 0으로 설정해서 중단시킨다. |
| 0xfa0 | 화면 캡처 스레드 생성 | 전송 주기와 전송 여부는 전역 변수에 의해 설정된다. 최소 전송 주기는 0.1초이다.-n커서 위치 정보와 JPEG로 인코딩된 스크린샷을 포함한 데이터를 전송한다.-n전송 type은 0xfa1이다.-n에러 발생 type = 0xfa3전송한다. |
| 0xfa2 | 화면 캡처 중단 | 화면 캡처할 확인하는 전역 변수 값을 0으로 설정해서 중단시킨다. |
| 0x1392 | 소켓 통신 시도 | 지정된 주소로 연결을 시도하며, 연결 시도에 1초의 타임아웃이 적용된다.-n연결 성공 C&C 서버로 type = 0x1393 전송, 실패 type = 0x1394 전송 |
| 0x13f6 | 사용자 권한으로 명령어 실행 | 사용자 권한으로 명령어를 실행한다.-n성공 type = 0x13f7 전송, 실패 type = 0x13f8 전송 |
| 0x145a | 파일 수정 시간 조작 | 지정된 파일의 수정 시간을 다른 파일에 적용한다.-n성공 type = 0x145b 전송, 실패 type = 0x145c 전송

caption - type에 따라 수행하는 행위

4. 연관성 분석

4.1. C&C 연관성

악성코드가 사용하는 C&C 서버는 daumnet.p-e[.]kr이며, 해당 도메인은 북한 APT 그룹인 Kimsuky와 연관성이 확인된 바 있다. p-e[.]kr 도메인의 Whois AC는 cfa4a551515dc742s@gmail.com이며, Whois AC가 동일한 일부 도메인은 아래와 같다.

  • n-e[.]kr

  • r-e[.]kr

  • o-r[.]kr

  • kro[.]kr

안랩의 “Phishing Attacks Impersonating Famous Korean Banking Apps” 보고서에 따르면 Kimsuky 관련 공격에서 자주 사용되는 최상위 도메인들이 식별되었으며, 도메인의 Whois AC가 모두cfa4a551515dc742s@gmail.com으로 동일하다.

  • n-e[.]kr

  • p-e[.]kr

  • r-e[.]kr

  • o-r[.]kr

  • kro[.]kr

추가로 지니언스의 “위협 행위자 김수키의 이메일 피싱 캠페인 분석” 보고서에 따르면 MYBOX 보안주의 내용을 포함한 피싱 이메일에서, 이메일 비밀번호를 탈취하기 위한 피싱 사이트에 p-e[.]kr 도메인이 사용된 것으로 확인되었다.


4.2. 코드 연관성

안랩의 “North Korea-related Hangul Word Processor (HWP) File Being Distributed” 보고서에 언급된 악성코드 중 a7077d9a2c98ec2d0b3b1c12f23b2a79 는 본 글에서 분석한 악성코드와 동일한 방법으로 Dynamic API를 수행한다.


코드 연관성 위협인텔리전스
caption - a7077d9a2c98ec2d0b3b1c12f23b2a79 Dynamic API 루틴
코드 연관성 위협인텔리전스 2
caption - 글에서 분석한 악성코드 Dyanamic API 루틴

문자열 복호화 과정도 동일하지만 커스텀 알파벳과 키가 상이하다.

  • 커스텀 알파벳 : zcgXlSWkj314CwaYLvyh0U_odZH8OReKiNIr-JM2G7QAxpnmEVbqP5TuB9Ds6fFt

  • 키: -22


문자열 복호화 루틴
caption - a7077d9a2c98ec2d0b3b1c12f23b2a79 문자열 복호화 루틴
악성코드 문자열 복호화 루틴
caption - 글에서 분석한 악성코드 문자열 복호화 루틴

Palo Alto Networks의 “Unraveling Sparkling Pisces’s Tool Set: KLogEXE and FPSpy” 보고서에 언급된 Kimsuky 악성코드 중 KLogExe, FPSpy의 Dynamic API 방식은 HackingTeam의 dynamic_import 코드의 문자열 복호화 방식까지 동일하다. 추가로 r-e[.]kr 도메인이 사용된 이력이 존재한다.


안랩 복호화 방식
caption - 9760f489a390665b5e7854429b550c83 Dynamic API 루틴

안랩의 “SmallTiger Malware Used in Attacks Against South Korean Businesses (Kimsuky and Andariel)” 보고서에 언급된 Andariel의 SmallTiger는 커스텀 알파벳과 키가 본 글에서 분석한 악성코드와 다르지만 동일한 복호화 방식을 사용한다.


c&c 서버
caption - 2766fcf5fa81a2877864a07ef306cde4 문자열 복호화 루틴

추가로 아래 도메인들이 C&C 서버로 사용되었다.

  • kro[.]kr

  • n-e[.]kr

  • n-b[.]kr

  • o-r[.]kr

  • p-e[.]kr


c&c 서버
caption - SmallTiger Malware Used in Attacks Against South Korean Businesses (Kimsuky and Andariel) IOC


4.3. 악성코드 빌드 환경 연관성

본 글에서 분석한 악성코드 Rich Header 정보를 기반으로 과거 APT 공격 그룹이 사용한 악성코드와의 연관성을 확인할 수 있었고, 이는 동일한 환경에서 제작되었다는 것을 시사한다.

Rich Header에는 빌드 과정에서 사용된 도구 정보와 사용 횟수에 대한 정보가 저장된다. Rich Header에 존재하는 도구 정보와 조합이 흔하지 않은 경우라면 빌드 환경에 대한 연관성을 확인할 수 있고, 악성코드와 악성코드 제작자에 대한 연관성을 확인하는 데에도 사용할 수 있다.

본 글에서 분석한 악성코드의 Rich Header 내용은 아래와 같다.


이 중 버전 정보를 알 수 있는 도구는 아래와 같다.

  • VS2015 Linker 14.00.23026

  • VS2015 CVTRES 14.00.23026

  • VS2015 Universal Tuple Compiler(LTCG/C++) 19.00.23026

  • VS2012 Import 11.00.65501

  • VS2013 Universal Tuple Compiler(C) 18.10.40116

  • VS2013 Universal Tuple Compiler(C++) 18.10.40116

  • VS2013 MASM 12.10.40116

이 외에 VS2015+로 시작하는 도구는, 버전 정보 데이터가 공개되지 않아 정확한 버전 정보를 알 수 없었다.

먼저 바이러스 토탈을 이용하여 샘플 확보와 분류 작업을 진행하였다. 바이러스 토탈에서 도구 정보를 기반으로 완벽히 일치하는 샘플을 검색할 수 없었으나, 일부 도구 정보가 포함되었는지에 대해서는 조건부 검색이 가능하였다. 이러한 검색은 전체 도구 정보가 일치하는 경우보다 상대적으로 약한 조건으로, 정확히 동일한 샘플은 아니더라도 관련성이 있을 수 있는 샘플들의 집합을 추출하는 데 활용할 수 있다. 과정은 다음과 같다.

  1. 바이러스 토탈에 PE 파일을 검색한 결과 233.0M개의 샘플이 확인되었다.

  2. 분석한 악성코드에서 확인된 도구 정보를 조건으로 검색하였다. 결과는 27.9K개의 샘플이 확인되었다. 검색에 사용된 조건은 아래와 같다.

    • entity:file type:pe detectiteasy:"Linker: Microsoft Linker(14.00.23026)" detectiteasy:"Compiler: Microsoft Visual C/C++(19.00.23026)[LTCG/C++]" detectiteasy:"Tool: Visual Studio(2015)”

  3. 최소 탐지수가 8개 이상인 것으로 분류한 결과 9.2K개의 악성코드가 확인되었다.

  4. 위에서 분류된 9.2K개의 악성코드를 확보한 뒤, 정확한 분석을 위하여 각 악성코드에 동일한 버전의 도구 정보가 포함되어 있거나 일치하는지를 확인하였다. 그 결과 포함되어있는 악성코드는 1,412개, 일치한 악성코드는 278개로 확인되었다.

따라서 본 글에서 분석한 악성코드 Rich Header에 존재하는 도구 정보와 완벽히 일치한 악성코드가 278개로 확인되었으며, 각 단계 별로 반올림하여 퍼센트로 나타낼 때 0.012%, 0.004%, 포함되어있는 악성코드 0.0006%, 일치한 악성코드 0.0002%로 흔하지 않은 도구 정보와 조합인 것을 확인할 수 있다.

추가로 vx-underground에서 APT 그룹과 연관된 악성코드를 연도별로 정리한 아카이브를 다운로드하여, 중복을 제외한 총 22,197개의 악성코드 중 PE 파일 14,950개를 확보하였고 위와 동일하게 분류 작업을 진행하였다.

그 결과 동일한 버전의 도구로 빌드된 악성코드는 총 28개로, 본 글에서 분석한 악성코드 Rich Header에 존재하는 도구가 포함된 악성코드는 20개, 일치한 악성코드는 8개로 전체 악성코드는 각각 북한, 중국, 이란 APT 그룹과 연관있는 것으로 확인되었다. 상세 정보는 아래와 같고, 해시 정보는 IOC에 정리하였다.

  • Lazarus, APT37(RokRAT, BLUELIGHT, GOLDBACKDOOR): 17개

  • APT34, Ferocious Kitten: 7개

  • Chimera, ShadowPad(Malware): 4개

각각 출처는 다음과 같다.

북한 APT 그룹
중국 APT 그룹
이란 APT 그룹

Rich Header는 악성코드 제작자가 수정할 수 있는 데이터이고, 실제로 Kaspersky의 “The devil’s in the Rich header” 보고서에 다른 악성코드의 Rich Header를 복사하여 사용한 사례가 존재한다. 해당 사례에서는 product id, build id, count 값까지 모두 동일하지만, 본 글에서 분석한 악성코드 Rich Header 정보를 토대로 연관성 분석 결과 product id, build id는 과거 APT 그룹이 사용한 악성코드와 동일하지만 count 값은 상이하여 Rich Header가 복사되지 않은 것으로 볼 수 있다.

이러한 분석 결과를 토대로 본 글에서 분석한 악성코드와 북한 APT 그룹과의 연관성이 존재하는 것으로 보인다. Rich Header 도구 정보가 일치하거나 포함된 28개 악성코드 중 17개가 북한 APT 그룹과 연관있는 악성코드로 확인되었다. 흔하지 않은 도구 조합의 Rich Header, 과반수 이상이 북한 APT 그룹과 연관있다는 점에서 본 글에서 분석한 악성코드는 북한 APT 그룹과 연관성이 높은 것으로 판단된다.

5. 대응 방안

코드 서명 인증서를 관리하는 기관은 인증서 유출을 방지하기 위해 특히 철저한 보안 조치를 취해야 한다. 인증서는 외부에서 임의로 접근할 수 없도록 암호화하여 안전하게 보관해야 하며, 코드 서명을 적용하는 시스템은 다른 시스템과 철저히 분리된 환경에서 운영되어야 한다.

인증서의 철저한 관리와 동시에 코드 서명에 대한 정책도 강화되어야 한다. 코드 서명은 서명 확인을 하지 않거나 무시하고 코드를 실행할 수 있기 때문에, 확인하는 대신 강제해야 가장 효과적이다. 추가로 윈도우 운영체제의 기본 설정들이 매우 취약하다.

윈도우에서는 코드 서명을 무시하고 프로그램을 실행할 수 있다. 또한 기본적으로 폐기된 인증서로 서명된 코드 서명을 신뢰할 수 있다. 이를 방지하기 위해 보안 설정을 바꾸어야 하는데 사용할 수 있는 방법들이 많고 복잡하다.

가장 간단한 방법은 윈도우의 Smart App Control을 활성화하는 것이다. Smart App Control은 코드 서명이 유효하거나 Microsoft에서 신뢰할 수 있다고 판단한 코드만 실행할 수 있도록 제한한다. 그러나 이 경우에도 코드 서명이 유효하지 않은 프로그램을 실행할 수 있고, Microsoft에서 안전하다고 판단하지만 실제로는 악성코드일 수 있기 때문에 주의해야 한다.

복잡하지만 보다 안전한 방법은 App Control 정책을 직접 구성하여 적용하는 것이다. Smart App Control은 App Control 정책 기반으로 구현되어 있고, Smart App Control 정책을 활용하여 커스텀 정책을 생성할 수 있다. 이때 Enabled:Intelligent Security Graph Authorization 항목을 비활성화하고 Enabled:Revoked Expired As Unsigned 항목을 활성화하면, 코드 서명이 유효하지 않지만 Microsoft에서 안전하다고 판단한 코드의 실행을 차단할 수 있고 폐기되었거나 만료된 인증서로 서명된 코드 또한 신뢰하지 않게 된다.

이외에도 AppLocker와 같은 보안 기능으로 코드 서명 정책을 강화할 수 있다.

6. 마치며

지난 2월 20일 코드 서명 인증서가 유출되었다는 기사가 보도되고, 한국 시간 기준 하루 뒤인 2월 21일 오후 2시 25분에 바이러스 토탈에 소만사의 유효한 인증서로 서명된 악성코드가 업로드되었다.

해당 악성코드가 어떤 공격에 활용되었는지는 알 수 없었으나, C&C 서버, 코드 패턴, Rich Header 분석을 통하여 북한 APT 그룹과의 연관성을 확인할 수 있었다. 추가로 공격자가 단순 침투를 넘어서 코드 서명 인증서를 탈취하고 이를 악성코드에 악용한다는 점에서 기술적 역량이 뛰어난 것을 알 수 있다.

북한 APT 그룹의 공격은 점점 더 정교해지고 있으며, 지속적으로 수행되고 있다. 또한 공격 성공을 위하여 장기간에 걸쳐 동일한 대상에게 여러 차례 다양한 주제로 공격을 수행하기도 한다. 본 글에서 작성한 사례 외에 아직 식별되지 않았거나 과거부터 현재까지 탐지되지 않은 위협이 내부에 존재할 수 있는 가능성도 배제할 수 없으며, 이러한 위협에 대응하기 위해서는 조직과 개인 모두가 보안에 대한 경각심을 가지고 세심한 주의를 기울여야 한다.

7. 부록

7.1. MITRE ATT&CK

| Tactics | Techniques |
| --- | --- |
| Reconnaissance | T1592: Gather Victim Host Information-nT1590.005: Gather Victim Network Information: IP Addresses |
| Execution | T1059.003: Command and Scripting Interpreter: Windows Command Shell-nT1106: Native API |
| Privilege Escalation | T1134.001: Access Token Manipulation: Token Impersonation/Theft-nT1134.002: Access Token Manipulation: Create Process with Token |
| Defense Evasion | T1140: Deobfuscate/Decode Files or Information-nT1070.004: Indicator Removal: File Deletion-nT1070.006: Indicator Removal: Timestomp-nT1027.007: Obfuscated Files or Information: Dynamic API Resolution-nT1027.008: Obfuscated Files or Information: Stripped Payloads -nT1553.002: Subvert Trust Controls: Code Signing |
| Discovery | T1083: File and Directory Discovery-nT1046: Network Service Discovery-nT1069.001: Permission Groups Discovery: Local Groups -nT1057: Process Discovery -nT1082: System Information Discovery-nT1033: System Owner/User Discovery |
| Collection | T1113: Screen Capture |
| Command and Control | T1132.002: Data Encoding: Non-Standard Encoding-nT1573.001: Encrypted Channel: Symmetric Cryptography |
| Exfiltration | T1030: Data Transfer Size Limits-nT1041: Exfiltration Over C2 Channel |
| Impact | T1485: Data Destruction -nT1565.001: Data Manipulation: Stored Data Manipulation


7.2. IOC

악성코드

  • 983b16c505a0b52a65dd31c7f50f8e9bfa2d7160d14e8eefbdf29b5c4a2c6e68

C&C

  • daumnet.p-e[.]kr:9980

Custom Alphabet

  • 7Uzc5ngXl_ESWkj3t14Cw+aYLvyh0odZH8OReKiNIr-JM2GQAxpmVb=qPTuB9Ds6fF

xor key

  • 0x3b, 0xa0, 0x28, 0xcc, 0x41, 0x0f, 0xd6, 0x5e, 0xb7, 0x83, 0x92, 0xcf, 0xe4, 0x4a, 0xb8, 0x77

Rich Header 연관 악성코드
북한 APT 그룹

Analysis Report on Lazarus Threat Group’s Volgmer and Scout Malwares

  • 0d133ea8098e3802bf74202e4d25d6e151fbbd1b787ed08e063bd678166da8c1

  • 568465424dfff48605ee683409dc31f74dd612ffc182971c549fd4801fb6cf18

  • 0e0e0736f98e1819f50b6f05fa59b19296ea7a61042be94c46eb03012b42ea49

  • 80f31bf4e0b4ba1d3c963cf37dd7cefb5517b6454f7809fe3a1703e8b5941b41

  • b4f8177d87df58e31afab30302a9d9ba609cd975341b5532f75808da342381db

  • f563f8abf56ae9819462e21635fbd4c790b2f7d69ae8c02d042a3510209694a9

Lazarus Trojanized DeFi app for delivering malware

  • 202cfbe37bcde2f5700fa43e5a4e08e6b2df6322d9cdfa958d95ab598b47b6b3

  • 4281854f27a755ab51e71d951016ad10ff30a03cd612ba1b14c4d89d9b4be212

  • d178cced92bbce22d2214dbdd3db0491f1c352d21634fda9abd08d720faca84d

Retrohunting APT37: North Korean APT used VBA self decode technique to inject RokRat

  • 2a253c2aa1db3f809c86f410e4bd21f680b7235d951567f24d614d8e4d041576

  • a42844fc9cb7f80ca49726b3589700fa47bdacf787202d0461c753e7c73cfd2a

Korea In The Crosshairs

  • b3de3f9309b2f320738772353eb724a0782a1fc2c912483c036c303389307e2e

The ink-stained trail of GOLDBACKDOOR

  • 485246b411ef5ea9e903397a5490d106946a8323aaf79e6041bdf94763a0c028

North Korean APT InkySquid Infects Victims Using Browser Exploits

  • 7c40019c1d4cef2ffdd1dd8f388aaba537440b1bffee41789c900122d075a86d

  • 94b71ee0861cc7cfbbae53ad2e411a76f296fd5684edf6b25ebe79bf6a2a600a

중국 APT 그룹

Abusing cloud services to fly under the radar

  • 9124266b87b16c02b94125fadfffdd15bc1a5ea714f0dec4962733693a655395

  • da56716727f513365b2308a0b145028fcd905aca2b9450f7632b4b10c209547d

ShadowPad | A Masterpiece of Privately Sold Malware in Chinese Espionage

  • f0854ec2496f9b4c634040bfac7381d6bc9926e9e89dc097b4684f73e1f6d9b3

  • c0d2aaf266866900552c681ce63bfd4a3b09442a7742d7f20dcdbdd3ec9763aa

이란 APT 그룹

Ferocious Kitten: 6 years of covert surveillance in Iran

  • 3c94eba2e2b73b2d2230a62e4513f457933d4668221992c71c847b79ba12f352

  • d723b7c150427a83d8a08dc613f68675690fa0f5b10287b078f7e8d50d1a363f

OilRig Targets Middle Eastern Telecommunications Organization and Adds Novel C2 Channel with Steganography to Its Inventory

  • 4ea6da6b35c4cdc6043c3b93bd6b61ea225fd5e1ec072330cb746104d0b0a4ec

  • 55282007716b2b987a84a790eb1c9867e23ed8b5b89ef1a836cbedaf32982358

  • 7b5042d3f0e9f077ef2b1a55b5fffab9f07cc856622bf79d56fc752e4dc04b28

  • acb50b02ab0ca846025e7ad6c795a80dc6f61c4426704d0f1dd7e195143f5323

  • ba380e589261781898b1a54c2889f3360db09c61b9155607d7b4d11fcd85bd9d

엔키화이트햇

엔키화이트햇

ENKI Whitehat
ENKI Whitehat

오펜시브 시큐리티 전문 기업, 공격자 관점으로 깊이가 다른 보안을 제시합니다.

오펜시브 시큐리티 전문 기업, 공격자 관점으로 깊이가 다른 보안을 제시합니다.

침해사고 발생 전,
지금 대비하세요

빈틈없는 보안 설계의 시작, NO.1 화이트 해커의 노하우로부터

침해사고 발생 전,
지금 대비하세요

빈틈없는 보안 설계의 시작, NO.1 화이트 해커의 노하우로부터

침해사고 발생 전,
지금 대비하세요

빈틈없는 보안 설계의 시작,
NO.1 화이트 해커의 노하우로부터

공격자 관점의 깊이가 다른 보안을 제시합니다.

Contact

biz@enki.co.kr

02-402-1337

서울특별시 송파구 송파대로 167
(테라타워 B동 1214~1217호)

ENKI WhiteHat Co., Ltd.

Copyright © 2025. All rights reserved.

공격자 관점의 깊이가 다른 보안을 제시합니다.

ENKI WhiteHat Co., Ltd.

Copyright © 2025. All rights reserved.