
CVE-2026-11837: symlink 추종 chown을 통한 ansible.posix authorized_key 모듈의 로컬 권한 상승. 기술 문서; CVE-2024-9902의 자매.
authorized_key 로컬 권한 상승사용자의 ~/.ssh 디렉터리 및 authorized_keys 파일에 대한 심볼릭 링크를 따라가는 chown(및 심볼릭 링크를 따라가는 파일 생성)을 통한 ansible.posix.authorized_key Ansible 모듈의 로컬 권한 상승입니다.
이는 제가 보고하고 Red Hat Product Security(CNA)에서 CVE-2026-11837을 할당한 취약점에 대한 분석입니다. 기술 기록으로서 여기에 게시되며, 새로운 발견을 주장하는 것이 아닙니다. 이 문제는 이전 수정 사항이 다루지 않은 모듈에서의 CVE-2024-9902의 자매입니다.
Red Hat의 게시된 인정: "Red Hat은 이 문제를 보고해 주신 Valentino Paulon에게 감사드립니다."
| CVE | CVE-2026-11837 |
| 구성 요소 | ansible.posix 컬렉션, 파일 plugins/modules/authorized_key.py, 함수 keyfile() |
| 유형 | 권한 상승 (로컬). CWE-59 / CWE-61 (링크 따라가기) 및 CWE-282 (부적절한 소유권 관리) |
| CVSS | 7.3 (High) |
| 공개일 | 2026-06-10 |
| 보고자 | Valentino Paulon |
루트로 실행되는 플레이북이 ansible.posix.authorized_key를 사용하여 로컬 사용자의 키를 관리할 때, 모듈의 keyfile() 헬퍼는:
~/.ssh 디렉터리 및 ~/.ssh/authorized_keys의 소유권을 일반 os.chown(os.lchown 아님)으로 변경하고,open(..., "w")(O_NOFOLLOW 없음)으로 키 파일을 생성합니다.기본 follow=False를 사용하면 모듈은 심볼릭 링크를 따라가서 교체하거나 거부하지 않습니다. 경로에서 직접 작동하므로 커널은 권한이 없는 대상 사용자가 자신의 ~/.ssh 내에 미리 준비한 모든 심볼릭 링크를 따라갑니다. 이로 인해 루트가 제어하는 경로의 소유권을 권한 없는 사용자에게 이전하는 두 가지 프리미티브가 생성되며, 사용자는 이를 통해 루트로 권한 상승합니다. 두 가지 모두 HEAD에서 컬렉션에 대해 종단 간 재현되었습니다.
keyfile() (plugins/modules/authorized_key.py), 기본 manage_dir=True, follow=False:
if manage_dir:
if not os.path.exists(sshdir): # os.path.exists FOLLOWS symlinks
try:
os.mkdir(sshdir, int('0700', 8))
...
os.chown(sshdir, uid, gid) # UNCONDITIONAL, plain chown, follows symlink
os.chmod(sshdir, int('0700', 8)) # follows symlink
if not os.path.exists(keysfile): # follows symlink
...
f = open(keysfile, "w") # plain open(), no O_NOFOLLOW, follows symlink
...
try:
os.chown(keysfile, uid, gid) # UNCONDITIONAL, plain chown, follows symlink
os.chmod(keysfile, int('0600', 8)) # follows symlink
except OSError:
pass
sshdir 및 keysfile은 대상 사용자의 passwd 홈(pwd.getpwnam(user).pw_dir)에서 파생되며, 이는 권한 없는 대상 사용자가 소유하고 제어하는 디렉터리입니다. follow 매개변수(기본값 False)는 경로에 대해 os.path.realpath()를 수행할지 여부만 선택합니다. 두 경우 모두 os.path.islink 검사, O_NOFOLLOW 열기, os.lchown 또는 기존 심볼릭 링크의 연결 해제 및 교체가 없습니다. 권한 드롭(seteuid/setfsuid)이 수행되지 않습니다. 모든 것이 루트로 실행됩니다.
두 os.chown 호출은 무조건적으로 실행되며, if not os.path.exists(...) 가드 외부에 있으므로 디렉터리/파일이 이미 존재하는지 여부에 관계없이 실행됩니다. 이것이 두 프리미티브를 신뢰할 수 있게 만듭니다.
둘 다 일회용 Linux VM에서 ansible.posix HEAD로 종단 간 확인되었습니다. victim은 권한이 없는 로컬 사용자(uid 1000)입니다. 모듈은 운영자의 플레이북과 정확히 동일하게 루트로 실행됩니다. 카나리(Canaries)는 민감한 루트 대상을 대신합니다.
벡터 1: 디렉터리 심볼릭 링크 (기존 루트 소유 디렉터리의 chown)
victim으로: ln -s /root/AD_CANARY ~/.ssh (/root/AD_CANARY는 기존 루트 소유 디렉터리).victim에 대해 authorized_key 작업을 실행합니다./root/AD_CANARY의 소유권이 root:root에서 victim:victim으로 변경되었습니다. os.chown(sshdir, ...) 호출이 ~/.ssh 심볼릭 링크를 따라가 루트 소유 디렉터리를 권한 없는 사용자에게 넘겼습니다.벡터 2: 데생 파일 심볼릭 링크 (새 루트 경로 파일의 생성 + chown)
victim으로 (~/.ssh가 일반 디렉터리인 경우): ln -s /root/AF_CANARY ~/.ssh/authorized_keys (대상이 존재하지 않음).victim에 대해 authorized_key 작업을 실행합니다./root/AF_CANARY가 생성되었고, 소유자는 victim:victim, 모드 0600입니다. open(keysfile, "w")가 심볼릭 링크를 통해 대상을 생성했고 os.chown(keysfile, ...)이 넘겼습니다.두 경우 모두 권한 없는 사용자는 루트가 제어하는 경로의 소유자가 됩니다. 링크를 /etc 아래의 디렉터리(벡터 1) 또는 /etc/cron.d/나 /etc/sudoers.d/ 아래의 새 파일(벡터 2)로 지정하면 표준 후속 조치에 의해 루트를 획득하게 되며, 이제 소유자인 사용자가 대상을 다시 씁니다.
이는 동일한 심볼릭 링크 따라가기 클래스를 다룬 CVE-2024-9902(ansible-core의 user 모듈 generate_ssh_key)의 자매입니다. authorized_key는 별도의 ansible.posix 컬렉션에 있으며 해당 수정 사항에 의해 변경되지 않았습니다. 심볼릭 링크를 따라가는 chown/create 패턴이 여전히 존재하고 보호되지 않았습니다. 이는 새로발견된 근본 원인이 아니라 이전 수정 사항이 도달하지 못한 모듈에서 동일한 허용된 클래스로 보고되었습니다.
ansible.posix.authorized_key 작업을 실행하는 조건(이 모듈의 일반적인 사용). 로컬 사용자는 자신의 ~/.ssh에 심볼릭 링크를 미리 준비합니다. 플레이북을 실행하지 않습니다. 이는 운영자가 트리거합니다: Red Hat이 "신뢰할 수 없는 계정에 대해 실행하지 마십시오"라는 완화 조치와 함께 승인한 CVE-2024-9902와 동일한 트리거 모델입니다. 전제 조건은 자체 트리거로 평가되지 않고 명시적으로 명시됩니다.os.open(keysfile, os.O_WRONLY | os.O_CREAT | os.O_EXCL | os.O_NOFOLLOW, 0o600) 및 디스크립터에서 작동; sshdir 또는 keysfile이 심볼릭 링크인 경우 거부(또는 follow=False 문서 문자열 계약에 따라 연결 해제 및 교체).os.chown(...)을 os.lchown으로 또는 안전하게 열린 디스크립터에서 os.fchown으로 대체하고, 마찬가지로 os.chmod 대신 os.fchmod를 사용하여 링크를 통해 소유권과 권한이 리디렉션되지 않도록 합니다.chown/chmod를 게이트하여 모듈 자체가 안전하게 생성한 경로에만 적용되도록 하고, 기존(심볼릭 링크 가능) 경로에는 적용되지 않도록 합니다.| 날짜 | 이벤트 |
|---|---|
| 2026-06-08 | [email protected]에 보고됨 (Red Hat Product Security CC가 CNA로), CVE-2024-9902의 자매로 구성됨 |
| 2026-06-10 | CVE-2026-11837 할당 및 게시됨; 크레딧 수락됨 |
MIT. LICENSE 참조.