
1. CVE-2026-46333 이란?
'ssh-keysign-pwn'은 리눅스 시스템에서 사용하는 ssh-keysign 유틸리티와 관련이 있습니다. 이 유틸리티는 SSH 호스트 기반 인증을 처리하는 중요한 역할을 하는데, 프로세스가 종료되는 찰나의 순간에 발생하는 '레이스 컨디션(Race Condition)' 결함이 발견되었습니다.
쉽게 말해, "프로세스가 꺼지는 아주 짧은 틈을 타 공격자가 시스템의 보안 제어를 우회하거나 권한을 가로챌 수 있는 버그"라고 보시면 됩니다.
- 취약점 명칭 : ssh-keysign-pwn
- 유형 : 프로세스 종료 시 발생하는 레이스 컨디션(Race Condition) 및 논리적 오류(Logic Flaw)
- 영향 범위: ssh-keysign 유틸리티와 관련된 리눅스 시스템
- 심각도: 배포판 및 환경에 따라 다르지만, 일반적으로 중요(Important) 또는 고위험군으로 분류
2. 기술적 분석
핵심 전제 구조와 커널의 허점
공격 과정을 이해하기 위해서는 리눅스 커널이 특권(SUID/SGID) 프로세스를 종료할 때 수행하는 작업과 권한 검사 함수의 작동 방식을 알아야 합니다.
- 종료 프로세스의 두 단계 (do_exit)
- 메모리 해제: 프로세스가 종료될 때 커널은 가장 먼저 해당 프로세스의 메모리 공간을 가리키는 포인터(mm_struct)를 파괴하고 비웁니다.
- 파일 디스크립터(FD) 닫기: 메모리가 비워진 후, 프로세스가 열고 있던 파일이나 파이프, 소켓 등의 FD를 차례로 닫습니다.
- 권한 검사의 구멍 (__ptrace_may_access) 다른 프로세스의 자원에 접근하려 할 때(예: pidfd_getfd 시스템 콜 사용 시), 커널은 이 함수를 통해 접근 권한을 검사합니다. 이때 보안을 위해 "해당 프로세스가 권한을 바꾸는 특권 프로그램(dumpable=0)인가?"를 체크하는 로직이 있습니다.
- 문제점: 이 함수는 타깃 프로세스의 메모리 포인터(mm_struct)가 이미 해제되어 존재하지 않으면, 특권 프로세스 여부를 확인하는 세이프가드(Safeguard) 체크를 그대로 통과(Skip)시켜 버리는 치명적인 로직 오류가 있었습니다.
단계별 공격 흐름 (Attack Flow)
공격자는 이 메모리가 해제된 시점(1단계)과 파일 디스크립터가 닫히기 전(2단계) 사이의 마이크로초(µs) 단위의 극히 짧은 틈(Race Window)을 노립니다.
[1단계] 타깃 특권 프로세스 실행 및 포크(Fork)
공격자는 루트 권한이나 특정 시스템 권한으로 실행되는 SUID/SGID 바이너리(예: /usr/lib/openssh/ssh-keysign 또는 /usr/bin/chage)를 실행합니다. 이 특권 프로세스는 실행되면서 내부적으로 중요 자원(예: 호스트 개인키, /etc/shadow 관련 파이프 등)에 접근할 수 있는 높은 권한의 파일 디스크립터(FD)를 생성합니다.
[2단계] 의도적인 프로세스 종료 유도 (Race Window 개방)
공격자는 이 특권 프로세스에 의도적으로 종료 시그널을 보내거나 특정 입력을 주어 프로세스가 종료 경로(do_exit)를 밟도록 유도합니다.
- 이 순간 커널은 타깃 프로세스의 메모리(mm_struct)를 가장 먼저 해제합니다.
- 하지만 아직 중요 자원이 담긴 파일 디스크립터(FD)들은 아직 닫히지 않고 열려 있는 임시 상태가 됩니다.
[3단계] pidfd_getfd()를 통한 커널 레이스 및 검사 우회
공격자가 미리 대기시켜 둔 일반 사용자 권한의 악성 프로세스가 pidfd_getfd() 시스템 콜을 호출하여, 방금 종료 중인 특권 프로세스의 파일 디스크립터를 복사해 달라고 커널에 요청합니다.
- 커널은 __ptrace_may_access()를 호출해 권한을 검사합니다.
- 하지만 타깃 프로세스는 이미 2단계에서 메모리가 해제된 상태이므로, 커널은 세이프가드 체크를 건너뛰고 "접근해도 안전한 일반 프로세스구나"라고 오판하여 요청을 승인합니다.
[4단계] 권한 있는 파일 디스크립터 가로채기 (FD Stealing)
검사를 무사히 통과한 공격자 프로세스는 종료 직전의 특권 프로세스가 쥐고 있던 파일 디스크립터를 자신의 프로세스 공간으로 그대로 가로채서(Hijacking) 가져오는 데 성공합니다.
[5단계] 루트 권한 획득 (Root Shell Acquired)
가로챈 파일 디스크립터가 무엇이냐에 따라 최종 공격 결과가 달라집니다.
- Shadow 파일 탈취: /usr/bin/chage 등에서 가로챈 경우, 관리자 패스워드 해시를 읽어와 크래킹 할 수 있습니다.
- D-Bus 세션 하이재킹: pkexec나 accounts-daemon 같은 특권 프로세스의 IPC(D-Bus) 연결을 가로채어, 높은 권한을 가진 시스템 서비스(예: systemd)에 "일반 사용자인 나에게 root 권한을 부여하라"는 임의 명령을 전달하여 최종적으로 루트 쉘을 획득하게 됩니다.
3. 공격 시연
Step 1) PoC 공격코드를 다운로드 합니다.

