Mac은 언제나 수백 개의 프로세스를 실행합니다. 대부분은 정상적인 시스템 서비스와 직접 설치한 앱입니다. 하지만 서명되지 않았거나, 비정상적인 경로에서 실행되거나, 조용히 네트워크 연결을 여는 단 하나의 악성 프로세스가 컴퓨터 전체를 위협할 수 있습니다. 건강한 시스템 데몬과 의심스러운 침입자를 구별하는 법을 아는 것은 macOS 사용자가 익힐 수 있는 가장 실용적인 보안 기술 중 하나입니다.
빠른 답변
macOS에서 의심스러운 프로세스를 탐지하려면, codesign -dvvv로 누락되거나 유효하지 않은 코드 서명을 점검하고, spctl --assess로 Gatekeeper 승인을 확인하며, 각 프로세스의 실행 경로, 부모 프로세스, 네트워크 활동, entitlements를 검사하세요. Apple이나 개발자 서명 없이 /tmp, /var/folders, 또는 사용자가 쓰기 가능한 위치에서 실행되는 프로세스는 즉시 조사할 가치가 있습니다.
위험 신호: 의심스러운 프로세스의 징후
낯선 프로세스가 모두 악성코드는 아니지만, 특정 패턴은 경계 수준을 높여야 합니다:
- 코드 서명이 없거나 ad-hoc 서명임. 정상적인 macOS 앱은 식별된 개발자나 Apple이 서명합니다. 서명되지 않은 바이너리가 지속적으로 실행된다면 위험 신호입니다.
- 임시 또는 숨김 디렉터리의 실행 경로.
/tmp,/private/var,/var/folders, 또는 점 접두어가 붙은 디렉터리(.hidden/)에서 실행되는 프로세스는 자세히 살펴볼 가치가 있습니다. 정상적인 앱은/Applications,/System,/usr에 있습니다. - 비정상적인 부모 프로세스.
bash가 생성한curl또는python3프로세스가, 그bash는 로그인 시launchd가 생성했고, 알아볼 수 있는 일치하는 LaunchAgent가 없다면 의심스럽습니다. - 예상치 못한 아웃바운드 네트워크 연결. 알아볼 수 없는 프로세스가 낯선 IP 주소로, 특히 비표준 포트로 연결을 맺는다면 조사할 만합니다.
- 명확한 목적 없는 높은 리소스 사용량. 크립토마이너와 데이터 탈취 도구는 흔히 사용자가 하는 어떤 작업과도 관련 없는 지속적인 CPU 또는 네트워크 I/O 부하를 보입니다.
- 누락되었거나 지나치게 광범위한 entitlements. 단순한 유틸리티가
com.apple.security.cs.disable-library-validation이나com.apple.security.cs.allow-unsigned-executable-memory를 요구한다면 비정상적입니다.
단계별: 의심스러운 프로세스 조사하기
프로세스 목록에서 낯선 것을 발견하면, 이 점검 항목들을 체계적으로 진행하세요.
1. 코드 서명 검증하기
가장 중요한 단일 점검입니다. 바이너리에 대해 codesign을 실행하세요:
codesign -dvvv /path/to/suspicious-binary
Authority 체인을 살펴보세요. 건강한 앱은 다음과 같은 내용을 보여줍니다:
Authority=Developer ID Application: Company Name (TEAMID)
Authority=Developer ID Certification Authority
Authority=Apple Root CA
code object is not signed at all이 보이거나 권한 체인이 없다면, 그 바이너리는 식별된 개발자가 서명한 적이 없는 것입니다.
2. Gatekeeper 및 공증 상태 점검하기
Apple의 Gatekeeper는 소프트웨어가 공증되었는지, 즉 자동화된 악성코드 검사를 위해 Apple에 제출되었는지 검증합니다:
spctl --assess --verbose /path/to/suspicious-binary
공증된 앱은 accepted, source=Notarized Developer ID를 반환합니다. 그 외의 결과는 해당 바이너리가 Apple의 공증 요구를 우회했거나 그 이전에 만들어졌음을 의미합니다.
3. 실행 경로와 인수 검사하기
프로세스 바이너리가 실제로 어디에 있는지 찾아보세요:
ps -eo pid,comm,args | grep <process-name>
정상적인 시스템 프로세스는 /usr/libexec, /System/Library, 또는 /Applications에서 실행됩니다. com.apple.something이라는 이름의 프로세스가 /Users/you/Library/LaunchAgents/에서 실행되고 바이너리가 /tmp에 있다면, 시스템 서비스를 흉내 내고 있는 것입니다.
4. 지속성 메커니즘 점검하기
악성코드는 보통 재부팅에서 살아남기 위해 LaunchAgent나 LaunchDaemon을 설치합니다:
# User-level persistence
ls ~/Library/LaunchAgents/
# System-level persistence
ls /Library/LaunchDaemons/
ls /Library/LaunchAgents/
낯선 .plist 파일을 열고 ProgramArguments 키를 확인해 어떤 바이너리를 실행하는지 보세요.
5. 네트워크 연결 살펴보기
프로세스가 무엇과 통신하는지 확인하세요:
lsof -i -n -P | grep <PID>
낯선 IP로의 연결, 특히 C2(명령 제어) 서버가 흔히 사용하는 4444, 8080 같은 포트나 그 외의 비표준 포트로의 연결을 살펴보세요.
6. entitlements 검토하기
entitlements는 프로세스가 어떤 시스템 리소스에 접근할 수 있는지 정의합니다:
codesign -d --entitlements - /path/to/binary
정상적인 PDF 뷰어라면 com.apple.security.device.camera나 com.apple.security.network.server가 필요하지 않아야 합니다.
의심스러워 보이는 흔한 정상 프로세스
당황하기 전에 이 목록을 확인하세요. 다음 Apple 시스템 프로세스들은 사용자를 자주 혼란스럽게 합니다:
| 프로세스 | 실제로 하는 일 |
|---|---|
kernel_task | macOS 커널; 높은 CPU는 악성코드가 아니라 발열 조절을 의미하는 경우가 많음 |
mds / mds_stores | Spotlight 인덱싱 엔진; 앱 설치나 파일 복사 후 급증함 |
WindowServer | 전체 GUI의 컴포지터; 높은 CPU는 보통 디스플레이 배율 문제를 의미함 |
nsurlsessiond | App Store 업데이트와 iCloud 동기화를 위한 백그라운드 다운로드 |
trustd | 인증서 및 신뢰 평가 데몬 |
syspolicyd | Gatekeeper 정책 시행 |
cloudd | iCloud Drive 동기화 데몬 |
bird | iCloud 문서 동기화 도우미 |
mediaanalysisd | 얼굴/객체 인식을 위한 사진 앱의 ML 처리 |
suggestd | Siri 제안 및 Spotlight 지식 인덱싱 |
이들 중 하나가 유효한 Apple 서명을 가지고 /usr/libexec나 /System/Library에서 실행된다면, 거의 확실히 정상입니다.
프로세스 보안 감사를 위한 도구
Activity Monitor
활성 상태 보기(Activity Monitor)는 CPU, 메모리, 기본적인 프로세스 정보를 보여주지만, 코드 서명, entitlements, 부모-자식 프로세스 트리, 실행 경로를 유용한 방식으로 표시하지 못합니다. 보안 작업에서는 기껏해야 출발점에 불과합니다.
Terminal: codesign과 spctl
명령줄 도구 codesign과 spctl은 서명 및 공증 검증의 가장 확실한 근거입니다. 필수적이지만 수십 개의 프로세스를 감사해야 할 때는 번거롭습니다. 각각 바이너리 경로를 수동으로 찾아야 하기 때문입니다.
ProcXray
ProcXray는 코드 서명 검증과 entitlements 검사를 프로세스 모니터링 UI 안으로 직접 가져옵니다. 실행 중인 모든 프로세스에 대해 다음을 볼 수 있습니다:
- 한눈에 보는 서명 상태 — 서명됨, 서명되지 않음, 또는 유효하지 않음 — 터미널 명령을 실행하지 않고도 확인.
- 전체 entitlements 목록 — 각 프로세스가 요구하는 시스템 권한을 검사.
- 프로세스 트리 뷰 — 어떤 부모 프로세스가 의심스러운 자식을 생성했는지 즉시 추적.
- 실행 경로와 인수 — 바이너리가 정확히 어디에 있고 어떻게 호출되었는지 확인.
각 바이너리에 대해 수동으로 codesign -dvvv를 실행하는 대신, ProcXray는 모든 프로세스의 보안 컨텍스트를 실시간으로 보여줍니다. 서명되지 않았거나 예상치 못한 위치에서 실행되는 것을 발견하면, Terminal로 전환하지 않고도 그 계보와 네트워크 컨텍스트를 조사할 수 있습니다.
자주 묻는 질문
프로세스가 악성코드인지 정상적인 시스템 서비스인지 어떻게 구별하나요?
세 가지를 확인하세요: (1) 코드 서명 — codesign -dvvv를 실행해 Apple 또는 식별된 개발자 권한 체인을 찾으세요, (2) 실행 경로 — 정상 서비스는 /tmp나 숨김 디렉터리가 아니라 /System이나 /usr/libexec에서 실행됩니다, (3) 지속성 — ~/Library/LaunchAgents와 /Library/LaunchDaemons에 바이너리를 가리키는 낯선 plist 파일이 있는지 확인하세요.
악성코드가 Activity Monitor에 숨을 수 있나요?
네. 루트킷은 시스템 호출을 후킹해 사용자 공간 도구로부터 프로세스를 숨길 수 있습니다. macOS 시스템 무결성 보호(SIP)는 이를 훨씬 어렵게 만듭니다. SIP가 활성화되어 있으면(csrutil status) 최신 macOS에서 커널 수준의 은닉이 차단됩니다. 다만 악성코드는 여전히 정상처럼 들리는 이름을 사용하거나 서명된 프로세스에 주입하는 방식으로 위장할 수 있습니다.
Gatekeeper가 모든 악성코드를 막아주나요?
아니요. Gatekeeper와 공증은 강력한 1차 방어선을 제공합니다. 기본적으로 서명되지 않고 공증되지 않은 소프트웨어의 실행을 차단합니다. 하지만 사용자가 Gatekeeper를 명시적으로 우회하거나(우클릭 > 열기), 악성코드가 이미 실행 중인 프로세스를 통해 전달되면(예: 브라우저 익스플로잇) Gatekeeper는 우회됩니다. 심층 방어 — 서명 점검, 프로세스 동작 모니터링, 지속성 메커니즘 감사 — 는 여전히 필수적입니다.
출처 및 참고 자료
- Apple: About Gatekeeper
- Apple: Notarizing macOS Software Before Distribution
- Apple: System Integrity Protection
- Apple:
codesignman page - Apple:
spctlman page - Apple: Entitlements Documentation
ProcXray 다운로드 → — 코드 서명 검증 내장, macOS Sonoma+.