저는 25년 동안 시스템을 구축해 왔으며, 의도적으로 설계되고 운영상 가벼운 것을 만드는 것을 좋아합니다. 그 벡터가 그 무게를 얻는 만큼만 운반합니다.
그 접근 방식에서 사용자의 데이터를 최소화하는 것은 명백한 이유를 넘어서는 이유로 항상 의미가 있었습니다. 그들의 데이터 주권은 중요합니다. 그 아래에는 더 단순한 것이 있습니다: 사물은 그 자리에 있어야 합니다. 제가 만드는 대부분은 처리이며, 처리 아키텍처는 다른 역할을 수행할 수 없습니다. 필요하지 않은 기록을 보유하는 것은 아무 가치도 없는 벡터입니다. 이를 최적화로 보지 않고 규정 준수 연습으로 보지 않는 것이 설계를 정직하게 유지합니다 — 그리고 그렇게 구축된 시스템은 규제와 자연스럽게 좋은 관계를 유지합니다. 규제할 것이 거의 없기 때문입니다.
그래서 Mary Camacho의 발표가 X 피드에 나타났을 때, 저는 그녀의 아키텍처를 제 자신의 것처럼 읽었습니다. 그녀는 핵심을 Creative Commons 라이선스 하에 공개 기록에 게시했으며, 엔지니어가 재구성할 수 있을 만큼의 세부 수준을 제공했고, 기존 기술에 대해 직접적으로 언급했습니다.
시퀀스를 따라가며, 저는 서버 내부에 적대적 엔터티를 배치하고 그가 도달할 수 있는 것을 추적했습니다. 그는 작업자를 앞질 수 있었습니다.
그 뒤에 거의 모든 작업은 음성 대화를 통해 진행되었습니다 — 30 음성 메모를 통해, 소리 내어 생각하고 다양한 각도에서 우려를 테스트하면서, 그것이 견디거나 무너질 때까지.

제가 눈치챈 것은: 장치는 클레임 기록을 먼저 작성한 사람에게 암호화합니다

공개는 운영 순서를 직접 명시합니다. 작업자는 작업을 주장하고 키를 게시한 다음에만 장치가 암호화합니다:
  1. 작업자 → 조정: 작업을 폴링하고 주장(한 번만 쓰기, 첫 번째 승리), 작업자의 공개 키를 게시합니다.
  2. 장치 ← 조정: 폴링, 작업자의 공개 키를 검색, 공유 비밀을 도출, 페이로드를 암호화합니다.
— §2.1, 데이터 흐름(작업당)
장치 측의 그 합의는 동일한 정밀도로 지정됩니다:
장치는 작업자의 공개 키를 알게 되면 자체 X25519 교환과 작업자 키에 대한 ML-KEM 캡슐화를 수행하여 자체 공개 기여( X25519 공개 키 ‖ ML-KEM 암호문)와 공유 비밀을 생성합니다.
— §4.2, 작업자 수명 주기에 바인딩
알게 된 순간. 19 페이지 전반에 걸쳐 작업자의 일시 공개 키에 대한 서명, 인증서, 장치가 평가하는 인증서, 사전 공유 비밀이 없습니다. 그 부재는 의도적이며 강점으로 제시됩니다: 모델은 인증 문서, TPM 인용, 측정 부트 아티팩트 없이 복호화를 차단하고 사전 프로비저닝된 작업자 비밀을 보관하지 않습니다.
따라서 장치는 클레임 기록에 있는 공개 키에 페이로드를 암호화하며, 합법적인 작업자의 키를 다른 사람의 키와 구분할 수 있는 수단이 없습니다. 클레임을 먼저 작성할 수 있는 모든 당사자는 장치가 암호화하는 당사자가 되며, 신뢰된 페이로드는 그들의 손에 복호화됩니다.
Diagram source
flowchart TB
    subgraph BEFORE["이전: 게시된 대로"]
        direction LR
        A2{"누가 먼저 주장합니까?"} -->|실제 작업자| A3["진짜 키"]
        A2 -->|다른 작성자| A4["공격자 키"]
        A3 --> A5["장치가 암호화합니다"]
        A4 --> A5
        A5 --> A6["키 보유자가 읽을 수 있습니다"]
    end
    subgraph AFTER["이후: 서명된 키"]
        direction LR
        B2{"서명이 유효합니까?"} -->|예| B3["검증된 작업자 키"]
        B2 -->|아니오| B4["거부, 재시도"]
        B3 --> B5["실제 작업자만 읽습니다"]
    end
    A6 ~~~ B2
심각성은 모델이 운반하는 것에서 비롯됩니다. 이 아키텍처는 사람들이 읽는 것을 가장 꺼리는 데이터를 정확히 보관하기 위해 존재하며, 그 문제의 더 어려운 절반을 해결합니다: 완성된 작업은 운영자를 포함한 누구에게도 복호화될 수 없습니다. 격차는 장치가 대화 상대를 확인해야 하는 한 단계에 있습니다.

