Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
도구/GitHubGitHub/0xmrma/cve-2026-46552
Authentication & AuthorizationVulnerability AnalysisWeb Application ExploitationPenetration TestingPapers & ResearchLearning & Education
GitHub0xmrma/cve-2026-46552

CVE-2026-46552

NocoDB 공유 베이스 링크가 실제 베이스 구성원을 초대할 수 있으며 공유 취소 후에도 유지됩니다.

저장소 보기
32개월 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2026-46552

NocoDB 공유 베이스 링크가 실제 베이스 멤버를 초대할 수 있고 공유 취소 후에도 유지될 수 있음

소개

NocoDB를 검토하던 중 이 문제를 발견했으며, 간단한 보안 질문을 염두에 두었습니다:

공유 베이스 링크가 일시적인 공유 접근에서 실제 인증된 베이스 멤버십으로 경계를 넘을 수 있는가?

이 경우, 답은 '예'였습니다.

xc-shared-base-id로만 인증된 공유 베이스 세션은 ACL 목적상 일반 베이스 뷰어로 취급되었습니다. 뷰어 권한이 여전히 멤버 관리 엔드포인트에 도달할 수 있었기 때문에, 공유 베이스 UUID만 가진 사용자가 기존 베이스 멤버를 열거하고 임의의 이메일 주소를 베이스에 실제 멤버로 초대할 수 있었습니다.

초대된 사용자는 일반 가입 흐름을 통해 초대를 수락하고, 표준 인증된 계정을 얻은 후, 소유자가 공유 베이스 링크를 비활성화해도 베이스 접근 권한을 유지할 수 있었습니다.

이 문제는 CVE-2026-46552가 되었습니다.

프로젝트: NocoDB

확인된 영향을 받는 버전: 0.301.3

이는 NocoDB에 영향을 미쳤으며, 공식 사이트에서 NocoDB는 35,000개 이상의 조직이 신뢰하고 2천만 회 이상 다운로드된 것으로 소개됩니다. 또한 사이트는 Accenture, Western Digital, Hyundai, Walmart, PwC, Bosch, American Express와 같은 기업을 나열합니다.

photo0

공격 체인

공개 공유 베이스 링크 -> xc-shared-base-id가 일반 베이스 뷰어로 처리됨 -> 뷰어 ACL이 멤버 관리 엔드포인트에 도달함 -> 공격자가 베이스 사용자를 나열하고 임의 이메일 초대 -> 초대된 사용자가 일반 가입 토큰 수락 -> 공유 링크 취소 후에도 지속되는 인증된 베이스 접근 유지


NocoDB가 하는 일

NocoDB는 데이터베이스 기반 협업 플랫폼으로, 브라우저 기반 베이스 접근, 공유, 메타데이터 관리 및 사용자 멤버십 워크플로우를 노출합니다.

즉, 공유 모델은 실제 보안 경계입니다.

여기서 중요한 질문은 공유 베이스 링크가 공유 콘텐츠를 읽을 수 있는지 여부가 아니었습니다.

진짜 질문은:

공개 공유 주체가 인증된 베이스 멤버에게만 속해야 하는 작업을 수행할 수 있는가?

이 경우, 가능했습니다.


이 표면이 조사할 가치가 있었던 이유

공개 공유 기능은 과소평가되기 쉽습니다.

그것은 실수입니다.

애플리케이션이 다음을 지원하면:

  • 익명 또는 링크 기반 접근,
  • 역할 매핑,
  • 동일한 ACL 시스템 뒤에 있는 일반 인증 관리 API,

주된 위험은 단순한 데이터 노출만이 아닙니다.

더 강력한 위험은 경계 붕괴(boundary collapse) 입니다:

  • 낮은 신뢰의 주체가 더 높은 신뢰의 기능을 상속받음,
  • 관리 작업이 공개 공유 컨텍스트에서 접근 가능해짐,
  • 일시적 접근이 영구적 접근으로 전환될 수 있음.

그것이 여기서 실제 문제였습니다.

로그인 검증의 버그가 아니었습니다. 토큰 위조 문제도 아니었습니다. 비밀번호 재설정 결함도 아니었습니다.

이는 고전적인 권한 부여 경계 실패(authorization boundary failure) 였습니다:

  • 공유 링크 주체가 일반 베이스 역할에 매핑됨,
  • 해당 역할에 멤버 관리 기능이 여전히 포함됨,
  • 공개 공유 컨텍스트에서 실제 지속적인 접근 제어 상태를 수정할 수 있었음.

제가 집중한 경계

무작위로 엔드포인트를 찔러보고 흥미로운 응답을 기대하는 방식으로 접근하지 않았습니다.

