DEEP DIVE REPORT

CVE-2026-123020: DB-GPT Agent Skill의 Jinja2 렌더링, LLM 호출 전에 코드 실행이 보고된 지점

SecurityDesk
• 2026.11.08 • 조회 3

CVE-2026-123020가 다루는 위험은 모델의 응답 바깥에서 생긴다. DB-GPT issue #3291의 보고에 따르면, 업로드된 Agent Skill의 지시문이 시스템 프롬프트를 조립하는 단계에서 Jinja2 템플릿으로 처리되고, 여기에 담긴 표현이 LLM 호출에 앞서 서버 프로세스 안에서 실행될 수 있다. 이 진술을 그대로 취하면 실행은 모델이 어떻게 동작하느냐에 좌우되지 않는다.

개요

개요 인포그래픽
VulDB에 등록된 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 템플릿 처리로 적혔다.

같은 사안을 다룬 DB-GPT issue #3291의 보고자는 실행 시점을 더 구체적으로 설명한다. 업로드된 SKILL.md에 Jinja2 SSTI 페이로드를 넣으면, 그 페이로드는 시스템 프롬프트를 만드는 과정에서 서버 프로세스 안에서 실행된다. 이 동작은 LLM 호출에 앞서 일어나므로 코드 실행이 모델의 응답이나 동작에 의존하지 않는다는 것이 보고서의 진술이다.

프로젝트 저장소도 같은 종류의 위험을 코드 주석으로 남겼다. 수정 커밋은 bind_prompt.template이 선택된 스킬의 지시문 같은 사용자 제어 콘텐츠를 담을 수 있고, 이때 일반 jinja2.Template을 쓰면 SSTI가 RCE로 이어질 수 있다고 설명한 뒤 SandboxedEnvironment를 적용하는 방식으로 바꿨다. 이 변경은 #3111 PR로 병합돼 v0.8.2 릴리스의 fix the unsandboxed jinja2 rce problem 항목에 포함됐다.

영향 범위

CVE 기록은 DB-GPT 0.8.1까지를 영향 버전으로 제시하고, issue 보고자는 v0.8.1을 영향 버전으로 명시한다. 보고자는 동시에 보고 시점까지 패치 버전은 없다고 적었다. 다만 2026-08-26에 공개된 v0.8.2에 Jinja2 샌드박스 보안 수정이 들어가 있으며, 이 수정이 이번 issue를 어디까지 덮는지는 회귀 검증이 필요하다는 단서가 함께 달려 있다.

그래서 버전 번호만 보고 판단하기보다, 신뢰할 수 없는 스킬 지시문이 실제로 이 렌더링 경로에 도달할 수 있는지를 먼저 보는 편이 정확하다. 외부 기여자나 다중 사용자에게 스킬 업로드·공유가 열려 있거나, 팀원이 외부에서 가져온 SKILL.md를 중앙 배포에 붙이는 운영이라면 점검 우선순위가 높다. 반대로 스킬 정의를 신뢰 가능한 관리자만 작성하고 외부 콘텐츠가 프롬프트 조립 단계에 들어오지 못한다면, 같은 코드라도 실제 노출 폭은 좁아진다.

이 판단에는 분명한 한계가 있다. 제공된 근거는 실제 악용 사실을 확인하지 못했고, 공격자가 반드시 갖춰야 할 접근 권한이나 배포별 노출 조건도 상세히 설명하지 않는다. 업로드 권한이 곧 RCE처럼 일반화할 근거는 아직 없다.

기술적 분석

