옅은 따뜻한 회색 바탕 위의 추상적인 기술 일러스트: 중앙에서 왼쪽으로 치우친 위치에 희미한 줄무늬 행이 있는 키가 큰 오프화이트 설정 패널이 있고, 그 가장 아래 필드에는 두 개의 작은 중첩된 청록색 꺾쇠괄호 표시가 하나가 다른 하나 안에 들어 있습니다. 가느다란 청록색 선이 패널에서 오른쪽의 평평한 슬레이트 서버 블록으로 이어집니다. 두 번째 호박색 선은 중첩된 표시에서 나와 패널 테두리 위를 지나 같은 블록에 도달하며, 작은 호박색 사각형이 두 경로가 갈라지는 접점을 표시합니다. 두 번째, 더 흐릿한 서버 블록이 첫 번째 블록 뒤에 있습니다. 이 아트워크는 부드러운 그림자와 넉넉한 여백을 갖춘 평면 벡터 기하학입니다. 텍스트, 글자, 숫자, 사람 또는 조직 로고는 나타나지 않습니다. OrcaRouter 로고는 아트워크 아래 흰색 띠의 오른쪽 아래 모서리에 합성되어 있습니다.
AI Safety Incidents

Zammad의 AI Agent RCE: 중첩된 템플릿 태그, 한 글자 수정

작성자

Alistair Wren

게시일

최신 모델 · 20모든 모델 보기 →
벤치마크: Artificial Analysis · 매일 업데이트
모든 게시물로 돌아가기

오픈소스 헬프데스크인 Zammad는 2026년 8월 4일 18개의 보안 수정 사항과 함께 버전 7.1.2를 출시했으며, 목록에 첫 번째로 기재된 수정 사항은 AI Agent 기능의 구성 필드에 있는 원격 코드 실행 취약점을 차단한다. 이 취약점은 CVE-2026-84462로, 같은 날 GitHub 권고문 GHSA-gp3x-9xm8-rcj6에서 공개되었으며, 영향 범위는 7.1.1 및 그 이하 버전의 모든 자체 호스팅 설치 환경이다. AI Agent를 생성하거나 편집할 수 있는 관리자는 해당 에이전트의 필드 중 하나에 특수하게 조작된 텍스트를 입력하고, 이를 무력화하려는 필터를 우회하여, Zammad를 호스팅하는 서버에서 임의 명령을 실행할 수 있으며 — 권고문의 표현대로 — "해당 서버에 저장된 모든 데이터를 읽거나 수정하거나 파괴할" 가능성이 있다. 다른 사용자가 별도로 조치할 필요는 없다: 권고문은 "영향을 받은 AI Agent가 다음에 티켓을 처리할 때 악성 코드가 자동으로 실행된다"고 밝힌다. GitHub는 이를 CVSS 4.0 기준 8.6점의 High로 평가한다. 이 기록과 그 심각도 및 피해 태그, 그리고 그 주변에 등록된 항목들은 보관된다. 보관 위치는 the Orca AI Incident Archive이며, 이 아카이브는 이 사건을 시리즈의 나머지 사건들과 함께 나열한다.

권고안이 규정하는 사항

2026년 8월 4일에 공개된 GitHub 권고문은 짧지만 메커니즘과 사전 조건에 관해 유난히 구체적이다. 이 권고문은 “Zammad의 AI 에이전트 구성을 보호하는 보안 필터”가 “AI 에이전트의 필드 중 하나에 특수하게 조작된 텍스트를 입력함으로써 우회될 수 있다”고 설명하며, 행위자를 정확히 지목한다: “AI 에이전트를 생성하거나 편집할 권한이 있는 관리자는 이를 악용해 Zammad를 호스팅하는 서버에서 임의 명령을 실행할 수 있다.” 영향을 받는 범위는 7.1.1까지(7.1.1 포함)로 기록되어 있고, 패치된 버전은 7.1.2이다. 공로를 인정받은 신고자는 colinthebomb1이며, 게시 계정은 fliebe92이다. 이 권고문은 개념 증명이나 익스플로잇 상세 정보를 전혀 공개하지 않는다.