Step 2) 공격 소스 코드 파일을 확인합니다.

Step 3) make 명령어로 소스코드를 컴파일합니다.

Step 4) sshkeysign_pwn 공격 시 SSH PRIVATE KEY가 노출되는 것을 알 수 있습니다.

Step 5) chage_pwn 공격 시 /etc/shadow 파일이 노출되는 것을 알 수 있습니다.

Step 6) root 해시를 이용하여 미리 정의한 취약한 비밀번호 목록(dictionary) 중에 존재하는지 하나씩 맞춰보는 사전 대입 공격 코드입니다.

Step 7) 비밀번호가 white라는 것을 알 수 있습니다.

Step 8) 실습영상 입니다.
4. 대응 방안
1. 최선책: 리눅스 커널 패치 및 업데이트
이 취약점은 커널의 로직 오류이므로, 제조사(Vendor)에서 배포한 최신 보안 패치가 포함된 커널로 업데이트하는 것이 가장 확실한 대응 방안입니다.
Ubuntu / Debian 계열
# 1. 패키지 리스트 업데이트
sudo apt update
# 2. 커널을 포함한 시스템 패키지 업그레이드
sudo apt upgrade -y
# 3. 변경된 커널 적용을 위한 시스템 재부팅
sudo reboot
RHEL / CentOS / Rocky Linux 계열
# 1. 커널 패키지 업데이트
sudo dnf update kernel -y
# 2. 시스템 재부팅
sudo reboot
2. 차선책: 런타임 커널 완화 조치
즉시 재부팅을 할 수 없거나 패치 적용이 어려운 상황이라면, 공격 체인의 핵심인 __ptrace_may_access 검사를 강화하여 일반 사용자의 프로세스 추적(ptrace) 및 파일 디스크립터 탈취(pidfd_getfd)를 차단해야 합니다.
임시 적용 (재부팅 시 초기화됨)
sudo sysctl -w kernel.yama.ptrace_scope=2
영구 적용 (재부팅 후에도 유지)
# sysctl 설정 파일에 해당 옵션 추가
echo "kernel.yama.ptrace_scope = 2" | sudo tee -a /etc/sysctl.d/99-security.conf
# 설정 파일 즉시 반영
sudo sysctl --system
💡 설명: ptrace_scope 값을 2로 설정하면 root 권한(CAP_SYS_PTRACE)을 가진 관리자만 ptrace 시스템 콜을 사용할 수 있게 제한하므로, 일반 사용자 계정에서의 취약점 악용 시도를 원천 차단할 수 있습니다.
'CVE 취약점' 카테고리의 다른 글
| Drupal Core 데이터베이스 SQL 인젝션 취약점 (CVE-2026-9082) (0) | 2026.06.29 |
|---|---|
| Math.js RCE 취약점(CVE-2026-40897) (0) | 2026.06.07 |
| NGINX-Rift (CVE-2026-42945) (0) | 2026.05.30 |
| PinTheft (CVE-2026-43494) (0) | 2026.05.24 |
| Fragnesia (CVE-2026-46300) (0) | 2026.05.16 |