검증되는 것 ✓
인클레이브에서 도는 코드가 공개 소스와 같은지
AI 에이전트에게 메일·캘린더·카드·비밀번호를 맡기는 시대입니다. 소스코드를 공개하고 AWS Nitro Enclave를 쓴다는 피클을, 겁주지도 홍보하지도 않고 "밖에서 검증되는 것"과 "그래도 믿어야 하는 것"으로 나눠 봅니다.

인클레이브에서 도는 코드가 공개 소스와 같은지
비공개 iOS 앱, AWS, 운영 회사의 약속
메일 본문·대화 내용, AI의 판단 실수
출처 · 개인정보위 2025 유출 동향(2026-05-15) · github.com/pickle-com/credential-enclave README · 직접 검증 2026-11-09 22:46 KST

출처 · 개인정보위·KISA 2025 유출 신고 동향(2026-05-15, nttId=12078) · 국회예산정책처(NABO) 보고서 idx=9447 · 2.7배는 447÷163 계산값



출처 · korea.kr SKT · pipc 쿠팡 nttId=12171 · pipc 티빙 nttId=12147 · korea.kr 티빙 조사결과 · 듀오 43만 명(NABO 각주)

네이버 메일은 OAuth가 아니라 IMAP/SMTP 앱 비밀번호로 붙습니다 (imap.naver.com:993 · smtp.naver.com:465).


출처 · platum · businesskorea · runtimewire · sfstandard · enclave/src/providers/definitions.json · host/src/egress.rs L126
비밀번호와 카드번호는 당신의 스마트폰에서 만든 키로 암호화됩니다. 복호화는 격리된 보호 영역 안에서만 됩니다. 서버가 공격당해도 피클을 운영하는 저희조차 읽을 수 없습니다. 코드도 공개했습니다.CEO Daniel Park, X 2026-10-28 일본 출시 글 (원문 일본어, 한국어 번역) · x.com/danifesto
출처 · 스레드 게시물(toscakarajan, 본문 표기 @danifestoo — X 계정은 @danifesto) · x.com/danifesto/status/2115326570915369035 · 다음 장에서 실제 코드와 대조합니다
| 돌고 있는 주장 | 코드·문서가 실제로 말하는 것 | 판정 | 근거 |
|---|---|---|---|
| "열쇠는 내 폰 + 잠긴 컴퓨터에만" | 마스터키는 iCloud 키체인(동기화 항목), Android는 Block Store(E2E)에 저장됩니다. 인클레이브에 가는 것은 마스터키가 아니라 파생된 사용자 키이고, 최대 30일 메모리에만 있습니다 | ✓ 조건부 맞음 | protocol.md L91 · lib.rs L79 |
| "회사는 암호문만 본다" | 토큰·TOTP 시드·메일 앱 비밀번호에는 맞습니다. 하지만 볼트의 비밀번호·카드번호·CVC는 사용 순간 평문이 되어 피클 worker와 원격 브라우저(Kernel)로 갑니다. 메일 본문·대화는 서버와 AI 제공자로 갑니다 | △ 일부만 맞음 | README "Vault value" 행 |
| "기록은 1년간 절대 못 지운다" | Amazon S3 Object Lock COMPLIANCE 모드, 365일. 운영자도 AWS 계정 root도 못 지웁니다. 버킷 수명 규칙으로 400일 뒤 삭제 | ✓ 맞음 | log_store.rs L867 |
| "누구나 공개 소스 그대로인지 확인" | 서버 쪽 인클레이브는 맞습니다 — 오늘 직접 확인(16장). 단, iOS 앱은 비공개라 앱이 약속대로 동작하는지는 확인할 수 없습니다 | ✓ 서버는 맞음 | README How to verify |
| "KMS 정책으로 잠갔다" (흔한 설명) | 리포 전체에 kms가 0건입니다. 노드가 부팅할 때 서명키·봉인키를 스스로 만들고, 앱이 증명서를 검증한 뒤 사용자 키를 HPKE로 그 노드 공개키에 직접 봉인해 건넵니다 | ✗ 표현 정정 | grep -ri kms = 0 |
출처 · README "Structure"·키 위치 표 · docs/protocol.md L91 · protocol/src/lib.rs L79 · enclave/src/log_store.rs L867 · secure-program/README.md · 블로그 "When Pickle uses a password or a card"