경로는 프롬프트 조립 지점에서 열린다. 수정 커밋의 주석이 남긴 설명은 두 부분이다. 첫째, bind_prompt.template은 선택된 스킬의 지시문처럼 사용자 제어 콘텐츠를 담을 수 있다. 둘째, 그 상태를 일반 jinja2.Template로 렌더링하면 SSTI가 RCE로 이어질 수 있다. issue #3291은 여기에 구체적인 경로를 더한다. 업로드된 SKILL.md의 SSTI 페이로드가 시스템 프롬프트를 조립하는 과정에서 서버 프로세스 안에서 실행될 수 있다는 것이다. 따라서 근거가 뒷받침하는 범위는, 악성 페이로드를 담은 Skill 지시문이 취약한 렌더링 경로를 처리하면 서버 측 코드 실행으로 이어질 수 있다는 보고까지다.

운영 관점에서 더 중요한 것은 실행 시점이다. issue #3291은 실행이 LLM 호출에 앞서 서버 프로세스 안에서 일어난다고 적었다. 이 설명을 취하면 코드 실행은 모델의 응답이나 동작에 의존하지 않고, 점검의 초점도 모델의 출력단이 아니라 프롬프트를 조립하는 서버 안쪽의 템플릿 처리가 된다.

수정이 일반 jinja2.Template 대신 SandboxedEnvironment를 쓰도록 바꾼 것은 렌더링 단계에 통제를 추가하는 방향의 변경이다. 그러나 샌드박스가 특정 우회까지 막는지, 그리고 issue #3291이 지목한 FileBasedSkill.get_prompt 경로까지 빠짐없이 덮는지는 전달된 자료에 확인 근거가 없다. 업데이트 여부와 별개로 회귀 검증이 필요한 대목이다.

공개 PoC·익스플로잇 분석

출처. 재현 절차는 DB-GPT 저장소에 병합된 수정 PR #3111의 Replication & Verification Steps에 기여자 명의로 공개돼 있다. 사용한 페이로드와 컨테이너 안 파일 생성 결과는 이 PR이 보고한 내용이다. 실행이 LLM 호출 전에 일어난다는 설명은 issue #3291에 적힌 별개의 진술로, 두 기록은 출처와 범위를 구분해서 봐야 한다.

전제조건. 기여자는 main 브랜치에서 악성 SKILL.md를 업로드한 뒤 /api/v1/chat/react-agent 엔드포인트로 React Agent를 실행했다고 보고했다. PR이 적은 재현 절차에는 스킬 파일의 업로드와 해당 엔드포인트 호출이라는 동작이 등장한다. 각 동작이 실제 배포에서 누구에게 열려 있는지를 설명하는 권한 정보는 제공된 근거에 없다.

사용된 페이로드는 다음과 같다.

{{ cycler.__init__.__globals__.os.popen('echo "DBGPT_SSTI_OK" > /tmp/dbgpt_ssti_ok').read() }}

입증 범위. PR #3111은 수정 전에는 페이로드가 실행돼 컨테이너 안에 /tmp/dbgpt_ssti_ok 파일이 생성됐고, 이를 원격 코드 실행으로 분류했다고 보고한다. 수정 이후 같은 상황에서 어떤 결과가 나오는지, 그리고 그 수정이 issue #3291이 지목한 FileBasedSkill.get_prompt 경로를 포함해 어디까지 커버하는지는 전달된 인용만으로 확인되지 않는다.

이 기록은 재현 사례이지 실전 악용 확인이 아니다. 제공된 근거에는 실제 공격으로 이어진 사례가 없다. 관찰된 직접 효과는 컨테이너 내부 파일 생성이며, 다른 자산 접근이나 추가 피해 범위는 이 근거만으로 확정할 수 없다.

운영상 의미. 재현 절차가 공개되어 있다는 사실과 실제 위험의 크기는 별개의 문제다. PR #3111이 보고한 것은 수정 전 컨테이너 안에 파일이 생성된 결과이고, 실행이 서버 프로세스 안에서 LLM 호출보다 앞서 일어난다는 설명은 issue #3291이 별개로 남긴 진술이다. 두 기록을 같은 재현 경로에서 함께 확인된 단일 사실로 묶을 근거는 전달된 자료에 없다. 공개된 페이로드가 그대로 검증된 탐지 시그니처가 되는 것도 아니고, 제공된 근거에는 검증된 탐지 규칙이 없다. 그래도 두 진술을 각각의 출처에서 취하더라도, 모델의 응답 단계에 있는 통제보다 프롬프트 조립 단계의 템플릿 처리를 먼저 점검하는 편이 이 경로에는 더 직접적으로 닿는다.

