대상 OS: Debian 12 (bookworm)
서버 보안에서 종종 놓치는 영역이 ‘로컬 권한 상승’입니다.
외부에서 침입이 어렵게 막혀 있어도, 내부 계정 1개가 털리면 공격자는 다음 단계로 sudo나 SUID 프로그램을 노립니다.
그중 pkexec는 과거 여러 취약점(CVE) 이슈로도 유명했고, 무엇보다 “기본적으로 SUID root로 동작할 수 있는 도구”라는 점에서 공격면이 됩니다.
모든 서버에서 pkexec가 꼭 필요한 것은 아니기 때문에, 필요 없다면 SUID를 제거해 공격 경로를 하나 줄이는 것이 실전적인 하드닝입니다.
이 글은 Debian 12에서 pkexec의 SUID 비트를 안전하게 제거(업데이트 후에도 유지)하고, polkit 환경을 점검하며, 운영 사고를 막기 위한 검증/롤백 루틴까지 정리합니다.
---
1) 먼저 확인: 이 서버에서 pkexec가 정말 필요한가
1)
데스크톱/GUI 서버가 아니라면 pkexec 의존도가 낮은 경우가 많다
2)
운영 자동화/서버 앱은 보통 systemd 유닛, sudo 정책, 전용 계정으로 관리하고 pkexec를 쓰지 않는다
3)
혹시 모르게 스크립트/도구가 pkexec를 호출할 수 있으니, 적용 전 “사용 흔적”을 점검하는 것이 안전하다
사용 흔적 점검(간단)
command -v pkexec || true
ls -la /usr/bin/pkexec 2>/dev/null || true
sudo journalctl -n 200 --no-pager | grep -i pkexec | tail -n 40 || true
---
2) 현재 상태 점검: pkexec가 SUID인지 확인
1)
파일 권한 확인
ls -la /usr/bin/pkexec
출력에서 권한에 `s`(예: `-rwsr-xr-x`)가 들어가면 SUID가 켜져 있는 상태입니다.
2)
패키지 소속 확인
dpkg -S /usr/bin/pkexec || true
---
3) “chmod로 그냥 끄지 말고” dpkg-statoverride로 관리하기
패키지 파일의 권한을 직접 chmod로 바꾸면, 패키지 업데이트 때 원복될 수 있습니다.
Debian에서는 `dpkg-statoverride`를 쓰면 “업데이트 후에도 유지되는 권한 정책”을 만들 수 있어 운영에 안전합니다.
1)
현재 override가 있는지 확인
sudo dpkg-statoverride --list | grep -E "\s/usr/bin/pkexec$" || true
2)
SUID 제거(0755로 강제)
sudo dpkg-statoverride --update --add root root 0755 /usr/bin/pkexec
3)
적용 확인
ls -la /usr/bin/pkexec
sudo dpkg-statoverride --list | grep -E "\s/usr/bin/pkexec$" || true
이제 pkexec는 SUID로 실행되지 않습니다.
---
4) “정말로 실행이 막혔는지” 동작 검증
pkexec는 정책/세션/환경에 따라 동작이 달라, 단순 실행만으로도 확인이 됩니다.
1)
실행 테스트(에러가 나거나 권한 거부가 나오면 일단 기대한 방향)
pkexec id || true
2)
SUID가 꺼진 상태에서의 기대
- pkexec가 루트 권한을 “갑자기” 얻는 경로가 사라집니다.
- 대신 sudo, systemd, ssh CA 같은 표준 경로로 운영 권한을 관리하게 됩니다.
---
5) polkit 자체는 어떻게 보나(참고 점검)
pkexec만이 polkit의 전부는 아닙니다.
서버에서 polkit 데몬이 필요 없거나, 최소화하고 싶다면 “실제로 돌아가는지”를 확인해보는 게 좋습니다.
1)
polkit 서비스 상태 확인
systemctl status polkit --no-pager 2>/dev/null || true
ps aux | grep -i polkit | head -n 20
2)
패키지 설치 여부 확인
dpkg -l | grep -i policykit || true
주의
- polkit을 마구 제거/비활성화하면, 일부 관리 도구가 영향을 받을 수 있습니다.
- 이 글의 초점은 “pkexec의 SUID 제거”로 공격면을 줄이는 것이고, polkit 전체 제거는 환경 의존성이 크므로 신중히 접근하세요.
---
6) 운영 실수 방지: 롤백 절차를 먼저 알고 적용하기
SUID 제거는 보통 안전하지만, 혹시라도 예상치 못한 의존성이 있으면 빠르게 원복할 수 있어야 합니다.
1)
override 제거(원복)
sudo dpkg-statoverride --remove /usr/bin/pkexec
2)
패키지 기본 권한 복원(필요 시)
sudo apt -y --reinstall install policykit-1
3)
원복 확인
ls -la /usr/bin/pkexec
---
7) “SUID 줄이기”를 더 확장하는 방법(아이디어)
pkexec만 줄여도 의미가 있지만, 운영에서는 보통 다음을 같이 봅니다.
1)
SUID/SGID 파일 목록을 정기적으로 스냅샷
sudo find / -xdev -perm -4000 -type f -printf '%p\n' 2>/dev/null | sort | head -n 80
2)
새로 생긴 SUID 파일이 있는지 변화 감지(주기적 비교)
sudo find / -xdev -perm -4000 -type f -printf '%p\n' 2>/dev/null | sort > /var/log/suid.snapshot
3)
특히 서버에서 필요 없는 SUID 도구는 하나씩 제거/완화
- 하지만 “무작정 제거”는 운영 장애로 이어질 수 있으니, 반드시 변경관리(승인/검증/롤백) 절차로 진행하세요.
---
마무리
Debian 12에서 pkexec의 SUID를 제거하는 것은, 로컬 권한 상승 공격면을 ‘작지만 확실하게’ 줄이는 하드닝입니다.
특히 서버 환경에서는 pkexec가 꼭 필요한 경우가 많지 않아서, 비용 대비 효과가 좋은 편입니다.
핵심은
- chmod가 아니라 dpkg-statoverride로 업데이트 내구성을 확보하고
- 적용 후 ls -la /usr/bin/pkexec로 SUID 해제를 확인하고
- 롤백 절차를 미리 준비하는 것
입니다.
작은 설정 하나가, 공격자가 쓰는 사다리의 한 칸을 제거합니다.