Joe Desimone

스마트 앱 제어 해체하기

새로운 초기 접근 및 회피 기술

11분 읽기보안 연구
스마트 앱 컨트롤 분석

서문

Elastic의 평판 서비스와 같은 평판 기반 보호는 낮은 오탐률을 유지하면서 탐지 기능을 크게 향상시킬 수 있습니다. 그러나 모든 보호 기능과 마찬가지로 약점이 존재하며 우회가 가능합니다. 이러한 약점을 이해하면 방어자는 탐지 엔지니어링을 주요 커버리지 빈틈에 집중할 수 있습니다. 이 문서에서는 평판 기반 시스템에 대한 우회 방법을 연구하기 위한 사례 연구로 Windows 스마트 앱 제어 및 스마트 스크린을 살펴본 다음 이러한 약점을 커버하는 탐지 방법을 시연합니다.

핵심 사항:

  • Windows 스마트 앱 제어 및 스마트 스크린에는 공격자가 보안 경고나 팝업 없이 초기 액세스 권한을 얻을 수 있는 몇 가지 설계상의 취약점이 있습니다.
  • LNK 파일을 처리하는 버그는 이러한 보안 제어를 우회할 수도 있습니다.
  • 방어자는 이러한 OS 기능의 한계를 이해하고 보안 스택에 탐지 기능을 구현하여 이를 보완해야 합니다.

스마트스크린/SAC 배경

Microsoft 스마트스크린은 Windows 8부터 기본 제공된 OS 기능입니다. 이 기능은 '웹 마크 (MotW)'가 있고 사용자가 클릭한 파일에서 작동합니다. Microsoft는 Windows 11 출시와 함께 SAC(스마트 앱 제어)를 도입했습니다. SAC는 어떤 면에서는 스마트스크린의 진화된 버전이라고 할 수 있습니다. Microsoft는 "악의적이거나 신뢰할 수 없는 앱을 차단하여 새로운 위협과 새로운 위협으로부터 중요한 보호 기능을 추가합니다."라고 말합니다. 애플리케이션이 실행될 때 Microsoft 클라우드 서비스를 쿼리하는 방식으로 작동합니다. 안전한 것으로 알려진 경우 실행이 허용되지만, 알 수 없는 경우 유효한 코드 서명 서명이 있는 경우에만 실행됩니다. SAC가 활성화되면 Defender 스마트스크린을 대체하고 비활성화합니다.

Microsoft는 스마트 스크린 및 스마트 앱 제어를 위한 파일의 신뢰 수준을 쿼리하기 위해 문서화되지 않은 API를 노출합니다. 이 연구를 돕기 위해 저희는 파일의 신뢰도를 표시하는 유틸리티를 개발했습니다. 이 유틸리티의 소스 코드는 여기에서 확인할 수 있습니다.

서명된 멀웨어

스마트 앱 제어를 우회하는 한 가지 방법은 코드 서명 인증서로 멀웨어에 간단히 서명하는 것입니다. SAC 이전에도 공격자들은 탐지를 피하기 위해 멀웨어에 서명하는 경향이 있었습니다. 최근에는 공격자들이 EV(확장 유효성 검사) 서명 인증서를 일상적으로 획득하고 있습니다. EV 인증서는 액세스 권한을 얻기 위해 신원 증명이 필요하며, 특별히 설계된 하드웨어 토큰에만 존재할 수 있어 도용이 어렵습니다. 하지만 공격자들은 기업을 사칭하여 이러한 인증서를 구매할 수 있는 방법을 찾아냈습니다. SolarMarker의 배후에 있는 위협 그룹은 캠페인 전반에 걸쳐 100개가 넘는 고유 서명 인증서를 활용했습니다. 인증 기관(CA)은 남용을 단속하고 부정하게 획득한 인증서를 최소화하기 위해 더 많은 노력을 기울여야 합니다. 사기성 인증서를 가장 자주 판매하는 CA에 압력을 가하기 위해 더 많은 공개 조사가 필요할 수 있습니다.

평판 하이재킹

