자격 증명에 붙은 라벨은 그 자격 증명의 범위가 아닙니다.
단일 볼트에 범위가 지정된 1Password 서비스 토큰이 조직 전체를 매핑할 수 있습니다. 모든 사용자, 그룹, 권한을요. 라벨에는 단일 볼트라고 적혀 있었습니다. API는 동의하지 않았습니다. 범위는 라벨이 아니라 강제로 지켜져야 합니다.
암호학은 완벽합니다. RFC 5054 SRP-6a, AES-256-GCM, 상수 시간 비교, 영지식 증명. 1Password는 암호학을 제대로 구현했습니다. 잘못한 것은 통조림에 붙은 라벨입니다.
이번 달, Token Security의 엔지니어 두 명이 1Password의 독자적인 SRP 인증 프로토콜을 역분석하는 데 3일을 썼습니다. 취약점을 찾으려던 것은 아니었습니다. SCIM 브리지를 비인간 신원 도구용 Python 클라이언트로 교체하려던 것이었습니다. 그들이 발견한 것은 자격 증명이 할 수 있다고 말하는 것과 실제로 할 수 있는 것 사이의 격차였습니다 [1][2].
읽기 권한이 있는 단일 볼트 범위의 서비스 계정 토큰이 조직의 모든 사용자를 나열할 수 있습니다. 모든 그룹을요. 모든 그룹 멤버십을요. 모든 볼트에 걸친 볼트 수준 권한 전부를요. 이름, 이메일, 상태, 최근 인증 시각까지. 토큰의 라벨에는 "단일 볼트"라고 적혀 있습니다. API는 다르게 말합니다 [1].
1Password가 확인했습니다. 이 동작은 의도된 설계입니다. 세분화된 범위 지정은 일정 없는 로드맵에 있습니다 [2].
토큰이 실제로 닿는 범위
Token Security에 글을 쓴 Gil Portnoy와 Henry는 "단일 볼트" 서비스 계정 토큰이 완전히 성공적으로 호출할 수 있는 API 엔드포인트 다섯 개를 문서화했습니다 [1]:
/api/v2/users는 조직의 모든 사용자를 반환합니다: UUID, 이름, 이메일, 상태, 유형, 최근 인증 시각. /api/v1/groups는 모든 그룹을 권한과 상태와 함께 반환합니다. 그룹 멤버십, 볼트 사용자와 권한, 볼트 그룹에 대한 CLI 명령은 모두 실제 데이터를 반환합니다. /api/v3/account는 계정 메타데이터를 반환합니다. /api/v2/vault/{id}/vaultaccess는 볼트 접근 정보를 반환합니다.
이 엔드포인트 중 어느 것도 토큰이 발급받은 그 단일 볼트에 범위가 지정되어 있지 않습니다. 토큰에게는 "단일 볼트를 읽어라"라고 말했습니다. API는 조직 전체의 지도를 주었습니다 [1].
더 날카로운 지점이 있습니다. 이 열거는 1Password의 공식 SDK로는 작동하지 않습니다. 그 경로는 UNSUPPORTED나 FORBIDDEN을 반환합니다. 연구자들이 역분석해야 했던 CLI의 내부 API를 통해서 작동합니다. 이 "범위"는 클라이언트 측 SDK 제한일 뿐입니다. 기저의 자격 증명은 조직 전체 읽기입니다. 공격자는 당신의 SDK를 쓰지 않습니다 [1].
연구자들은 약 420줄의 Python으로 클라이언트를 만들었습니다. API 엔드포인트 다섯 개. 조직 전체 가시성. 그들은 7월 16일에 이 글을 공개했습니다 [1].
문제는 자물쇠가 아니라 열쇠고리입니다.
연구자들은 이 지점에서 조심합니다. 암호학은 실제로 강력합니다. SRP 구현은 RFC 표준화된 영지식 증명을 사용합니다. 서버는 비밀번호를 보지 못하고, 클라이언트는 솔트를 보지 못하며, 모든 인증 실패는 동일한 오류 메시지를 반환하므로 공격자는 아무것도 얻지 못합니다. 1Password는 자체적인 비표준 편차를 문서화했고(암호학 상수에 "Penny Lane"의 Beatles 가사가 이스터 에그로 숨어 있는 것 포함), 그 편차들은 보안에 중립적입니다 [1].
문제는 자물쇠가 아닙니다. 열쇠가 여는 것이 문제입니다. 자격 증명에 "단일 볼트에 범위 지정됨"이라는 라벨이 붙어 있으면, 관리자는 파급 범위가 좁다고 믿으며 에이전트에 그것을 발급합니다. 에이전트는 자격 증명을 얻습니다. 그 자격 증명은 조직도를 얻습니다. 아무도 그것을 의도하지 않았지만, 아무도 그것을 일어나는 것을 볼 수도 없습니다 [1].
에이전트에 "범위 지정된" 토큰을 주면, 에이전트는 라벨이 기술하는 범위가 아니라 API가 실제로 강제하는 범위 안에서 작동합니다. 에이전트가 프롬프트 인젝션, 오염된 규약 파일, 공급망 공격, 또는 텍스트 기반 방어가 완전히 막을 수 없는 어떤 경로로든 침해되면, 공격자는 단일 볼트를 얻지 않습니다. 그들은 조직 구조를 얻습니다. 누가 어느 그룹에 있고, 누가 어느 볼트에 접근하며, 각자가 언제 마지막으로 인증했는지. 이것은 침해의 정찰 단계가 단 한 번의 API 호출로 전달되는 것입니다 [1].
문서화된 범위와 실제 유효 범위 사이의 격차는 1Password에만 있는 것이 아닙니다. 모든 자격 증명 관리 API는 관리자가 결코 보지 못하는 암묵적 인가 결정을 내립니다. Token Security가 증명한 것은 그 격차가 실재하고, 측정 가능하며, 주말의 작업과 Frida 훅으로 악용할 수 있다는 점입니다 [1].
이런 상황을 위해 만들어진 볼트는 무엇이 다른가
자격 증명의 역할은 그것이 놓인 세계에서 살아남는 것입니다. "범위 지정된" 토큰이 조직을 조용히 매핑할 수 있다면, 그 범위는 실재한 적이 없었습니다. 라벨이었을 뿐입니다.
Clavitor는 자격 증명에 라벨을 붙이고 기대하지 않습니다. 에이전트는 명시적으로 이름 붙여진 단일 자격 증명을 얻고, 호출 순간에 실시간으로 가져와 단일 요청에 주입된 뒤 사라집니다. 공격자가 재사용할 수 있는 상시 토큰은 없습니다. 아무도 검증하지 않은 범위 라벨 뒤에 조직 지도 엔드포인트가 있는 것도 아닙니다. 볼트는 에이전트에 열거 기능을 노출하지 않습니다. 에이전트는 이름 붙여진 대상에만 닿고, 그 외에는 닿지 않습니다.
모든 접근은 에이전트가 실행되는 엔드포인트가 아니라, 볼트 위에서 그것을 수행한 특정 에이전트 단위로 기록됩니다. 토큰이 침해되면 파급 범위는 그 뒤에 있는 조직 구조가 아니라 그 하나의 호출 범위입니다.
범위를 라벨이 아니라 강제하는 볼트의 원칙: 자격 증명 관리의 10가지 규칙
Clavitor (@clavitorai)는 AI 에이전트를 위해, 그리고 그들을 대비해 만들어진 자격 증명 볼트입니다. clavitor.ai
출처
[1] Token Security (Gil Portnoy, Henry) — Reversing 1Password's Proprietary SRP Authentication Protocol — @TheTokenSec
[2] @TheTokenSec — 범위 확장 발견에 관한 X 스레드, 2026년 7월 16일 — "1Password confirmed this is by design, to support vault-management workflows"