슬로우 미스트 (SlowMist): 블록체인 애플리케이션에서 흔히 발생하는 암호화 리스크

이 기사는 기계로 번역되었습니다
원문 표시
저자: 슬로우 미스트 (SlowMist) 
링크: https://mp.weixin.qq.com/s/0C7LMVFjc6nPtyQdDpXaHQ
면책 조항: 본 기사는 재인쇄본입니다. 독자는 원문 링크를 통해 더 자세한 정보를 얻을 수 있습니다. 저자가 재인쇄 형식에 이의가 있는 경우 당사에 연락 주시면 저자의 요청에 따라 수정하겠습니다. 본 재인쇄본은 정보 공유만을 목적으로 하며 투자 조언을 구성하지 않으며, 우톡(Wu-Talk) 관점 나 입장을 대변하지 않습니다.


배경 개요
암호화는 웹3 보안의 핵심입니다. 개인 키 생성부터 거래 서명에 이르기까지 모든 단계는 암호화 구성 요소의 정확하고 안전한 구현에 달려 있습니다. 그러나 실제 웹3 프로젝트 개발 과정에서 연구 개발팀은 업무 로직과 성능 최적화에만 집중하여, 근본적인 암호화 구현의 미묘한 차이에 대한 충분한 주의를 기울이지 않는 경우가 많습니다. 안전하지 않은 난수 생성기 사용, 암호화 라이브러리의 잘못된 호출, 알고리즘 특성에 대한 오해는 모두 치명적인 취약점을 초래하여 개인 키 유출, 서명 위조, 그리고 궁극적으로 돌이킬 수 없는 자산 손실로 이어질 수 있습니다.
일반적으로 프로젝트 팀은 이러한 문제를 발견하기 위해 보안 감사 활용합니다. 그러나 사후 검증 방법인 감사 프로젝트 수명 주기 전체를 ​​포괄하기에는 불충분합니다. 많은 취약점은 개발 초기 단계, 특히 선택 및 설계 단계에서 발생합니다. 팀이 기본적인 암호화 보안 지식이 부족하면 리스크 근본적으로 해결할 수 없습니다.
따라서 슬로우 미스트 (SlowMist) 보안팀은 블록체인 애플리케이션에서 흔히 발생하는 암호화 리스크 오픈소스로 공개하여, 최전선 공격 및 방어 경험을 통해 축적된 암호화 오용 사례와 모범 사례를 보존하고자 합니다. 저희는 프로젝트 팀이 개발 초기 단계부터 견고한 암호화 보안 방어 체계를 구축하고, 궁극적으로 독립적이고 지속적인 보안 코딩 역량을 확립하기를 기대합니다.
이 글은 전체 내용 중 일부만을 소개합니다. 전체 내용은 GitHub에 처음 게시되었습니다. GitHub에서 해당 내용을 열람, 포크, 스타팅하실 수 있습니다: https://github.com/slowmist/Common-Cryptographic-Risks-in-Blockchain-Applications

0x01 개인 키 난수 보안

 

1. JavaScript의 Math.random 또는 시간 기반 시드를 사용하여 난수를 생성합니다.


  • 심각도: 높음


  • 설명: JavaScript의 `Math.random()`은 의사 난수 생성기(PRNG)로, 암호학적으로 안전한 시나리오에는 적합하지 않습니다. 이 함수의 구현은 브라우저 또는 JavaScript 엔진(예: V8의 Xorshift128+)에 따라 달라지며, 시드와 알고리즘은 종종 제어 및 예측이 불가능하여 공격자가 생성된 난수 시퀀스를 추측하거나 복제할 수 있는 위험이 있습니다.


  • 사용 사례: 암호화 키, 세션 토큰, CSRF 토큰 또는 임의 게임 이벤트를 생성할 때 키 유출, 세션 하이재킹 또는 게임 부정행위로 이어질 수 있습니다.


  • 권장 사항 : 암호학적으로 안전한 난수를 생성하기 위해 웹 암호화 API의 `crypto.getRandomValues()` 사용을 우선시하십시오. 이러한 난수는 키 및 토큰과 같은 민감한 시나리오에 적합합니다.