암호화는 견고하며 도입은 인증되지 않는다

공격자는 아무것도 깨뜨리지 않는다. X25519 그리고 ML-KEM-768 둘 다 정확히 지정된 대로 작동합니다. 공격자는 키를 제공하고 합의의 정당한 당사자가 된다.
이는 인증되지 않은 키 동의이며, 그 실패 모드는 분야에서 가장 오래된 결과이다. Plain Diffie-Hellman은 아무도 인증하지 않으며, 자신의 공개 키를 대체하는 당사자에게 넘어간다. 키 캡슐화 메커니즘은 그 특성을 상속받으며, 이 때문에 RFC 9180는 수신자의 공개 키의 진위 여부를 자체 범위 밖에 두고, 주변 애플리케이션이 인증서, 키 디렉터리 또는 오프밴드 검증을 통해 이를 설정한다고 가정합니다. 이 모델은 주변 애플리케이션이며, 수신자 키를 배포하는 데 사용되는 채널은 자체 신뢰 모델이 신뢰할 수 없다고 라벨링한 구성 요소입니다.
공개는 인접 공격을 예상하고 이를 닫는다:
주장은 일회성/첫 승리이며, 이후 작업자는 작업의 키 교환을 탈취할 수 없습니다.
— §6, 참조 구현
그러한 추론은 타당하며 메커니즘은 말한 대로 작동합니다. 두 개의 대칭 경우 중 하나를 다룹니다.
위협한 번 쓰기 주장으로 처리됨
두 번째 작업자가 기존 주장을 덮어씁니다예 — 쓰기가 거부됩니다
무단 당사자가 먼저 주장을 씁니다아니요 — 첫 번째 쓰기가 승리합니다
First-wins는 경쟁입니다. 규칙은 승자가 직업을 유지하도록 보장하며 승자가 누구인지에 대해서는 언급하지 않습니다.
한 가지 추가 주장이 인용할 가치가 있습니다. 왜냐하면 그 발견이 이를 모순하기 때문입니다:
중간자(게이트웨이, 조정, 저장, 모니터)는 비밀을 도출할 수 있는 충분한 키 자료를 결코 보유하지 않습니다. 조정 또는 저장을 손상시키는 공격자는 불투명한 블롭과 공개 키만을 얻습니다.
— §4.3, 독립적인 방향별 키
첫 번째 문장은 정확합니다. 두 번째 문장은 읽는 공격자를 묘사합니다. 쓰는 공격자는 장치가 폴링하기 전에 주장 기록에 선택된 공개 키를 삽입하고, 정당한 비밀을 도출하는 것이 상대방이 될 수 있는 당사자에게는 필요하지 않게 만듭니다. 그 기록의 내용을 관리하는 사람은 페이로드를 읽을 수 있는 사람을 관리하며, 이는 조정 계층을 기밀성에 대한 신뢰할 수 있는 구성 요소로 만듭니다 — §3가 말하는 유일한 것은 장치와 작업자 외에는 어떤 구성 요소도 결코 존재해서는 안 된다는 것입니다.
주장의 정직한 한계: 이는 오늘날 공개 인터넷의 누구도 이 데이터를 읽을 수 없다는 것을 의미하지는 않습니다. 실제 배포에서는 주장을 쓰는 능력이 클라우드 네트워킹과 자격 증명 뒤에 있으며, 공개는 장치 경로의 인증 게이트웨이를 설명합니다. 정확한 문제는 기밀성이 이제 그 주변에 달려 있다는 점이며, 아키텍처의 중앙 약속은 장치와 작업자 사이의 구성 요소를 신뢰하지 않고도 유지된다는 것입니다.

두 가지 설계 속성이 결과를 복합적으로 만든다

결과는 동일한 적대자가 중재하는 두 번째 계약 하에 장치로 돌아오므로, 가로채진 작업이 완료되고 사용자의 관점에서 평범해 보임.
지속 가능한 작업과 결과 원장(ledger)의 의도적 부재 — 비보관을 만들고 규제 표면을 축소하는 동일한 부재 — 는 조사자가 나중에 영향을 받은 작업을 재구성하는 데 사용할 수 있는 대부분을 제거함. 조정 기록은 약 한 시간 동안 만료됨. 일반적인 경우 데이터를 보호하는 속성은 적대적 경우 포렌식 기록을 얇게 만든다.

격차는 모델의 최선 결정이 드리우는 그림자이다

