시스템 보안 · 취약점 › H. 방어 회피 · 흔적 삭제 징후 · 36/50편 (전체 386/450)
학습 단계: 위장·난독화·흔적 분석
실습 표기: 이 글의 명령어·출력·로그는 로컬 VMware 테스트 VM(Rocky Linux 9 / Ubuntu 22.04) 기준의 「실습 예시」이며, IP·계정·호스트명은 가상의 값입니다.
공격자는 Linux 네임스페이스·컨테이너를 이용해 활동을 호스트의 일반 관점에서 숨깁니다. 별도 PID·마운트·네트워크 네임스페이스 안에서 실행하면 호스트의 ps·일반 도구에 다르게 보이거나 격리되어 보입니다.
컨테이너·네임스페이스 은닉
PID 네임스페이스: 별도 PID 공간(격리)
마운트 은닉: 네임스페이스 내 마운트(호스트 미표시)
네트워크 NS: 격리된 네트워크 스택
unshare/nsenter: 네임스페이스 생성·진입
특징: 호스트 일반 도구로는 부분 가시성
탐지: unshare·nsenter·비정상 컨테이너, /proc 네임스페이스 비교
핵심은 "격리를 은닉에 악용한다"는 점입니다. unshare·nsenter 호출, 비정상 컨테이너 생성, /proc의 네임스페이스 비교가 탐지 포인트입니다.
| 은닉 | 방식 | 탐지 |
|---|---|---|
| PID NS | 별도 PID 공간 | /proc/*/ns |
| 마운트 NS | 격리 마운트 | ns 비교 |
| 네트워크 NS | 격리 스택 | ip netns |
| unshare/nsenter | NS 생성·진입 | 명령 감사 |
| 정상 컨테이너 | 관리 도구 | 오케스트레이터 |
# 컨테이너·네임스페이스 은닉 탐지 (분석 방법)
# unshare·nsenter 호출(수동 네임스페이스 조작)
sudo ausearch -k proc_exec -i --start recent 2>/dev/null | grep -E 'unshare|nsenter' | tail
# 프로세스별 네임스페이스 비교(호스트와 다른 NS)
for p in /proc/[0-9]*; do ns=$(readlink $p/ns/pid 2>/dev/null); echo "$ns"; done 2>/dev/null | sort | uniq -c | sort -rn | head
# 정식 오케스트레이터 외 컨테이너 런타임 호출
sudo ausearch -k proc_exec -i --start recent 2>/dev/null | grep -E 'runc|containerd-shim|docker run' | tail
$ (unshare/nsenter) (없음 또는 관리 목적)
$ (네임스페이스) 정상 컨테이너 NS만
$ (런타임) 오케스트레이터 관리발
unshare·nsenter가 관리 목적으로만 쓰이고, 네임스페이스가 정식 컨테이너의 것뿐이며, 런타임이 오케스트레이터로만 호출되는 상태가 정상입니다.
$ (unshare/nsenter)
unshare -m -p -f /tmp/.x (수동 네임스페이스로 은닉 실행)
nsenter -t 1 -m -p (호스트 네임스페이스 진입 — 탈출)
$ (네임스페이스)
PID의 ns/pid가 알 수 없는 네임스페이스(오케스트레이터 외)
컨테이너·네임스페이스 은닉 분석입니다(가상의 예시).
[공격자]
unshare -p -m -f 로 별도 네임스페이스 실행
→ 호스트 ps에서 프로세스·마운트 숨김
또는 nsenter로 호스트/다른 컨테이너 진입
↕ (탐지)
[분석가]
unshare/nsenter 명령 자체 감사 포착
/proc/*/ns 비교 → 비정상 네임스페이스 발견
오케스트레이터 외 런타임 호출 → 수동 조작
↓
= 격리를 은닉에 써도 조작 명령·NS 메타는 남음 → 정탐
| 관점 | 은닉 | 탐지 |
|---|---|---|
| 프로세스 | 별도 PID NS | ns 비교 |
| 조작 | unshare/nsenter | 명령 감사 |
| 런타임 | 비정상 호출 | 계보 |
네임스페이스 조작 감사 + /proc NS 비교가 핵심입니다.
<!-- 실습 예시 룰: 적용 전 wazuh-logtest 및 테스트 환경 검증 필요 -->
<group name="local,syssec_h,defense_evasion,">
<rule id="107350" level="13">
<if_sid>107000</if_sid>
<field name="audit.proctitle" type="pcre2">\bunshare\b.*(-p|-m|-f)|\bnsenter\b.*-t\s*1</field>
<description>수동 네임스페이스 조작(unshare/nsenter, 컨테이너 은닉·탈출)</description>
<mitre><id>T1610</id><id>T1611</id></mitre>
</rule>
</group>
정식 오케스트레이터가 생성하는 네임스페이스를 기준선화하고, 수동 unshare·nsenter·비정상 런타임 호출을 탐지합니다. 컨테이너 런타임 로그와 교차합니다.
| 은닉 | 방식 |
|---|---|
| PID NS | 별도 PID 공간 |
| 마운트 NS | 격리 마운트 |
| 네트워크 NS | 격리 스택 |
| unshare/nsenter | NS 생성·진입 |
| 면접 포인트 | "격리를 은닉에 악용 — unshare/nsenter 감사+/proc NS 비교로 탐지" |
다음 편 387. 방어 회피·흔적 삭제 — 시간 기반 회피(지연·간헐 실행) 탐지 에서는 시간 기반 회피를 다루는 시간 기반 회피(지연·간헐 실행) 탐지를 다룹니다.
이전 편: 385. 방어 회피·흔적 삭제 — 서명·신뢰 관계 악용 탐지
📚 시리즈 전체 보기: 시스템 보안 · 취약점