여러 사용자가 같은 AI 어시스턴트에서 지식베이스와 기억 기능을 함께 쓰는 환경이라면, 내 메시지의 참조 데이터에 누가 접근할 수 있는가가 곧 보안 경계가 됩니다. langchain4j-aideepin의 메시지 참조 조회에는 이 경계를 SQL이 확인하지 않던 구간이 있었고, CVE-2026-125386으로 추적됩니다.
개요

langchain4j-aideepin 3.32.0 이하 버전의 CharacterMessageController에 안전하지 않은 직접 객체 참조(IDOR) 취약점이 보고되어 있습니다. CVE 레코드는 소유권 검증이 빠져 있어 인증된 사용자가 다른 사용자의 메시지 참조에 도달할 수 있다고 명시합니다.
조작 방식은 복잡하지 않습니다. CVE 레코드의 서술대로라면, 다른 사용자의 메시지 uuid를 knowledge-embedding-ref, memory-embedding-ref, graph-ref 세 참조 엔드포인트 중 하나에 넘기면 그 메시지에 연결된 지식베이스 청크와 장기 기억 텍스트, 지식 그래프 데이터가 반환될 수 있습니다.
성격상 이는 계정 탈취나 원격 코드 실행이 아니라, 이미 로그인한 사용자의 가시 범위를 넓혀주는 정보 노출입니다. 실제 환경에서의 악용이 확인되었다는 기록은 제공된 자료에 없으며, 공개 공격 코드의 존재 여부도 확정할 수 없습니다.
영향 범위
버전 범위는 langchain4j-aideepin 3.32.0 이하로 명시되어 있습니다. 이 프로젝트는 AI 채팅, 지식베이스(RAG), 워크플로우 오케스트레이션, 장기·단기 기억, MCP 도구 등을 묶어 지능형 업무 어시스턴트를 빠르게 구축하기 위한 라이브러리입니다. 즉 취약 지점은 모델이 아니라, 그 모델을 뒷받침하는 지식과 기억 저장소로 향하는 조회 경로입니다.
- 취약한 기능은 메시지에 연결된 참조 데이터 조회, 다시 말해 지식 임베딩·장기 기억 임베딩·지식 그래프 참조입니다.
- 악용에는 인증된 사용자와 다른 사용자의 메시지 UUID가 모두 필요합니다. 익명 원격 공격자가 아니라 이미 계정을 가진 사용자에 가까운 전제입니다.
- 실제 노출량은 해당 메시지에 정말로 참조 데이터가 연결되어 있는지, 그리고 서비스가 어떤 접근 조건을 두고 있는지에 따라 달라집니다. 참조가 비어 있는 메시지라면 노출 내용도 얕습니다.
- 같은 인스턴스를 여러 사용자가 공유하고 업무 자료가 지식베이스와 장기 기억에 모여 있는 구성일수록 점검이 급해집니다. 이 판단은 위 조건이 성립할 때의 이야기로, 단일 사용자 구성이라면 우선순위가 달라질 수 있습니다.
메시지 UUID를 얻는 구체적 경로와 실제 운영 환경의 노출 범위는 확인되지 않았습니다. UUID의 생성 방식이나 예측 난이도 역시 자료에 없습니다. 따라서 노출 가능성은 다른 사용자의 메시지 UUID를 실제로 확보하는 일과 세 참조 엔드포인트에 접근할 수 있다는 조건이 동시에 성립할 때의 문제로 보는 편이 안전합니다.
기술적 분석
조회 경로의 원인은 Issue #118에서 제보자가 제시한 정적 검토, 즉 v3.31.0 코드를 대상으로 한 분석으로 확인됩니다. 메시지 참조 서비스는 메시지 UUID를 단서로 listByMsgUuid를 호출하고, CharacterMessageRefEmbeddingMapper.xml, CharacterMessageRefMemoryEmbeddingMapper.xml, CharacterMessageRefGraphMapper.xml 세 매퍼는 where b.uuid = #{uuid} 조건으로 조인한다는 것이죠. 이 조인문에 user_id 조건이 없어, 조사된 참조 조회 경로에서는 데이터 계층이 메시지의 소유자를 확인하지 않습니다. 이 글은 3.32.0의 SQL 구현을 별도로 검증한 것이 아니라, CVE 레코드가 3.32.0 이하에 같은 종류의 소유권 검증 누락을 보고하는 범위에서 인용합니다.
눈여겨볼 점은 같은 코드 주변의 형제 메서드입니다. CharacterMessageService의 softDelete나 getTextByAudioUuid처럼 대응하는 작업들은 사용자를 확인합니다. 제시된 형제 메서드에는 사용자 확인이 있는 반면 조사된 참조 조회에는 그 조건이 없었다는 것이 Issue #118가 보여준 비교 범위이고, 이 자료 밖의 다른 경로까지 포함해 소유권 검증이 어디에 있고 어디에 없는지를 단정할 수는 없습니다.
수정 커밋 483499b1a6b4a27d856f85d88c28ae6152660953은 답을 SQL에 둡니다. ref 매퍼의 메시지 조인을 호출 사용자 기준으로 좁혀, 남의 메시지 uuid가 들어오면 어떤 호출자가 서비스에 도달하든 행이 반환되지 않게 합니다. 커밋 스스로 이 가드가 컨트롤러가 아니라 SQL과 함께 이동한다고 설명하는 지점입니다.
SQL에 둔 가드의 실효성은 수정된 ref 매퍼를 지나는 조회 경로에 한정됩니다. 커밋의 설명대로라면 진입로가 바뀌어도 소유권 조건이 쿼리와 함께 유지될 수 있고, 그 범위 안에서는 참조 조회와 무관해 보이는 신규 진입로에서 확인 절차를 다시 잊을 위험이 줄어듭니다. 다만 커밋에서 확인되는 범위는 ref 매퍼의 메시지 조인이므로, 참조 조회 외 경로까지 같은 방식으로 막혔는지는 이 자료만으로는 판단할 수 없습니다.
또 하나 분명히 해둘 점이 있습니다. 소유자 기준 조인은 향후 노출을 막는 방향의 수정이지, 이미 조회된 이력을 되돌리는 조치가 아닙니다. 수정을 적용해도 과거에 다른 사용자의 uuid로 참조가 반환되었을 가능성에 대한 검토는 별개로 남습니다.
대응 방안
점검 순서는 노출 가능성의 크기보다 확인 비용이 낮은 쪽부터 잡는 편이 현실적입니다.
지금 확인할 것과 임시 잠회
- 사용 여부 확인: 도입한 langchain4j-aideepin 버전이 3.32.0 이하인지, 그리고 지식 임베딩·기억 임베딩·지식 그래프 참조 기능을 실제로 호출하는 구성인지 먼저 봅니다. 참조 기능을 쓰지 않는 배포라면 이 취약점의 실제 영향은 크게 줄어듭니다.
- 권한을 갖춘 환경에서 점검: 영향 범위로 판단되는 구성에서 다른 사용자 메시지의 uuid로 참조를 요청했을 때 데이터가 반환되는지 확인합니다. 직접 점검은 권한을 갖춘 환경에서 진행하며, 반환 여부와 무관하게 테스트 데이터로 수행하는 것이 안전합니다.
- 잠회 처리: 운영상 가능한 경우, 수정 반영 전까지 해당 참조 엔드포인트의 접근을 제한하는 방안을 검토합니다.
수정 적용과 이후 조치
- 코드 수정 적용: 메시지 참조 조회 SQL에서 호출자 기준으로 메시지 소유권을 제한하는 수정(커밋 483499b1a6b4a27d856f85d88c28ae6152660953)을 반영합니다.
- 수정 검증: 정당한 소유자의 조회는 그대로 동작하는지, 동시에 다른 사용자의 메시지 uuid에서는 참조 행이 반환되지 않는지를 함께 확인합니다. 한쪽만 보면 회귀와 검증 누락을 구분하기 어렵습니다.
- 배포 대상 확정: 수정이 포함된 공식 배포 버전과 일정은 확인되지 않았습니다. 코드 적용 시점과 배포 경로를 별도로 정해야 하며, 배포판 발표만 기다려서는 종료 시점을 특정할 수 없습니다.
- 기록 검토: 이미 보유 중인 접근 기록이 있다면, 메시지 참조 기능에 대한 요청과 해당 메시지의 소유 관계를 대조해 의심 사례를 추려볼 수 있습니다. 다만 기록에 사용자와 메시지를 연결하는 정보가 있어야 하고, 이 방법만으로 악용 여부를 확정할 수는 없습니다. 이 취약점 전용의 로그 항목이나 탐지 지표는 제공된 자료에서 확인되지 않았습니다.
자료의 한계
확정되지 않은 항목은 세 가지입니다. 수정 사항을 담은 공식 배포 버전과 일정, 메시지 UUID가 유출되거나 수집되는 구체적 경로, 그리고 취약점 전용 탐지 지표입니다. 실제 악용 여부와 공개 공격 코드 존재 여부도 확인되지 않았습니다. SQL 수준의 매퍼 분석은 제보자의 정적 검토에 의존하며, 3.32.0에서 같은 조인문이 그대로인지는 별도 확인이 필요합니다. 위 대응은 모두 이 공백을 전제한 조건부 판단이며, 특히 우선순위는 참조 기능의 실제 사용 여부와 다 사용자 구성 여부를 확인한 뒤 재산정해야 합니다.
참고자료
- langchain4j-aideepin through 3.32.0 IDOR via /character/message reference endpoints
- Character message reference endpoints return other users' knowledge, memory and graph data (missing owner check)
- scope character message ref queries to owner in SQL
- langchain4j-aideepin
함께 읽으면 좋은 글
- CVE-2026-119613: ash_ai 도구 오류 응답에 실려 나가는 내부 정보
- CVE-2026-125397: NocoBase plugin-ai AI 직원 권한 우회 취약점 분석
- CVE-2026-112137: Mendix Studio Pro MCP Server의 CSRF 취약점 점검
본 콘텐츠는 AI 기술로 작성된 분석 리포트를 포함하고 있습니다. 내용 중 사실과 다르거나 보완이 필요한 정보를 발견하셨으면 댓글을 통해 의견을 부탁드립니다. 여러분의 피드백은 더 정확한 보안 정보 공유에 큰 도움이 됩니다.
댓글 (0)
댓글을 작성하려면 로그인이 필요합니다.
로그인아직 댓글이 없습니다.
첫 번째 댓글을 작성해보세요!