더 강력한 경로는 먼저 가장 가치 있는 신뢰 경계를 식별하는 것이었습니다.

NocoDB의 경우, 그것은 다음 사이의 경계였습니다:

  • 공유 베이스 접근
  • 그리고 인증된 베이스 멤버십

이 두 상태는 서로 교환 가능해서는 안 됩니다.

공유 베이스 링크는 범위가 지정되고, 취소 가능하며, 링크 기반 접근을 제공해야 합니다. 베이스 내에서 새로운 장기 주체를 생성할 수 없어야 합니다.

이것이 바로 여기서 실패한 경계입니다.


근본 원인

취약점은 공유 베이스 접근이 일반 ACL 경로에 통합된 방식에서 발생했습니다.

공유 베이스 프론트엔드 흐름에서 xc-shared-base-id가 주입되는 동안 일반 인증 헤더는 제거되었습니다.

그런 다음 백엔드에서 BaseViewStrategy가 xc-shared-base-id를 수락하고 공유 링크를 공유 베이스 구성에서 파생된 일반 roles / base_roles로 직접 변환했습니다.

그것이 첫 번째 문제였습니다.

두 번째 문제는 뷰어 수준 권한에 여전히 멤버 관리 작업이 포함되어 있다는 점이었습니다.

ACL 계층에서 ProjectRoles.VIEWER는 다음에 도달할 수 있었습니다:

  • baseUserList
  • userInvite

이러한 권한은 일반 메타 경로를 보호했습니다:

  • GET /api/v2/meta/bases/:baseId/users
  • POST /api/v2/meta/bases/:baseId/users

따라서 공개 공유 세션이 실제 베이스 참가자를 대상으로 한 멤버십 엔드포인트에 효과적으로 접근할 수 있었습니다.

마지막 단계는 초대 흐름 자체에 있었습니다.

BaseUsersService.userInvite()는 역할 권한을 확인한 후 다음을 생성했습니다:

  • invite_token이 있는 실제 사용자 행
  • 대상 베이스에 대한 실제 베이스 멤버십 행

그리고 공유 베이스 세션의 경우:

  • invited_by가 null이 됨

요청 뒤에 실제 인증된 초대자 신원이 없었기 때문입니다.

이것이 전체 버그 체인입니다.

이것이 악용 가능한 이유

공유 베이스 링크를 소유하는 것만으로 충분했기 때문입니다.

공격자에게는 다음이 필요하지 않았습니다:

  • xc-auth
  • 기존 계정
  • 도난된 자격 증명
  • 또는 베이스의 이전 멤버십

악용 체인은 간단했습니다:

  • 공격자가 공유 베이스 UUID 획득
  • UUID가 베이스 뷰어 주체로 수락됨
  • 뷰어 ACL이 멤버 관리 엔드포인트에 도달
  • 공격자가 현재 베이스 멤버 나열
  • 공격자가 임의 이메일 주소 초대
  • 초대된 사용자가 일반 가입 흐름을 통해 토큰 수락
  • 새 계정이 실제 인증된 베이스 멤버가 됨
  • 소유자가 나중에 공유 링크 비활성화
  • 초대된 계정은 여전히 일반 인증 접근 유지

이는 취소 가능한 링크 공유를 지속적인 멤버십으로 전환합니다.


이것이 단순한 이상한 공유 동작이 아닌 보안 문제인 이유

중요한 차별점은 취소 후에도 지속된다는 점입니다.

이것은 단순히:

"뷰어가 뷰어 엔드포인트를 호출할 수 있었다"

가 아닙니다.

취약한 주체는 일반 인증된 뷰어가 아니었습니다.

공개 공유 세션이었습니다.

애플리케이션이 일시적이고 링크 범위의 주체를 신뢰할 수 있다고 간주하여 다음을 수행하도록 허용했기 때문입니다:

  • 실제 멤버 열거,
  • 접근 제어 상태 변경,
  • 베이스 내에서 새로운 지속적인 주체 생성

진짜 질문은:

"공유 사용자가 공유 데이터를 읽을 수 있는가?"

가 아니었습니다.

진짜 질문은:

"공개 공유 접근이 공유 취소 후에도 지속되는 영구적인 인증된 접근으로 전환될 수 있는가?"

였습니다.

답은 '예'였습니다.

이것이 단순한 놀라운 애플리케이션 동작이 아닌 실제 권한 부여 취약점인 이유입니다.


PoC

로컬에서 다음에 대해 검증했습니다:

  • 제품 버전: 0.301.3
  • 커밋: dac49b0122c5ee655fb8f46a1b6e42dfeec1f3ad
  • 기본 URL: http://127.0.0.1:8080

