COMMENTS (0)
댓글은 익명으로 작성되며, 삭제 비밀번호를 설정하면 본인만 삭제할 수 있습니다. 비밀번호를 설정하지 않은 댓글은 누구나 삭제할 수 있습니다.
Velvet Ant(중국계 APT)가 pam_unix.so와 OpenSSH를 9개 변종으로 조작해 10년간 탐지를 피한 Operation Highland의 기술 메커니즘을 분석한다. 인증 우회, 자격증명 수집, 프로세스 위장, MITRE T1556.003 탐지 관점을 다룬다.
댓글은 익명으로 작성되며, 삭제 비밀번호를 설정하면 본인만 삭제할 수 있습니다. 비밀번호를 설정하지 않은 댓글은 누구나 삭제할 수 있습니다.
로그인 화면은 가장 신뢰받는 보안 경계선이다. 그런데 그 경계선 자체가 이미 공격자의 것이라면? 2016년부터 시작된 Operation Highland에서 중국계 APT 그룹 Velvet Ant는 PAM(Pluggable Authentication Modules)과 OpenSSH 바이너리를 교체해 9가지 백도어 변종을 리눅스 서버에 이식했다. Sygnia 사고대응팀이 고객사 인시던트 대응에 착수하기 전까지 탐지 알림은 단 한 건도 울리지 않았다. 발각까지 약 10년이 걸렸다.
이 사례는 인증 계층이 얼마나 깊이 뚫릴 수 있는지, 그리고 왜 "이상한 알림이 없으면 안전하다"는 가정이 틀렸는지를 기술적으로 보여준다.
PAM은 리눅스와 macOS에서 모든 인증 이벤트를 처리하는 단일 허브다. SSH 로그인, su 명령, sudo 실행, 화면 잠금 해제가 모두 PAM을 거친다. 달리 말하면, PAM 하나를 장악하면 개별 애플리케이션의 보안 로직을 건드리지 않고도 운영체제 전체의 인증 신뢰 체계를 무력화할 수 있다.
일반적인 악성코드는 새 프로세스를 생성하거나 파일을 드롭해 흔적을 남기고, EDR·AV가 이를 포착한다. 반면 PAM 백도어는 시스템이 정상적으로 호출하는 공유 라이브러리 내부에 숨는다. 로그에는 "인증 성공" 이벤트만 남고, 프로세스 트리도 평범하다. Sygnia 팀이 밝혔듯 "정상 사용자에게는 정상적으로 동작하며, 어떠한 비정상 로그 항목도 남기지 않는다." 이것이 10년 잠입을 가능하게 한 구조적 이유다.
PAM은 세 가지 구성 요소로 이루어진다.
| 구성 요소 | 역할 |
|---|---|
/etc/pam.d/ 설정 파일 | 서비스별 인증 모듈 체인 정의 |
/lib/security/*.so 모듈 | 실제 인증 처리 공유 라이브러리 |
PAM API (libpam.so) | 애플리케이션이 인증 요청을 전달하는 인터페이스 |
로그인 시 흐름은 단순하다. sshd가 PAM API를 호출하면 /etc/pam.d/sshd 설정 체인에 따라 pam_unix.so가 실행된다. pam_unix.so는 /etc/shadow의 해시와 입력된 패스워드를 비교해 PAM_SUCCESS 또는 PAM_AUTH_ERR를 반환한다.
이 구조에서 pam_unix.so 파일 하나를 조작된 버전으로 교체하면 운영체제의 나머지 구성 요소는 아무것도 눈치채지 못한다. /etc/shadow 비교 로직을 공격자가 원하는 방식으로 바꿀 수 있기 때문이다.
Sygnia 분석에 따르면 Velvet Ant는 pam_unix.so를 9가지 버전으로 각각 교체했다. 두 유형으로 나뉜다.
Type 1 — 인증 우회 전용: pam_sm_authenticate 함수 내부에 하드코딩된 마스터 패스워드를 삽입했다. 이 패스워드를 입력하면 /etc/shadow 대조 없이 즉시 PAM_SUCCESS가 반환된다. 로그인 성공 후 해당 패스워드 문자열을 메모리에서 즉시 NULL로 덮어써 포렌식 메모리 분석을 회피한다.
Type 2 — 우회 + 자격증명 수집: Pamauth@123456 패스워드로 인증을 우회하는 동시에, 정상 사용자가 입력한 계정명과 패스워드를 /usr/sbin/.ssh.log 숨긴 파일에 기록한다. 일부 변종은 중복 항목을 제거하는 de-duplication 로직까지 포함해 파일 크기를 최소화했다.
9개 변종이 단일 소스에서 파생된 것이 아님을 보여주는 또 다른 단서가 RPATH다. 각 변종의 RPATH에는 서로 다른 컴파일 경로가 박혀 있다. 예를 들어 /home/kevin/Desktop/Linux-PAM-{버전}/libpam/.libs와 /c/src/Linux-PAM-{버전}/libpam/.libs처럼 인스턴스마다 별도 빌드 환경에서 컴파일했음을 나타낸다. 이는 공격자가 탐지 회피를 위해 각 타깃별로 별도 바이너리를 제작했음을 의미한다.
신형 변종 (수정 바이너리 4개 — ssh, sshd, scp, ssh-keygen):
/usr/share/man9/ph/.ph.man에 암호화 저장. 연결 방향(O/I), 인증 방식(B/C/X), 성공 여부(Y/N) 플래그를 함께 기록.-d 플래그로 공격자가 직접 접속할 때 자신의 행위 기록을 억제.scp 바이너리는 root 권한 실행 시 SELinux를 해제.! 플래그로 프로세스 이름을 [kauditd] -sh로 바꿔 정상 리눅스 감사 데몬처럼 보이게 함.구형 변종 (수정 바이너리 2개):
정적 패스워드 대신 일별 MD5 해시를 인증 우회에 사용했다. 자격증명은 /usr/lib/eth-scsi/libethscsi.so에, 키로그는 /var/lib/sam/sam_{타임스탬프} 패턴으로 기록된다. 구형도 동일한 -d 플래그를 지원해 공격자 행위를 숨겼다.
Velvet Ant가 공략한 조직은 인터넷 연결이 없는 에어갭 내부망이었다. 1단계에서 auditdb라는 이름의 GS-Netcat 바이너리를 배포해 인터넷 노출 서버를 장악했다. 2단계에서 Nginx 설정을 수정해 HTTP POST 파라미터로 SSH 연결을 트리거하는 커스텀 uptime 바이너리로 내부망에 진입했다. 3단계에서 내부 서버 전체의 authorized_keys에 공격자 공개키를 추가하고 PAM·OpenSSH 바이너리를 교체해 영구 거점을 확보했다. 이 3단계 전환 과정에서 생성된 경보는 없었다.
Velvet Ant의 기법이 탐지를 어렵게 만드는 이유는 계층별로 다르다. 이를 감안하면 탐지 접근도 세 층위로 나눠야 한다. 파일 무결성이 가장 근본적이고, 프로세스 이상 탐지와 RPATH 감사는 그 다음 단계다.
다음 경로의 해시 변화를 모니터링해야 한다. 타임스탬프는 신뢰할 수 없다.
/lib/security/pam_unix.so, /lib64/security/pam_unix.so/etc/pam.d/ 하위 파일 (패키지 관리자 외 주체의 수정)ssh, sshd, scp, sftp, ssh-keygen 바이너리~/.ssh/authorized_keys 신규 항목공격자는 백도어 파일의 타임스탬프를 /etc/shells 생성 시각으로 위조했다. /etc/shells는 시스템 설치 시 한 번 생성된 후 거의 수정되지 않아 오래된 시각을 갖는다. find /lib -newer /etc/shells 같은 신선도 기반 탐지가 무력화되는 이유다. 따라서 파일 탐지는 반드시 암호화 해시를 기준으로 해야 한다.
title: PAM Module Unauthorized Modification
logsource:
category: file_event
product: linux
detection:
selection:
TargetFilename|contains:
- '/lib/security/pam_'
- '/lib64/security/pam_'
- '/etc/pam.d/'
filter_package_manager:
Initiator|contains:
- 'dpkg'
- 'rpm'
- 'yum'
- 'apt'
condition: selection and not filter_package_manager
level: high
Atomic Red Team T1556.003 검증 테스트:
/etc/pam.d/su-l에 auth sufficient pam_succeed_if.so uid >= 0 삽입 → 패스워드 없이 권한 상승 가능한지 검증pam_evil.so 컴파일·배포 → root 전환 인증 우회 동작 검증[kauditd] -sh처럼 대괄호로 감싼 프로세스가 /proc/*/status의 커널 스레드 목록과 불일치하면 이상 신호다. smbd -D의 PPID가 정상 Samba 데몬이 아닌 경우도 마찬가지다.
패키지 관리자가 설치한 정상 바이너리에는 /home/ 또는 /c/src/ 같은 개발 경로가 RPATH에 포함되지 않는다. readelf -d /lib/security/pam_unix.so | grep RPATH로 비표준 경로 존재 여부를 확인할 수 있다.
| 기법 ID | 기법명 | Operation Highland 적용 |
|---|---|---|
| T1556.003 | Modify Auth: PAM | pam_unix.so 백도어 교체 |
| T1098.004 | Account Manipulation: SSH Keys | authorized_keys 공개키 추가 |
| T1070.006 | Indicator Removal: Timestomp | /etc/shells 생성 시각으로 위조 |
| T1543.002 | Create/Modify System Process | systemd 지속성 유지 |
| T1090 | Proxy | Perl SOCKS5 프록시 배포 |
AhnLab ASEC은 PAM PRELOAD 방식(악성 PAM 모듈 등록 또는 LD_PRELOAD 후킹)을 EDR로 탐지하는 분석을 공개했다. 에어갭 내부망을 운영하는 국내 금융권·통신사·방산 분야도 동일 공격 체계에 노출될 수 있다. 외부 침투 경로가 없다고 판단한 환경일수록 파일 무결성 모니터링이 소홀해지는 경향이 있다는 점에서, Operation Highland의 3단계 침투 흐름은 국내 에어갭 운영 조직에 직접적인 참조가 된다.
pam_unix.so 하나 교체만으로 운영체제 수준의 인증 우회가 가능하다.AI 활용 안내 이 글은 AI(Claude)의 도움을 받아 작성되었습니다. 인용된 통계와 사례는 참고 자료에 명시된 출처에 근거하며, 설명을 위한 일부 표현은 각색되었습니다.
면책 조항 본 글은 보안 인식 제고를 위한 교육 목적으로 작성되었습니다. 언급된 공격 기법을 실제로 시도하는 행위는 「정보통신망법」, 「형법」 등에 따라 처벌받을 수 있으며, 본 블로그는 이에 대한 법적 책임을 지지 않습니다.