인클레이브는 분리·강화되고 강하게 제약된 가상머신입니다. 부모 인스턴스와는 안전한 로컬 소켓 연결만 제공합니다. 영구 저장소, 대화형 접속, 외부 네트워크가 없습니다. 사용자는 SSH로 들어갈 수 없고, 부모 인스턴스의 프로세스·앱·사용자(root/관리자)도 안의 데이터와 앱에 접근할 수 없습니다.AWS Nitro Enclaves 사용자 가이드 (한국어 번역)
출처 · AWS What is Nitro Enclaves? · 비유는 RESEARCH 3절(덱용 설명) · 이용료: 추가 요금 없음(EC2 요금만)
Nitro Hypervisor가 인클레이브 전용 vCPU와 메모리를 부모 인스턴스에서 떼어 냅니다. 부모의 root도 그 메모리를 읽을 수 없습니다.
host 프로그램은 인클레이브를 띄우고 바이트만 나릅니다. README: "노드가 보장하는 어떤 것도 호스트에 의존하지 않는다". 외부 TLS는 노드 안에서 끝납니다.
"노드는 디스크에 아무것도 쓰지 않는다." 재시작하면 새 키가 생기고 사용자 키는 없습니다. 키는 다시 위임받아야 합니다.
디버그 인클레이브는 부모가 메모리를 읽을 수 있고 PCR이 전부 0이 됩니다. 피클 노드는 이런 피어를 절대 받지 않습니다.
출처 · AWS nitro-enclave.html · README 구성표(host/)·"Structure" · docs/enclave.md 3절 · enclave/src/attest.rs L194-202
같은 커밋을 빌드하면 언제나 같은 PCR0·1·2(SHA-384 해시)가 나옵니다. 재현 가능 빌드.
하이퍼바이저가 측정값을 담은 문서를 서명합니다. 인증서 체인은 AWS Nitro Root-G1까지.
폰 앱(또는 누구나)이 무작위 nonce를 보내 증명서를 받고, 서명·nonce·PCR을 공개 릴리스 값과 비교합니다.
일치하면 사용자 키를 그 노드 공개키에 HPKE로 봉인해 건넵니다. 다르면 키를 주지 않습니다.
| PCR | 무엇의 지문인가 | 피클 사용 |
|---|---|---|
| PCR0 | 인클레이브 이미지 파일(EIF) 전체 | ✓ 사용 |
| PCR1 | 리눅스 커널과 부트 램디스크 | ✓ 사용 |
| PCR2 | 애플리케이션(노드 프로그램) | ✓ 사용 |
| PCR3 · 4 | IAM 역할 · 인스턴스 ID | 미사용 |
| PCR8 | EIF 서명 인증서 | 없음 (EIF 미서명) |
| 전부 0 | 디버그 모드로 띄운 경우 → 증명에 쓸 수 없음 | ✗ 거부 |

kms:RecipientAttestation:PCR)으로 복호화를 허용할 수 있지만, 그건 AWS의 일반 기능입니다. 피클 리포는 KMS를 쓰지 않습니다.출처 · AWS set-up-attestation · AWS KMS × Nitro · docs/enclave.md 11.1 · README "How to verify" 2단계 · grep -ri kms = 0
| 값 | 📱 내 기기(앱) | 🔒 인클레이브 노드 | 🏢 피클 운영 영역 |
|---|---|---|---|
| 마스터키 · 계정 서명키 · 로그 복호화키 | 있음 | 절대 없음 | 절대 없음 |
| 사용자 키 | 마스터키에서 파생 | 그랜트가 유효한 동안 메모리에 (최대 30일) | 없음 인클레이브 노드 기준 |
| 노드 서명키 · 봉인키 | 없음 | 프로세스 수명 동안 메모리에 | 없음 |
| OAuth 토큰 (Google 등) | 없음 | 호출하는 동안 메모리에 | 암호문만 |
| 메일 앱 비밀번호 (네이버 메일) | 입력 시 기기에서 암호화 | 정해진 IMAP/SMTP 호출 동안 | 암호문만 |
| 볼트 값 (비밀번호·카드번호·CVC) | 입력할 때 | release 실행 동안 | 암호문 + release 후 평문 |
| TOTP(OTP) 시드 | 입력할 때 | 코드를 계산하는 동안 | 암호문만 6자리 코드만 나감 |
| 사용 기록(로그 entry) | 로그 복호화키로 열람 | 만들어서 행동 전에 저장소에 기록 | 봉인된 채 보관 · 365일 삭제 불가 |


출처 · README "Value / Device / Node / Operator domain" 표(L51-60) · README L94 "A vault value is protected by the node up to release" · docs/protocol.md L91 · 블로그 "When Pickle uses a password or a card"
폰 앱이 노드의 증명서와 PCR이 공개 릴리스와 같은지 먼저 확인합니다.
사용자 키를 그 노드 봉인키에 묶어(HPKE) 건넵니다. 기간은 최대 30일.
노드가 로그 entry를 S3에 PUT하고 HTTP 200을 받아야 다음으로 갑니다.
토큰을 노드 안에서 붙여, 컴파일된 주소로만 요청합니다. TLS는 노드 안에서 끝납니다.
메일 본문은 피클 서버로 가고, 답장을 쓰려고 AI 제공자도 처리합니다.


