1. 싱글 유저 모드(Single User Mode)란?
리눅스의 싱글 유저 모드는 시스템이 최소한의 서비스만 올린 채 root 권한으로 부팅되는 복구용 모드다.
네트워크 서비스, 인증 데몬 등이 시작되기 전에 root 셸이 열리기 때문에, 원래 목적은 관리자가 비밀번호를 분실했을 때 시스템을 복구하는 용도다.
문제는 이 복구 경로가 공격자에게도 동일하게 열려 있다는 점이다.
물리적 접근만 가능하면 인증 없이 root 비밀번호를 변경할 수 있으므로, KISA 주요정보통신기반시설 보안 가이드 등 주요 보안 진단 항목에 "싱글모드 부팅 시 인증 요구" 항목이 포함되어 있다.
2. 공격 시나리오: rd.break를 이용한 root 비밀번호 초기화
1️⃣ rd.break란?
rd.break는 리눅스 커널 파라미터로, initramfs 단계에서 부팅을 멈추고 셸을 띄우는 역할을 한다.
일반적인 부팅 과정에서 커널은 initramfs(초기 RAM 파일시스템)를 로드한 뒤, 실제 루트 파일시스템(/sysroot)으로 전환(switch_root)하는데, rd.break는 이 전환 직전에 프로세스를 중단시킨다.
이 시점의 환경은 다음과 같다:
- 현재 루트(/)는 initramfs의 임시 환경
- 실제 디스크의 시스템은 /sysroot에 읽기 전용(ro)으로 마운트
- 네트워크, 인증 서비스 미시작 상태 → 비밀번호 입력 없이 root 셸 진입
다음은 부팅 과정에서 rd.break가 개입하는 지점을 보여준다.

2️⃣ 공격 절차 (Rocky Linux 9 기준)
공격자가 물리적으로 서버에 접근 가능한 상태에서, 다음 절차로 root 비밀번호를 초기화할 수 있다.
부팅 → GRUB 메뉴에서 'e' 입력 (편집 모드)
→ linux 라인 끝에 'rd.break' 추가
→ Ctrl + X 로 부팅
→ switch_root:/# 프롬프트 진입
이 시점에서 /sysroot는 읽기 전용(ro)으로 마운트되어 있으므로, 쓰기 가능 상태로 재마운트한 뒤 비밀번호를 변경한다.
mount -o remount,rw /sysroot # 읽기/쓰기 모드로 재마운트
chroot /sysroot # 실제 시스템을 루트로 변경
LANG=C # 로케일 이슈 방지
passwd # root 비밀번호 변경
touch /.autorelabel # SELinux 레이블 재생성 플래그
reboot -f
🔵 핵심 명령어
- chroot /sysroot — 현재 셸의 루트 디렉토리를 initramfs 임시 환경에서 실제 디스크의 /sysroot로 변경한다. 이후 실행하는 모든 명령이 실제 시스템의 파일을 대상으로 동작하게 된다.
- touch /.autorelabel — passwd로 /etc/shadow를 수정하면 해당 파일의 SELinux 보안 컨텍스트가 깨질 수 있다. SELinux가 enforcing 모드인 시스템에서 컨텍스트가 잘못된 /etc/shadow는 로그인 자체를 차단하므로, 다음 부팅 시 모든 파일의 보안 컨텍스트를 다시 라벨링하도록 플래그를 생성하는 것이다. 이 파일이 없으면 비밀번호 변경에 성공해도 로그인이 안 되는 상황이 발생할 수 있다.
- LANG=C — chroot 환경에서 로케일 파일이 로드되지 않아 발생하는 경고 메시지를 방지한다.
3. 1차 방어 - GRUB2 비밀번호 설정
싱글모드 진입의 관문은 GRUB 편집 모드다.
GRUB 메뉴에 진입하자마자 "e"를 눌러 커널 파라미터를 편집하는 단계에 비밀번호를 걸면, rd.break 삽입 자체를 차단할 수 있다.
1️⃣ PBKDF2
GRUB2는 비밀번호를 평문이 아닌 PBKDF2 해시로 저장한다.
PBKDF2(Password-Based Key Derivation Function 2)는 비밀번호를 안전하게 저장하기 위한 해시 함수로, NIST RFC 2898에서 정의한 표준이다.
🔵 PBKDF2의 특징:
- 일방향(One-way) — 해시값에서 원본 비밀번호로 복호화가 불가능하다. 검증 시에는 입력된 비밀번호를 동일한 Salt와 반복 횟수로 해싱한 뒤 저장된 해시와 비교한다.
- Salt — 해싱 시 매번 임의의 문자열(Salt)을 섞기 때문에, 동일한 비밀번호라도 매번 다른 해시값이 생성된다. 이는 사전에 계산된 해시 테이블(레인보우 테이블)을 이용한 공격을 무력화한다.
- 반복 횟수(Iteration) — grub2-mkpasswd-pbkdf2는 기본 10,000회 반복 해싱을 수행한다. 한 번의 해시 비교에 시간이 걸리므로, 무차별 대입(brute-force) 공격의 속도를 크게 저하시킨다.
참고로 리눅스 /etc/shadow도 같은 원리(SHA-512 + Salt + Iteration)로 비밀번호를 해시 저장한다.
2️⃣ 설정 절차
🔵 Step 1: PBKDF2 해시 생성
grub2-mkpasswd-pbkdf2
# Enter password: ******
# Reenter password: ******
# PBKDF2 hash of your password is grub.pbkdf2.sha512.10000.8DFC66D4E3...

