Linux 시스템 보안 기초 · 23/50편
이 글은
리눅스 시스템 기초·파일 · 권한 · 사용자 관리·서비스 · 프로세스 관리시리즈를 선행 학습으로 두고, 동일한 개념을 보안관제(SOC) 관점에서 한 단계 확장합니다.
22편에서 capability의 개념을 봤다면, 이번 편은 '왜 어떤 capability는 사실상 root와 같은가'를 권한 상승 관점에서 구체적으로 봅니다. 실제 서버에서 무엇을, 어떤 우선순위로 점검할지 정리합니다.
권한 상승으로 직결되는 대표 capability:
| capability | 왜 위험한가 |
|---|---|
| CAP_SETUID | 임의 UID로 전환 → root 전환 가능 |
| CAP_DAC_OVERRIDE | 모든 파일 권한 검사 우회 → shadow 읽기/쓰기 |
| CAP_SYS_ADMIN | 마운트·네임스페이스 등 광범위 → 컨테이너 탈출 등 |
| CAP_SYS_PTRACE | 다른 프로세스 메모리 조작 |
| CAP_SYS_MODULE | 커널 모듈 적재 → 커널 백도어 |
이런 capability가 범용 인터프리터(python/perl)에 붙으면, 그 스크립트로 즉시 상승이 가능합니다.
python3 에 cap_setuid+ep 부여되어 있으면:
alice ── python3 -c 'import os; os.setuid(0); os.system("/bin/sh")'
│
▼
EUID=0 root 쉘 획득
CAP_SETUID는 프로세스가 임의 UID로 전환하도록 허용합니다. 이 capability를 가진 인터프리터는 setuid(0) 호출로 스스로 root가 될 수 있습니다. CAP_DAC_OVERRIDE는 권한 비트를 무시하고 모든 파일에 접근하게 해, shadow를 읽거나 sudoers를 수정하는 식으로 상승이 가능합니다.
즉 capability 점검은 '목록의 존재'가 아니라 '어떤 파일에 어떤 강력 capability가 붙었는가'의 조합을 봐야 합니다.
# 강력 capability를 가진 파일만 필터
sudo getcap -r / 2>/dev/null | grep -Ei 'setuid|dac_override|sys_admin|ptrace|sys_module'
# 인터프리터/범용 도구에 capability가 붙었는지 집중 점검
for b in python3 perl ruby node php gdb; do p=$(command -v $b 2>/dev/null); [ -n "$p" ] && getcap "$p"; done
실습 환경에서 강력 capability 필터 실행 결과입니다. (실제 캡처 — 정상 상태)
$ sudo getcap -r / 2>/dev/null | grep -Ei 'setuid|dac_override|sys_admin'
(출력 없음)
출력이 없다는 것은 위험 capability가 부여된 파일이 없다는 정상 신호입니다. 만약 /usr/bin/python3 cap_setuid+ep 같은 줄이 나오면, 이는 즉시 권한 상승이 가능한 심각한 취약점입니다.
cap_setuid, cap_dac_overridecap_sys_admin/cap_sys_modulecapability 오남용은 SUID보다 은밀해 놓치기 쉽습니다. 그래서 정기 스캔과 기준선 비교가 필수입니다.
setcap/setxattr 감사로 부여 순간 포착capability 기반 상승은 '실행 파일 자체는 표준이지만 속성이 바뀐' 형태라 탐지가 까다롭습니다. auditd의 setxattr/fsetxattr 감사와 Wazuh 확장속성 FIM을 결합하고, 스캔 결과의 강력 capability는 즉시 조사 티켓으로 전환합니다. 해당 파일 경로·해시를 IOC로 등록합니다.
[ ] 강력 capability 파일 필터
[ ] 인터프리터 대상 집중 점검
[ ] 기준선 대비 신규 capability 확인
[ ] setxattr 감사 설정
다음 편에서는 24. 파일 소유권 보안 를 다룹니다. 권한만큼 중요한 '소유권' 이상을, 웹 디렉터리와 서비스 계정 중심으로 봅니다.
본 실습은 격리된 테스트 VM(Rocky Linux / Ubuntu, VMware) 및 테스트 계정 환경을 기준으로 하며, 운영 서버를 대상으로 하지 않습니다. 실행 결과는 실제 캡처와 예시 출력을 명확히 구분해 표기합니다.