출처 · README 보장표 3·4·5행, 한계표 "What a credential fetches" · enclave/src/oauth.rs · docs/egress-policy.md · pickle.com/security/isolation "What it protects"
protocol/src/lib.rs · L77-79 (실제 코드)/// Longest delegation: 30 days of node time. A node shortens a longer grant /// to this length (5.2 `not_after_ms`). pub const GRANT_MAX_MS: u64 = 30 * 24 * 60 * 60 * 1000;

노드는 30일 초과 그랜트를 거부하지 않고 30일로 자릅니다. 철회가 오면 키를 지웁니다.
정한 기간 안에 피클을 열지 않으면 접근이 자동으로 꺼집니다 (피클 설명).
출처 · protocol/src/lib.rs L77-79 · enclave/src/api/messages.rs L174 · enclave/src/tests/commands.rs L307-317 · README 한계표 "Withdrawing a delegation" · 블로그 "A time limit and a record of use"
enclave/src/log_store.rs · L861-871 (S3에 보내는 헤더) ("x-amz-object-lock-mode", "COMPLIANCE".to_string()), ( "x-amz-object-lock-retain-until-date", retain_until(now_ms.saturating_add(retention_ms)), // 365일 ),

출처 · README 보장표 4·5행 · enclave/src/log_store.rs L679, L867 · docs/enclave.md 5.14 · docs/protocol.md 7절 · README 한계표 "The log store"·"Reading the log store"

enclave/ 노드 프로그램 — 사용자 키를 잠시 쥐고 자격증명을 사용·기록host/ 부모 쪽 프로그램 — 띄우고 바이트만 전달protocol/ 키·메시지·레코드·로그 형식verify/ 검증 도구 credential-enclave-verifysecure-program/ 앱이 실행하는 JS — 마스터키 생성, 노드 검증, 그랜트 봉인egress/secret-access.tsv)에 있고 push마다 검사합니다출처 · README 구성표·"The egress policy" · docs/egress-policy.md E1~E6 · scripts/secret-access.sh · .github/workflows/release.yml, secure-program-monitor.yml · docs/enclave.md 11.1-11.2 · GitHub API(★·포크, 2026-11-09)
git checkout {tag}
build/build.sh eif
# → out/measurements.jsonLinux x86_64 + Docker buildx 필요. Apple Silicon은 nitro-cli 크래시 사례.
credential-enclave-verify \
--url https://{api host} \
--measurements ...32바이트 nonce로 증명서를 요청해 체인·서명·nonce·PCR·노드 키를 검사.
GitHub Releases └ measurements.json └ Sigstore 번들
릴리스마다 독립 빌드 2개가 합의한 값이 붙어 있습니다.
credential-enclave-verify program \ --source ... --release ...
시큐어 프로그램(앱이 도는 JS)에 대해 검사 10개를 돌립니다.



출처 · README "How to verify" 1~4단계 · pickle.com/security/verification · GitHub Releases(measurements.json, Sigstore 번들)
$ cargo build --release --locked -p credential-enclave-verify # Rust 1.98.1 $ credential-enclave-verify --url https://character-api-prod.picklemem.com \ --measurements meas-v2.3.0.json # GitHub 릴리스 v2.3.0 공개값 source https://character-api-prod.picklemem.com/api/credential-enclave/attestation nonce (32바이트 무작위값 — 화면에서 생략) expected release v2.3.0 pcr0 8835de060043…9a9ac6ac65 … node 15 of 15 release v2.3.0 platform nitro time 2026-11-09T13:46:40Z # = 22:46:40 KST log_store character-credential-log-prod-1 in us-west-2 checks pass certificate chain: leads to the AWS Nitro Enclaves Root-G1 pass signature: verifies under the key of the certificate of the document pass nonce: the document carries the nonce that was asked for pass production mode: none of PCR0, PCR1 and PCR2 is all zero pass pcr0: equals the expected value pass pcr1: equals the expected value pass pcr2: equals the expected value pass node key: the signing key of the binding is the node of the response result: pass summary: 15 nodes: 11 passed, 4 failed. # 실패 4개 = PCR0·PCR2가 v2.1.0 값인 노드 $ credential-enclave-verify … --measurements meas-v2.1.0.json summary: 15 nodes: 4 passed, 11 failed. # 그 4개가 v2.1.0과 정확히 일치
15개 모두 AWS 인증서 체인·서명·nonce·운영 모드(PCR≠0) 통과. 로그 저장소는 15개 모두 us-west-2의 같은 버킷.
이 박스엔 Docker가 없어 1단계(EIF 재빌드)는 생략했습니다. 대신 GitHub 릴리스에 공개된 측정값(독립 빌드 2개 합의값)으로 대조했습니다.
출처 · 직접 실행 원본 verify-v2.3.0.txt("15 nodes: 11 passed, 4 failed"), verify-v2.1.0.txt("4 passed, 11 failed") · GitHub 릴리스 v2.3.0·v2.1.0 measurements.json · 2026-11-09 22:46 KST
마스터키를 쥐고 증명서를 검증하는 건 앱입니다. iOS 앱은 아직 비공개라, 앱이 키를 폰에만 두고 검증된 노드에만 주는지는 회사 설명을 믿어야 합니다. 앱 JS는 공개됐지만 바이너리가 그걸 그대로 돌리는지는 증명되지 않습니다.
Nitro 격리, 증명서 서명, S3 Object Lock이 모두 AWS에 달려 있습니다. 운영자의 AWS 계정이 닫히면 로그 버킷도 사라집니다.
새 릴리스로 위임을 옮길 때 사전 고지 기간이 0입니다. 대신 이전받은 모든 릴리스는 공개 로그(Rekor)에 영구히 남습니다.
노드는 Rekor의 서명(SET)만 보고 포함 증명은 확인하지 않습니다. 응답의 크기·시간·접속 목적지는 운영자에게 보입니다.