아키텍처는 운영자가 합법적으로 보유할 수 있는 데이터와 절대로 보유해서는 안 되는 데이터를 분리한다. 연락처 데이터는 사람이 누구이며 어떻게 연락할 수 있는지를 나타낸다. 신뢰된 데이터는 그들이 자신에 대해 공개한 내용이다. 기존 시스템은 둘 다 하나의 데이터베이스에 저장하며, 이는 계정 테이블을 누군가의 사생활 기록으로 바꾸는 움직임이다. 구조적 답은 한 줄이다: 연락처를 보유하고 신뢰된 데이터를 보유할 수 없게 한다.
중앙 오케스트레이터를 제거하면 바로 그 목적을 달성한다. 작업을 작업자에게 할당하는 구성 요소는 누가 무엇을 하고 있는지 반드시 알게 되며, 그 지식은 모델이 보유하기를 거부하는 정확한 자산이다. 그것을 제거하면 또한 일반적으로 작업자의 신원을 보증하던 구성 요소도 제거되었으며, 남은 모든 인증 경로는 독립적으로 거부되었고, 각각은 정당화 가능한 이유를 가졌다.
결과는 보유에 대해 실제 엄격함으로 추론하고, 문제의 형태가 인증인 한 지점에서 보유 추론을 적용하는 설계이다. 신뢰 모델은 각 구성 요소가 보유하는 것이 무엇인지 묻고 정확히 답한다. 그곳에서 필요한 질문은 각 구성 요소가 대체할 수 있는 것이 무엇인지이다. 이들은 두 개의 독립적인 신뢰 문제이며, 어느 하나를 해결해도 다른 하나를 해결한 적이 없다.

워커의 일시적 공개 키 위에 서명하면 그것이 닫힙니다

워커는 시작 시점에 일시적 키 쌍을 현재와 동일하게 생성합니다. 그 키가 클레임에 게시되기 전에, 장기 운영자 키로 서명되며, 그 공개 부분은 애플리케이션과 함께 제공됩니다. 장치는 서명을 검증한 뒤 아무것도 파생하지 않으며, 서명되지 않았거나 유효하지 않은 키를 거부합니다. 복구는 이미 지정되어 있습니다. 클라이언트 주도 재시도와 새 작업 및 새 키 동의가 모델의 표준 실패 경로이기 때문입니다.
결정적인 특성은 서명 키가 아무것도 복호화하지 않는다는 것입니다. 운영자의 서명 키가 손상되면 앞으로 워커를 가장할 수 있지만, 각 작업별 키가 워커와 함께 파괴되었으므로 완료된 작업 하나를 읽을 수 있는 능력은 없습니다. 비보관, 빈 키 금고, 그리고 회상 복호화 불가능성은 모두 온전하게 살아남습니다. 이것이 설계의 완성을 만드는 이유입니다.
서명자는 설계가 제거한 오케스트레이터가 되는 것을 피합니다. 그는 단지 주어진 일시적 공개 키가 운영자가 시작한 워커에 속함을 증명하면 되고, 그 워커가 어떤 작업을 클레임할지 알 필요가 없습니다. 기존 모니터가 자연스러운 장소입니다: 이미 워커를 프로비저닝하고 수확하며, 사용자 데이터와 키를 보유하지 않으며, 설계상으로도 작업을 라우팅하거나 할당하지 않습니다.
재생은 검토가 필요합니다. 작업 지식이 없는 서명자는 서명을 작업 식별자에 바인딩할 수 없기 때문입니다. 정품 서명된 워커 키를 다른 클레임 기록에 복사한 공격자는 여전히 해당 개인 키가 없으므로 페이로드는 읽을 수 없습니다. 결과는 아무도 처리할 수 없는 작업, 즉 서비스 거부이며 기밀성은 유지됩니다.
세 가지 한계가 남아 있으며, 공개는 모두 세 가지를 명시합니다: 작업이 실행되는 동안 워커의 메모리에 평문이 존재하고, 작업 타이밍이 메타데이터를 누출하며, 키 파생 구조가 저자에 의해 개선 대상으로 표시됩니다.

고문

이 발견은 아키텍처가 공용으로 배치되었기 때문에 존재합니다. 공개가 독립 평가를 가능하게 했으며, 이 때문에 사건 보고서가 아니라 여기에서 격차가 드러났습니다. 이 시스템의 독점 버전도 동일한 문제를 갖게 되며, 이를 말할 사람이 없습니다.
기여에 감사드리며, 모델은 초대받은 검토를 받을 자격이 있습니다. 핵심 주장은 유지되며, 이는 내가 더 많은 시스템이 취하기를 원하는 형태이며, 비밀 데이터를 보유하지 않는 아키텍처는 보유하는 아키텍처보다 규제 표면이 적습니다.
권장 사항은 좁습니다: 장치가 암호화하기 전에 작업자의 일시적 공개키를 인증하십시오. 장치에서 검증된 한 서명은 모델을 채택할 가치가 있는 비용이 전혀 없습니다. 위의 모든 내용은 30 노트 이상에 걸친 음성-텍스트 대화를 통해 나온 것이며, 요약이 아니라 공개된 공개 자료를 기준으로 확인되었습니다. 이러한 발견이 그쪽에서 검증된다면, 실행하기 쉽습니다.