GitHub는 이 취약점을 High로 평가하며, CVSS 4.0 기준 8.6점이고, 벡터는 AV:N/AC:L/AT:N/PR:H/UI:N/VC:H/VI:H/VA:H이며 범위 변경은 없습니다. 이를 해석하면, 이 취약점은 낮은 복잡도로 네트워크를 통해 도달할 수 있고, 공격 요구 사항과 사용자 상호작용이 없으며, 이미 애플리케이션 내부에서 높은 권한을 보유한 공격자에 의해 악용될 수 있고, Zammad 인스턴스 자체의 기밀성, 무결성 및 가용성에 높은 영향을 미친다는 뜻입니다. 권고문은 세 가지 약점을 나열합니다. CWE-20, 부적절한 입력 검증; CWE-94, 코드 주입; 그리고 CWE-1336, MITRE가 "엔진에서 처리될 때 템플릿 표현식이나 기타 코드 지시문으로 해석될 수 있는" 특수 구문을 중화하지 못하는 것으로 정의한 템플릿 엔진 클래스입니다.

수정은 한 글자를 변경했습니다.

공개된 수정은 커밋 e3b0c8df91ad2108c8305be23e8fe6f73fb9718d이며, "Maintenance: Improve ERB sanitizer."라는 메시지로 제출되었습니다. GitHub에는 작성자 날짜가 2026년 7월 7일, 커밋 날짜가 2026년 8월 3일로 기록되어 있으며, 이는 권고문과 릴리스보다 하루 앞선 날짜입니다. 이 커밋은 두 파일을 수정합니다: lib/erb_sanitizer.rb의 한 줄과 명세에 추가된 열네 줄입니다.

수정 전체는 단 한 줄입니다. escape_tag 메서드는 문자열에서 패턴의 첫 번째 일치 항목을 치환하는 Ruby의 sub를 사용했지만, 이제는 모든 일치 항목을 치환하는 gsub를 사용합니다. 두 버전 모두 치환 결과는 동일합니다. `<%`로 작성된 여는 태그는 `<%%`가 되는데, 이는 Ruby의 템플릿 엔진인 ERB가 평가하지 않고 리터럴 텍스트로 렌더링하는 중복 형태입니다. 권고문은 어느 AI Agent 필드가 해당 템플릿을 담고 있는지 명시하지 않습니다. 커밋은 해당 템플릿을 무력화했어야 하는 필터를 지목합니다.

A dark HTML card titled 'One line, one letter', kicker 'Zammad fix commit e3b0c8f', subtitle 'lib/erb_sanitizer.rb, method escape_tag, authored 7 July 2026 and committed 3 August 2026 - one day before disclosure'. Two code panels: BEFORE, in amber, shows a red minus beside tag.sub with the opener arguments and the note 'Replaces the first opener only'; AFTER, in cyan, shows a green plus beside tag.gsub and the note 'Replaces every opener'. A second panel headed 'WHY ONE LETTER MATTERED' shows the payload, a literal opener followed by an evaluating tag, arrowed to the same string with the first opener doubled, and explains that the inner tag is never touched. A third row headed 'REGRESSION SPEC, SAME COMMIT' shows the two nested payloads the added tests cover, with the note 'Both must render as literal text, not evaluate'. A footer names commit e3b0c8df91ad2108c8305be23e8fe6f73fb9718d and says the card was rendered by OrcaRouter with no vendor logos. The OrcaRouter logo is composited in the bottom-right corner.

`sub`를 사용하면 문자열에서 첫 번째 오프너만 무력화되었다. 첫 번째 오프너 바로 뒤에 두 번째 오프너를 넣은 페이로드는 필터를 통과한다. `<%<%= 1 + 1 %>`는 `<%%<%= 1 + 1 %>`가 되는데, 여기서 ERB는 맨 앞의 오프너를 텍스트로 출력한 다음 내부 태그를 평가한다. 같은 커밋에 추가된 회귀 명세는 이 트릭을 명확히 이름 붙인다 — "단일 태그 안에 중첩 오프너를 몰래 넣음(escape-all-openers 우회)" — 그리고 `<%<%= 1 + 1 %>`와 이중으로 중첩된 `<%<%<%= 1 + 1 %>` 둘 다 리터럴 텍스트로 렌더링되어야 한다고 단언한다. 그 명세는 필터가 어떻게 우회되었는지에 대한 가장 명확한 공개 설명인데, 어드바이저리 자체는 아무런 설명도 제공하지 않기 때문이다.

이 버그의 형태는 Zammad만의 흥미로운 현상이라기보다 일반적입니다. 첫 번째 일치 이후 멈추는 이스케이프 처리기는 제거하는 시퀀스의 두 번째 중첩 복사본을 담은 모든 입력에 의해 무력화됩니다. 커밋 메시지는 이 변경을 유지보수라고 부르는데, 이는 단일 문자 강화 패치가 흔히 전달되는 방식이며, 경고를 diff가 아니라 보안 권고문이 담아야 했던 이유이기도 합니다.

보안 권고문에서 NVD까지 7주

