PowerShell 에서 Get-Process lsass 로 경로를 물었더니 빈칸이 돌아왔다. 내가 띄운 프로그램은 경로가 다 찍히는데 이것은 비어 있다. 파일이 없어서가 아니라, Windows 가 일부러 들여다보지 못하게 막아 둔 프로세스라서 그렇다. 2시즌 첫 편은 그만큼 Windows 가 아끼는 프로세스, 로그인과 비밀번호를 맡는 lsass.exe 다.

하나뿐이고, 부모는 wininit.exe

확인한 시점에 이 PC 에서 lsass.exe 는 한 개였다. 부팅한 지 이틀 반쯤 지난 상태였는데, 시작 시각이 부팅 직후 몇 초 안이었다.

Get-CimInstance Win32_Process -Filter "Name='lsass.exe' or Name='LsaIso.exe'" |
    Select-Object Name, ProcessId, ParentProcessId, SessionId, CreationDate

lsass.exe 와 LsaIso.exe 가 같은 초에 생겼고, 둘 다 부모 번호가 wininit.exe 였다. 세션 번호는 0, 즉 사용자 화면이 아니라 서비스 쪽 세션이다. 같은 부모 아래 services.exe 도 같은 초에 떠 있었다. 이 부팅 순서는 다음 편에서 자세히 본다.

일반 권한으로는 경로·명령줄·CPU 시간이 모두 빈 값으로 나왔다. 대신 파일은 직접 열어 볼 수 있다. C:\Windows\System32\lsass.exe 는 95,040바이트, 설명 "Local Security Authority Process", 버전 10.0.26100.9711 이고 서명은 Microsoft Windows 로 유효했다. 실행 파일은 작고, 실제 일은 안에 올라오는 인증 DLL 들이 한다.

메모리는 작았다. 성능 카운터로 2초 간격 세 번을 보니 CPU 는 0%, 개인 메모리는 약 30MB(작업 집합은 16.5MB), 핸들은 2,800개 남짓, 스레드는 14개였다. 작업 관리자의 이름 그대로 "로컬 보안 기관"이 하는 일에 비하면 조용한 편이다.

lsass 가 하는 일

lsass 는 Local Security Authority Subsystem Service 의 줄임말이다. 로그인할 때 비밀번호나 PIN 이 맞는지 확인하고, 확인이 끝나면 "이 사용자는 누구이고 어떤 그룹에 속한다"는 접근 토큰을 만들어 준다. 이후에 여는 프로그램은 모두 이 토큰을 물려받는다. 공유 폴더나 회사 도메인에 접속할 때 쓰는 NTLM·Kerberos 인증도 lsass 가 처리하고, 비밀번호 정책과 보안 감사 로그 기록도 여기서 나온다.

lsass 안에는 서비스도 몇 개 들어 있다.

tasklist /svc /fi "imagename eq lsass.exe"

이 PC 에서는 KeyIso(CNG Key Isolation), SamSs(Security Accounts Manager), VaultSvc(Credential Manager) 세 개였다. 로컬 계정 데이터베이스, 암호화 키 보호, 웹·Windows 자격 증명 보관함이 모두 이 프로세스 안에 있다는 뜻이다. 이름만 들어도 공격자가 노릴 만한 곳이고, 실제로 lsass 메모리에서 자격 증명을 빼내는 공격 도구가 오래전부터 알려져 있다.

그래서 Windows 는 lsass 를 두 겹으로 감싼다. 첫째는 보호된 프로세스(PPL)다. 이 PC 의 시스템 이벤트 로그에는 부팅 때 Wininit 이 "LSASS.exe가 4 수준의 보호된 프로세스로 시작되었습니다"라는 기록(이벤트 ID 12)을 남겨 두었다. 레지스트리 HKLM\SYSTEM\CurrentControlSet\Control\Lsa 의 RunAsPPL 값은 2였다. 2는 UEFI 잠금 없이 켜 둔 상태로 알려져 있다. 관리자 권한 프로그램이라도 서명 등급이 낮으면 lsass 메모리를 읽지 못하게 막는 장치이고, 앞에서 경로조차 빈칸으로 나온 이유이기도 하다.

LsaIso.exe 와 Credential Guard

둘째 겹이 lsass 옆에 붙어 있는 LsaIso.exe 다. 파일 설명은 "Credential Guard & VBS Key Isolation", 420,152바이트에 역시 Microsoft Windows 서명이 유효했다. 작업 관리자에서는 메모리가 거의 0으로 보이는데, 이 프로세스는 Secure System 편에서 본 가상화 기반 보안(VBS)의 격리된 쪽에서 돌기 때문이다. 일반 Windows 쪽에서는 그 안의 메모리가 보이지 않는다.