🔵 Step 2: GRUB 사용자 정의 파일에 등록
vi /etc/grub.d/40_custom
파일 하단에 다음 두 줄을 추가한다:
set superusers="root" #또는 다른 사용자명으로 설정할 수 있음
password_pbkdf2 root grub.pbkdf2.sha512.10000.5AB1A849...

클립보드 붙여넣기가 불가능한 콘솔 환경에서는 해시 생성 결과를 리다이렉트로 먼저 저장한 뒤 vi로 정리하는 방법으로 할 수 있다.
grub2-mkpasswd-pbkdf2 >> /etc/grub.d/40_custom
# 이후 vi로 불필요한 줄 정리
🔵 Step 3: GRUB 설정 파일 재생성
grub2-mkconfig -o /boot/grub2/grub.cfg
이 명령은 /etc/grub.d/ 디렉토리 내 스크립트들을 순서대로 실행하여 /boot/grub2/grub.cfg를 새로 생성한다.
3️⃣ grub.cfg
/boot/grub2/grub.cfg는 자동 생성 파일이다.
커널 업데이트, grub2-mkconfig 실행 등의 이벤트가 발생하면 /etc/grub.d/ 내 스크립트 기반으로 덮어써지기 때문에, 직접 수정한 내용은 유지되지 않는다.
따라서 항상 소스 파일(40_custom 등)을 수정하고 mkconfig로 재생성하는 것이 올바른 방법이다.
다음은 GRUB 설정 파일의 생성 흐름이다.
4️⃣ 검증
재부팅 후 GRUB 메뉴에 진입해서 "e"를 입력하면 username/password 입력 프롬프트가 나타난다.
잘못된 사용자명 또는 비밀번호를 입력하면 편집 모드 진입이 거부되고, root 계정과 올바른 비밀번호를 입력해야만 커널 파라미터 편집이 가능하다.
4. 방어 우회: USB 부팅 + Rescue 모드
GRUB 비밀번호가 설정되어 있어도 물리적 접근이 가능하면 우회할 수 있다.
외부 부팅 미디어(USB, CD/DVD)로 부팅하면 디스크에 설치된 GRUB 자체를 우회하기 때문이다.
🔵 우회가 필요한 시나리오
- 전임자가 GRUB 비밀번호를 인수인계하지 않고 퇴사
- 본인이 설정한 비밀번호를 분실
1️⃣ 절차 (Rocky Linux 설치 USB 기준)
CMOS Setup → 부팅 순서를 CD/DVD(또는 USB) 우선으로 변경
↓
설치 메뉴 → Troubleshooting → Rescue a Rocky Linux system
↓
"1) Continue" 선택 → 실제 시스템이 /mnt/sysimage 에 마운트됨
↓
Enter 입력 → bash 셸 진입
셸 진입 후 실행하는 명령:
chroot /mnt/sysimage # 실제 시스템으로 진입
vi /etc/grub.d/40_custom # superusers, password_pbkdf2 줄 삭제
grub2-mkconfig -o /boot/grub2/grub.cfg # 설정 재생성
exit
reboot
부팅 시 USB/CD를 분리(disconnect)하고, 재부팅 후 GRUB 메뉴에서 e를 눌렀을 때 비밀번호 없이 편집 모드에 진입되면 우회에 성공한 것이다.
2️⃣ rd.break vs Rescue 모드 비교
두 방식 모두 root 파일시스템에 접근하는 수단이지만, 진입 경로와 마운트 포인트가 다르다.
- rd.break: 디스크의 GRUB을 통해 부팅 → initramfs에서 중단 → 실제 시스템은 /sysroot에 마운트
- Rescue 모드: 외부 미디어로 부팅 → 별도의 복구 환경 로드 → 실제 시스템은 /mnt/sysimage에 마운트
5. 보안 진단 및 대응
지금까지 살펴본 공격과 방어의 패턴을 보면 어떤 단일 방어 계층도 그 자체로는 충분하지 않다는 것을 알 수 있다.

각 계층의 위협과 대응을 정리하면 다음과 같다.
🔵 GRUB 계층
rd.break로 싱글모드 진입 후 root 비밀번호 초기화가 가능하다.
GRUB2 PBKDF2 비밀번호 설정으로 편집 모드 진입을 차단한다.
🔵 BIOS/UEFI 계층
USB 부팅으로 Rescue 모드에 진입하면 GRUB 설정 자체를 우회/삭제할 수 있다.
CMOS 비밀번호 설정과 부팅 우선순위를 HDD에 고정함으로써 대응한다.
🔵 물리 계층
HDD를 분리해 다른 시스템에 마운트하면 위 두 계층의 보안이 모두 무의미해진다.
디스크 암호화(LUKS), 서버랙 잠금, 출입 통제로 대응한다.
결론적으로 단일 계층에서의 보안은 충분하지 않다.
GRUB 비밀번호를 걸어도 BIOS가 열려 있으면 우회 가능하고, BIOS까지 잠가도 디스크 암호화가 없으면 HDD 분리 공격에 노출된다.
이것이 Defense in Depth(다계층 방어)의 전형적 사례이며, 보안 진단 시 단일 항목이 아닌 계층 전체의 조합을 점검해야 하는 이유다.
'Journey to Security > Linux OS' 카테고리의 다른 글
| UEFI 펌웨어 구조와 부팅 원리 (0) | 2026.08.08 |
|---|---|
| Linux CPU 과점유 대응: top, /proc, strace로 위장 프로세스 추적하기 (0) | 2026.07.21 |
| 리눅스 rescue mode에서 chroot /sysroot 동작 원리 (0) | 2026.06.23 |
| awk - 필드 단위 텍스트 처리 도구 (0) | 2026.06.18 |
| sed에서 사용하는 정규표현식 - BRE와 ERE (0) | 2026.06.18 |