매우 중요한 보안패치입니다. 가급적 빨리 업데이트하시기 바랍니다.
라이믹스 1.x 및 XE 0.1.5 이상 1.11.6 이하 모든 버전에도 동일한 보안패치가 필요합니다. 라이믹스 1.x는 2021년 말에 지원이 종료되었으며 XE 1.x는 2019년 이후 업데이트되지 않고 있으므로, 아직 구 버전을 사용하고 계신 분은 아래 링크를 참고하여 page.view.php 및 page.mobile.php 파일을 수정하시기 바랍니다. 라이믹스 개발팀이 언제까지나 다른 CMS에 대한 정보를 제공해 드릴 수는 없으니, 신규 보안취약점에 지속적으로 대응할 수 있는 CMS로 변경하시기를 강력히 권합니다.
보안취약점 수정
- [RVE-2022-2] 외부페이지의 템플릿 문법을 이용한 원격 코드 실행(RCE) 취약점
- 외부페이지는 페이지(page) 모듈에서 제공하는 기능으로, 관리자가 지정한 경로의 HTML 문서를 불러오거나 PHP 스크립트를 실행하여 레이아웃의 틀 안에 표시할 수 있는 기능입니다. 특수한 기능을 가진 페이지를 간단하게 구현하기 위해 널리 사용되어 왔으나, 모듈로 제작된 기능에 비해 대체로 코드 품질이 열악한 실정입니다.
- 외부페이지에 템플릿 문법을 사용하지 않는 사이트라도 안전하지 않습니다. 공격자가 템플릿 문법을 임의로 삽입할 수 있다는 점이 문제이기 때문입니다. GET/POST 변수, 글/댓글/회원정보 등 사용자가 임의로 입력할 수 있는 데이터를 처리하는 기능이 조금이라도 있다면 위험하며, 해당 데이터를 escape(), htmlspecialchars(), strip_tags(), addslashes() 등 일반적인 방법으로 필터링하더라도 효과가 없습니다.
- 외부페이지를 전혀 사용하지 않는 사이트이거나, 어떤 로직이나 변수도 사용하지 않고 순수한 HTML, CSS, JS만으로 작성된 외부페이지이거나, URL로 불러오는 외부페이지이거나, 관리자 전용으로 접근 권한을 제한해 둔 외부페이지라면 안전합니다.
- 라이믹스 2.0.19에서는 외부페이지에 PHP 로직이나 변수, 템플릿 문법 등을 사용하더라도 안전합니다. 단, 템플릿 문법 지원 기능이 기본으로 OFF되어 있으므로 업데이트 직후에는 템플릿 문법이 해석되지 않고 그대로 노출됩니다. 외부페이지에 템플릿 문법을 사용하려면 페이지(page) 모듈의 각 외부페이지 설정 화면에서 "외부페이지 후처리" → "PHP 실행" 및 "템플릿 해석" 옵션을 켜야 합니다.
- 단, 처리 방식이 달라졌으므로 외부페이지 소스에 포함된 인클루드 경로 등을 일부 수정해야 할 수도 있습니다. 기존에 템플릿 문법을 사용하지 않던 외부페이지라도 영향을 받을 수 있으니 하나씩 점검한 후 사용하시기 바라며, 향후 외부페이지에서는 가급적 템플릿 문법에 의존하지 말고 순정 PHP와 HTML만으로 작성하는 것을 권합니다. 순수한 HTML 페이지라면 "PHP 실행" 옵션도 끄는 것이 가장 안전합니다.
- 라이믹스 1.x 및 XE 1.x용 패치는 위와 같은 ON/OFF 옵션이 포함되어 있지 않으므로, 패치 적용시 더이상 외부페이지에서 템플릿 문법을 사용할 수 없습니다. 템플릿 문법을 사용하는 외부페이지는 순정 PHP 및 HTML로 변환하여야 합니다. 변환하기 곤란한 경우 라이믹스 2.0.19 이상 버전으로 업데이트하십시오.
- 라이믹스 1.x 및 XE 1.x에서 모든 패치를 즉시 적용하기 곤란한 경우, 우선 dispPageIndex() 부분에 추가된 1차 방어 기능(특수문자 금지 코드)부터 적용하고, 외부페이지 소스를 수정하는 등 준비를 마친 후에 나머지 패치(템플릿 해석 기능을 실제로 제거하는 코드)를 적용하는 방법도 있습니다. 특수문자 금지 코드만으로는 100% 안전하지 않으나, 불가피한 경우 참고하시기 바랍니다.
- 아주 오래된 버전의 XE이거나, 오래된 버전에서 꾸준히 업그레이드해 왔다면 opage 모듈에도 동일한 패치를 적용해야 할 수 있습니다. opage 모듈이 있는지 확인하시고, 만약 더이상 사용하지 않는다면 삭제하시기 바랍니다.
- 위젯 코드는 이번 보안패치나 "템플릿 해석" ON/OFF 옵션에 영향을 받지 않습니다.
개선점
- 파일 다운로드에 사용하는 암호화 키의 유효기간을 1시간에서 5분으로 축소하여, URL 유출시 피해를 최소화하도록 함 (#1890)
- git 저장소의 이름이 "rhymix"가 아니더라도 로컬 또는 github에서 유닛 테스트를 실행할 수 있도록 개선
- 기본 레이아웃에서 알림 위젯 사용시 알림센터를 중복으로 표시하지 않도록 개선
버그 수정
- 특정한 상황에서 관리자 전용으로 설정한 디버그 기능이 작동하지 않는 문제 수정 (#1884)
- MemberModel::getMemberInfo* 함수의 반환값 포맷이 일정하지 않은 데 따른 잠재적인 버그 예방조치 (#1886)
- 템플릿에서 loop 속성에 함수를 사용하면 2번씩 호출되는 문제 수정 (#1893)
- 설문조사 등록시 DB에 NULL값을 입력하려고 시도하는 문제 수정 (#1895)
- 쿼리 파라미터가 최대 길이를 초과할 때 에러 메시지에는 최소 길이로 표시되는 문제 수정 @Erictoby (#1897)
- 인증 메일의 비밀번호 필드 관련 길이 제한이 일관성없게 지정되어 있는 문제 수정 (#1898)
- 그룹 목록이 캐싱되지 않는 문제 수정 @dewekk (#1899)
- 비회원 추천 허용시 동일 IP에서 회원의 추천 기록이 있으면 비회원의 추천 기록이 있는 것으로 인식하는 문제 수정 (#1900)
- 템플릿 문법에서 {isset()}, {unset()}, {empty()}로 시작하는 삼항식을 인식하지 못하는 문제 수정
- image_link 에디터 컴포넌트를 비활성화해도 계속 로딩하려고 시도하는 문제 수정 (비활성화시 CKEditor 자체 이미지 플러그인으로 대체)
- 특정한 형태로 작성된 모듈에서 다른 모듈의 standalone 액션을 끌어다 쓰려고 하면 메시지 없는 에러를 반환하는 문제 수정
- URL 검증 정규식 수정
정리
패치 공지 및 다운로드
https://rhymix.org/news/334
https://github.com/rhymix/rhymix/commit/5b195ce16e77a71e21ecddb77ddb5863ddb29866
해당 문제해결을 위한 패치를 추가로 진행해 주셔야 합니다.