평판 하이재킹은 평판 기반 멀웨어 보호 시스템에 대한 일반적인 공격 패러다임입니다. 이는 애플리케이션 제어 시스템에 대한 케이시 스미스 등의 잘못된 신뢰 연구와 가브리엘 랜도와 저의 취약한 드라이버 연구와 유사합니다. 불행히도 이 경우의 공격 표면은 훨씬 더 큽니다. 평판 탈취는 시스템을 우회하기 위해 평판이 좋은 앱을 찾아서 용도를 변경하는 것입니다. 초기 액세스 벡터로 작동하려면 한 가지 제약 조건은 애플리케이션이 명령줄 매개 변수 없이 제어되어야 한다는 것입니다(예: 예측 가능한 파일 경로에서 스크립트를 로드하고 실행하는 스크립트 호스트).

스크립트 호스트는 평판 하이재킹 공격의 이상적인 표적입니다. 특히 외부 기능 인터페이스(FFI) 기능이 포함된 경우 더욱 그렇습니다. FFI를 사용하면 공격자는 메모리에 임의의 코드와 멀웨어를 쉽게 로드하고 실행할 수 있습니다. VirusTotal과 GitHub에서 검색을 통해 평판이 좋고 전체 코드 실행에 사용할 수 있는 스크립트 호스트를 다수 확인했습니다. 여기에는 Lua, Node.js 및 자동 핫키 인터프리터가 포함됩니다. 이 기술을 시연하는 샘플은 여기에서 확인할 수 있습니다.

다음 동영상은 보안 경고 없이 스마트 앱 제어를 우회하기 위해 JamPlus 빌드 유틸리티를 사용하여 하이재킹하는 방법을 보여줍니다:

또 다른 예에서는 알려진 자동 핫키 인터프리터를 사용하여 스마트스크린 보안 경고를 우회했습니다:

알려진 애플리케이션의 평판을 가로채는 또 다른 방법은 이를 악용하는 것입니다. 이는 예측 가능한 경로에서 INI 파일을 읽다가 발생하는 일반적인 버퍼 오버플로와 같은 간단한 문제일 수 있습니다. 다른 기본 요소(예: 명령 실행/레지스트리 쓰기 등)를 연쇄적으로 연결하는 더 복잡한 것일 수도 있습니다. 또한 알려진 여러 앱을 서로 연결하여 전체 코드를 실행할 수 있습니다. 예를 들어, 구성 파일을 읽고 명령줄 매개변수를 실행하는 한 애플리케이션은 임의의 코드 실행을 위해 매개변수 집합이 필요한 다른 알려진 애플리케이션을 실행하는 데 사용할 수 있습니다.

평판 시드

평판 보호에 대한 또 다른 공격은 공격자가 제어하는 바이너리를 시스템에 심는 것입니다. 이러한 바이너리는 신중하게 제작하면 나중에 공격자에게 유용하게 사용되면서도 양성으로 보이게 하고 좋은 평판을 얻을 수 있습니다. 새로운 스크립트 호스트 바이너리, 알려진 취약점이 있는 애플리케이션 또는 유용한 프리미티브가 있는 애플리케이션일 수 있습니다. 반면에 악성 코드가 포함되어 있지만 특정 날짜 또는 환경 트리거 이후에만 활성화되는 바이너리일 수도 있습니다.

스마트 앱 제어가 시딩에 취약한 것으로 보입니다. 한 머신에서 샘플을 실행한 후 약 2 시간 후에 양호한 라벨을 받았습니다. 저희는 기본적인 에뮬레이션 방지 기술이 긍정적인 평판이나 평판을 받는 데 영향을 미치는 것으로 나타났습니다. 다행히도 스마트스크린은 애플리케이션을 신뢰하기 전에 전 세계 사용률 표시줄이 더 높은 것으로 보입니다. 이 기술을 시연하는 샘플은 여기에서 확인할 수 있으며 아래에 설명되어 있습니다:

평판 조작

평판 시스템에 대한 세 번째 공격 유형은 평판 변조입니다. 일반적으로 평판 시스템은 암호학적으로 안전한 해시 시스템을 사용하여 조작을 불가능하게 합니다. 그러나 파일을 일부 수정해도 SAC의 평판이 바뀌지 않는 것으로 나타났습니다. SAC는 표준 파일 해싱 대신 또는 추가로 퍼지 해싱 또는 기능 기반 유사성 비교를 사용할 수 있습니다. 또한 클라우드의 ML 모델을 활용하여 알려진 상품과 매우 유사한 등 매우 양호한 점수를 받은 파일을 허용할 수도 있습니다. 놀랍게도 일부 코드 섹션은 관련 평판을 잃지 않고 수정할 수 있습니다. 시행착오를 통해 안전하게 변조할 수 있는 세그먼트를 파악하고 동일한 평판을 유지할 수 있었습니다. Microsoft나 SAC에서 본 적이 없는 고유한 해시를 사용하여 변조된 바이너리 하나를 만들었습니다. 여기에는 "실행 계산" 셸코드가 포함되어 있으며 실행 모드에서 SAC로 실행될 수 있습니다:

