CVE-2026-123020은 eosphoros-ai DB-GPT 0.8.1 이하 버전에서 에이전트 스킬 파일(SKILL.md)이 시스템 프롬프트로 조립되는 과정에서 발생하는 Jinja2 서버 측 템플릿 삽입(SSTI) 취약점이다. 업로드된 SKILL.md에 SSTI 페이로드가 포함되면 LLM을 호출하기 전 단계, 다시 말해 모델이 응답을 생성하기도 전에 서버 프로세스 안에서 코드가 실행될 수 있다. 이 점이 이 취약점의 핵심 위험이다. 수정은 v0.8.2에서 일반 jinja2.Template을 SandboxedEnvironment로 교체하는 방식으로 이루어졌고, 이 위험의 수준을 둘러싼 평가는 취약점 데이터베이스의 저위험 정량 지표와 프로젝트 내 RCE 분류 사이에 격차가 있다.
CVE-2026-123020 개요: 영향 범위와 취약 지점
VulDB에 등록된 CVE-2026-123020 기록은 eosphoros-ai DB-GPT를 0.8.1까지 영향 범위로 제시한다. 발생 지점은 packages/dbgpt-core/src/dbgpt/agent/skill/claudeskill/init.py 파일의 FileBasedSkill.getprompt 함수로 지목됐다. 취약점 데이터베이스 항목은 이 지점을 Jinja2 Template Handler 컴포넌트로 특정하고, 취약 유형을 템플릿 엔진에 사용되는 특수 요소의 부적절한 중화로 분류하며, 공격이 원격으로 시작될 수 있다고 밝힌다. issue #3291의 보고자도 영향 버전으로 v0.8.1을 명시하고 보고 시점까지 패치 버전은 없다고 적었다.
| 구분 | 내용 | 근거 |
|---|---|---|
| CVE 식별자 | CVE-2026-123020 | |
| 대상 소프트웨어 | eosphoros-ai DB-GPT | |
| 영향 버전 | 0.8.1까지 | |
| 취약 지점 | packages/dbgpt-core/src/dbgpt/agent/skill/claude_skill/__init__.py — FileBasedSkill.get_prompt 함수 | |
| 컴포넌트 · 취약 유형 | Jinja2 Template Handler · 템플릿 엔진 특수 요소의 부적절한 중화(SSTI) | |
| 공격 개시 | 원격으로 시작 가능 | |
| 수정 버전 | v0.8.2 | |
| 패치 커밋 | a9e7a3c026d114fcfb4ffe3eaf78851a636ded16 |
작동 원리: SKILL.md 렌더링이 LLM 호출 전 코드 실행으로 이어지는 경로
공격 흐름은 다음과 같다.
- 공격자가 Jinja2 SSTI 페이로드를 포함한 SKILL.md를 업로드한다.
- 해당 스킬이 선택되면 FileBasedSkill.get_prompt 함수가 이 콘텐츠를 시스템 프롬프트 조립에 사용하며 Jinja2 렌더링을 수행한다.
- 수정 전 구현은 일반 jinja2.Template을 사용했기 때문에, 삽입된 페이로드가 렌더링 시점에 서버 프로세스 안에서 실행된다.
- 이 코드 실행은 시스템 프롬프트를 만드는 과정에서, 즉 LLM 호출에 앞서 일어난다.
왜 LLM 호출 이전의 실행이 더 위험한가
보고에 따르면 이 코드 실행은 LLM 호출에 앞서 일어나므로 모델의 응답이나 동작에 의존하지 않는다. 침해 지점은 모델이 아니라 DB-GPT 서버 프로세스 자체다. 대응도 애플리케이션 서버 관점에서 설계해야 한다.
공개 재현 절차와 페이로드: PR #3111이 보고한 내용
재현 절차와 페이로드는 DB-GPT 저장소에 병합된 수정 PR #3111의 Replication & Verification Steps에 기여자 명의로 공개돼 있다. 재현은 다음 절차로 보고되었다.
- main 브랜치 환경에서 악성 SKILL.md를 업로드한다.
- /api/v1/chat/react-agent 엔드포인트로 React Agent를 실행한다.
이 재현에서 사용된 페이로드는 다음과 같다.
{{ cycler.__init__.__globals__.os.popen('echo "DBGPT_SSTI_OK" > /tmp/dbgpt_ssti_ok').read() }}
Jinja2의 cycler 객체에서 전역 네임스페이스로 접근해 os.popen으로 명령을 실행하고, /tmp/dbgptsstiok 파일 생성으로 실행 성공을 확인하는 검증용 사례다. PR #3111의 보고에 따르면 수정 전에는 페이로드가 실행돼 컨테이너 안에 /tmp/dbgptsstiok 파일이 생성됐으며, 이 결과는 원격 코드 실행으로 분류됐다. 다만 이 페이로드는 특정 재현 사례에 사용된 예시일 뿐, 이 단일 사례만으로 실제 배포 환경의 전체 공격 표면을 일반화해서는 안 된다. 각 동작이 실제 배포에서 누구에게 열려 있는지에 대한 권한 정보도 근거에 없다.
v0.8.2 수정 내용과 패치 커버리지 불확실성
DB-GPT v0.8.2는 일반 jinja2.Template 대신 SandboxedEnvironment를 적용하는 방식으로 SSTI RCE 문제를 수정했다. 수정 커밋은 bind_prompt.template이 선택된 스킬의 지시문 같은 사용자 제어 콘텐츠를 담을 수 있어 일반 jinja2.Template을 쓰면 SSTI가 RCE로 이어질 수 있다고 설명했다. 이 변경은 PR #3111로 병합되어 v0.8.2 릴리스의 “fix the unsandboxed jinja2 rce problem” 항목에 포함됐다. 취약점 데이터베이스는 패치 식별자로 커밋 a9e7a3c026d114fcfb4ffe3eaf78851a636ded16을 게시한다.
업그레이드 적용 시 확인할 사항
SecurityDesk는 2026-08-26에 공개된 v0.8.2에 Jinja2 샌드박스 수정이 포함됐지만 이 수정이 issue #3291이 지목한 FileBasedSkill.get_prompt 경로를 어디까지 덮는지는 회귀 검증이 필요하다고 보고한다. DevGuard는 0.8.2 업그레이드로 충분하다고 단정하나 이는 상충하는 서술이므로, 업그레이드 후 자체 환경에서 스킬 렌더링 경로 검증이 권장된다.
심각도 평가 충돌: CVSS 2.1 Low vs RCE 분류
이 취약점의 위험 수준을 두고 출처 간 평가가 갈린다. DevGuard는 이 항목에 CVSS 2.1(Low), EPSS 0.50%(30일 내 악용 가능성 매우 낮음), 위협 인텔리전스 1.3(제한적 익스플로잇 활동 관측)을 게시했고, 게시일은 2026-11-05다. 반면 PR #3111의 재현 보고는 수정 전 페이로드 실행으로 컨테이너 내 파일이 생성된 결과를 원격 코드 실행으로 분류했고, issue #3291은 시스템 프롬프트 조립 과정에서 서버 프로세스 안의 코드 실행 가능성을 보고했다. 두 평가 사이의 산출 방식 차이나 조정 근거는 수집 근거에 없다.
실제 악용 동향도 대조된다. DevGuard의 위협 인텔리전스 1.3은 제한적 익스플로잇 활동 관측이라고 표기했지만 관측 근거를 제시하지 않았고, SecurityDesk는 제공된 근거가 실제 악용 사실을 확인하지 못했다고 적는다. 익스플로잇 공개 여부에서도 DevGuard 페이지는 익스플로잇이 공개됐다고 설명하면서 같은 페이지의 Exploit 섹션에는 GitHub 저장소와 Exploit-Database 모두에서 이용 가능한 익스플로잇을 찾지 못했다고 적어 내부적으로 모순된다. 재현 절차와 페이로드 자체는 PR #3111에 공개돼 있다.
운영 환경 점검 포인트와 대응 방향
- 버전 확인: 운영 중인 DB-GPT가 0.8.1 이하인지 점검한다. 영향 범위는 0.8.1까지로 제시된다.
- 업그레이드 적용: v0.8.2로 업그레이드한다. 적용 여부는 패치 커밋 a9e7a3c026d114fcfb4ffe3eaf78851a636ded16과 릴리스의 “fix the unsandboxed jinja2 rce problem” 항목으로 대조한다. 단 이 수정이 FileBasedSkill.get_prompt 경로를 어디까지 덮는지는 회귀 검증이 필요하다는 보고가 있으므로, 업그레이드 후 자체 환경에서 스킬 렌더링 경로를 직접 확인해 본다.
- 스킬 파일 입력 경로 점검: 공격의 출발점이 SKILL.md 업로드이므로, 스킬 파일 등록 경로와 이용 가능한 사용자 범위를 점검한다. 노출 여부는 신뢰할 수 없는 SKILL.md나 외부 스킬 지시문이 에이전트의 시스템 프롬프트 조립 경로에 실제로 도달하는지에 달려 있다.
- 에이전트 실행 엔드포인트 점검: 재현 절차에서 /api/v1/chat/react-agent 엔드포인트가 사용됐으므로 해당 엔드포인트의 노출 여부와 접근 통제를 확인한다.
- 임시 완화: 업그레이드 전까지 신뢰할 수 없는 출처의 SKILL.md 등록을 제한하는 것이 이 취약점의 침투 경로를 줄여 준다.
결론: 확인된 사실과 남은 검증 과제
CVE-2026-123020은 DB-GPT 0.8.1 이하에서 SKILL.md의 Jinja2 렌더링 경로, 즉 FileBasedSkill.get_prompt 함수를 통해 LLM 호출 전에 서버 프로세스 내 코드 실행으로 이어질 수 있는 취약점이며, v0.8.2의 SandboxedEnvironment 적용으로 수정됐다. 다만 이 수정의 경로별 커버리지는 회귀 검증이 필요하다는 보고가 남아 있고, 심각도 평가는 출처 간 격차가 해소되지 않았다. 스킬 업로드 권한이 실제 배포에서 누구에게 열려 있는지, 배포별 노출 조건과 실제 악용 동향 같은 사항은 본 글이 참조한 근거 범위에서 확정되지 않았고, 검증된 탐지 규칙도 제공되지 않았다. 본 글은 기준일 2026-11-08까지 수집된 근거에 따라 작성되었으므로, 최종 판단과 추가 조치는 공식 CVE 레코드와 DB-GPT 저장소의 최신 발표를 기준으로 확인하기 바란다.