Sshole - musl 기반 OpenSSH에서 비밀번호 인증을 우회하는 취약점

2 hours ago 2

musl 기반 Linux에서 PAM 없이 실행되는 OpenSSH에 특정 계정의 비밀번호 인증을 우회하는 문제가 있음. 비밀번호 필드가 *인 계정이 조건에 따라 임의의 긴 비밀번호로 로그인을 허용함 musl의 crypt() 실패 반환값 * 가 계정의 비밀번호 필드와 일치하는 것이 핵심임. OpenSSH가 다른 계정의 솔트를 빌려 해시를 계산하는 처리와 비밀번호 길이 제한이 맞물려 발생함 공격이 성립하려면 비밀번호 로그인 활성화, 비밀번호 필드가 *인 대상 계정, 실제 비밀번호가 설정된 다른 계정이 필요함. 이 조건에서 257~1024자 비밀번호로 인증을 우회할 수 있음 Alpine 공식 AWS/Azure 이미지의 기본 alpine 계정도 해당 조건에서 영향을 받으며, 비밀번호 없이 doas를 사용할 수 있어 root 권한으로 이어짐 OpenSSH 10.6p2에서 수정됨. 즉시 업데이트할 수 없다면 PasswordAuthentication no로 비밀번호 로그인을 비활성화하는 대응이 필요함 *로 비밀번호 로그인을 막아 온 방식 1980년 Bill Joy는 누구도 로그인하면 안 되는 daemon 계정의 비밀번호 필드에 * 를 넣음 당시 해시는 누구나 읽을 수 있는 /etc/passwd에 저장됐으며, *는 해시가 아니므로 어떤 비밀번호와도 일치하지 않는 방식이었음 3BSD의 /etc/passwd에는 해당 계정의 이름 필드가 “the devil himself”로 기록돼 있음 현재 비밀번호 해시는 보통 /etc/shadow 에 저장됨 $6$abc$k2P9… 형식에서 $6$는 SHA-512, abc는 솔트, 나머지는 해시임 sshd는 입력한 비밀번호를 같은 솔트로 해시한 뒤 저장된 값과 비교하며, 필드가 *라면 원래 어떤 비밀번호도 일치하지 않아야 함 1997년 Single UNIX Specification의 crypt() 규정은 지원하지 않는 알고리듬 등으로 계산에 실패하면 NULL을 반환하도록 함 NULL을 확인하지 않고 결과를 비교하는 프로그램은 이때 충돌할 수 있음 musl의 실패 반환값과 256바이트 제한 musl은 2012년 8월 변경에서 충돌을 피하려고 crypt() 실패 시 NULL 대신 단일 문자를 반환하도록 바꿈 해당 변경의 반환식은 (setting[0]=='*') ? "x" : "*"로, 설정값이 *로 시작하면 x, 그렇지 않으면 *를 반환함 실제 비밀번호 해시와 일치하지 않는 값을 반환해 잘못된 비밀번...

Read Entire Article




피플앤툴즈 네트워크
🛍 샵