LNK 스톰핑

사용자가 파일을 다운로드하면 브라우저는 웹의 마크(MotW)라고 하는 대체 데이터 스트림에 연결된 "Zone.Identifier" 파일을 생성합니다. 이렇게 하면 시스템의 다른 소프트웨어(AV 및 EDR 포함)가 해당 파일이 더 위험하다는 것을 알 수 있습니다. SmartScreen은 웹 마크가 있는 파일만 스캔합니다. 특정 파일 유형이 있는 경우 SAC를 완전히 차단합니다. 일반적으로 이러한 보안 시스템을 우회할 수 있기 때문에 MotW 우회는 흥미로운 연구 대상이 되고 있습니다. 금전적 동기를 가진 위협 그룹은 여러 취약점을 발견하고 이를 활용하여 MotW 검사를 우회했습니다. 이러한 기법에는 자바스크립트 또는 MSI 파일에 위조된 유효하지 않은 코드 서명 서명을 추가하는 것이 포함됩니다.

연구 도중, 저희는 악용하기 쉬운 또 다른 MotW 우회 방법을 우연히 발견했습니다. 여기에는 비표준 대상 경로 또는 내부 구조를 가진 LNK 파일 제작이 포함됩니다. 클릭하면 이러한 LNK 파일은 explorer.exe에 의해 표준 포맷으로 수정됩니다. 이 수정으로 인해 보안 검사가 수행되기 전에 MotW 레이블이 제거됩니다. LNK 파일을 덮어쓰는 함수는 다음 호출 스택에서 볼 수 있듯이 _SaveAsLink() 입니다:

보안 검사를 수행하는 함수는 다음 호출 스택에 표시된 것처럼 CheckSmartScreen() 입니다:

이 문제를 가장 쉽게 설명하는 방법은 대상 실행 경로(예: powershell.exe.)에 점이나 공백을 추가하는 것입니다. 또는 .\target.exe 과 같은 상대 경로가 포함된 LNK 파일을 만들 수도 있습니다. 링크를 클릭하면 explorer.exe 에서 일치하는 .exe 이름을 검색하여 찾고, 전체 경로를 자동으로 수정하고, 디스크의 파일을 업데이트(MotW 제거)한 후 마지막으로 대상을 실행합니다. 또 다른 변형은 LNK의 타겟 경로 배열의 단일 항목에 다단계 경로를 만드는 것입니다. 대상 경로 배열에는 일반적으로 디렉터리당 1 항목이 있어야 합니다. pylnk3 유틸리티는 실행 전후의 익스플로잇 LNK(비표준 형식)의 구조(표준 형식)를 보여줍니다:

이러한 기술을 시연하는 Python 스크립트는 여기에서 확인할 수 있습니다.

다음은 스마트 앱 제어에서 MotW 제한을 우회하여 Powershell을 시작하고 계산을 표시하는 LNK 파일을 보여 줍니다:

다른 예에서는 이 기술을 Microsoft cdb 명령줄 디버거와 연결하여 임의의 코드를 실행하고 셸 코드를 실행하여 계산을 팝하는 방법을 보여드립니다:

바이러스토탈에서 이 버그를 보여주는 여러 샘플을 확인했으며, 야생에서 실제로 사용되고 있음을 입증했습니다. 확인된 가장 오래된 샘플은 6 년 전에 제출된 것입니다. 또한 해당 버그에 대한 자세한 내용을 MSRC에 공개했습니다. 이 문제는 향후 Windows 업데이트에서 수정될 수 있습니다. 패치가 나올 때까지 방어자가 이 활동을 식별할 수 있도록 탐지 로직 및 대응책과 함께 이 정보를 공개합니다.

탐지

평판 하이재킹은 그 특성상 탐지하기 어려울 수 있습니다. 이 기술을 수행하기 위해 수많은 애플리케이션을 함께 사용할 수 있습니다. 악용되는 것으로 알려진 애플리케이션을 분류하고 차단하는 것은 초기(그리고 지속적인) 단계입니다.

