요. 본문 바로가기
N잡러의 지식노트 N잡러의 지식노트

Succinct SP1 보안 취약점, 증명 검증 오류 분석

읽는 시간 약 6분
image 269

요약

SP1 V6의 건전성 취약점으로 인해 악의적인 증명자가 선언된 차원과 저장 길이가 일치하지 않는 증명 텐서를 제공할 수 있습니다. 이러한 불일치로 인해 Rust의 기본 검증기가 유효하지 않은 실행에 대한 증명을 수락할 수 있습니다.

이 취약점은 영향을 받는 네이티브 Rust 검증기에 직접 제출된 코어 증명 및 압축 증명에 영향을 미칩니다. 신뢰할 수 없는 증명자로부터 증명을 수락하기 위해 이 검증기를 사용하는 애플리케이션은 이 문제에 노출됩니다.
Succinct의 영지식 증명 시스템인 SP1에서 심각한 건전성 오류가 발견되어, 회사 자체의 메인넷 증명 네트워크가 잘못된 증명에 노출되었습니다.

10월 11일에 발표된 GitHub 보안 권고에 따르면, Succinct가 알고 있는 한 해당 네트워크 배포만 영향을 받았습니다.

Rust 6.0.0부터 6.8.0까지의 네이티브 Rust 검증기는 유효하지 않은 증명을 허용할 수 있었습니다.

GHSA-p7v2-jjv3-8p8f로 등록된 해당 권고문은 악의적인 증명자가 유효하지 않은 실행에 대한 증명을 제출할 수 있으며, 네트워크의 검증자가 이를 수락할 수 있다고 지적합니다. 증명자 네트워크는 제3자 증명자의 증명을 허용했습니다.

해당 버그를 악용하려면 증명을 SP1의 네이티브 Rust 검증기로 직접 전송해야 했습니다. 코어 증명과 압축 증명이 해당 경로에 노출되었습니다.

Groth16 및 Plonk 검사는 고정된 형태의 래핑된 증명을 사용했고 버그의 증명자 제어 텐서 형식을 전혀 건드리지 않았기 때문에 안전했습니다.

온체인 Plonk 및 Groth16 검사를 위한 Solidity 체커는 영향을 받지 않았습니다. 압축 증명을 확인하기 위해 verify_sp1_proof 함수를 사용하는 앱은 증명 집계가 Groth16 또는 Plonk 증명으로 끝나는 경우에만 안전했습니다.

해당 공지에 따르면 6.0.0부터 6.8.0 버전까지 sp1_hypercube, sp1_prover 및 sp1_sdk가 영향을 받습니다. Succinct는 해당 공지가 공개되기 17일 전인 9월 24일에 6.8.1 버전에서 수정 사항을 배포했습니다.

세부

검증기는 다차원 데이터를 Tensor버퍼와 데이터의 형태를 설명하는 차원을 포함하는 구조체로 표현합니다. 검증이 올바르게 작동하려면 저장된 요소의 개수가 이러한 차원들의 곱과 같아야 합니다.

역직렬화 과정에서 검증기는 저장소 길이가 선언된 형태와 일치하는지 확인하지 않았습니다. 그 결과, 여러 검증 경로에서 기본 저장소를 확인하지 않고 선언된 크기를 사용했습니다.

악의적인 검증자는 차원과 저장 길이가 일치하지 않는 텐서를 제공하여 이러한 누락된 검사를 악용할 수 있습니다. 그러면 서로 다른 검증 단계에서 동일한 텐서의 서로 다른 부분을 처리하게 되어 건전한 검증에 필요한 일관성이 깨지게 됩니다.

저장 길이가 일치하지 않는 텐서는 버전 6.8.1부터 폐기됩니다.

SP1의 네이티브 Rust 검증기에 버그가 있었습니다. 이는 증명이 유효한지 확인하는 프로그램의 일부입니다.

SP1은 다차원 데이터를 텐서에 저장합니다. 텐서는 저장된 값의 버퍼와 형태를 설명하는 선언된 차원으로 구성됩니다.

정확한 검증을 위해서는 두 값이 일치해야 합니다. 저장된 요소의 개수는 주어진 차원의 곱과 같아야 합니다.

각 증명 데이터 조각에는 크기가 표시된 라벨이 붙어 있습니다. 검증자는 라벨에 적힌 내용과 데이터 내부 내용이 일치하는지 확인하지 않았습니다. 라벨만 확인했을 뿐입니다.

따라서 공격자는 가짜 레이블을 사용하여 데이터를 전송할 수 있습니다. 그러면 검증의 각 부분이 동일한 데이터의 서로 다른 부분을 검사하게 되므로 가짜 증명이 통과될 수 있습니다.

버전 6.8.1부터 역직렬화 시 길이 검사가 추가되었습니다. 저장된 요소의 개수가 선언된 차원의 곱과 같지 않은 텐서는 모두 거부됩니다.

6.8.1 버전이 게시된 후, Succinct는 메인넷 Prover Network에 수정 사항을 배포했습니다.

네트워크에서 증명을 요청하는 사용자는 자신의 쪽에서 아무것도 변경할 필요가 없습니다. 자체 Rust 검증 도구를 실행하고 신뢰하지 않는 증명자의 증명을 수락하는 사용자는 6.8.1 버전으로 업그레이드해야 합니다.

Vitalis Salis는 해당 결함을 발견하고 Immunefi의 버그 현상금 프로그램을 통해 보고했다고 해당 공지는 밝혔습니다.
올해 Cryptopolitan은 Zcash 의 Orchard 쉴드 풀 에서 발견된 건전성 버그를 포함하여 다른 증명 시스템 건전성 버그들을 보고했습니다. 또한 Cryptopolitan은 Foom.Cash 에서 공격자가 검증자 설정 오류로 인해 zkSNARK 증명을 위조한 사례에 대해서도 논의했습니다.

영향 및 범위

이 취약점을 악용하려면 공격자는 영향을 받는 네이티브 Rust 검증기에 증명을 제출해야 합니다. 발견 당시 알려진 유일한 영향받는 배포 환경은 타사 증명기로부터 증명을 수락하는 Succinct 운영 메인넷 증명기 네트워크였습니다.

악의적인 증명자는 네트워크의 영향을 받는 검증자가 수락할 수 있는 유효하지 않은 실행에 대한 증명을 제출할 수 있습니다. 요청자의 노출 정도는 증명 모드와 검증 경로에 따라 달라집니다.

TensorGroth16 및 Plonk 검증은 고정된 형태의 래핑된 증명을 사용하기 때문에 영향을 받지 않습니다. 이들은 이번 취약점과 관련된 증명 제어 방식의 Rust 표현을 처리하지 않습니다 .

라이브러리 함수를 통해 압축된 증명을 검증하는 애플리케이션은 verify_sp1_proof증명 집계가 Groth16 또는 Plonk 증명으로 끝나는 경우에만 이 문제의 영향을 받지 않습니다.

bymh7765
함께 보면 좋은 글

댓글 0

첫 댓글을 남겨보세요.

광고 차단 알림

광고 클릭 제한을 초과하여 광고가 차단되었습니다.

단시간에 반복적인 광고 클릭은 시스템에 의해 감지되며, IP가 수집되어 사이트 관리자가 확인 가능합니다.