Zebra의 투명한 SIGHASH_SINGLE 처리는 해당 출력에 대해 zcashd와 다릅니다.
Zebra 투명 SIGHASH_SINGLE 대응 출력 처리가 zcashd에서 분기됨V5+ 투명 지출의 경우 Zebra와 zcashd는 동일한 합의 규칙에 동의하지 않습니다. 입력 인덱스에 해당 출력이 없으면 SIGHASH_SINGLE은 실패해야 합니다. 'zcashd'는 이를 ZIP-244에서 합의가 잘못된 것으로 처리하는 반면, 'Zebra'의 투명한 확인 경로는 실패하는 대신 누락된 출력 사례에 대한 다이제스트를 계산합니다.
결과는 직접적인 블록 유효성 분할입니다. 잘못된 형식의 V5 투명 거래는 'Zebra'에 의해 허용되고 'Zebra'의 멤풀에 보관되며 'Zebra'의 'getblocktemplate'으로 선택되고 블록으로 마이닝된 다음 'zcashd'에 의해 거부될 수 있습니다.
분석 중에 사용된 검증된 코드 개정:
zcashd: 2c63e9aa08cb170b0feb374161bea94720c3e1f5얼룩말: a905fa19e3a91c7b4ead331e2709e6dec5db12cb범위 참고 사항:
zcashd 쪽:
TransactionSignatureChecker::CheckSig() 및 SignatureHash()를 통해 확인됩니다. zcash/src/script/interpreter.cpp.SIGHASH_SINGLE 또는 SIGHASH_SINGLE|ANYONECANPAY가 nIn >= txTo.vout.size()와 함께 사용될 때 SignatureHash()는 명시적으로 발생합니다. zcash/src/script/interpreter.cpp.CheckSig()는 해당 예외를 포착하고 false를 반환하여 투명 스크립트가 실패하게 만듭니다.'얼룩말' 쪽:
zebra/zebra-consensus/src/transaction.rs.Zebra는 디코딩된 해시 유형을 변환하고 zcashd가 먼저 시행하는 해당 출력 사전 검사를 추가하지 않고 Rust의 한숨 엔진에 다이제스트를 요청합니다. zebra/zebra-script/src/lib.rs, zebra/zebra-chain/src/primitives/zcash_primitives.rs.Zebra는 정식 SIGHASH_SINGLE을 Rust ZIP-244 구현으로 전달합니다.input.index() >= Bundle.vout.len()일 때 코드는 오류 대신 transparent_outputs_hash::<TxOut>(&[])을 사용합니다. zcash_primitives/src/transaction/sighash_v5.rs, zcash_primitives/src/transaction/sighash_v5.rs.이것이 악용될 수 있는 이유:
일반 경로 실행 가능성:
zcashd 일반 mempool 승인은 실제 트리거 경로가 아닙니다. 동일한 ZIP-244 SignatureHash() 검사가 먼저 실패하기 때문입니다. zcash/src/main.cpp, zcash/src/script/interpreter.cpp.Zebra는 멤풀과 블록 검증을 위해 동일한 투명 검증자를 사용하고 여기서 별도의 "입력당 하나의 출력" 표준 규칙이 없기 때문에 Zebra 일반 멤풀 허용이 실행 가능합니다. zebra/zebra-consensus/src/transaction.rs, zebra/zebrad/src/comComponents/mempool/storage.rs.Zebra는 블록 템플릿 생산자이므로 현실적인 스톡 경로는 Zebra mempool -> Zebra getblocktemplate -> 외부 마이너입니다. [zebra/zebra-rpc/src/methods/types/get_block_template/zip317.rs](https://github.com/ZcashFoundation/zebra/bl ob/a905fa19e3a91c7b4ead331e2709e6dec5db12cb/zebra-rpc/src/methods/types/get_block_template/zip317.rs#L72-L105).검증된 커밋:
zcashd: 2c63e9aa08cb170b0feb374161bea94720c3e1f5얼룩말: a905fa19e3a91c7b4ead331e2709e6dec5db12cb수동 재생 단계:
0을 정상적으로 서명합니다.SIGHASH_SINGLE 또는 SIGHASH_SINGLE|ANYONECANPAY를 사용하여 입력 1에 서명합니다.Zebra는 그것을 멤풀에 받아들입니다;Zebra는 이를 getblocktemplate으로 선택합니다.Zebra는 그것을 포함하는 블록을 채굴하고 받아들일 수 있습니다.zcashd는 일반적인 mempool 경로에서 이를 거부합니다.이는 직접적인 V5+ 투명한 합의 분할입니다.
이를 실행할 수 있는 사람:
영향을 받는 사람:
Zebra는 zcashd가 거부하는 거래/블록을 수락하고 템플릿화할 수 있습니다.왜 이 VPI인가 (설명가능 · 실험적)
VPI 산정 기준
| 영향도(심각도 등급 추정치) | 95.00 |
| 악용 신호(추가 악용신호 없음) | ×1.00 |
| VPI | 95.00 |
VPI 공식 vpi-v1 기준