*sshole, 우리는 대체 언제 C를 없앨 것인가?

1 day ago 3

잠긴 계정과 해시 오류가 같은 "*" 값을 사용하는 충돌로, PAM 없는 musl 시스템에서 인증되지 않은 사용자가 셸을 얻을 수 있는 취약점이 발생함 이번 문제는 메모리 안전성 취약점이 아님. Rust에서도 같은 코드를 작성할 수 있지만, 타입 시스템이 형성하는 개발 관행은 이런 오류 처리를 용인하지 않음 musl은 일부 바이너리가 crypt의 NULL 반환을 확인하지 않자, 오류 시 NULL을 반환하도록 한 POSIX 명세 대신 "*" 센티널 값을 반환하도록 변경했음 Rust 의존성에는 컴파일 시간과 이식성 비용이 실제로 존재하지만, 도입을 반대하는 배포판 유지관리자의 이해와 다수 사용자의 이익 사이에는 주인-대리인 문제가 있음 AI 에이전트가 C와 Rust의 차이를 없앤다는 논리는 라이브러리와 학습 코드에 축적된 개발 관행을 놓침. Rust를 사용하는 에이전트는 타입 시스템에 더 많은 불변 조건을 담을 가능성이 있지만, 숙련자의 검토는 여전히 필요할 수 있음 센티널 값 충돌과 타입 시스템이 만드는 개발 문화 취약점은 서로 다른 두 상태가 동일한 "*" 값을 사용하면서 발생함 Unix에서 비밀번호 해시 "*"는 초기부터 잠긴 계정을 뜻했음 musl libc의 crypt는 2012년부터 해시할 수 없을 만큼 긴 비밀번호에 문자열 "*"를 반환해 왔음 sshd는 타이밍 정보 누출을 막기 위해 잠긴 계정의 로그인 시도에도 해시를 계산함 이 조합으로 PAM 없는 musl 시스템에서는 인증되지 않은 사용자가 셸을 얻을 수 있으며, 경우에 따라 root 셸도 가능함 공식 Alpine AWS 이미지도 해당 조건에 속하며, 세부 내용은 Alpine 보안 권고에서 확인할 수 있음 POSIX의 crypt 명세는 성공 시 해시된 비밀번호의 포인터를, 실패 시 NULL 포인터를 반환하고 errno로 오류를 나타내도록 요구함 C 타입 시스템은 호출자가 NULL을 확인하도록 강제하지 못함 musl 개발자들은 일부 바이너리가 이를 확인하지 않는 것을 보고, 명세에서 벗어나 "*"를 반환하도록 변경했음 메모리 안전성만으로는 막을 수 없는 문제이며, Rust에서도 너무 긴 비밀번호에 "*"를 반환하는 함수를 작성할 수 있음 차이는 언어가 기술적으로 허용하는 범위뿐 아니라, 커뮤니티가 어떤 구현을 용인하느냐에 있음 타입 시스템은 개발 문화에 영향을 미치며, 대수적 데이터 타입이나 결과 타입이 없는 C에서는 정상 데이터와 같은 반환 경로에 ...

Read Entire Article




피플앤툴즈 네트워크
🛍 샵