2. 자바의 안전하지 않은 난수 생성 방식을 사용하여 개인 키를 생성합니다.


  • 심각도 : 높음


  • 설명: Java의 `java.util.Random` 또는 `java.util.concurrent.ThreadLocalRandom`은 암호학적으로 안전하지 않은 의사 난수 생성기(PRNG)입니다. 이러한 생성기의 시드와 알고리즘(예: 선형 합동 생성기)은 예측 가능하며 엔트로피가 부족합니다. 이러한 방법을 사용하여 암호화 개인 키(예: RSA, ECDSA)를 생성하는 경우, 생성된 키는 예측 가능하며 공격자가 쉽게 유추하거나 복제할 수 있습니다.


  • 사용 사례: Java 기반 웹 애플리케이션에서 Random을 사용하여 생성된 키는 공격자가 TLS 세션을 해킹하거나 JWT 토큰을 위조하는 데 악용될 수 있습니다.


  • 권장 사항: java.security.SecureRandom을 사용하세요. 이는 암호화 시나리오에 맞게 설계된 난수 생성기로, 높은 엔트로피를 제공하여 개인 키 생성에 적합합니다. 또는 KeyPairGenerator나 KeyFactory와 같은 표준 라이브러리 또는 프레임 사용하여 키를 생성하는 것을 우선적으로 고려하세요.


  1. 일부 안드로이드 버전에서는 SecureRandom이 제대로 초기화되지 않습니다.


  • 심각도: 높음


  • 설명: 일부 Android 버전(특히 4.1~4.3과 같은 이전 버전)에서 java.security.SecureRandom이 제대로 초기화되지 않아 생성된 난수에 필요한 엔트로피가 부족합니다. 이는 일반적으로 시스템 엔트로피 풀(예: /dev/urandom)이 충분히 채워지지 않았거나 SecureRandom 구현상의 결함으로 인해 발생하는 문제입니다. 이러한 결함으로 인해 생성된 난수 시퀀스가 ​​매우 예측 가능해지므로 개인 키 생성에 사용할 경우 보안이 크게 저하됩니다.


  • 사용 사례: 영향을 받는 안드로이드 기기에서 SecureRandom을 사용하여 생성된 비트코인 ​​개인 키가 손상되어 자금 도난으로 이어질 수 있습니다.


  • 권장 사항: SecureRandom을 호출하기 전에 SecureRandom.setSeed()를 명시적으로 호출하고, 이를 높은 엔트로피 소스(예: 사용자 입력 또는 하드웨어 센서 데이터)와 결합하여 난수성을 향상시키십시오.


  1. 개인 키 생성 시 난수를 저장하는 공간이 너무 작습니다.


  • 심각도: 높음


  • 설명: 개인 키 생성 과정에서 난수를 저장하는 데 공간이 부족한 변수 유형(예: 32비트 정수)을 사용하면 난수의 범위와 엔트로피가 제한되어 생성된 개인 키의 강도가 부족해질 수 있습니다.


  • 사용 사례: 공격자는 난수 생성 범위의 제한성을 악용하여 무차별 대입 공격이나 사전 계산 공격(예: 레인보우 테이블)을 통해 개인 키를 빠르게 추측할 수 있습니다. 예를 들어, Profanity 도구의 경우 공격자는 생성된 주소 패턴을 분석하여 여러 이더리움 지갑을 해킹하고 대량 의 자금을 탈취했습니다.


  • 권장 사항: 전체 키 공간(예: secp256k1 곡선의 2^256 범위)을 지원하려면 난수를 저장할 때 충분히 큰 변수 유형(예: 256비트 이상)을 사용하십시오.


  1. 리비트코인 메르센 트위스터 약한 엔트로피 취약점


  • 심각도: 높음


  • 설명: Libbitcoin Explorer(버전 3.0.0~3.6.0)의 `bx seed` 명령어는 Mersenne Twister(MT19937) 의사 난수 생성기(PRNG)를 사용하여 지갑 시드를 생성하는데, 이때 생성되는 시드는 32비트 시스템 시간(high_resolution_clock)으로만 초기화됩니다. 이로 인해 엔트로피 공간이 2^32(약 43억)개의 가능한 값으로 제한되어, 보안에 필요한 128비트 또는 256비트 엔트로피 요구 사항에 훨씬 못 미칩니다. 공격자는 무차별 대입 공격을 통해 시드를 복제하여 개인 키를 추론하고 사용자 자금을 위험에 빠뜨릴 수 있습니다. 이 취약점은 처음 생성되는 시드 구문이 "milk sad"로 시작하기 때문에 "Milk Sad"라고 불립니다.


  • 사용 사례 : `get_clock_seed()`는 32비트 시스템 타임스탬프(uint32_t)를 반환하며, 이는 메르센 트위스터의 시드(seed)로 사용할 수 있습니다. `std::mt19937`은 겉보기에는 무작위 출력을 생성하지만, 32비트 시드에 의해 엔트로피가 제한되어 128비트 이상의 보안 수준을 제공할 수 없습니다. `pseudo_random_fill`로 출력을 채울 때 256비트로 확장하는 것은 단순히 의사 난수 확장일 뿐 실제 엔트로피를 증가시키지는 않습니다.


  • 권장 사항: Mersenne Twister를 암호학적으로 안전한 난수 생성기(예: /dev/urandom, 높은 엔트로피 소스를 사용하는 C++의 std::random_device 또는 OpenSSL의 RAND_bytes)로 교체하십시오.