process where process.parent.name == "explorer.exe" and process.hash.sha256 in (
"ba35b8b4346b79b8bb4f97360025cb6befaf501b03149a3b5fef8f07bdf265c7", // AutoHotKey
"4e213bd0a127f1bb24c4c0d971c2727097b04eed9c6e62a57110d168ccc3ba10" // JamPlus
)

그러나 이러한 접근 방식은 항상 공격자에게 뒤처지게 됩니다. 조금 더 강력한 접근 방식은 악용되는 소프트웨어의 일반적인 범주를 식별하는 행동 시그니처를 개발하는 것입니다. 예를 들어 의심스러운 호출 스택에서 일반적인 Lua 또는 Node.js 함수 이름이나 모듈을 찾을 수 있습니다:

sequence by process.entity_id with maxspan=1m
[library where
  (dll.Ext.relative_file_creation_time <= 3600 or
   dll.Ext.relative_file_name_modify_time <= 3600 or
   (dll.Ext.device.product_id : ("Virtual DVD-ROM", "Virtual Disk","USB *") and not dll.path : "C:\\*")) and
   _arraysearch(process.thread.Ext.call_stack, $entry, $entry.symbol_info: "*!luaopen_*")] by dll.hash.sha256
[api where
 process.Ext.api.behaviors : ("shellcode", "allocate_shellcode", "execute_shellcode", "unbacked_rwx", "rwx", "hook_api") and
 process.thread.Ext.call_stack_final_user_module.hash.sha256 : "?*"] by process.thread.Ext.call_stack_final_user_module.hash.sha256
api where process.Ext.api.name : ("VirtualProtect*", "WriteProcessMemory", "VirtualAlloc*", "MapViewOfFile*") and
 process.Ext.api.behaviors : ("shellcode", "allocate_shellcode", "execute_shellcode", "unbacked_rwx", "rwx", "hook_api") and
 process.thread.Ext.call_stack_final_user_module.name : "ffi_bindings.node"

보안팀은 다운로드한 파일에 특히 주의를 기울여야 합니다. 지역 평판을 사용하여 환경의 이상값을 식별하여 면밀히 검사할 수 있습니다.

from logs-* | 
where host.os.type == "windows"
and event.category == "process" and event.action == "start"
and process.parent.name == "explorer.exe"
and (process.executable like "*Downloads*" or process.executable like "*Temp*")
and process.hash.sha256 is not null
| eval process.name = replace(process.name, " \\(1\\).", ".")
| stats hosts = count_distinct(agent.id) by process.name, process.hash.sha256
| where hosts == 1

LNK 스톰핑에는 다양한 변종이 있을 수 있으므로 LNK 파일에 대한 서명 기반 탐지가 어려울 수 있습니다. 하지만 모두 비슷한 동작 신호( explorer.exe LNK 파일 덮어쓰기)를 트리거해야 합니다. 이는 특히 다운로드 폴더 또는 LNK에 웹 마크가 있는 경우 비정상적인 현상입니다.

file where event.action == "overwrite" and file.extension : "lnk" and
 process.name : "explorer.exe" and process.thread.Ext.call_stack_summary : "ntdll.dll|*|windows.storage.dll|shell32.dll|*" and
 (
  file.path : ("?:\\Users\\*\\Downloads\\*.lnk", "?:\\Users\\*\\AppData\\Local\\Temp\\*.lnk") or
  file.Ext.windows.zone_identifier == 3
  )

마지막으로 인메모리 회피, 지속성, 자격 증명 액세스, 열거, 측면 이동과 같은 일반적인 공격자 기법에 대한 강력한 행동 범위는 평판 탈취를 비롯한 현실적인 침입을 탐지하는 데 도움이 됩니다.

결론

평판 기반 보호 시스템은 상용 멀웨어를 차단하는 강력한 계층입니다. 하지만 다른 보호 기술과 마찬가지로 약간의 주의를 기울이면 우회할 수 있는 약점이 있습니다. 스마트 앱 제어 및 스마트스크린에는 여러 가지 근본적인 설계상의 취약점이 있어 보안 경고 없이 최소한의 사용자 상호 작용만으로 초기 액세스가 허용될 수 있습니다. 보안팀은 탐지 스택에서 다운로드를 면밀히 조사해야 하며, 이 영역의 보호를 위해 OS 기본 보안 기능에만 의존해서는 안 됩니다.