Trawling

Alpine Linux, musl 기반 OpenSSH의 비밀번호 인증 우회 취약점 수정

Alpine Linux는 musl 기반 OpenSSH에서 257~1024바이트 암호의 오류 반환값 `*`가 계정의 `*` 암호 필드와 일치해 인증을 우회하는 취약점을 수정했습니다. PAM을 끈 sshd에서 비밀번호 인증이 켜져 있고 `*` 필드 계정과 `$5$` 또는 `$6$` 해시를 가진 로컬 계정이 함께 있으면 공격이 성립합니다. Alpine은 수정 패키지를 배포했으며, 업데이트 뒤 sshd를 재시작하고 즉시 업데이트하기 어려우면 비밀번호 인증을 끄도록 안내했습니다.

Alpine Linux는 2026년 11월 5일 musl 기반 OpenSSH 서버의 비밀번호 인증 우회 취약점을 공지하고 수정 패키지를 공개했습니다. SSH 포트에 접근할 수 있는 공격자는 서버의 인증 설정과 계정 조합이 맞으면 비밀번호를 몰라도 로그인할 수 있습니다.

문제는 PAM을 사용하지 않는 sshd의 비밀번호 검사 경로에서 생깁니다. sshd는 입력한 암호를 crypt()로 처리해 계정에 저장된 암호 필드와 비교합니다. 암호 필드가 salt를 담기에 너무 짧으면 sshd는 다른 계정의 salt를 빌려 검사를 이어갑니다.

musl의 crypt()는 256바이트를 넘는 암호를 해시하지 못할 때 오류 표시로 *를 반환합니다. 암호 필드가 *인 계정에 257~1024바이트 암호를 보내면 반환값과 저장값이 같아져 인증이 통과합니다. Alpine은 공격이 SSH 연결 한 번으로 성립하고 재시도도 필요 없다고 설명했습니다.

영향을 받는 구성은 Alpine의 기본 openssh-server처럼 PAM 없이 빌드한 sshd, 또는 PAM 지원 빌드에서 UsePAM no로 실행하는 sshd 중 PasswordAuthentication yes인 경우입니다. 여기에 * 암호 필드 계정과 $5$ 또는 $6$ 해시를 가진 로컬 계정이 적어도 하나 있어야 합니다. 해시 계정 하나가 있으면 비밀번호 필드가 *인 계정이 공격 대상이 될 수 있습니다. PAM 지원 빌드에서 UsePAM yes로 실행하거나 비밀번호 인증을 끈 시스템은 영향을 받지 않으며, 암호 필드가 !인 계정도 대상에서 제외됩니다. Alpine 기본 이미지의 root 계정도 root:*지만, 기본 PermitRootLogin prohibit-password 설정은 root의 비밀번호 로그인을 막습니다. root에 대한 직접 공격에는 PermitRootLogin yes 설정이 필요합니다.

Alpine의 공식 tiny-cloud 이미지는 3.18.11부터 3.24.3까지 * 암호 필드의 alpine 계정과 비밀번호 없이 실행할 수 있는 doas를 포함합니다. 이 이미지는 첫 부팅 시에는 취약 조건이 갖춰지지 않지만, 관리자가 콘솔 암호를 설정하거나 user-data가 hashed_passwd로 계정을 추가해 $6$ 해시가 생기면 공격이 가능해집니다. 공격자는 alpine 계정으로 셸을 얻은 뒤 doas를 이용해 root 권한으로 이어갈 수 있습니다.

OpenSSH 10.6p2는 11월 5일 sshd에서 이 우회 경로를 막는 수정을 공개했습니다. Alpine은 3.21.10, 3.22.8, 3.23.8, 3.24.4에 수정 패키지를 포함했고 3.16~3.20 브랜치에도 각각 패키지를 배포했습니다. 패키지 업데이트만으로 실행 중인 sshd가 교체되지는 않으므로 업데이트 뒤 데몬을 재시작해야 합니다. 즉시 업데이트하기 어렵다면 Alpine은 PasswordAuthentication no를 설정하고 sshd를 재시작하는 방법을 안내합니다.

Oxide에서 Rust로 시스템과 도구를 개발하는 Rain은 11월 6일 개인 블로그 글에서 이 사건을 C의 오류 처리 방식에 관한 논거로 삼았습니다. Rain은 POSIX 규격이 crypt() 오류에 null 포인터와 errno를 쓰도록 하지만, musl 개발자들이 오류 반환값을 확인하지 않는 바이너리를 발견한 뒤 *를 반환하도록 바꿨다고 설명합니다. 그는 C의 타입 시스템이 호출자에게 오류 처리를 강제하지 못하는 점을 지적하고, Rust에서는 오류를 Result의 별도 경우로 표현하고 호출자가 다루도록 하는 개발 관행과 비교합니다. OpenSSH 릴리스 노트는 근본 원인이 sshd 외부에 있으며 sshd의 수정으로 악용을 막았다고 설명합니다.

참고 자료

오류 제보