개요

Kiota는 OpenAPI 기반으로 HTTP 클라이언트 코드를 생성하는 도구입니다. CVE-2026-105796는 이 생성기의 Java·PHP 문서 주석(doc-comment) 살균기(sanitizer)가 만드는 코드 주입 경로를 다룹니다. CVE 기록에는 0.5.0 이상 1.35.0 미만 구간에서 블록 주석 종결자가 중성화되지 않고 삭제만 일어나, 겹치는 문자가 종결자를 다시 만들어 공격자가 제어하는 OpenAPI 텍스트가 생성된 문서 주석 밖으로 나올 수 있다고 적혀 있습니다.
CVSS 3.1 벡터는 CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H로 기록되어 있습니다. 네트워크발 입력, 낮은 공격 난이도, 권한 불필요라는 조건과 함께 사용자 상호작용(UI:R)이 필요하다는 항목이 포함된 조합으로, 아래에서 볼 수 있는 "생성 후 컴파일·로드"라는 성립 조건과 같은 방향을 가리킵니다.
가장 먼저 정리할 사실은 실행 시점입니다. GHSA-rm89-rhwj-9j92는 Kiota가 악성 설명서를 읽는 것만으로 코드가 실행되지는 않으며, 실행은 소비 애플리케이션 또는 빌드 환경의 보안 컨텍스트에서 일어난다고 명시합니다. 즉 이 취약점은 "OpenAPI 파일을 열었을 때 터지는" 유형이 아니라, 코드 생성과 빌드라는 두 단계를 통과할 때 비로소 실행 기회를 얻는 유형입니다.
영향 범위
보안 공지가 확인하는 버전 범위와 변형은 다음과 같습니다.
| 구분 | 확인된 범위 |
|---|---|
| Java 정규화 순서 결함 | 0.5.0에 도입, 1.34.1까지 지속. 별도의 보안 백포트 릴리스 1.29.1에도 존재 |
| PHP 구분자 재형성 변형 | 1.34.1과 1.29.1에 존재 |
| 수정 | 1.35.0에서 두 변형 모두 수정 |
- Java 생성기와 PHP 생성기 양쪽에 각각 다른 모양의 결함이 존재하며, 두 변형 모두 1.35.0에서 함께 정리됩니다.
- 보안 백포트로 배포된 1.29.1을 "구버전에서 안전하다고 믿고" 고정해 둔 구성도 취약 범위에 포함됩니다. 버전 정책이 복잡한 저장소일수록 이 항목이 중요합니다.
- 실행까지 요구되는 조건은 생성 대상 언어에 따라 다릅니다. Java는 악성 설명서로 클라이언트를 생성한 뒤 산출물을 컴파일하고 로드해야 하고, PHP는 생성된 산출물을 로드하는 단계까지 필요합니다.
따라서 실질 위험은 "Kiota를 쓰느냐"가 아니라 "Kiota를 어떤 OpenAPI 정의와 함께 쓰느냐"로 좁혀집니다. 외부에서 제공받거나 검증되지 않은 OpenAPI 설명서를 코드 생성에 투입하는 경로가 있는 조직, 예를 들어 파트너 사양이나 공개 사양을 파이프라인에 직접 넣는 구성에서는 점검 우선순위가 높아집니다. 반대로 내부에서 직접 작성·검토한 OpenAPI 정의만 사용하는 구성은 성립 조건 자체가 약합니다.
기술적 분석
결함의 핵심은 "무효화가 아닌 삭제"입니다. 수정 PR #8017에 따르면 Java·PHP 문서 주석 살균기는 */ 종결자를 Replace(*/, empty) 방식으로 제거했습니다. 두 글자 시퀀스를 단순히 지우면 앞뒤 문자가 겹쳐 같은 종결자가 다시 만들어집니다. PR에 제시된 예처럼 **//에서 삭제 후 */가 다시 만들어지듯, 삭제 연산 자체가 탈출구를 재생산합니다.
이렇게 재형성된 종결자는 생성된 문서 주석을 조기에 닫습니다. 주석 안에 머물러야 할 스키마 설명 텍스트가 주석 밖 문법 위치로 나오면서, 스키마 설명이라는 "데이터로 취급되어야 할 문자열"이 생성된 클라이언트 소스의 코드로 승격됩니다. OpenAPI 설명 필드가 코드 생성기의 문맥 전환 지점이 되는 셈입니다.
Java에는 이보다 한 단계 정교한 순서 결함이 추가되어 있습니다. Java 살균기는 종결자를 삭제한 뒤 비ASCII 문자를 제거하는데, 이 정규화(normalization) 순서 때문에 정규화 과정에서 새로운 종결자가 만들어질 수 있습니다. 즉 1차 삭제 시점의 검사를 통과해도 후속 정규화가 다시 위험한 토큰을 조립할 수 있습니다. 입력 변형 처리에서 "정규화와 무효화의 순서"가 보안 경계가 되는 전형적인 패턴입니다.
악용 성립 조건과 실행 컨텍스트
공급자가 확인한 악용 조건을 정리하면 성립 경로는 최소한 다음 네 단계를 모두 통과해야 합니다.
- 공격자 또는 신뢰 경계를 통과하지 못한 입력이 OpenAPI 설명서에 도달할 수 있을 것.
- 개발자 또는 빌드 파이프라인이 그 설명서로 클라이언트를 생성할 것.
- Java는 생성된 산출물을 컴파일하고 로드할 것. PHP는 생성된 산출물을 로드할 것.
- 그 실행이 소비 애플리케이션 또는 빌드 환경의 보안 컨텍스트에서 일어날 것.
실행 위치가 빌드 환경이라는 점은 영향의 성격을 바꿉니다. 코드 실행이 확인되면 CVSS에 기록된 기밀성·무결성·가용성 영향이 모두 높음(C:H/I:H/A:H)이 되는 이유도 이 컨텍스트와 맞닿습니다. 조건부 운영 판단으로 보면, 빌드 환경에서 동작하는 코드는 소스 코드와 빌드 시크릿, 레지스트리 자격증명, 파이프라인이 생성하는 산출물에 도달할 수 있는 위치이므로, 단일 서비스 침해보다 하류 산출물 오염으로 이어질 가능성이 큽니다. 다만 이 부분은 증거에 개별 사실로 기술된 피해 사례가 아니라 성립 조건에서 도출된 해석이며, 실제 피해 범위를 증명하지는 않습니다.
확인되지 않은 사항과 해석의 한계
- 이번 증거 수집 범위에서 공개 PoC나 실제 악용 사례는 확인되지 않았습니다. CISA KEV 등재 여부도 확인하지 않았습니다. 이는 "악용 없음"의 증거가 아니라 "악용 증거를 아직 보지 못했다"에 가깝습니다.
- Microsoft 자료 외 독립적인 제3자의 기술 분석이나 재현 보고서는 확인되지 않았습니다. 메커니즘 설명이 사실상 단일 공급자 출처에 의존한다는 뜻입니다.
- 악용 성립 조건은 분명하지만, 조건이 요구하는 것만으로 실제 익스플로잇 난이도를 단정할 수는 없습니다.
대응 방안
즉시 조치
- 조직 전체에서 Kiota 사용 여부와 버전을 파악합니다. 0.5.0 이상 1.34.1 이하, 그리고 보안 백포트 1.29.1을 사용 중이라면 취약 대상으로 간주하는 것이 안전합니다.
- 출처가 검증되지 않았거나 신뢰 경계가 불분명한 OpenAPI 설명서에 대한 클라이언트 생성, 그리고 그 산출물의 컴파일·로드를 잠시 중단합니다. 실행 조건이 로드 단계에서 완성된다는 점에서, 이 중단은 실제로 공격 표면을 줄이는 조치입니다.
- 이미 생성된 클라이언트 코드에서 문서 주석 종결자 이탈 흔적을 검토합니다. 주석 종결자가 의도치 않게 재형성된 흔적이나, 주석 블록 밖으로 벗어난 비정상 텍스트가 관찰 대상입니다. 다만 증거에 정의된 탐지 시그니처나 로그 패턴은 없으므로, 서명을 통한 탐지가 아닌 코드 리뷰 형태의 검토가 필요합니다.
- 코드 생성에 투입한 OpenAPI 설명서의 출처와 해시를 기록해, 특정 정의가 언제 어떤 버전의 생성기로 산출물을 만들었는지 추적할 수 있게 합니다. 이 추적성 확보 역시 증거에 명시된 통제 항목이 아니라 운영 판단에 따른 보완 조치입니다.
구조적 대응
- Kiota를 1.35.0 이상으로 업그레이드합니다. 수정 버전은 종결자를 삭제하지 않고 중성화하며, Java의 경우 비ASCII 정규화 이후에 종결자 중성화를 수행해 앞서 본 순서 결함을 함께 정리합니다.
- 업그레이드만으로 끝나지 않습니다. 이전 버전 생성기가 만들어 낸 기존 클라이언트는 1.35.0 이상에서 재생성(regenerate)해야 합니다. 새 생성기로 바꾸는 것만으로는 이미 저장된 산출물이 대체되지 않기 때문입니다.
- OpenAPI 설명서를 코드 생성에 투입하기 전 신뢰된 출처만 허용하는 공급망 통제를 적용합니다. 증거가 완화책으로 명시한 것은 업그레이드와 재생성이며, 출처 통제와 승인 흐름은 이 취약점의 성립 조건(검증되지 않은 설명서의 유입)을 줄이기 위한 조건부 권고입니다.
점검 우선순위를 조건부로 정리하면, 검증되지 않은 OpenAPI 정의를 자동으로 받아 코드 생성에 사용하는 파이프라인이 최상위에 놓입니다. 그다음은 백포트 버전 1.29.1처럼 수정 버전으로 오인되기 쉬운 고정 버전, 그리고 생성 산출물을 즉시 컴파일·배포하는 구성입니다. 내부 검토를 거친 정의만 사용하고 로드 전 산출물 리뷰가 존재하는 구성은 상대적으로 후순위로 판단할 수 있습니다.
참고자료
- CVE-2026-105796: Kiota: Code injection through doc-comment delimiter reformation in Kiota Java and PHP generators
- GHSA-rm89-rhwj-9j92: Code injection through doc-comment delimiter reformation in Kiota Java and PHP generators (Impact)
- PR #8017: neutralize doc-comment delimiters instead of deleting them
함께 읽으면 좋은 글
- CVE-2026-111357: Ivanti Connect Secure 핵심 기능 인증 누락과 권한 상승 체인 점검
- CVE-2026-114437: go-chi ClientIPFromXFF의 X-Forwarded-For 기반 클라이언트 IP 스푸핑 점검
- CVE-2026-118527: Ivanti Connect Secure 예측 가능한 식별자와 파일 업로드 체인 점검
본 콘텐츠는 AI 기술로 작성된 분석 리포트를 포함하고 있습니다. 내용 중 사실과 다르거나 보완이 필요한 정보를 발견하셨으면 댓글을 통해 의견을 부탁드립니다. 여러분의 피드백은 더 정확한 보안 정보 공유에 큰 도움이 됩니다.
댓글 (0)
댓글을 작성하려면 로그인이 필요합니다.
로그인아직 댓글이 없습니다.
첫 번째 댓글을 작성해보세요!