6. OpenSSL 난수 생성기의 보안 리스크


  • 심각도: 높음


  • 설명: OpenSSL 암호화 라이브러리의 난수 생성기인 `RAND_pseudo_bytes()`는 `num`개의 의사 난수 바이트를 `buf`에 저장하는 데 사용되지만, 보안 설계상의 결함이 있습니다. `RAND_pseudo_bytes()`가 생성하는 의사 난수 바이트 시퀀스는 길이가 충분히 길면 고유하지만, 반드시 예측 불가능한 것은 아닙니다. 이러한 의사 난수 바이트는 암호화 목적이 아닌 다른 용도나 일부 암호화 프로토콜의 특정 목적에 사용될 수 있지만, 일반적으로 키 생성 등에는 사용되지 않습니다.


  • 취약점의 예: 저엔트로피 키 누출(LESLI) 취약점은 공격자가 논스(nonce) 값을 획득한 후 가능한 모든 PIN 코드와 난수 생성기(RNG) 상태를 무차별 대입하여 원래 PIN 값을 복구할 수 있는 취약점입니다.

     

  • 권장 사항: RAND_pseudo_bytes 사용을 피하고, RAND_bytes로 완전히 대체한 후 반환 값을 확인하십시오.

     

0x02 ECDSA 보안

 

1. secp256r1 백도어 문제


  • 심각도: 중간


  • 설명: secp256r1(NIST P-256이라고도 함)은 널리 사용되는 타원 곡선 암호화 알고리즘이지만, 매개변수 생성 과정에 잠재적인 백도어가 존재할 수 있다는 우려가 있습니다. 표준화 과정에서 NSA가 매개변수를 제공했는데, 생성 과정의 투명성이 부족했습니다. 이는 특정 공격자(예: NSA)가 숨겨진 수학적 관계를 악용하여 데이터를 해독하거나 서명을 위조할 수 있도록 의도적으로 취약점을 포함하도록 설계되었을 가능성이 있습니다.


  • 사용 사례: 공격자는 백도어(존재하는 경우)를 악용하여 알려진 매개변수의 수학적 특성을 활용해 개인 키를 신속하게 계산하거나 난수 생성기의 출력을 예측함으로써 암호화된 통신을 해독하거나, 디지털 서명을 위조하거나, secp256r1 기반 암호화 시스템(TLS, 비트코인, SSH 등)에서 민감한 데이터를 탈취할 수 있습니다.


  • 권장 사항: 백도어 리스크 줄이려면 Ed25519 또는 Secp256k1과 같이 매개변수가 투명하게 생성되는 곡선으로 전환하는 것을 고려하십시오.