앱이 오픈소스가 되기 전까지 "앱은 정직하다"는 가정이며, 공개된 것이 아닌 앱은 마스터키를 유출할 수 있다.README 한계표 "The honesty of the app" (한국어 번역) — 회사 스스로 적은 문장
출처 · README 한계표 "The honesty of the app"·"The log store"·"The transfer to a later release"·"The transparency log"·"Side channels" · 피클 블로그 2026-10-01
메일 본문 같은 응답은 피클 서버와 AI 제공자로 갑니다. 대화·기억은 AWS 관리 키로만 암호화되고, 권한 있는 직원이 내부 도구로 열람할 수 있습니다(열람 로그 남음).
비밀번호·카드번호는 release 뒤 worker와 Kernel 원격 브라우저로 평문 전달됩니다. 로그인 쿠키는 브라우저에 남고, 그랜트 만료와 별개입니다.
인가 코드가 운영자 콜백을 지나가고, 운영자가 클라이언트 시크릿도 갖고 있어 스스로 교환할 수 있습니다.
API 한 번으로 포워딩 규칙·공유 링크·웹훅처럼 지속되는 접근이 열릴 수 있습니다. 보장은 그 호출의 로그에서 끝납니다.
OAuth 동의를 앱 연결 흐름 밖에서 하면 노드 규칙이 적용되지 않습니다.
운영자가 노드를 목록에서 빼면 그 노드는 최대 30일 키를 유지합니다. 앱은 "미완료"로 표시하고 사용은 로그에 남습니다.


출처 · README 한계표 5개 행(credential fetches · without PKCE · lasting access · consent outside · withdrawing) · pickle.com/security · 블로그 "The life Pickle remembers" · 처리방침
전화 대행 AI 에이전트로 일본 클로즈드 베타를 열었습니다(선착순 500명).
피클이 사용자 확인 없이 호텔에 전화를 걸었고, 2번째 통화에서는 AI라고 밝히지 않았습니다.
본인과 호텔에 사과하고, 가게에 거는 전화는 "걸기 전에 확인"과 "첫마디에 AI라고 밝히기"를 필수로 바꿨습니다.
어제 피클이 사용자의 확인 없이 호텔에 전화를 걸었고, 두 번째에는 AI라고 밝히지 않았습니다. 본인과 호텔에 사과드립니다.CEO Daniel Park, X 2026-10-29 (원문 일본어, 한국어 번역) · @danifesto
피클 블로그도 "모델이 그 판단을 틀릴 수 있다"고 적었습니다. 토큰이 아무리 안전해도, 전화·발송·결제처럼 되돌리기 어려운 행동은 실행 전 확인을 켜 두는 편이 안전합니다.
출처 · X @danifesto 2026-10-29 · X @danifesto 2026-10-28 출시 글 · 블로그 "the model can get that judgment wrong"

출처 · RESEARCH 6절 체크리스트 · 피클 블로그(Link 1회용 카드, 삭제 주기) · kidc.eprivacy.go.kr · Google·MS·네이버·KISA 경로는 일반 안내(이번에 직접 열어 보지 않음)
출처 · 이 덱 06~19장의 근거 종합 · README 보장표·한계표 · 직접 검증 2026-11-09 22:46 KST



조사 · 2026-11-09 KST · 리포 클론 HEAD 17cde93 · 직접 검증 22:46 KST · 큐레이터 단비