flawopen.com/Incidents/openai-community-forum-heif-sso-chain-september-2026
OpenAI 포럼에서 SSO까지 이어진 공격 경로: CVE-2026-32882
Hacktron은 Discourse 이미지 처리 경로에서 발생한 libheif 알파 평면 경계 밖 읽기와 OpenAI의 별도 SSO 결함을 연결한 경로를 보고했습니다. CVE-2026-32882는 libheif 1.22.0에서 수정되었습니다. 연구자들은 접근을 증명하는 무해한 pull request를 제출한 뒤 테스트를 중단했다고 밝혔습니다.[4], [1], [2]
투명 필름 두 장을 떠올려 보세요. 하나에는 넓은 색상 칸이 있고 다른 하나에는 더 좁은 투명도 값이 있습니다. 디코더는 다음 투명도 값을 찾으면서 색상 필름의 행 길이를 사용했습니다. 그래서 한 행씩 읽을 때마다 작은 필름의 끝을 더 지나쳤습니다. 수정 사항은 투명도 필름의 자체 행 길이를 사용합니다.[1]
핵심 개념 및 용어
HEIF / HEIC- 이미지 컨테이너 형식입니다. HEIF 파일에는 파생 이미지, 오버레이, 별도의 색상 및 알파 평면이 포함될 수 있으며 디코더는 각 평면의 경계를 지켜야 합니다.[1]
libheif- HEIF 및 AVIF 이미지를 디코딩하고 인코딩하는 네이티브 라이브러리입니다. Discourse 권고문은 이미지 업로드 처리 경로를 CVE-2026-32882와 연결합니다.[1], [2]
Stride- 이미지 평면의 한 행 시작점과 다음 행 시작점 사이의 바이트 수입니다. 비트 깊이가 다르면 색상 평면과 알파 평면의 stride도 달라질 수 있습니다.[1]
CWE-125- 경계 밖 읽기: 소프트웨어가 버퍼에 할당된 메모리 범위를 넘어 읽습니다. 여기서는 알파 평면 주소를 계산할 때 색상 평면의 stride를 사용했습니다.[1]
SSO 신뢰 경계- 로그인 서비스와 애플리케이션 사이의 신원 연동입니다. Hacktron은 OpenAI 포럼의 SSO 관계가 별도 포럼 침해의 영향을 키웠다고 보고했습니다. 공개 보고서는 정확한 SSO 구현 결함이나 패치를 공개하지 않습니다.[4]
프레임워크 매핑
- 이 가이드에서 설명하는 약점의 CWE 참조: CWE-125
사고 타임라인
libheif 유지 관리자가 GHSA-hg7q-rjr2-8x46을 공개하고 CVE-2026-32882를 등록했으며 libheif 1.22.0을 수정 버전으로 제시했습니다.[1]
Hacktron에 따르면 연구자들은 Discourse 이미지 경로를 통해 OpenAI 포럼에 접근했고 OpenAI 측 SSO 문제를 신고한 뒤 접근 증명용 무해한 pull request 제출 후 테스트를 중단했습니다.[4]
Discourse는 GHSA-vhm9-85gw-x335를 공개하고 수정된 릴리스를 나열했으며 자체 호스팅 설치의 재빌드를 권고했습니다.[2]
Hacktron은 협조 공개 보고서를 게시했습니다. 보고서에 따르면 OpenAI는 SSO 수정 사항을 확인했으며, 포상은 OpenAI 측 발견에 대한 것이고 Discourse 호스팅 포럼 테스트는 대상이 아니었습니다.[4]
단계별 공격 실행 흐름
색상 평면 레이아웃을 알파 평면에 재사용
HeifPixelImage::overlay()의 취약한 코드는 해당 평면에서 alpha_stride를 얻었지만 alpha_p를 y * in_stride만큼 이동합니다. 알파와 색상 비트 깊이가 다르면 행 크기가 달라져 알파 할당 영역을 넘어 읽을 수 있습니다. 업스트림 권고문은 이를 CWE-125로 분류합니다.[1]
별도 SSO 결함이 보고된 체인의 영향을 확장
Hacktron은 포럼 침해 뒤 OpenAI SSO 문제를 통해 직원 ChatGPT/Codex 계정에 접근했고 무해한 pull request로 연결된 저장소 접근을 입증했다고 밝혔습니다. 공개 자료는 SSO 코드 결함, 계정의 정확한 권한 또는 재사용 가능한 SSO 수정 사항을 공개하지 않습니다.[4]
증거와 주장 범위를 제한
Hacktron은 접근 증명 pull request 제출 후 테스트를 중단했다고 밝혔습니다. 보고서는 연구자가 통제한 공개를 설명하며 악의적 사고나 고객 데이터 획득의 증거가 아닙니다. 연구자들은 OpenAI 포상이 회사 측 SSO 발견에 대한 것이며 Discourse 호스팅 포럼 테스트는 포함하지 않았다고도 설명합니다.[4]
소스 코드 비교: 취약한 구현 vs 보안 패치
이 코드는 접근 패턴을 보여 주는 일부 발췌이며 독립적으로 작동하는 디코더나 전체 패치의 그대로인 복사본이 아닙니다. 유지 관리자의 권고문은 취약한 표현식을 지목하고 libheif 1.22.0에서 수정되었다고 밝힙니다. 각 평면은 자체 stride로 인덱싱해야 합니다. 비트 깊이가 다른 평면에서 색상 stride를 재사용하면 알파 읽기 위치가 너무 멀리 이동합니다. 호스트 애플리케이션에서는 디코더를 업데이트하고 신뢰할 수 없는 업로드의 변환 작업을 격리하세요.[1], [3]
// 문서화된 접근 패턴을 간략화한 발췌입니다.
// alpha_stride를 사용할 수 있었지만 색상 평면의 stride를 사용했습니다.
uint8_t alpha_value = alpha_p[in_x0 + y * in_stride + x];// 알파 평면에 해당하는 행 레이아웃을 사용합니다.
// 업스트림 수정은 libheif 1.22.0에 포함되어 있습니다.
uint8_t alpha_value = alpha_p[in_x0 + y * alpha_stride + x];엔지니어링 및 시스템 보안 강화 체크리스트
- ✓자체 호스팅 Discourse를 GHSA-vhm9-85gw-x335의 수정 릴리스로 업데이트하고 애플리케이션 이미지를 다시 빌드하세요. 웹 인터페이스만 업데이트해서는 네이티브 libheif 패키지가 바뀌었는지 확인할 수 없습니다.[2], [4]
- ✓각 이미지 처리 컨테이너에 실제 포함된 libheif 버전을 확인하고 배포판의 백포트 상태를 점검하세요. 업스트림 버전 문자열만으로 배포판 패키지의 수정 상태를 판단할 수 없는 경우가 있습니다.[6], [4]
- ✓이미지 평면을 인덱싱할 때 해당 평면의 stride와 크기를 사용하세요. 비트 깊이와 stride가 다른 알파 및 색상 평면의 회귀 테스트를 추가하세요.[1], [3]
- ✓신뢰할 수 없는 HEIF/AVIF 업로드 변환은 파일 시스템 접근이 제한되고 환경 자격 증명을 상속하지 않으며 CPU와 메모리 제한이 적용된 일회성 격리 worker에서 실행하세요.[2]
- ✓파서 수정과 별도로 SSO 신뢰 관계를 검토하세요. issuer, audience, redirect URI, 계정 연결, 세션 바인딩을 검증하고 신원 경계가 넘어갔을 가능성이 있으면 세션을 폐기하세요.[4]
- ✓OpenAI의 SSO 구현이나 정확한 패치를 알려진 사실처럼 설명하지 마세요. 공개 보고서는 연구자의 설명만 제공하며 코드 결함이나 수정은 공개하지 않았습니다.[4]