2. secp256k1에서 k 값의 무작위성이 약하기 때문에 개인 키 유출이 발생합니다.


  • 심각도: 높음


  • 설명: secp256k1 곡선의 ECDSA 서명 과정에서 서명을 위해 난수 k(nonce)가 필요합니다. 만약 k 값이 취약한 난수 생성기(예: 엔트로피가 낮은 소스, 안전하지 않은 의사 난수 생성기, 예측 가능한 시드)에 의해 생성될 경우, 공격자는 서명 데이터를 분석하여 k 값을 추론한 후 ECDSA의 수학적 특성을 이용하여 개인 키를 직접 계산할 수 있습니다. 이러한 취약점은 일반적으로 안전하지 않은 난수 생성기(예: rand(), Math.random())를 사용하거나 환경 엔트로피가 부족한 경우(예: 가상 머신 또는 임베디드 장치)에 발생합니다.


  • 사용 사례: 공격자는 소량의 서명 데이터(예: r 및 s 값)를 수집하고 이를 약한 난수의 예측 가능성과 결합하여 k 값을 재구성하고 개인 키를 추론할 수 있습니다. 블록체인 환경(비트코인 및 이더리움 등)에서 이는 지갑 개인 키 노출 및 자금 탈취로 이어질 수 있습니다. 예를 들어, k 값이 타임스탬프 또는 고정된 시드를 기반으로 생성되는 경우 공격자는 무차별 대입 공격이나 패턴 분석을 통해 개인 키를 신속하게 복구할 수 있습니다. 유사한 문제는 초기 암호화폐 지갑 구현에서 발생했는데, 이는 k 값 생성에 약한 난수 생성기를 사용했기 때문입니다.


  • 권장 사항: 난수 생성기의 품질에 의존하지 않고 개인 키와 메시지 해시를 기반으로 고유한 k 값을 생성하기 위해 결정론적 k 값 생성(RFC 6979)을 사용하십시오.


3. secp256k1에서 k 값을 재사용하면 개인 키가 유출됩니다.


  • 심각도: 높음


  • 설명: secp256k1 타원 곡선(비트코인 등 암호화폐에서 널리 사용됨)에 ECDSA 서명을 사용할 때, 두 서명이 동일한 난수 k(nonce)를 사용하면 서명의 r 값이 동일해집니다. 공격자는 이 두 서명 세트(r, s1)와 (r, s2) 및 이에 해당하는 메시지 해시 h1과 h2를 분석하여 개인 키를 추론할 수 있습니다. 이 취약점은 ECDSA 서명 방정식의 수학적 구조에서 비롯됩니다. k의 재사용으로 인해 공격자는 방정식 시스템을 구성하고 개인 키 d를 직접 구할 수 있습니다.


  • 권장 사항: RFC 6979를 준수하여 개인 키와 메시지 해시를 기반으로 결정론적이지만 예측 불가능한 k 값을 생성하여 재사용을 방지하십시오.


