진저월렛(GingerWallet)은 WasabiWallet의 포크로, Wasabi 코인조인 코디네이터가 중단된 후 전 zkSNACKs 직원들이 유지 관리하고 있습니다. 개발자 drkgry로부터 받은 이 취약점 보고서는 코인조인 라운드에서 사용자 입력 및 출력을 완전히 비식별화할 수 있게 하여, 악의적인 코디네이터가 코인조인으로 얻은 모든 프라이버시 이득을 완전히 무효화할 수 있는 능력을 제공합니다.
Wasabi 2.0은 고정된 액면가 믹스 금액을 사용하는 제로링크 프레임워크에서 동적 다중 액면가 금액을 허용하는 와비사비 프로토콜로 이동하는 방식으로 Wasabi가 코인조인을 조정하는 방법을 완전히 재설계한 것입니다. 이 과정에서는 동질적인 블라인드 토큰에서 코인을 되찾기 위한 출력을 등록하는 방식으로 전환하고, 키드 검증 익명 자격 증명(Keyed Verification Anonymous Credentials, KVACs)이라는 동적 자격 증명 시스템으로 전환했습니다. 이를 통해 사용자는 서버에 상관없이 다른 사용자의 코인을 도난당하지 않도록 블라인드 금액을 등록할 수 있으며, 별도의 입력 소유권을 연결하는 것을 방지할 수 있습니다.
사용자가 라운드에 참여하기 시작하면, 코디네이터 서버에 라운드에 대한 정보를 요청합니다. 이는 RoundCreated 매개변수에서 maxAmountCredentialValue라는 값을 반환합니다. 이는 서버가 발급할 수 있는 가장 높은 값의 자격 증명입니다. 각 자격 증명 발급은 여기 설정된 값에 따라 식별할 수 있습니다.
대역폭을 절약하기 위해 클라이언트가 이 정보를 교차 검증하는 여러 제안된 방법은 구현되지 않았습니다. 이로 인해 악의적인 코디네이터는 사용자가 입력을 등록하기 시작할 때 각 사용자에게 고유한 maxAmountCredentialValue를 제공할 수 있습니다. 이후 코디네이터에 대한 메시지, 출력 등록을 포함하여, 코디네이터는 이 값을 기반으로 어떤 사용자와 통신하고 있는지를 식별할 수 있습니다.
이러한 방식으로 각 사용자에게 고유 식별자를 “태깅”함으로써, 악의적인 코디네이터는 어떤 출력이 어떤 사용자에게 속하는지를 확인할 수 있으며, 이는 코인조인으로 얻을 수 있었던 모든 프라이버시 이점을 무효화합니다.
내가 아는 한 drkgry는 이 문제를 독립적으로 발견하고 선의로 공개했지만, Wabisabi 설계 단계에 있었던 zkSNACKs 팀의 구성원들은 이 문제를 완전히 인지하고 있었습니다.
“라운드 해시의 두 번째 목적은 서버의 태깅 공격으로부터 클라이언트를 보호하는 것입니다. 자격 증명 발급 매개변수는 모든 자격 증명에 대해 동일해야 하며, 다른 라운드 메타데이터는 모든 클라이언트에 대해 동일해야 합니다(예: 서버가 클라이언트가 등록에서 감지 가능한 편향을 생성하도록 영향을 미치지 않도록 보장하기 위해).”
이 문제는 2021년 유발 코그만(Yuval Kogman), 일명 nothingmuch에 의해 제기되었습니다. 유발은 와비사비 프로토콜을 설계한 개발자이며, István András Seres와 함께 전체 프로토콜을 실제로 지정하는 디자이너 중 한 명입니다.
마지막으로, 태깅 취약점은 유발의 이 제안과 실제 UTXO에 바인딩된 전체 소유권 증명이 없이는 실제로 해결되지 않습니다. 클라이언트에 전송되는 모든 데이터는 특정 라운드 ID에 바인딩되지 않기 때문에, 악의적인 코디네이터는 여전히 사용자에게 고유한 라운드 ID를 제공하고 필요한 데이터를 복사한 다음 각 사용자별로 고유한 라운드 ID를 재할당하여 유사한 공격을 수행할 수 있습니다.
현재 Wasabi 2.0 구현에서 존재하는 유일한 취약점이 아닙니다. 나머지 팀이 구현 단계에서 절차를 간소화하면서 발생한 문제입니다.