
Windows에서 서명된 자식 프로세스를 AM-PPL(Anti-Malware Protected Process-Light)로 실행하는 ELAM 드라이버와 서비스를 빌드하며, 보안 연구용입니다.
이 프로젝트는 연구 목적으로 '임의*' 프로세스를 Anti Malware Protected-Process-Light(PPL)로 실행할 수 있게 하는 것을 목표로 합니다. (* 자세한 내용은 제한 사항 섹션을 참조하세요)
자세한 내용과 이 프로젝트의 배경이 되는 이유는 제가 작성한 이 블로그 글을 참조하세요.
시스템 보호 프로세스는 Windows의 보안 모델로, 시스템 및 안티바이러스 프로세스를 관리자/SYSTEM에 의한 경우에도 변조나 내부 검사로부터 보호하도록 설계되었습니다.
Anti Malware 'Protected Process-Light'(PPL)로 시작된 프로세스는 수행할 수 있는 작업이 제한되며, 서명된 코드만 로드할 수 있고, 보호되지 않은 프로세스에 의해 디버깅, 검사 또는 중지될 수 없습니다. 또한 Microsoft-Windows-Threat-Intelligence ETW 공급자와 같은 특수 데이터에 접근할 수 있습니다.
이 프로젝트는 ELAM(Early-Launch Anti Malware) 드라이버와 사용자 모드 서비스를 생성합니다. 이 서비스는 시작될 때 구성 가능한 자식 프로세스를 실행하며, 이 자식 프로세스 역시 PPL로 표시됩니다.
자식 바이너리는 서비스와 동일한 인증서로 서명되어야 하며, 몇 가지 다른 제한 사항도 충족해야 하지만, 그 외에는 원하는 바이너리와 명령줄 인수를 사용할 수 있습니다.
솔직히 말해 ELAM과 PPL이 무엇인지 잘 설명하지 못하고 있으므로, 대신 다음에서 시작하는 것을 권장합니다:
Releases에서 미리 빌드되고 서명된 PPLRunner 서비스와 커널 모듈을 받을 수 있습니다. 릴리스에는 자동 생성된 인증서와 개인 키가 .pfx 파일로 포함되어 있으며, 이 파일은 비밀번호 password로 보호됩니다. 이건 연구 목적 전용이라고 말했었죠?
자신만의 프로젝트를 생성하고 빌드하려면:
Windows SDK가 설치되어 있는지 확인하세요.
generate_cert.ps1과 sign_file.ps1을 열고 $password 변수를 다른 값으로 변경하세요(두 파일의 값이 서로 일치해야 합니다).
generate_cert.ps1을 실행하세요. 그러면 새로운 개인 및 공개 인증서가 포함된 ppl_runner.pfx가 생성됩니다.
이 인증서는 PPLRunner에서 사용하는 모든 바이너리에 서명하는 데 사용됩니다.
ppl_runner.sln을 빌드하세요. 그러면 3개의 바이너리가 생성됩니다:
인증서 정보가 포함된 ELAM 커널 드라이버입니다. 이 드라이버는 실제로 아무 작업도 하지 않으며 실제로 로드되지도 않습니다. 단지 서명 인증서를 담는 그릇으로만 사용됩니다.
서비스 설치 프로그램 및 바이너리입니다. PPL 서비스로서 시작되면 자식 프로세스를 PPL로 실행한 다음 중지하고 종료합니다.
빌드 시 Visual Studio에 의해 올바른 인증서로 서명될 예제 실행 파일입니다. PPLRunner는 거의 모든 바이너리를 실행할 수 있으며, 이것은 자동으로 서명될 예제일 뿐입니다.
참고 운영 환경이나 가정용 PC가 아닌 테스트 머신에만 설치하세요.
빌드가 완료되면 elam_driver.sys와 ppl_runner.exe를 대상 머신의 폴더에 복사하세요.
관리자 권한 프롬프트에서 다음을 실행하여 테스트 서명을 활성화한 후 재부팅하세요:
bcdedit /set testsigning on
ppl_runner.exe install
이렇게 하면 ppl_runner라는 이름의 서비스가 설치됩니다.
바이너리를 서명하여 실행하려면 sign_file.ps1 스크립트를 사용하거나, 직접 signtool.exe를 실행하여 ppl_runner.pfx 인증서로 서명하십시오. signtool.exe가 없다면 Windows SDK에 포함되어 있습니다.
레지스트리 키 HKLM\SOFTWARE\PPL_RUNNER를 생성하십시오.
기본/빈 키를 REG_SZ로 설정하고, 실행할 바이너리의 전체 경로와 명령줄 인수를 포함시키십시오. 예를 들어 명령줄에서 다음과 같이 합니다:
REG.exe ADD HKLM\SOFTWARE\PPL_RUNNER /ve /t REG_SZ /d "C:\path\to\binay --argument 1"
서비스가 실행 파일을 시작하도록 하려면, 관리자 권한 프롬프트에서 다음을 실행하세요:
net start ppl_runner
PPL 서비스로서, ppl_runner는 시작되면 레지스트리 키를 읽고, 자식 프로세스도 PPL로 실행한 뒤, 중지하고 종료합니다. 실행에 성공해도 여전히 the service failed to run이라고 표시되지만, sc query ppl_runner로 반환 코드를 확인하면 0, 즉 ERROR_SUCCESS여야 합니다.
자식 프로세스는 보이지 않지만, Debug Output과 DBGView.exe를 사용해 어떤 형태로든 출력을 얻을 수 있습니다(child_example 코드 참조).
서비스가 Anti Malware PPL이기도 하므로, 비슷한 수준의 프로세스만이 이를 중지하고 삭제할 수 있습니다. 그러나 PPLRunner를 사용해 스스로를 제거할 수 있으며, 간단히 레지스트리 키의 명령을 다음과 같이 설정하면 됩니다:
C:\path\to\ppl_runner.exe remove
그리고 서비스를 실행합니다. 즉, 다음을 실행합니다:
REG.exe ADD HKLM\SOFTWARE\PPL_RUNNER /ve /t REG_SZ /d "C:\path\to\ppl_runner.exe remove"
net start ppl_runner
testsigning 모드에서만 작동합니다.ppl_runner.exe install을 다시 실행해야 합니다.Sysinternals의 DBGView를 실행하고 Win32 Global을 로깅하며 *[PPL_RUNNER]*로 필터링하세요.
이렇게 하면 서비스와 설치 프로그램의 모든 로그를 볼 수 있습니다.
추후 작성 예정 - Sealighter 블로그
James Forshaw는 기존 PPL 프로세스에 코드를 주입하는 멋진 프로젝트를 만들었습니다.
ELAM과 PPL에 대해 더 배우는 가장 좋은 방법은 아마도 Alex Ionescu를 팔로우하는 것일 것입니다. 다음부터 시작하는 것이 좋을지도 모릅니다: https://www.crowdstrike.com/blog/protected-processes-part-3-windows-pki-internals-signing-levels-scenarios-signers-root-keys/
Matthew Graeber와 James Forshaw를 팔로우하는 것도 또 하나의 좋은 방법입니다.
인증서에서 'To-Be-Signed' 해시를 얻기 위한 powershell 스크립트를 제공해 주신 Matt에게 큰 감사를 드립니다.