4. ECDSA 서명 값의 가변성


  • 심각도: 중간


  • 설명: ECDSA(타원 곡선 디지털 서명 알고리즘) 서명 값(r, s)은 변조 가능성을 지닙니다. 즉, 유효한 서명(r, s)이 주어졌을 때, n이 타원 곡선의 차수인 경우에 한해, n에 대해 동일한 유효한 서명(r, -s mod n)을 생성할 수 있습니다. 이러한 수학적 특성은 ECDSA 서명 검증의 모듈러 대칭성에서 비롯됩니다. 정규화되지 않은 서명(예: 낮은 s 값 사용 강제)을 구현할 경우, 공격자는 서명의 유효성에 영향을 주지 않고 서명을 수정할 수 있으며, 잠재적으로 서명 검증 메커니즘을 우회하거나 특정 프로토콜의 고유성 요구 사항을 위반할 수 있습니다.


  • 사용 사례: 공격자는 서명 변조 가능성을 악용하여 블록체인(비트코인, 이더리움 등)이나 프로토콜에 문제를 일으킬 수 있습니다. 예를 들어, 비트코인 ​​거래에서 공격자는 거래 서명의 's' 값을 수정하여 새로운 서명을 생성하고 거래 ID(txid)를 변경함으로써 거래 거부 또는 이중 지출 리스크 초래할 수 있습니다. 또한, 일부 스마트 계약이나 다중 서명 프로토콜에서는 정규화되지 않은 서명을 사용하여 검증 로직을 우회함으로써 금전적 손실이나 프로토콜 오류를 발생시킬 수 있습니다. 2013년에는 비트코인 ​​네트워크에서 서명 변조로 인한 거래 변조 공격이 발생하여 Mt. Gox와 같은 거래소 피해를 입혔습니다.


  • 권장 사항: "낮은 s 값"(s ≤ n/2) 사용을 의무화하고, RFC 6979 또는 BIP-66 표준(비트코인 커뮤니티에서 채택)을 준수하며, 위조 가능성을 제거하기 위해 비정형 서명을 거부하십시오.


5. ECDSA와 Schnorr 서명은 동일한 난수 k를 공유하므로 개인 키 유출로 이어질 수 있습니다.


  • 심각도: 높음


  • 설명: 타원 곡선 디지털 서명 알고리즘(ECDSA)과 슈노르 서명에서, 서명 생성 시 동일한 난수 k(nonce)를 사용하는 경우 공격자는 서명을 분석하여 개인 키를 추론할 수 있습니다. 이 취약점은 두 서명 방식의 수학적 구조가 유사하여, 알려진 서명 방정식으로부터 개인 키를 유추할 수 있다는 점에서 비롯됩니다. 동일 시스템 내에서 여러 번 서명하거나 서로 다른 서명 알고리즘에서 k 값을 재사용하는 경우, 개인 키가 완전히 노출되어 공격자가 서명을 위조하거나 관련 계정을 제어할 수 있게 됩니다.


  • 권장 사항: RFC6979에서는 입력 매개변수에 "추가 데이터"를 포함할 수 있도록 허용합니다. k를 생성할 때 서명 알고리즘 정보를 이 필드에 입력할 수 있으므로 알고리즘 수준에서 k를 안전하게 재사용할 수 있습니다.


6. ECDSA는 서명 값에 해당하는 메시지 m이 필요하지 않은 경우 서명 값을 위조할 수 있습니다.


  • 심각도: 낮음


  • 설명: ECDSA 서명 검증 시, 원본 메시지 자체가 아닌 메시지의 해시 값만 검증에 필요한 경우, 공격자는 개인 키를 알지 못해도 알려진 정상 서명을 기반으로 검증을 통과하는 위조 서명을 생성할 수 있습니다. 이 취약점은 ECDSA 검증 메커니즘의 수학적 특성을 악용하여, 공격자가 해당 원본 메시지나 개인 키를 알지 못해도 특정 값 조합을 선택하여 위조 서명을 생성할 수 있도록 합니다.


  • 권장 사항: 서명을 검증할 때 해시 값뿐만 아니라 원본 메시지 m도 요구해야 합니다.


