EU Age Control: 디지털 ID를 위한 트로이 목마
3 hours ago
1
- 연령만 증명하는 프라이버시 보호형 인증으로 홍보되지만, 실제 배포 구조는 각국 앱과 선택적 경로에 의존하며 단일 EU 앱으로 작동하지 않음
- 대형 플랫폼은 EU wallet 대신 여권 스캔과 liveness 검사를 수행하는 일반 KYC provider를 쓸 수 있어, 프라이버시 보호 경로가 필수 요건이 아니라 선택지에 머묾
- 현재 reference 구현의 주 경로는 zero-knowledge proofs가 아니라 ISO 18013-5 mdoc with ES256를 사용하며, unlinkability도 강한 수학적 보장보다 지갑의 일회용 자격증명 회전 규칙에 기대고 있음
- 앱 무결성 검증에 hardware attestation이 붙으면 최종 바이너리는 Google 또는 Apple이 승인한 코드와 일치해야 해, GrapheneOS나 커스텀 Linux 폰 같은 기기는 배제될 수 있음
- relay attack은 모든 서명과 attestation이 정상이어도 막히지 않으며, 이런 구조가 연령 확인을 넘어 revocable digital IDs 수용으로 이어질 수 있다는 경계가 함께 제기됨
DSA 우회 경로와 KYC 대체
- 특정 콘텐츠를 다루는 대형 플랫폼은 나이 확인이 필요하지만, 반드시 프라이버시 지향 EU 지갑을 쓸 필요는 없음
- 플랫폼은 EU wallet을 선택할 수도 있음
- 동시에 여권 전체 스캔과 liveness 검사 등을 수행하는 일반 KYC provider를 붙일 수도 있음
- 프라이버시 기능은 선택 사항에 머묾
- 홍보는 privacy-preserving 쪽에 집중되지만, 규칙상 비공개성이 약한 대체 경로도 허용됨
- 각국 eID를 직접 연동하는 길은 실무적으로 어렵게 묘사됨
- 27개국의 서로 다른 national eID systems를 통합하는 일은 복잡함
- KYC 사업자는 물리 신분증 외형 데이터베이스와 사진 기반 절차를 유지하는 편이 더 싸고 범용적으로 작동함
- 현재 상호운용성의 준비 상태도 낮게 평가됨
- 공식 trusted list에는 프로덕션 앱이 0개임
- reference implementation도 아직 미완성으로 묘사됨
- 2026년 말까지 27개국 전체에서 깔끔한 상호운용이 갖춰질 것이라는 기대는 비현실적으로 봄
실제 검증 흐름과 기기 통제
- 주된 고신뢰 경로는 NFC passport를 사용함
- 사진 페이지 하단의 MRZ를 스캔해 NFC 칩 데이터를 읽고 복호화할 키를 얻음
- 칩에는 서명된 데이터와 보유자 JPEG photo가 들어 있음
- 설계상 휴대폰에서 실시간 얼굴 사진을 찍어 칩 사진과 로컬 매칭함
- 이 로컬 얼굴 매칭은 자녀가 부모 여권을 스캔해 자기 자격증명을 발급받는 일을 막기 위한 용도로 적혀 있음
- 앱이 오픈소스여도 실제 국가 배포판에서 hardware attestation이 강제되면 임의 수정은 막히게 됨
- 본문 기준 현재 reference code에서는 서버 측 attestation 검증이 아직 연결되어 있지 않음
- 다만 국가별 배포판이 이를 추가해야 하는 구조로 적혀 있음
- 최종 바이너리는 Google 또는 Apple이 서명한 정확한 코드와 일치해야 함
- 이 보안 모델은 특정 기기와 운영체제를 배제함
- 더 단순한 MRZ-only 경로도 있지만 한계가 큼
- NFC 읽기나 얼굴 매칭 없이 신분증 사진만 찍는 경로임
- 실제 국가 앱이 이를 지원할지는 불명확하다고 적혀 있음
- reference는 고신뢰 칩 기반 경로를 권장함
홍보되는 암호기술과 실제 탑재된 암호기술의 차이
- 대외 서사는 zero-knowledge proofs 중심이지만, 실제 reference Android 앱의 실행 경로는 ZK 암호를 사용하지 않음
- 현재 작동하는 방식은 ISO 18013-5 mdoc with ES256로 적혀 있음
- 각 속성은 사전에 서명됨
- 지갑은 요청받은 속성만 드러내고, 나머지는 salted-digest commitments로 숨김
- ZK 라이브러리가 저장소에 포함돼 있어도, presentation path에서는 그것을 호출하지 않음
- 저장소에 있다는 사실과 실제 switched on 상태는 다르다는 점을 구분함
- 각국 앱이 나중에 활성화할지는 열려 있는 문제로 남겨 둠
- 현재 reference의 unlinkability도 강한 수학적 보장과는 다르게 설명됨
- 본문은 이를 disposable-batch unlinkability로 표현함
- 서명된 자격증명을 한 번씩만 쓰면 18세 이상 여부와 발급자 정도만 드러날 수 있고, 고유 식별자는 없다고 적혀 있음
프라이버시 특성과 한계
- 전체 흐름은 local-first에 가깝지만, 자격증명 발급 서버는 여전히 필요함
- 문서 스캔과 초기 검사는 휴대폰에서 수행됨
- attested app이라는 전제 아래 발급 서버는 어떤 코드가 실행됐는지 어느 정도 신뢰할 수 있음
- 서버는 문서 서명을 검증하고 서명된 credential을 발급함
- 검증자 관점의 unlinkability는 지갑이 규칙대로 움직일 때만 성립함
- 설계는 두 증명이 수학적으로 상관관계 분석이 불가능한 구조가 아니라, disposable credentials를 한 번씩 쓰고 다시 받아오는 방식임
- 지갑이 이를 지키면 서로 다른 검증자는 서로 다른 서명을 보게 되어 연결하기 어려워짐
- 지갑이 속이거나 proof가 재사용되면 같은 서명 바이트가 드러나 연결이 쉬워짐
- 흔히 떠올리는 ZK = 영구적 unlinkability라는 서사는 여기 적용되지 않음
- 이 성질은 암호학이 재사용 자체를 무력화해서가 아니라, 지갑이 회전 규칙을 지켜야 유지됨
- 비교 대상으로 BBS+ 와 CL signatures가 언급되며, 그런 방식은 재사용돼도 상관없는 비연결 증명을 만들 수 있다고 적혀 있음
- 발급자 관점의 추적 범위도 제한적임
- 발급자는 사용자가 ID를 제시할 때 credential을 발급함
- 이후 그 credential을 어디에 몇 번 쓰는지는 서버가 알지 못함
- 상상 가능한 rate limit도 발급량 제한일 뿐, 실제 사용 횟수 제한은 아님
- 정상적인 지갑 동작 아래서는 EU 국가 시민이라는 점 정도를 추론할 수 있지만, 어떤 계정들이 같은 사람 것인지나 사이트 간 활동 연계는 어렵다고 적혀 있음
Relay attack 문제
- 규격이 제대로 답하지 못하는 relay attack 시나리오가 제시됨
- 미성년자가 연령 제한 사이트에 들어가려 할 때, 대리 인증 서비스에 QR 코드나 링크를 넘김
- 그 서비스는 실제 성인의 정부 지갑이 있는 깨끗한 휴대폰으로 이를 전달함
- 성인이 승인하면 사이트는 완전히 유효한 over-18 proof를 받고 접근을 허용함
- 이 흐름에서는 어떤 암호 검증도 실패하지 않음
- 모든 서명은 진짜이고, attestation도 진짜이며, 성인도 실제로 성인임
- 문제는 프로토콜이 현재 이 브라우저 앞의 인간이 아니라, 어디선가 어떤 지갑이 승인했다는 사실에만 바인딩된다는 점임
- proximity check가 없다는 점이 핵심 한계로 제시됨
- 브라우저 측 Digital Credentials API는 같은 휴대폰에서 브라우징과 인증을 함께 할 때만 일부 완화 효과가 있음
- 기기 간 이동에 쓰이는 QR 코드와 deep link는 여전히 열려 있다고 적혀 있음
- Play Integrity도 이 문제를 막지 못함
- Play Integrity는 어떤 기기에서 어떤 코드가 실행되는지만 attestation함
- 기기 앞에 누가 있는지, 그 기기가 어디 있는지는 말해주지 않음
- 프록시 흐름에서 대리 웹서비스는 attestation 대상이 아니라 바이트만 중계함
- 성인 등록 이후에는 재판매 모델이 더 쉬워진다고 봄
- 지갑에는 짧은 주기로 갱신되는 30개의 disposable credentials가 있다고 적혀 있음
- 발급자는 그 자격증명이 실제로 어떻게 소비되는지 보지 못함
- 따라서 프록시 운영자는 같은 credential을 많은 미성년자에게 재사용할 수 있고, 상류 시스템은 이를 감지하지 못함
- 이 문제는 구현 버그가 아니라 protocol shape에서 비롯된 구조적 성질로 규정됨
- 따라서 규격을 따르는 27개국 앱 전반에 남을 문제로 봄
디지털 ID 인프라로의 확장 우려
- 연령 확인 앱은 digital ID infrastructure로 가는 진입점으로 다뤄짐
- 시작점은 아동 보호와 유해 콘텐츠 차단이지만, 실제로는 사람들이 더 편한 attested wallet을 선택하도록 마찰을 만드는 구조로 묘사됨
- 이 구조에서 앱 자체도 attestation 대상이므로, 무엇이 실행 가능한지 Google 또는 Apple이 좌우하게 됨
- 자격증명은 issuer가 폐기할 수 있다고 적혀 있음
- reference app은 얼굴 사진을 로컬에서만 누출한다고 적혀 있음
- 동시에 27개국이 각자 별도 버전을 만들 것이므로, 각국 구현마다 별도 프라이버시 버그가 생길 수 있다고 봄
- 반복적 지갑 호출은 Hawthorne effect를 낳는다고 적혀 있음
- 논란성 사이트에서 매번 지갑을 꺼내게 되면, proof가 익명이라 해도 자기검열이 커질 수 있음
- 정부가 이런 데이터를 잘 보호해온 기록이 좋지 않다고 적혀 있음
- 이후 Digital Euro 같은 다른 체계와 연결될 수 있다는 우려도 제기됨
- 그러면 삶의 큰 부분이 원격으로 꺼질 수 있다고 봄
- 주차 위반 과태료 미납을 예시로 들어 credential 일시 박탈 같은 시나리오를 상정함
- 결론적으로 인터넷 접근의 대가로 revocable digital IDs를 받아들일 필요가 없다고 못 박음
공개된 해킹 사례에 대한 구분
- 보고된 문제는 두 부류로 나뉨
- mock-up bugs: 파일 누출, 검사되지 않은 MRZ 스캔, placeholder backend를 때리는 Chrome extension 데모 등
- structural properties: proximity binding 부재, 클라이언트 측 one-time-use, 재사용 시 깨지는 unlinkability 등
- 첫 부류는 국가별 구현에서 고칠 수 있는 문제로 분류됨
- reference app의 디스크 파일 누출은 수정될 일이며, 본질적 문제로 보지 않음
- 테스트 credential을 얻게 속일 수 있어도, 실제 주 경로는 검증되지 않은 MRZ 스캐너 mock-up이 아니라 각국 eID 체계가 될 것이라고 적혀 있음
- 두 번째 부류는 버그가 아니라 규격에서 바로 따라오는 속성으로 다뤄짐
- 규격을 따르는 모든 국가 구현에 남는 문제로 규정됨
- custom Chrome extension 기반 해킹도 생산 환경에서는 통하지 않을 것으로 봄
- attestation이 강제되면 앱 검증에서 실패하게 됨
- MRZ 경로도 실제 EU 공통 백엔드와 연결되지 않으며, 유효 문서 레지스트리는 각국 관할이라고 적혀 있음
- mock-up을 뚫었다는 식의 시연은 라이브러리 사용 예제를 공격한 것에 가깝다고 정리함
- 실제로는 Slovak, Hungarian, German, Dutch, French 등 국가별 앱이 각각 존재하게 될 것이라고 적혀 있음
수요와 결론
- 이런 체계에 대한 수요 자체는 존재한다고 봄
- 인터넷이 위험하다고 느끼는 부모들이 자녀 보호 수단을 원함
- 아이들이 우회할 가능성과 별개로, 보호받는 대상인 아이보다 안심하려는 부모가 실질적 고객으로 묘사됨
- 관련 참고 링크가 함께 실려 있음
- 결론부의 판단은 네 가지로 압축됨
- EU fancy ZK apps는 준비가 늦어 플랫폼이 일반 KYC provider, AI 얼굴 나이 추정기, 기타 수단을 쓸 가능성이 큼
- 규격대로 구현되면 플랫폼이 사용자의 실명이나 계정 간 연결을 알기 어렵다는 의미 있는 프라이버시 특성은 있음
- 다만 그 특성은 암호학적 강제보다 wallet behavior에 기대며, 저장소 안의 ZK 수학은 현재 켜져 있지 않음
- Google/Apple approved device가 아니면 동작하지 않는 제약과 relay attack의 구조적 한계가 함께 따라옴
-
Homepage
-
Tech blog
- EU Age Control: 디지털 ID를 위한 트로이 목마