
# CVE-2026-26717 기술 분석: OpenFUN Richie LMS 웹훅 인증의 HMAC 타이밍 공격 취약한 코드, 영향, 그리고 `hmac.compare_digest`를 사용한 수정 사항을 포함한 OpenFUN Richie LMS 웹훅 인증의 HMAC 타이밍 공격에 대한 기술 분석입니다.
작성자: Elvin Latifli
CVE ID: CVE-2026-26717
심각도: 중간 (CVSS 3.1: 4.8 — AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:N)
영향을 받는 제품: OpenFUN Richie (커밋 a1b5bbd 이전의 모든 버전)
영향을 받는 구성 요소: src/richie/apps/courses/api.py — sync_course_runs_from_request
수정 커밋: a1b5bbda
Richie는 France Université Numérique(OpenFUN)이 개발한 오픈소스 CMS로, DjangoCMS 기반으로 구축되었습니다. 이 프로젝트는 조직이 OpenEdX와 같은 학습 관리 시스템(LMS)에서 동기화된 강좌 카탈로그를 갖춘 완전한 기능의 온라인 교육 포털을 구축할 수 있도록 설계되었습니다. Richie는 인증된 웹훅을 통해 강좌 데이터 동기화를 처리하며, 그중 하나에 이 보고서에서 설명된 취약점이 포함되어 있습니다.
sync_course_runs_from_request 웹훅 엔드포인트는 수신된 Authorization 헤더를 예상 HMAC 서명과 비교할 때 표준 연산자를 사용했습니다:
==# 취약한 코드
signature_is_valid = any(
authorization_header == get_signature(message, secret)
for secret in getattr(settings, "RICHIE_COURSE_RUN_SYNC_SECRETS", [])
)
== 연산자는 비상수 시간 비교를 수행합니다 — 첫 번째 불일치 문자가 발견되는 즉시 단락(short-circuit)됩니다. 원격 공격자는 많은 조작된 요청을 보내고 응답 시간 차이를 측정하여 올바른 서명을 한 문자씩 추론할 수 있으며, 궁극적으로 유효한 인증 토큰을 위조하고 웹훅의 인증을 완전히 우회할 수 있습니다.
성공적인 공격을 통해 인증되지 않은 원격 공격자는 다음을 수행할 수 있습니다:
수정 사항은 ==를 상수 시간 문자열 비교를 위해 설계되어 타이밍 부채널을 제거하는 Python의 hmac.compare_digest()로 대체합니다:
# 수정된 코드
signature_is_valid = any(
hmac.compare_digest(authorization_header, get_signature(message, secret))
for secret in getattr(settings, "RICHIE_COURSE_RUN_SYNC_SECRETS", [])
)