재현은 간단했습니다.

먼저 일반 소유자 계정으로 로그인하여 새 베이스를 만들고, 테이블을 만든 후 공유 베이스 접근을 viewer로 활성화했습니다:

root@kitploit:~
PATCH /api/v2/meta/bases/<baseId>/shared
Content-Type: application/json

{
  "roles": "viewer"
}

그러면 공유 베이스 UUID가 반환되었습니다.

그런 다음 xc-auth를 전혀 보내지 않고 다음만 사용했습니다:

root@kitploit:~
xc-shared-base-id: <sharedBaseUuid>

해당 헤더만 사용하여 다음을 호출했습니다:

root@kitploit:~
GET /api/v2/meta/bases/<baseId>/users

200 OK가 반환되었고 이메일 주소를 포함한 실제 베이스 멤버가 노출되었습니다.

계속해서 xc-shared-base-id만 사용하여 다음을 호출했습니다:

root@kitploit:~
POST /api/v2/meta/bases/<baseId>/users
Content-Type: application/json

{
  "email": "[email protected]",
  "roles": "viewer"
}

이 또한 200 OK를 반환했습니다.

이메일 전달 없이 로컬 랩 검증을 위해 SQLite 메타 데이터베이스에서 다음을 직접 확인했습니다:

  • nc_users_v2에 초대된 사용자가 존재하며 invite_token이 null이 아님
  • nc_base_users_v2에 대상 베이스에 대한 실제 멤버십 행이 존재함
  • invited_by가 NULL임

그런 다음 일반 가입 흐름을 통해 초대를 수락했습니다:

root@kitploit:~
POST /api/v2/auth/user/signup
Content-Type: application/json

{
  "email": "[email protected]",
  "password": "Password123.",
  "token": "<invite_token>"
}

반환된 xc-auth를 사용하여 다음을 호출했습니다:

root@kitploit:~
GET /api/v2/meta/bases/<baseId>/tables

200 OK가 반환되었습니다.

마지막으로 소유자로서 공유 베이스 링크를 비활성화했습니다:

root@kitploit:~
DELETE /api/v2/meta/bases/<baseId>/shared

이후:

  • xc-shared-base-id를 사용한 공유 링크 접근은 401 실패
  • 일반 xc-auth를 사용한 초대된 계정은 200으로 계속 성공

관찰된 결과

  • 공유 사용자 목록: 200
  • 공유 초대: 200
  • 가입: 200
  • 초대된 인증된 테이블 접근(공유 비활성화 전): 200
  • 공유 비활성화: 200
  • 공유 링크 테이블 접근(비활성화 후): 401
  • 초대된 인증된 테이블 접근(비활성화 후): 200

이는 중앙 보안 주장을 입증했습니다:

  • 공개 공유 접근이 멤버십 엔드포인트에 도달할 수 있음
  • 멤버십 변경으로 실제 지속적인 인증된 접근이 생성됨
  • 원래 공유를 취소해도 해당 접근이 제거되지 않음

재현이 중요한 이유

한 번의 성공적인 공유 베이스 초대로도 이미 권한 부여 실패를 보여주기에 충분했을 것입니다.

그러나 전체 검증 체인은 두 가지 이유로 중요했습니다.

첫째

이것이 단순한 엔드포인트 노출이 아님을 보여주었습니다.

공개 공유 세션이 단순히 제한된 API에 도달한 것이 아닙니다. 전체 권한 전환 체인을 완료했습니다:

  • 멤버 열거
  • 새 주체 초대
  • 초대 수락
  • 일반 인증 접근 획득

둘째

이것이 자체 취소되지 않음을 증명했습니다.

더 심각한 영향은 공유 링크 비활성화 후에 나타났습니다:

  • 원래 링크는 죽었지만
  • 공격자가 생성한 계정은 죽지 않았습니다.

이것이 일시적인 링크 접근을 지속적인 접근 유지로 바꾼 것입니다.


영향

이 취약점은 공유 베이스 링크를 가진 모든 사람이 다음을 수행할 수 있게 합니다:

  • 실제 베이스 멤버와 그들의 이메일 주소 열거
  • 임의의 이메일 주소를 베이스에 실제 멤버로 초대
  • 일시적인 링크 기반 접근을 지속적인 인증된 멤버십으로 전환
  • 소유자가 공유 링크를 취소한 후에도 해당 접근 유지

주된 영향은 기밀성(confidentiality) 입니다. 공격자가 일반 인증된 계정을 통해 공유 베이스 데이터에 대한 지속적인 읽기 접근을 유지할 수 있기 때문입니다.