대응 방안

우선순위 판단을 위한 확인

  • 실행 중인 DB-GPT 버전과 배포 형태를 확인한다. CVE 기록이 제시한 영향 범위는 0.8.1까지다.
  • 신뢰할 수 없는 SKILL.md나 외부 스킬 지시문이 업로드·선택·실행될 수 있는지, 그 지시문이 에이전트의 시스템 프롬프트 조립 경로에 실제로 도달하는지를 함께 점검한다. 노출 여부는 이 조건에서 갈린다.

즉조치에 가까운 선택

  • 도달 경로가 열려 있다면, 확인이 끝날 때까지 신뢰할 수 없는 스킬 콘텐츠의 사용을 제한하는 방향을 우선 검토한다. 스킬 등록 주체를 제한하거나 외부 유입을 막는 방식이 후보가 될 수 있으나, 실제 적용 가능성과 업무 영향은 각 환경에서 확인이 필요하다.
  • 업로드된 스킬 지시문과 관련 처리 활동에 의심스러운 템플릿 표현이나 예상 밖의 서버 측 실행 징후가 있는지 살펴본다. 어떤 기록이 남고 어디까지 보이는지는 배포마다 다르므로, 로그 보존 범위를 먼저 확인해야 한다. 검증된 탐지 규칙이나 환경별 우회 절차는 전달된 근거에 없다.

장기 조치

  • v0.8.2의 Jinja2 샌드박스 수정을 검토하고 업데이트를 계획한다. 단, 업데이트만으로 보고된 스킬 처리 경로가 해결됐다고 단정하지 않는다.
  • 운영 반영 전에 해당 경로 자체를 대상으로 회귀 검증을 수행하고, 기존 스킬이 정상 동작하는지와 렌더링 동작 변경이 업무 흐름에 미치는 영향을 함께 확인한다.
  • 검증에 사용한 버전과 검증 범위를 기록으로 남겨, 이후 같은 경로의 패치 유효성을 다시 확인할 때 기준으로 삼는다.

아직 알 수 없는 것

실제 악용 사례, 공격에 필요한 구체적 권한, 배포별 노출 조건, 수정 후의 정확한 동작, 샌드박스 수정의 커버리지 검증 결과는 현재 근거의 밖에 있다. 이 공백은 위협 수준을 낮게 평가할 이유도, 높게 부풀릴 이유도 되지 않는다. 점검의 출발점은 버전 번호보다 내 환경에서 외부 스킬 지시문이 프롬프트 조립 단계까지 도달하는가다.

참고자료

함께 읽으면 좋은 글

본 콘텐츠는 AI 기술로 작성된 분석 리포트를 포함하고 있습니다. 내용 중 사실과 다르거나 보완이 필요한 정보를 발견하셨으면 댓글을 통해 의견을 부탁드립니다. 여러분의 피드백은 더 정확한 보안 정보 공유에 큰 도움이 됩니다.

댓글 (0)

댓글을 작성하려면 로그인이 필요합니다.

로그인

아직 댓글이 없습니다.

첫 번째 댓글을 작성해보세요!

IT 도구 서랍

→ Unix: 2025-01-15T09:30:00
→ 날짜: 1736934600

→ ASCII: ABC
→ 문자: 65 66 67

ASCII 코드표 — 클릭하면 입력란에 추가

DecHex약어설명
DecHex문자
DecHex문자

→ 유니코드: 홍길동
→ 문자: \ud64d\uae38\ub3d9