DEEP DIVE REPORT

CVE-2026-125397: NocoBase plugin-ai AI 직원 권한 우회 취약점 분석

SecurityDesk
• 2026.11.11 • 조회 4

AI 직원을 업무 흐름에 연결하면 시스템은 사용자를 대신해 어디까지 허용할지 판단해야 한다. NocoBase plugin-ai의 AI 직원 접근 경로에서는 이 판단이 요청값에 밀렸다. 역할로 좁혀 놓은 조회 조건이 요청에 담긴 사용자 이름에 덮어써지기 때문이다.

개요

개요 인포그래픽
NocoBase plugin-ai 2.1.0부터 2.2.41까지에서, 인증된 사용자가 자신의 역할에 할당되지 않은 AI 직원에 접근할 수 있는 권한 우회가 확인됐다. 문제의 취약점 번호는 CVE-2026-125397이고, 원인은 접근 대상 AI 직원을 특정하는 getAccessibleAIEmployee() 함수다. 역할에서 파생한 필터를 만든 뒤, 같은 필터의 사용자 이름 항목을 호출자가 지정한 대상 AI 직원의 사용자 이름으로 덮어쓰는 구조가 문제를 만든다.

이 결함으로 가능해지는 동작은 두 갈래다.

  • dispatch-sub-agent-task 도구로, 사용자에게 부여되지 않은 AI 직원을 그 직원에 매핑된 도구와 권한으로 실행할 수 있다.
  • get-ai-employee로, 해당 직원의 프롬프트와 도구 설정을 읽을 수 있다.

두 도구는 AI 직원을 해석할 때 같은 접근 확인 함수를 거치므로, 동일한 권한 확인 결함의 영향을 함께 받는다.

영향 범위

영향 버전으로 제시된 범위는 2.1.0부터 2.2.41까지다. 악용에는 인증된 사용자가 필요하다. 다시 말해 계정을 확보한 사용자를 전제로 하는 문제이고, 무인증 원격 코드 실행과는 성격이 다르다.

접근 대상은 역할에 부여되지 않았더라도 활성화된 상태인 업무용 AI 직원이다. 제출된 수정안과 v2.2.41 코드에서 확인되는 동작은, 역할로 제한된 사용자 이름 목록 항목이 호출자가 지정한 대상 AI 직원의 사용자 이름으로 덮어써진다는 점이다. 그 결과 사용자의 역할에 부여되지 않은 활성 업무용 AI 직원까지 해석될 수 있다. 다만 필터의 다른 조건까지 모두 사라진다는 점은 이번 근거로 확인되지 않았으므로, 대상 범위는 역할에 부여되지 않은 활성 직원이라는 확인된 범위로 본다.

피해의 크기는 직원별 구성이 결정한다. 실행 시 영향은 그 AI 직원에 부여된 도구와 권한을 따르고, 조회 시 노출되는 것은 그 직원의 프롬프트와 도구 설정이다. 같은 버전을 쓰더라도 AI 직원에 어떤 도구와 권한을 연결해 놓았는지에 따라 두 환경의 위험도는 같지 않다. 따라서 이 건의 위험 평가는 버전 번호 단독이 아니라 활성 직원과 그 권한 구성에서 출발해야 한다.

한 가지 중요한 공백이 있다. 수정 사항이 포함된 정식 릴리스와 구체적인 수정 버전은 아직 확인되지 않았다. 업그레이드 대상 확정에는 벤더 정보가 더 필요하다.

기술적 분석

v2.2.41 기준 sub-agents/shared.ts에서 해당 함수는 다음 형태다.

export async function getAccessibleAIEmployee(ctx: Context, username: string): Promise<Model | null> {
  const filter = await buildAccessibleEmployeeFilter(ctx);
  return ctx.db.getRepository('aiEmployees').findOne({
    filter: {
      ...filter,
      username,
    },
  });
}

