Zebra: halo2_gadgets 가변 기반 스칼라 곱셈에서 복사 제약 조건 누락으로 인해 베이스 제약이 부족하여 Orchard Action 회로 건전성이 손상됨
'halo2_gadgets'의 변수 기반 스칼라 곱셈 가젯의 건전성 취약성으로 인해 악의적인 증명자가 제한된 기준점을 사용하여 과수원 작업에 대한 유효한 증명을 생성할 수 있었습니다. 이 가젯은 Orchard Action 문의 다양한 주소 무결성 조건을 시행하기 때문에 결함으로 인해 증명자는 임의의 (pkd, gd, ivk) 트리플에 대한 조건을 충족하여 Action을 올바른 수신 보기 키에 바인딩하는 검사를 효과적으로 우회할 수 있습니다. 따라서 지출되는 노트의 올바른 nullifier(nf) 및 지출 검증 키(ak)에 바인딩됩니다.
주요 실제 결과는 적이 과수원 풀 내에서 이중 지불을 수행하여 균형 위반을 초래할 수 있다는 것입니다. 동일한 메모를 여러 번 사용할 수 있으며, 매번 뚜렷하고 유효해 보이는 무효화 장치가 드러날 수 있습니다. 전체 ZEC 공급은 모든 풀에서 흘러나오는 가치를 제한하는 Zcash의 개찰구 메커니즘에 의해 보호되었으므로 전체 공급의 무한한 인플레이션은 불가능했습니다. 노출은 회전문 시행 한도까지 과수원 풀 내 가치의 인플레이션이었습니다.
이중 지출을 통해 취약점을 악용하는 것은 온체인에서 감지할 수 없습니다. 악용에는 전용 회로 입력을 선택한 값으로 설정하기만 하면 되며, 이중 지출로 생성된 무효화는 정직한 무효화와 구별할 수 없으므로 영지식 속성은 공격의 모든 서명을 숨깁니다.
또는 (수정 전) 적이 기존 메모에 대한 지출 승인을 위조하여 자금을 도난할 수도 있습니다. 그렇게 하기 위해서는 노트 일반 텍스트를 알아야 하며, 실제로 해당 들어오는 보기 키를 알면 이를 얻을 수 있습니다. 예를 들어, 연결된 소프트웨어 지갑이 손상된 경우 하드웨어 지갑에 지출 키를 보관하여 제공되는 보호를 우회하는 데 사용할 수 있습니다. 이러한 형태의 악용은 개찰구를 통해 감지될 수 없습니다(균형 위반이 아닌 이러한 방식으로 취약점을 악용하려는 동기가 될 수 있음). 이는 도난당한 자금의 합법적인 보유자가 해당 자금을 사용할 수 없거나 체인에서 지폐의 무효화를 확인함으로써 감지할 수 있습니다. 그러나 이는 다른 수단에 의한 지출 키의 손상과 반드시 구별할 수는 없습니다.
이 취약성은 NU5 네트워크 업그레이드(2022년 5월 31일 활성화)에 Orchard 풀이 도입된 이후 존재했습니다. 교정 전에 악용되었다는 증거는 없습니다.
잔액 위반이나 자금 도난을 위한 취약점의 사용은 문제가 해결되기 전에 발생해야 합니다. 도난은 원칙적으로 해당 시점부터 감지할 수 있습니다(실제 무효화가 체인에 나타나기 때문입니다). 악용 시점에는 잔액 위반이 감지되지 않습니다.
결함은 halo2_gadgets/src/ecc/chip/mul/incomplete.rs에서 가변 기반 스칼라 곱셈의 이중 및 추가 구현에 있습니다. 성능을 위해 알고리즘은 중간 단계에서 불완전한 점 추가 공식을 사용합니다. (여기서 불완전 덧셈은 원칙적으로 안전합니다. 첫 번째와 마지막 단계에서는 완전 덧셈을 사용하고, 퇴화 사례에 도달하려면 이산 로그를 깨야 합니다.)
기준점은 알고리즘이 작동해야 하는 실제 기준에 해당 값을 연결하는 제약 조건을 도입하지 않고 **감시 값(개인 회로 입력)을 할당하는 할당_조언()을 통해 불완전 추가 단계에 공급됩니다.
``녹 지역.할당_advice(|| "x_p", self.double_and_add.x_p, 행 + 오프셋, || x_p)?; 지역.할당_advice(|| "y_p", self.y_p, 행 + 오프셋, || y_p)?;
*(`halo2_gadgets/src/ecc/chip/mul/incomplete.rs`, 커밋 `32a87582dfb0ad9364ef3ffe71751ceab2a502ea`의 L309–L310 주변.)*
기존 `q_mul_2` 제약 조건은 불완전 덧셈 루프 *전체에 걸쳐* 사용되는 기본 값을 서로 동일하게 강제하지만 **실제 기본**과 동일하도록 강제하는 것은 없습니다. 따라서 악의적인 증명자는 루프에서 사용되는 베이스를 완전히 자유롭게 선택할 수 있습니다. 대상 pk<sub>d</sub>, g<sub>d</sub> 및 ivk가 주어지면 증명자는 계산된 [ivk] g<sub>d</sub>가 원하는 pk<sub>d</sub>와 동일하게 만드는 기본 값을 풀 수 있으며, 이에 대해 다양화된 주소 무결성 방정식 pk<sub>d</sub><sup>old</sup> = [ivk] g<sub>d</sub><sup>old</sup>를 만족합니다. 정직한 증명자는 결코 만족할 수 없는 입력입니다.
### 이것이 이중 지불을 가능하게 하는 이유
Orchard Action 문은 사용된 노트의 nullifier가 올바른 nullifier 키 nk에서 파생되도록 제한하며, 이는 차례로 ivk = Commit<sup>ivk</sup><sub>rivk</sub>(Extract<sub>ℙ</sub>(ak<sup>ℙ</sup>), nk)를 통해 올바른 수신 보기 키 ivk에 바인딩됩니다. 다양한 주소 무결성 검사 pk<sub>d</sub> = [ivk] g<sub>d</sub>는 일반적으로 증명자가 해당 메모에 대해 올바른 ivk(따라서 올바른 nk)를 사용했음을 보장합니다. 해당 검사를 우회할 수 있으면 다음과 같습니다.
1. 증명자는 지출된 메모에 대해 새로운 **잘못된** nk를 선택합니다. nk는 nullifier 계산을 제공하므로 잘못된 nk는 동일한 음표에 대해 다른 nullifier를 생성합니다.
2. 다른 회로 제약으로 인해 증명자는 여전히 잘못된 nk에서 정직하게 ivk를 파생하여 해당 노트에 대해 잘못된 ivk를 생성하게 됩니다. 이는 일반적으로 무결성 검사에 의해 발견됩니다.
3. 증명자는 pk<sub>d</sub> = [ivk] g<sub>d</sub>를 만족시키기 위해 제한된 기반을 사용하여 검사를 무효화합니다.
4. 각각의 잘못된 nk는 고유한 유효한 nullifier를 생성하여 해당 메모가 반복적으로 사용될 수 있도록 합니다.
### 이것이 도난을 발생시키는 이유
지출 검증 키인 ak<sup>ℙ</sup>(기본적으로 ak와 동일)도 ivk = Commit<sup>ivk</sup><sub>rivk</sub>(Extract<sub>ℙ</sub>(ak<sup>ℙ</sup>), nk)를 통해 제한됩니다. 위와 같이 다양한 주소 무결성 검사는 일반적으로 증명자가 해당 메모에 대해 올바른 ivk(따라서 올바른 ak)를 사용했음을 보장합니다. 해당 검사를 우회할 수 있으면 다음과 같습니다.
1. 증명자는 개인 키를 알고 있는 ak를 선택하여 요청합니다.
2. 그들은 피해자의 메모를 사용하는 거래를 구성하고 해당 요청을 사용하여 서명합니다.
### 영향
- **무결성:** 높음. 악의적인 증명자는 Orchard 노트를 여러 번 사용하여 Orchard 풀 내에서 가치를 부풀릴 수 있습니다. 이는 수영장의 개찰구 제한에 의해서만 제한됩니다. 또는 증명자는 지출 키 없이도 다른 사용자의 노트 사용을 승인할 수 있습니다.
- **기밀유지:** 없음. 영지식 속성은 그대로 유지됩니다. 개인정보는 공개되지 않습니다. 이것이 공격이 관찰 가능한 온체인 서명을 남기지 않는 이유이기도 합니다.
- **가용성:** 버그의 직접적인 영향을 받지 않습니다. (조정된 대응은 완화를 위해 Orchard 조치를 일시적으로 비활성화했습니다. 이는 취약점의 영향이 아닌 운영상의 선택이었습니다.) 반면에 자금 도난 또는 향후 개찰구 위반으로 인해 자금을 사용할 수 없는 것은 가용성 결과로 간주될 수 있습니다.
### 영향을 받는 버전
- `halo2_gadgets` `< 0.5.0`
- `과수원` `< 0.14.0`
- `zcash_primitives` `< 0.28.0`
- `zcashd` `< 6.20.0`
- `zebrad` `< 5.0.0`
### 패치
회로 수준 수정은 기준점에 대한 첫 번째 반복 '할당_조언()' 호출을 '복사_조언()'으로 대체하여 첫 번째 기준 값이 올바른 기준과 같아야 하는 복사 제약 조건을 도입합니다. 루프 전반에 걸쳐 기존 `q_mul_2` 동등 제약 조건과 결합되어 불완전 덧셈 단계의 모든 기본 값을 올바른 기본으로 전이적으로 제한하여 공격자가 의존하는 자유를 닫습니다.
영지식 회로를 교정하면 고정된 확인 키가 변경되므로 네트워크 수준 수정에는 하드 포크(NU6.2)가 필요했습니다. NU6.2는 수정된 회로를 사용하여 Orchard를 다시 활성화하고 Orchard 증명을 회로별 확인 키(`InsecurePreNu6_2` / `FixedPostNu6_2`)로 라우팅합니다.
-`halo2_gadgets` 0.5.0
-`과수원` 0.14.0
- `zcash_primitives` 0.28.0
- 'zebrad' 5.0.0 (NU6.2); 4.5.3은 임시 소프트포크 완화를 제공합니다.
- `zcashd` 6.20.0 (NU6.2)
### 해결 방법/완화
회로 수정이 부족한 근본적인 건전성 결함에 대한 클라이언트 측 해결 방법은 없습니다. 배포된 임시 완화(Zebra 4.5.3 / 동급)는 Orchard가 포함된 모든 트랜잭션 및 블록을 거부하여 NU6.2가 활성화될 때까지 악용을 완전히 무력화하는 소프트 포크였습니다.
영향을 받는 상자에 의존하는 다운스트림 프로젝트는 다음을 수행해야 합니다.
- 'halo2_gadgets', 'orchard' 및 'zcash_primitives'를 위의 패치 버전으로 업그레이드하세요.
- 의도된 불변성은 목격된 값이 알려진/고정 값과 동일하다는 것인 '할당_조언()'(및 유사한 비제약 할당 API)의 다른 사용을 감사합니다. 그러한 사이트는 `copy_advice()`를 사용해야 합니다(또는 명시적인 제약을 적용해야 합니다).
### 지표/감지
착취는 구별되는 온체인 서명을 생성하지 않습니다. 모든 가치 풀에서 총 ZEC를 추적하는 개찰구 메커니즘은 실제 공급 확인을 제공하고 총 공급이 그대로 유지되는지 확인합니다. Orchard 트랜잭션 특성(예: 중복 후 통합 동작의 패턴)에 대한 경험적 분석은 가능하지만 일반적인 보호 활동 차이에 대해서는 결론이 나지 않습니다.
### 타임라인(MDT)
| 날짜/시간 | 이벤트 |
|---|---|
| 2022-05-31 11:50 | 취약한 NU5 업그레이드 활성화(버그 도입) |
| 2026-05-29(저녁) | 프로토콜 감사 중에 발견된 취약점 |
| 2026-05-29 23:53 | ZODL 핵심 엔지니어에게 책임감 있게 공개 |
| 2026-05-30 06:30 | ZODL이 인정한 공개 |
| 2026-06-01 (~21:30) | 긴급 소프트포크 완화 활성화(블록 3,363,426) |
| 2026-06-03 00:05 EDT | NU6.2 하드 포크가 활성화되고 Orchard가 수정 사항으로 다시 활성화되었습니다(블록 3,364,600) |
### 크레딧
**Shielded Labs**를 대신하여 수행된 프로토콜 감사 중에 독립적인 보안 연구원인 **Taylor Hornby**가 발견하고 책임감 있게 공개했습니다. ZODL 엔지니어 **Jack Grigg**, **Daira-Emma Hopwood** 및 **Kris Nuttycombe**가 분석 및 문제 해결을 주도했으며 **Arya Solhi**(Zcash Foundation)가 Zebra 패치 작업을 수행했습니다.
### 리소스
- Zcash 재단: *Zebra 4.5.3 및 5.0.0: 긴급 소프트 포크 및 NU6.2 활성화* — https://zfnd.org/zebra-4-5-3-and-5-0-0-emergency-soft-fork-and-nu6-2-activation/
- 영향을 받는 소스(접두사): `halo2_gadgets/src/ecc/chip/mul/incomplete.rs` @ commit `32a87582dfb0ad9364ef3ffe71751ceab2a502ea`, L309–L310
| 소스 | CVSS 버전 | 기본 점수 | 심각도 | 벡터 문자열 | 평가일 |
|---|---|---|---|---|---|
| NVDNIST | 3.1 | 9.3 | CRITICAL | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:N/I:H/A:L | 2026. 07. 18. |
| OSV3rd | 3.1 | 9.3 | CRITICAL |
왜 이 VPI인가 (설명가능 · 실험적)
VPI 산정 기준
| 영향도 | 93.00 |
| 악용 신호(추가 악용신호 없음) | ×1.00 |
| VPI | 93.00 |
VPI 공식 vpi-v1 기준
| CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:N/I:H/A:L |
| 2026. 07. 07. |