최근 musl 기반 리눅스(Linux) 환경에서 PAM(Pluggable Authentication Modules) 없이 실행되는 OpenSSH에 심각한 비밀번호 인증 우회 취약점, 일명 'Sshole'이 발견되었습니다. 이 취약점은 비밀번호 필드가 '*'로 설정된 계정에 대해 특정 조건에서 257자에서 1024자 사이의 임의의 긴 비밀번호로 로그인이 가능하게 합니다. 이는 1980년대부터 사용되어 온 '*' 문자를 이용한 계정 잠금 방식과 musl C 라이브러리의 crypt() 함수 동작, 그리고 OpenSSH의 타이밍 공격 방어 로직이 복합적으로 얽혀 발생했습니다.
취약점의 핵심 원인은 musl C 라이브러리의 crypt() 함수가 매우 긴 비밀번호 입력 시 실패 반환값으로 '*'를 돌려준다는 점입니다. 여기에 OpenSSH가 타이밍 공격을 막기 위해 실제 해시가 없을 때 다른 계정의 솔트(salt)를 빌려 해시를 계산하는 로직이 더해졌습니다. 이 과정에서 musl의 실패 반환값 '*'가 대상 계정의 저장된 비밀번호 필드 '*'와 우연히 일치하게 되면서 인증이 성공하는 기이한 현상이 발생한 것입니다. 특히 Alpine 리눅스의 공식 AWS/Azure 이미지의 기본 'alpine' 계정은 이 조건에 해당하며, 비밀번호 없이 'doas'를 사용할 수 있어 루트(root) 권한 탈취로 이어질 수 있습니다.
이 취약점은 OpenSSH 10.6p2 버전에서 수정되었으므로, 해당 환경을 사용하는 관리자는 즉시 업데이트해야 합니다. 만약 즉시 업데이트가 어렵다면, '/etc/ssh/sshd_config.d/00-no-passwords.conf' 파일에 'PasswordAuthentication no'를 설정하여 비밀번호 로그인을 비활성화하고 SSH 데몬(sshd)을 재시작하는 임시 대응이 필요합니다. 이번 취약점은 여러 소프트웨어 컴포넌트의 오랜 설계 결정과 상호작용이 예상치 못한 보안 문제로 이어질 수 있음을 다시 한번 보여주는 사례입니다.