이름에 Credential Guard 가 들어 있어서 "Credential Guard 가 켜져 있구나" 하고 넘기기 쉽다. 이 PC 는 그렇지 않았다. 같은 부팅 기록에 이벤트 ID 14 "Credential Guard 구성: 레지스트리 구성 0x0"이 있었고, WMI 의 DeviceGuard 상태에서도 실행 중인 보안 서비스는 메모리 무결성(HVCI) 하나뿐이었다. 대신 이벤트 ID 18 "VBS 키 격리가 시작되었으며 VSM 격리 키를 보호합니다"가 남아 있었다. 이 PC 의 LsaIso 는 Credential Guard 가 아니라 키 격리 쪽 일을 하려고 뜬 것으로 보인다.

Get-WinEvent -FilterHashtable @{LogName='System'; ProviderName='Microsoft-Windows-Wininit'} -MaxEvents 5 |
    Select-Object TimeCreated, Id, Message

이 명령 하나면 내 PC 의 lsass 보호 수준과 Credential Guard 구성이 일반 권한으로도 보인다. Credential Guard 가 켜지면 NTLM 해시나 Kerberos 티켓 같은 비밀은 LsaIso 쪽에만 두고, lsass 는 그것을 직접 들고 있지 않게 된다. Windows 11 의 Enterprise·Education 판에서는 조건이 맞으면 기본으로 켜지는 것으로 알려져 있다.

CPU 나 메모리가 높을 때

정상적인 집이나 사무실 PC 에서 lsass 는 거의 놀고 있다. 계속 CPU 를 쓰고 있다면 lsass 를 부르는 쪽이 있는 것이다. 흔히 거론되는 경우는 이렇다.

  • 같은 PC 나 공유 폴더에 계속 로그인을 시도하는 프로그램이 있을 때(비밀번호가 바뀐 매핑 드라이브, 예전 비밀번호로 도는 예약 작업이나 서비스)
  • 회사 도메인 PC 에서 그룹 정책이나 인증서 갱신이 몰릴 때
  • 보안 제품이나 원격 관리 도구가 넣은 인증 확장 DLL 이 문제를 일으킬 때(메모리가 서서히 커지는 경우도 대개 여기로 알려져 있다)

마지막 경우는 레지스트리를 읽기만 해도 단서가 나온다. 위의 Lsa 키에서 Authentication Packages, Notification Packages, Security Packages 값을 본다. 이 PC 는 각각 msv1_0, scecli, 빈 값으로 Windows 기본 그대로였다. 여기에 모르는 DLL 이름이 있다면 무엇이 넣었는지 찾아볼 일이다. 값을 직접 지우는 건 로그인이 안 되는 PC 를 만들 수 있으니 하지 않는다. 그 DLL 을 넣은 프로그램을 업데이트하거나 제거하는 쪽이 안전하다.

로그인 시도가 반복되는지는 이벤트 뷰어의 Windows 로그 → 보안에서 실패한 로그온(이벤트 ID 4625)이 쌓이는지로 본다. 보안 로그는 관리자 권한으로 열어야 보인다. 같은 계정, 같은 원본 주소로 몇 초마다 실패가 찍혀 있다면 범인은 거기 적힌 프로세스나 원격 주소다.

가짜 lsass 구별과 끄면 안 되는 이유

악성코드는 lsass 이름을 즐겨 흉내 낸다. 기준은 세 가지다. 정상 lsass 는 하나뿐이고, 경로는 C:\Windows\System32\lsass.exe 이며, 부모는 wininit.exe 다. 대문자 I 로 시작하는 Isass.exe, s 가 하나 모자라거나 남는 이름도 종종 쓰인다.

Get-Process lsass* | Select-Object Name, Id, Path
Get-AuthenticodeSignature C:\Windows\System32\lsass.exe | Select-Object Status

진짜 lsass 는 일반 권한에서 Path 가 비어 나온다. 반대로 일반 권한에서도 경로가 술술 보이는 "lsass" 가 사용자 폴더나 Temp 아래 있다면 그쪽을 의심해야 한다. 두 개 이상 보이는 것도 이상 신호다.

진짜 lsass 는 끄려고 해도 거의 막히고, 관리자 권한으로 강제 종료하면 Windows 가 "1분 뒤에 다시 시작합니다"라는 경고를 띄우고 재부팅하는 것으로 알려져 있다. 로그인과 권한 확인을 맡은 프로세스가 사라지면 PC 가 더 버틸 수 없기 때문이다. CPU 가 높다면 끄는 대신 위에서처럼 누가 계속 인증을 요청하는지 찾는 것이 맞다.

다음 편은 lsass 를 띄운 wininit.exe 와 그 형제들, csrss.exe·smss.exe·winlogon.exe·services.exe 다. 부팅할 때 어떤 순서로 뜨는지, csrss 가 왜 두 개인지를 부모 관계로 따라가 본다.