buildAccessibleEmployeeFilter(ctx)는 역할에 허용된 직원만 남기는 조건을 만들어 주고, 그 핵심에 사용자 이름 목록이 있다. 문제는 이 필터를 전개한 자리 뒤에 username을 다시 지정했다는 점이다. 객체 리터럴에서 같은 키는 나중에 온 값이 앞을 대신하므로, 역할이 만들어 놓은 사용자 이름 목록 항목은 호출자가 지정한 접근 대상 AI 직원의 사용자 이름으로 덮어써진다. 확인된 동작은 이 항목의 덮어쓰기이고, 그 외 필터 조건이 최종 조회에서 어떻게 평가되는지는 위 코드 조각만으로는 단정하지 않는다.

NocoBase 측 설명도 같은 지점을 짚는다. 제출된 수정 PR 설명에 따르면, 역할 제한 필터를 전개한 뒤 호출자가 지정한 대상 직원의 사용자 이름으로 그 목록을 덮어썼기 때문에 dispatch-sub-agent-task와 get-ai-employee가 사용자의 역할에 부여되지 않은 활성 업무용 AI 직원까지 해석하게 됐다는 것이다.

수정 방향은 두 조건이 서로를 지우지 않도록 나란히 유지하는 것이다. 요청된 사용자 이름에 일치하는 조건과 역할에 허용된 직원이라는 조건을 $and로 결합해 하나가 다른 하나를 덮지 않게 하는 방식으로, 해당 PR에는 이 헬퍼를 다루는 단위 테스트도 함께 추가됐다.

검증 상태와 남은 공백

  • 취약한 동작과 수정 방향은 제공된 근거로 확인됐다.
  • 실제 환경에서의 악용, 공개 공격 코드, 독립적인 기술 검증은 이번 근거에서 확인되지 않았다. 악용이 없었다는 뜻은 아니다.
  • 수정이 포함된 정식 릴리스와 수정 버전은 미확인이다. 대응의 종착점인 업그레이드 경로는 아직 확정할 수 없다.
  • 로그 가용성과 구체적인 탐지 방법도 확인되지 않아, 탐지 항목은 환경별 검증이 필요하다.

대응 방안

먼저 확인할 항목

  • 사용 중인 plugin-ai 버전이 2.1.0부터 2.2.41까지에 해당하는지 확인한다.
  • 활성화된 AI 직원 목록과 역할별 할당 현황, 각 직원에 연결된 도구와 권한을 정리한다.
  • 영향 범위에 해당하면서 민감한 도구 또는 권한을 가진 AI 직원이 있는 환경을 우선 검토한다. 이 순서는 확인된 우회 경로와 권한 사용 가능성에 근거한 조건부 판단이며, 실제 악용 확인에 기반한 우선순위는 아니다.

이후 조치

  • 역할 제한 필터가 호출자가 지정한 대상 직원의 사용자 이름으로 덮어써지지 않도록 두 조건을 함께 적용하는 수정 내용을 검토한다.
  • 배포판에 수정이 포함됐는지, 적용 가능한 릴리스가 무엇인지 벤더 정보를 통해 확인한다.
  • 적용 전에 역할별 허용과 차단이 의도대로 동작하는지 검증한다. 수정 전후로 권한 경계가 달라지는 지점을 확인하는 절차다.

탐지 관점

AI 직원의 접근이나 작업 실행에 관한 기록이 남아 있는 환경이라면, 사용자의 역할에 할당되지 않은 AI 직원에 대한 접근과 실행이 있었는지 점검할 수 있다. 다만 구체적인 로그 항목이나 탐지 규칙은 확인되지 않았으므로, 이 점검은 로그가 존재함을 전제로 한 제한적 안내다.

참고자료

함께 읽으면 좋은 글

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

댓글 (0)

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

로그인

아직 댓글이 없습니다.

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

IT 도구 서랍

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

→ ASCII: ABC
→ 문자: 65 66 67

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

DecHex약어설명
DecHex문자
DecHex문자

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