7. ECDSA 시그니처의 논스 사이드 채널 공격 취약점


  • 심각도: 높음


  • 설명: LadderLeak은 ECDSA 구현에서 발견되는 사이드 채널 취약점입니다. 공격자는 캐시된 타이밍 분석을 통해 서명 과정에 사용되는 논스(nonce)의 최상위 비트를 획득할 수 있지만, 유출 확률은 100% 미만(즉, "1비트 미만"의 정보)입니다. 이 취약점은 OpenSSL 1.0.2 및 1.1.0 버전과 RELIC 툴킷 0.4.0 버전에 존재하며, 특히 section163r1 및 NIST P-192 곡선을 기반으로 하는 ECDSA 구현에 영향을 미칩니다. 이 취약점은 몽고메리 사다리꼴 알고리즘 구현에서 좌표 처리가 잘못되어 발생하는 미세한 시간 차이에서 비롯됩니다. 공격자는 이 시간 차이를 관찰하고 통계적 방법을 사용하여 논스 k의 최상위 비트를 추론할 수 있습니다. 이러한 정보 유출률이 100% 미만(예: P-192의 경우 99%, section163r1의 경우 97.3%)이더라도 공격자는 개선된 블라이헨바허 푸리에 분석 방법을 사용하여 충분한 수의 서명을 수집함으로써 개인 키를 완전히 복구할 수 있습니다.


  • 취약점 예시: OpenSSL 구현의 취약점은 이진 곡선 사례(예: sect163r1)와 소수 곡선 사례(예: NIST P-192) 모두에서 나타납니다. 


    1. Filecoin BLS 서명 검증의 확장성 취약점


    • 심각도: 높음


    • 설명: Filecoin의 Lotus 구현에서 BLS 서명 검증 메커니즘에 확장성 취약점이 발견되었습니다. BLS 서명은 직렬화된 형식과 압축된 형식, 두 가지 형태로 표현될 수 있습니다. 두 형식 모두 BLST 라이브러리의 `VerifyCompressed` 메서드를 사용하여 성공적으로 검증할 수 있습니다. 그러나 Lotus의 블록 검증 로직은 서명이 포함된 블록 헤더의 CID를 사용하여 블록의 고유성을 판단합니다. 이로 인해 다음과 같은 보안 문제가 발생합니다. 동일한 블록이라도 서로 다른 두 가지 BLS 서명 형식을 사용하면 CID가 다르기 때문에 서로 다른 블록으로 간주됩니다. 공격자는 동일한 내용을 포함하지만 서명 형식이 다른 블록을 제출하여 중복 블록 감지를 우회함으로써 이 취약점을 악용할 수 있으며, 이는 블록체인 포크, 더블 스펜딩 공격 또는 합의 실패로 이어질 수 있습니다.


    • 권장 사항: 서명을 검증하기 전에 모든 서명을 균일한 형식으로 변환하십시오(직렬화 또는 압축 사용).


    2. BLS 라이브러리의 0 값 관련 취약점 및 "0 값 분할" 공격


    • 심각도: 높음


    • 설명: 연구원들은 4개의 주요 BLS(Boneh-Lynn-Shacham) 암호화 라이브러리와 BLS 표준 초안에서 0 값 처리와 관련된 일련의 심각한 보안 취약점을 발견했으며, 이를 통칭하여 "0 분할" 공격이라고 합니다. 이러한 취약점은 암호화 알고리즘에서 특수 값 "0"을 처리하는 방식의 결함에서 비롯되며, 서명 검증 우회, 개인 키 복구, 서비스 거부 공격 및 기타 심각한 보안 문제로 이어질 수 있습니다. 특히, GitHub 보고서에는 다음과 같은 추가적인 0 값 관련 취약점도 언급되어 있습니다. supranational/blst 라이브러리에서 길이가 0인 서명이나 메시지는 프로그램 충돌을 일으킵니다. 또한, 모듈로 p 연산에서 inverse(0) mod p = 0은 처리되지만 inverse(p) mod p = 1은 처리되지 않는 문제가 있습니다. BLS 서명 체계는 고유한 집계 속성 때문에 블록체인 및 분산 시스템에서 널리 사용되고 있으며, 이러한 취약점은 해당 라이브러리에 의존하는 대규모 시스템에 상당한 보안 문제를 야기할 수 있습니다.


    • 취약점 예시: 연구 문서에 따르면, "제로 값 분할" 공격은 주로 제로 서명 검증 우회, 제로 공개 키 공격, 라이브러리 충돌 취약점, 모듈로 연산에서의 제로 값 문제, 그리고 집계 서명에서의 제로 값 조작 등을 포함합니다.

    • 권장 사항: 0 값(길이가 0인 입력, 0점, 0 스칼라 등)을 처리하기 위한 전략을 명확하게 정의하고 일관되게 구현하십시오.


    3. BLS 다중서명에서 발생하는 악성 키 공격 취약점


    • 심각도: 높음


    • 설명: BLS 서명 방식에서 공개 키와 서명의 합산은 단순히 합산하는 방식으로 이루어집니다. 공격자는 비밀 키를 0으로 설정하고 정직한 키의 덧셈 역수를 계산하여 "악성 키"를 생성함으로써 정직한 참여자들의 기여를 무효화할 수 있습니다.


    • 권장 사항: 단순 합산 집계에 의존하지 않도록 소유권 증명(PoP) 메커니즘에 대한 엄격한 검증을 구현하십시오. 비선형 집계 또는 추가적인 난수 생성을 고려하십시오.

       

    0x06 RSA 보안

     


    1. 해시 충돌 생일 공격


    • 심각도: 높음


    • 설명: 해시 생일 공격은 확률 이론의 "생일 역설"에 기반합니다. 이 원리를 이용하면 해시 충돌을 찾는 데 필요한 계산 복잡성을 크게 줄일 수 있습니다. n비트 해시 함수의 경우 이론적으로 특정 충돌을 찾으려면 2^n번의 시도가 필요하지만, 생일 공격을 사용하면 임의의 두 입력이 동일한 해시 값을 생성할 확률이 50%인 경우를 찾는 데 약 2^(n/2)번의 시도만 필요합니다.


    • 취약점 예시: MD5 해시 함수(128비트 출력)를 사용하는 경우, 공격자는 약 2^64가지 변형 메시지를 생성하여 충돌을 찾아낼 수 있습니다. 예를 들어, 공격자는 MD5(A) = MD5(B)가 되도록 서로 다른 두 개의 계약 파일 A와 B(A는 유효하고, B는 변조됨)를 생성합니다. 시스템이 MD5를 사용하여 서명을 검증하는 경우, 공격자는 A의 서명을 이용하여 B의 서명을 위조할 수 있으며, 이는 2004년 Flaming 공격에서 가짜 인증서를 생성하는 데 사용된 MD5 충돌이나 2012년 Flame 악성코드가 Windows 업데이트 검증을 우회하기 위해 충돌을 악용한 사례와 같은 상황으로 이어질 수 있습니다.


    • 권장 사항: SHA-256, SHA-3 또는 BLAKE2와 같이 충돌 저항성이 뛰어난 최신 해시 알고리즘을 사용하고, MD5 및 SHA-1과 같이 보안에 취약한 것으로 입증된 알고리즘은 사용하지 마십시오.


    2. 해시 함수 길이 확장 공격


    • 심각도: 높음


    • 설명: 길이 확장 공격은 Merkle-Damgård 구조(MD5, SHA-1, SHA-2 시리즈 등)를 사용하는 해시 함수를 대상으로 하는 암호화 공격입니다. 공격자는 이러한 해시 함수의 내부 작동 방식을 악용하여 메시지 자체를 알 필요 없이 H(메시지||패딩||확장) 값을 H(메시지||패딩||확장)으로 계산할 수 있습니다. 여기서 확장은 공격자가 임의로 선택한 데이터입니다. 이 공격이 가능한 이유는 Merkle-Damgård 해시 알고리즘이 입력을 고정 길이 블록으로 나누고, 각 블록의 해시 값이 이전 블록의 해시 상태에 따라 달라지기 때문입니다. 즉, 공격자는 알려진 해시 상태에서 시작하여 해당 상태를 생성한 원래 데이터를 알지 못한 채 블록을 추가하면서 계속 계산할 수 있습니다. 이러한 유형의 취약점은 웹 애플리케이션, API 검증, 신원 인증 시스템, 블록체인 애플리케이션, 특히 H(비밀번호||메시지)와 같은 간단한 검증 패턴을 사용하는 시스템에서 매우 위험합니다.


    • 권장 사항: 머클-담가르드 구조를 사용하지 않는 SHA-3 및 BLAKE2와 같은 최신 해시 알고리즘을 사용하십시오. 이러한 알고리즘은 길이 확장 공격에 본질적으로 안전합니다.

       

    0x08 AES 보안

     


    1. 약한 피아트-샤미르 변환


    • 심각도: 높음


    • 설명: 피아트-샤미르 변환은 대화형 영지식 증명 프로토콜을 비대화형 증명 프로토콜로 변환하는 중요한 방법입니다. 이 변환은 증명자와 검증자의 무작위 챌린지를 해시 함수의 출력으로 대체합니다. 프로즌 하트(Frozen Heart) 취약점은 피아트-샤미르 변환 구현에서 "약한 피아트-샤미르" 변환을 사용하는 것과 관련이 있습니다. 이는 증명자 메시지의 일부만 해시하고 공개 정보(매개변수, 공개 입력 등)는 해시하지 않는다는 것을 의미합니다. 따라서 공격자는 미리 계산된 공개 키 A를 사용하여 비밀 값을 알지 못한 채 증명을 위조하고 검증자를 속일 수 있습니다. 이 취약점은 Bulletproofs, Plonk, Spartan, Wesolowski의 VDF를 포함한 여러 주요 영지식 증명 시스템에 영향을 미칩니다.


    • 권장 사항: 피아트-샤미르 변환 구현 시 난수 생성 과정에 모든 공통 입력 데이터가 포함되도록 하십시오.


    2. GG18 및 GG20의 Paillier Key 취약점


    • 심각도: 높음


    • 취약점 설명: 이 취약점은 널리 사용되는 두 가지 다자간 연산(MPC) 프로토콜인 GG18 및 GG20의 명세에 존재하며, 10개 이상의 지갑 및 라이브러리(바이낸스 커스터디 서비스 포함)에 영향을 미칩니다. 이 취약점의 근본 원인은 프로토콜 구현에서 공격자의 파이리에르 모듈러스 N에 작은 약수가 포함되어 있는지 또는 이중 소수인지 여부를 검사하지 않는 데 있습니다. 공격자는 이 취약점을 악용하여 MPC 프로토콜의 서명자와 상호 작용하고, 서명자의 비밀 조각을 탈취하고, 궁극적으로 마스터 비밀 키를 획득하여 개인 키 클레임 확보하고 암호화된 지갑의 모든 자금을 탈취할 수 있습니다.


    • 권장 사항: 공격자가 작은 인수(예: 2^20 크기의 소수)를 포함하는 악의적인 모듈러를 사용하는 것을 방지하기 위해 서명자의 파이리에 공개 키에 작은 소인수가 있는지 확인하십시오.

       

    요약하다

    슬로우 미스트 (SlowMist) 보안팀은 블록체인 애플리케이션의 일반적인 암호화 리스크 를 체계적으로 분석한 "블록체인 애플리케이션의 일반적인 암호화 위험" 문서를 오픈소스로 공개했습니다. 이 문서는 개인 키 생성, 디지털 서명, 해시 함수, 대칭 암호화 등 핵심적인 부분에 숨겨진 고위험 보안 리스크 밝히는 것을 목표로 합니다. 웹3 프로젝트 담당자들은 이 문서를 참고하여 다양한 취약점에 대한 원리 분석, 공격 시나리오, 해결 방안을 파악하고, 암호화 보안에 대한 이해를 심화하며, 일반적인 구현상의 문제점을 피함으로써 프로젝트와 사용자의 자산을 더욱 효과적으로 보호할 수 있습니다.



출처
면책조항: 상기 내용은 작자의 개인적인 의견입니다. 따라서 이는 Followin의 입장과 무관하며 Followin과 관련된 어떠한 투자 제안도 구성하지 않습니다.
라이크
즐겨찾기에 추가
코멘트