NVD는 2026년 9월 25일에 CVE-2026-84462에 대한 기록을 게시했으며, 이는 권고문 발표 후 7주가 지난 시점이었고, 9월 28일에 마지막으로 수정했습니다. 해당 기록은 "Deferred"(보류)로 표시되어 있는데, 이는 NVD가 자체 분석을 게시하지 않았음을 의미하며, metrics 블록에서는 8.6점을 보조 지표로 security-advisories@github.com에 귀속시키고 있습니다. 즉, 독립적인 NVD 평가가 아니라 CVE 번호 부여 기관으로서 GitHub가 매긴 점수입니다. 같은 기록에는 CPE 구성이 전혀 없으므로, 해당 취약점을 버전이 지정된 제품 식별자에 매핑하지 않습니다.

릴리스 노트 대신 피드로 자체 호스팅 소프트웨어를 추적하는 사람에게는 두 가지 세부 정보 모두 중요합니다. 수정 조치는 8월 4일 공개되었고 바로 적용할 수 있었습니다. 기계가 읽을 수 있는 기록은 9월 25일에 도착했으며, 그때조차 CPE 기반 스캐너가 대조하는 제품 식별자 없이 도착했습니다. 7주 동안 해당 취약점에 대한 권위 있는 설명은 벤더의 보안 권고와 벤더의 릴리스 노트였습니다.

A dark HTML timeline card titled 'From commit to CVE record', kicker 'Zammad 7.1.2 - CVE-2026-84462', subtitle 'Five dated points, taken from the fix commit, the GitHub advisory, the Zammad release note and the NVD API'. Five rows: 7 July 2026, fix authored in commit e3b0c8f with the message 'Maintenance: Improve ERB sanitizer'; 3 August 2026, fix committed one day before disclosure; 4 August 2026, GitHub advisory GHSA-gp3x-9xm8-rcj6 published and Zammad 7.1.2 shipped the same day with 18 security fixes; 25 September 2026, NVD publishes CVE-2026-84462 with status Deferred and no CPE configuration, 52 days after disclosure; 29 October 2026, FIRST EPSS read at 0.28 percent probability in 30 days, 20th percentile. An amber rule below reads 'The advisory and the CVE record describe the same flaw. The first was actionable on 4 August; the second arrived as a machine-readable record 52 days later.' A footer credits GitHub, Zammad, NVD and FIRST, and says the card was rendered by OrcaRouter. The OrcaRouter logo is composited in the bottom-right corner.

무엇이 확립되었고, 무엇이 그렇지 않은가

확인된 사항: 보안 권고문, 패치된 버전, CVSS 점수, 코드 변경 사항은 모두 Zammad와 GitHub의 권고문 데이터베이스에서 비롯되었으며, 서로 일치합니다. NVD의 기록은 자체 분석을 추가하지 않고 번호 부여 기관의 설명을 그대로 재현합니다. 아카이브는 이를 근거로 해당 항목의 신뢰도를 A로 평가하며, 해당 사건은 논쟁의 여지가 없습니다.

확인되지 않았거나 기록되지 않음: 권고문에는 개념 증명이 없고, 실제 환경에서 악용되었다는 보고도 없습니다. FIRST의 EPSS는 2026년 10월 29일 공개된 점수에서 CVE-2026-84462에 향후 30일 내 악용 확률 0.28퍼센트, 20번째 백분위수를 부여합니다. 아카이브에는 실제 피해가 기록되어 있지 않으며, 해당 항목을 중간 위험도로 분류합니다 — 권고문 자체의 High 등급보다 낮습니다. 이들은 서로 다른 질문에 답하는 별개의 도구입니다. 즉, 그 취약점이 허용할 수 있는 것과 실제로 일어난 것으로 알려진 것에 관한 것이며, 이 글은 이 둘을 조정하려 하기보다 둘 모두를 보도합니다.

독립적인 교차 검증은 빈약하다. 이 CVE에 대한 보도를 검색하면 번호 부여 기관의 텍스트를 재게시한 취약점 데이터베이스들과 Zammad 자체의 릴리스 노트가 나올 뿐이며, 어떤 뉴스 매체도 이 취약점을 독립적으로 보도한 것으로 보이지 않는다. 이것은 기록 자체에 대한 비판이 아니라 기록에 관한 발견이다: 관리자 계정을 필요로 하는 헬프데스크 원격 코드 실행은 언론 보도를 불러일으키는 종류의 사건이 아니며, 독립적인 설명이 없다는 점 자체가 이 기록이 문서화하는 내용의 일부이다.

누가 이를 촉발할 수 있으며, 무엇이 바뀌었는가