또한 무결성(integrity) 영향도 있습니다. 공개 공유 주체가 새 멤버를 추가하여 접근 제어 상태를 수정할 수 있기 때문입니다.

이는 일반적인 데이터 유출보다 더 강력한 결과입니다. 익명 공유와 인증된 멤버십 사이의 권한 경계 붕괴입니다.


심각도 및 분류

이 문제는 기밀성 영향을 수반하는 교차 범위 권한 부여 결함으로 합리적으로 분류됩니다.

CVSS:

root@kitploit:~
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:N/A:N

해당 벡터는 여기서의 핵심 동작에 적합합니다:

  • 네트워크 접근 가능 동작
  • 사전 인증된 계정 불필요
  • 악용 중 피해자 사용자 상호작용 불필요
  • 공개 공유 주체가 일반 멤버십 관리 기능으로 넘어가므로 범위 변경
  • 지속적인 무단 베이스 접근을 통한 기밀성 영향

제안된 완화 방법

수정 방향은 간단합니다.

공유 베이스 세션은 멤버 관리 기능을 상속해서는 안 됩니다.

최소한:

  • xc-shared-base-id를 통해 접근 가능한 모든 권한에서 baseUserList 및 userInvite 제거
  • 공유/공개 주체가 GET 및 POST /api/v2/meta/bases/:baseId/users와 같은 베이스 멤버십 엔드포인트를 호출할 수 없도록 명시적 차단 시행
  • 공유 베이스 접근을 일반 베이스 뷰어 권한에 직접 매핑하는 대신 별도의 주체 유형으로 처리
  • 공유 베이스 요청이 멤버를 열거할 수 없고, 사용자를 초대할 수 없으며, 공유 취소 후에도 지속되는 접근을 생성할 수 없음을 확인하는 회귀 테스트 추가

공개

이 문제는 NocoDB 0.301.3의 커밋 dac49b0122c5ee655fb8f46a1b6e42dfeec1f3ad에서 로컬로 검증되었습니다.

보고서는 다음을 입증했습니다:

  • xc-shared-base-id에서 일반 베이스 역할로의 ACL 매핑
  • 뷰어 권한 경로를 통한 멤버 관리 엔드포인트 접근
  • 실제 초대된 사용자 및 베이스 멤버십 행 생성
  • 일반 가입 흐름을 통한 초대 수락 가능
  • 공유 링크 취소 후 인증된 접근 지속

해당 문제는 다음으로 할당되었습니다:

CVE-2026-46552


이 버그가 실제로 가르치는 것

핵심 교훈은 간단합니다:

공유 링크 접근은 신뢰된 멤버십과 동일하지 않습니다.

많은 시스템이 이 두 개념을 동일한 역할 모델로 통합할 때 문제에 빠집니다.

공유 링크는 운영상 뷰어 계정과 유사해 보일 수 있지만, 신뢰 가정은 다릅니다:

  • 공유 링크는 재배포되기 쉽습니다
  • 공유 링크는 취소 가능하도록 설계되었습니다
  • 공유 링크는 일반적으로 낮은 보증의 주체입니다

이 낮은 보증의 주체가 관리 작업을 수행하거나 새로운 지속적인 신원을 생성할 수 있다면, 공유 경계는 이미 깨진 것입니다.

그것이 진짜 핵심입니다.


핵심 요점

  • 공개 공유 기능은 보안 경계입니다
  • 공유 링크 주체는 일반 멤버십 관리 기능을 상속해서는 안 됩니다
  • 공개 공유 컨텍스트에서의 멤버 열거는 이미 민감합니다
  • 무단 초대는 실제 지속적인 주체를 생성하므로 더 심각합니다
  • 원래 공유를 취소하는 것만으로는 충분하지 않습니다. 공격자가 생성한 계정이 살아남기 때문입니다
  • 공개 공유 접근을 별도의 주체 유형으로 처리하는 것이 더 안전한 설계입니다

마지막 말

이 취약점은 인증을 완전히 우회하는 것에 관한 것이 아니었습니다.

분리되어야 했던 두 신뢰 수준을 붕괴시키는 것에 관한 것이었습니다.

NocoDB에서 공유 베이스 링크는 일시적이고 취소 가능한 공유 콘텐츠 접근을 제공하기로 되어 있었습니다. 대신, 멤버를 열거하고, 베이스에 실제 사용자를 초대하며, 공유 취소 후에도 지속되는 인증된 멤버십으로 공개 공유 접근을 전환하는 데 사용될 수 있었습니다.

그것이 이것을 CVE-2026-46552로 만든 이유입니다.

도구 다운로드