{{1}}7.1.2{{/1}}에 대한 Zammad의 릴리스 노트({{2}}2026년 8월 4일{{/2}})에는 해당 버전에서 패치된 18개의 취약점이 나열되어 있으며, {{3}}AI 에이전트 템플릿 우회{{/3}}가 가장 먼저 제시됩니다. 호스팅 고객의 경우 "{{4}}조치가 필요하지 않습니다. 귀하의 인스턴스는 이미 우리 팀에 의해 패치되고 보호되었습니다.{{/4}}"라고 명시합니다. 자체 호스팅 설치 환경의 경우 더 직설적으로 "{{5}}시스템이 보호되도록 즉시 Zammad 최신 버전으로 업그레이드할 것을 강력히 권장합니다.{{/5}}"라고 밝힙니다. 이 권고에는 우회 방법이 없으며, 기록에는 업그레이드 외에 위험을 완화할 방법이 제시되지 않습니다.

A dark HTML card titled 'Who can pull the trigger', kicker 'CVE-2026-84462 - preconditions', subtitle 'From the GitHub advisory and the Zammad 7.1.2 release note; the score and exploitation figure are labelled separately'. Left column headed 'THE ATTACKER MUST' lists three conditions: hold administrator rights inside Zammad, specifically permission to create or edit AI Agents; reach the agent configuration over the network; supply no interaction from any other user. Right column headed 'THE PAYLOAD THEN' lists three consequences: runs on the server that hosts Zammad, not in a browser; fires the next time the agent processes a ticket; can read, modify or destroy all data on that server, according to the advisory. A statistics strip reads 8.6 CVSS 4.0 High, PR:H high privileges required, UI:N no user interaction, C:H I:H A:H all three impacts high, and 0.28 percent EPSS on 29 October 2026. Three flags below read Affected: Zammad up to and including 7.1.1; Fixed: 7.1.2, released 4 August 2026; Stated remedy: upgrade, no workaround published. A closing panel notes that the advisory publishes no proof of concept and that the regression spec in the fix commit is the clearest public description of the bypass. A footer says hosted instances were already patched and self-hosted installations must reach 7.1.2. The OrcaRouter logo is composited in the bottom-right corner.

권한 요구사항은 벡터가 제시하는 것보다 더 자세히 살펴볼 필요가 있습니다. PR:H는 공격자가 그 취약점을 유용하게 쓰려면 상당한 접근 권한이 필요하다는 뜻이며, 여기서 그 접근 권한은 Zammad 문서에서 AI Agents와 작업하려면 반드시 필요하다고 명시한 admin.ai_agent 권한입니다. 헬프데스크에서는 흔히 분류기, 태거, 텍스트 추출기를 조정하는 서비스팀 리드가 해당되며, 반드시 서버를 관리하는 사람은 아닙니다. 권고문 자체의 표현인 "AI Agents를 생성하거나 편집할 권한이 있는 관리자"는 "누구나"보다 좁고 "root"보다 넓습니다. 즉시 업그레이드가 불가능하다면 해당 권한 보유자를 좁히면 코드 경로에 접근할 수 있는 사람의 범위가 줄어듭니다. 이는 벡터와 문서에서 추론한 것이지 벤더가 공개한 해결책은 아닙니다.

어떤 1차 문서도 언어 모델을 익스플로잇 경로에 포함시키지 않는다. 해당 명령은 에이전트 구성이 렌더링될 때 Zammad의 Ruby 프로세스 내부에서 실행된다. 권고문, 커밋, 릴리스 노트 어디에도 모델이 페이로드를 생성한다는 설명은 없다. AI Agent 기능은 관리자가 작성할 수 있고 템플릿으로 처리되는 필드를 제공하며, AI는 메커니즘이 아니라 표면이다. 기록이 가리키는 패턴은 이것이다. 에이전트 정의, 즉 지시문, 템플릿, 필터는 실행 가능한 구성이며, 보안 검토가 아니라 지원 업무를 맡은 사람들이 이를 편집한다.

Zammad의 해결책은 비례적이고 무미건조하다. 메서드 변경 하나, 회귀 테스트 두 개, 그리고 이 구멍과 함께 다른 열일곱 개의 구멍까지 닫아 주는 버전 올리기다. 앞으로 전달할 가치가 있는 부분은 노출 모델이다. 지원 책임자가 에이전트를 정의하도록 허용하는 헬프데스크는 그 지원 책임자가 서버가 실행할 무언가를 작성하도록도 허용하며, 그 둘 사이에 있는 유일한 것은 제거하는 구문의 모든 중첩 복사본에 대해 올바로 판단해야 하는 필터뿐이다.