[블록체인] 보안

dhkim·2022년 7월 27일
0

블록체인 뽀개기

목록 보기
22/22
post-custom-banner

암호학의 역사

오래 전부터 사람들은 정보를 안전하게 전송하기 위해 암호학을 사용해왔으며, 오늘날 사용되는 암호 기술은 매우 긴 역사의 결과물입니다.

  • 고대의 암호학: 스키테일 암호화 방식, 카이사르 암호화 방식
  • 중세 시대와 르네상스의 암호학: 빈도 해석, 다중문자 암호
  • 근대의 암호학: 제퍼슨 디스크, 에니그마 장치
  • 컴퓨터 시대의 암호학: 양자 암호학, 타원곡선 전자서명 알고리즘(ECDSA)

해시 함수

해싱이란?

해싱은 다양한 크기의 입력값을 고정된 크기의 출력값으로 생성해내는 과정을 의미합니다. 암호 해시 함수는 블록체인과 같은 분산 시스템에서 데이터의 무결성과 보안을 보장합니다.

블록체인에서 해싱이 중요한 이유는 다음과 같습니다.

  1. 해시값을 사용해 익명성을 보장한다
  2. 무결성을 검증한다
  3. 해시값을 통해 채굴 노드를 정한다

암호 해시 함수에서 함수의 안전성을 평가하는 요소에는 다음 세가지가 있습니다.

  1. 충돌 저항성: 어떤 해시 함수에서, 서로 다른 두 입력에 대해 동일한 출력값을 발견하지 않은 상태
  2. 역상 저항성: 어떤 해시 함수에서, 특정한 값을 출력하는 입력값을 찾을 확률이 매우 낮은 상태
  3. 제2 역상 저항성: 어떤 입력값의 해시값과 동일한 해시값을 출력하는 또 다른 입력값을 파악할 수 없는 상태

채굴(Mining)

비트코인 채굴은 블록을 생성하는 과정에서 각 노드들이 수많은 해싱을 반복하며 특정 조건을 만족하는 정답을 찾는 것입니다. 채굴은 이전 블록의 해시값, 트랜잭션 머클 트리의 루트 해시, 임의의 숫자 논스값을 해싱했을 때 어떤 값의 범위를 만족하는 해시값을 구하는 과정이며, 논스값을 무차별적으로 대입하면서 진행합니다.

서명(Signature)

디지털 서명이란?

디지털 서명은 메시지나 디지털 문서의 진위성과 무결성을 검증하는 데 사용하는 수학적 메커니즘입니다. 쉽게 말해, 디지털 서명은 메시지에 첨부되는 코드이며, 이 코드는 수신자에게 도착할 때까지 메시지가 변조되었는지 확인할 수 있도록 해줍니다.

공개 키 암호화 방식

공개 키 암호화 방식은 공개 키와 비밀 키로 구성된 한 쌍의 키를 사용한 암호화 방식입니다. 두 키는 타원곡선 알고리즘을 사용하여 생성됩니다.

데이터를 암호화하여 전달해야 할 때는 수신자만이 데이터를 확인할 수 있어야 하기 때문에 공개 키로 데이터를 암호화하여 전달하고, 개인 키로 복호화합니다. 반대로, 디지털 서명에서는 송신자만이 암호화된 데이터를 만들 수 있고, 누구나 공개 키로 열람할 수 있어야 하기 때문에 비밀 키로 데이터를 암호화하고, 공개 키로 복호화합니다.

디지털 서명의 동작 방식

  1. 해싱: 원본 데이터를 해싱합니다. 해싱은 생략해도 되지만, 해싱을 하면 동일한 길이의 값을 비교할 수 있기 때문에 위변조를 탐지하는 과정이 간편해집니다.
  2. 서명: 공개 키 암호화 방식을 사용해 해싱된 데이터를 서명합니다. 서명이 완료되면, 원본 데이터와 디지털 서명, 송신자의 공개 키를 함께 전송합니다.
  3. 검증: 수신자는 송신자의 공개키를 사용해 디지털 서명을 복호화하고, 원본 데이터를 해싱하여 두 값이 같은지 확인합니다. 값이 같으면 데이터가 정상적으로 전달된 것입니다.

디지털 서명의 특징

  1. 데이터 무결성: 수신자는 디지털 서명을 통해 메시지가 전송되는 동안 위변조가 일어나지 않았는지 확인할 수 있습니다.
  2. 진위성: 송신자의 개인 키가 안전하게 보관되었다는 전제 하에, 수신자는 디지털 서명이 송신자에 의해 생성되었음을 확인할 수 있습니다.
  3. 부인 방지: 송신자의 개인 키가 안전하게 보관되었다는 전제 하에, 서명이 생성되고 나면 이 서명이 송신자에 의해 서명되었다는 사실을 부정할 수 없습니다.

디지털 서명 시스템의 필요 조건

  1. 알고리즘: 신뢰할 수 있고, 널리 사용되어 그 안전성이 입증된 해시 함수와 암호화 알고리즘을 사용해야합니다.
  2. 구현: 디지털 서명 방식은 데이터의 무결성 및 진위성과 직결되기 때문에 결점 없는 시스템을 구현하는 것 역시 중요합니다.
  3. 개인 키: 개인 키가 유출되거나 손상될 경우, 진위성과 부인 방지 속성이 무효화됩니다.

공개 키 암호화 방식과 대칭 키 암호화 방식

대칭 키 암호 방식

여러 사용자 사이에 공유되는 단일 키를 기반으로 원본 데이터를 암호화 및 복호화합니다. 대칭 키 암호 방식에는 블록 암호 방식이나 스트림 암호 방식을 사용할 수 있습니다.

[암호화 기술과 보안&핵심 요약-그림.1] 대칭 키 암호화 방식

대칭 키 암호 방식의 장단점은 다음과 같습니다.

장점
간결한 방식이기 때문에 네트워크나 CPU의 오버헤드 부담이 적습니다.
키의 길이가 길어질수록 무차별 대입 공격을 통한 복호화 난이도가 기하급수적으로 증가합니다.
단점
단일 키를 관리하는 것이 어렵습니다.
허가 받지 않은 제삼자가 해당 키를 가지게 되면 해당 키를 사용한 모든 데이터의 보안에 위협이 됩니다.

공개 키 암호 방식

데이터를 암호화하여 전달하기 위해 공개 키와 비밀 키를 사용하여 원본 데이터를 암호화 및 복호화합니다. 공개 키는 전송자가 정보를 암호화하는데 사용하며, 비밀키로 암호화된 데이터를 복호화합니다.

[암호화 기술과 보안&핵심 요약-그림.2] 공개 키 암호화 방식

공개 키 암호 방식의 장단점은 다음과 같습니다.

장점
대칭 키 암호 방식의 키 노출 문제를 해결하여, 컴퓨터 보안을 강화하고 데이터의 무결성을 확인하는 데 사용할 수 있습니다.
단점
암호화 및 복호화 시 수학적 연산이 복잡하기 때문에, 데이터의 양이 많아지면 오버헤드가 발생하여 속도가 느려질 수 있습니다.
대칭 키 암호 방식과 마찬가지로, 개인 키가 안전하지 않은 공간에 노출되는 경우, 대응되는 공개 키로 암호화된 모든 데이터의 보안이 위험해집니다.
공개 키 암호 방식은 트랜잭션을 검증하는 디지털 서명 방식으로 사용됩니다. 새로운 암호 화폐 지갑이 설정될 때, 비밀 키가 먼저 생성되며, 이 비밀 키를 기반으로 공개 키가 생성됩니다. 사용자의 지갑은 이 공개 키를 해싱한 값으로 생성되며, 이 지갑은 일종의 계좌번호의 역할을 하여 다른 사람들과 공유할 수 있습니다. 반면, 비밀 키는 디지털 서명을 생성하고 트랜잭션을 검증할 때 사용되기 때문에 사용자가 각별히 유의하여 보관해야 합니다. 디지털 서명을 통해 해당 암호 화폐 지갑에 대응되는 비밀 키를 가진 사용자만 자금을 사용할 수 있습니다.

공개 키 암호 방식과 대칭 키 암호 방식의 비교

  1. 키의 길이: 대칭 키 암호 알고리즘은 키의 길이가 임의로 지정되는 반면, 공개 키 암호 알고리즘은 한 쌍의 키가 패턴을 가지고 있으며, 대칭 키에 비해 훨씬 더 긴 키를 사용합니다.
  2. 연산 속도: 대칭 키 암호 방식은 연산이 단순하기 때문에 비교적 속도가 빠릅니다. 반면, 공개 키 암호 방식은 연산이 복잡하여 속도가 느리고, 많은 연산 능력을 필요로 합니다.
  3. 보안: 대칭 키 암호 방식은 단일한 비밀 키를 공유해야 하기 때문에, 키가 노출 될 시 보안 위협이 큽니다. 반면, 공개 키 암호 방식은 한 쌍의 키를 사용함으로써 이러한 문제를 해결합니다.
  4. 알고리즘: 잘 알려진 대칭 키 암호 방식 알고리즘에는 RC4, AES, DES, 3DES 등이 있으며, 공개 키 암호 방식 알고리즘에는 RSA, 디피-헬먼, ECC 등이 있습니다.

다양한 암호화 기술

SHA-256

미 국가보안국에 의해 설계되고, 미국 국립표준기술연구소에서 발전시킨 암호 해시 알고리즘입니다. SHA-0, SHA-1, SHA-2, SHA-3 등이 있으며, SHA-0과 SHA-1은 충돌이 감지되어 더 이상 사용되지 않습니다. 오늘날 가장 많이 쓰이는 함수군은 SHA-2로, SHA-224, SHA-256, SHA-384, SHA-512가 있습니다.

SHA-256은 데이터의 위변조가 불가능함으로 보장하는 무결성이 목적입니다.

ECDSA

ECDSA는 공개 키 방식 중 하나인 ECC에 디지털 서명 방식을 접목한 알고리즘입니다. 디지털 서명은 비밀 키로 생성하며, 수신자가 트랜잭션에 작성된 디지털 서명과 송신자의 공개 키를 통해 송신자의 디지털 서명이 맞는지, 변조되지는 않았는지 확인합니다.

HMAC

HMAC은 대칭 키 암호 방식을 이용한 디지털 서명 방식입니다. HMAC은 송신자와 수신자가 단일 키를 공유하고, 해당 단일 키와 원본 데이터를 해싱한 값과 원본 데이터를 함께 트랜잭션으로 보내 데이터의 무결성을 증명합니다.

HMAC 트랜잭션 = Hash(원본 데이터, 단일 키) + Message

PKI

PKI는 디지털 인증서와 공개 키를 생성, 관리, 배포, 사용, 저장 및 해지하는 데 필요한 일련의 하드웨어, 소프트웨어, 정책, 프로세스와 절차의 집합입니다. PKI의 목적은 데이터를 안전하게 전송하는 것이며, 이를 위해 시스템 및 리소스 접근 권한, 데이터 보호, 트랜잭션 무결성 및 진위성, 기밀성을 보장합니다. PKI은 단순 보안 이메일, 웹 트래픽 뿐만 아니라 여러 개의 복잡한 생태계 내의 다양한 어플리케이션, 사용자, 장치를 지원하고 있습니다. 또한 정부 및 산업 데이터 보안에 대한 규제가 점점 엄격해지고 있기 때문에, 정부기관과 기업들은 신뢰를 보장하기 위해 조직적인 PKI를 구성하고자 노력하고 있습니다.

슈노르 서명

슈노르 서명은 키 집합(Key Aggregation)을 사용하여 서명 당사자들의 공개 키를 하나의 키로 통합하고, 단일 공개 키에 유효한 단일 서명을 구성합니다.

슈노르 서명은 당사자들의 정보를 하나로 통합하기 때문에 개인 정보 보호에 유리하며, 블록에 들어가는 멀티시그 공개 키들과 서명들의 크기를 일반적인 블록 크기 정도로 줄이기 때문에 블록 공간을 매우 절약하고, 검증의 속도를 빠르게 할 수 있습니다.

HD 지갑

HD 지갑은 하나의 시드 키(Seed Key)를 사용하여 여러 주소를 생성할 수 있는 암호화폐 지갑입니다. HD 지갑은 트리 형태로, 하나의 부모 키가 여러 개의 연속된 자식 키를 만들고, 이 자식 키는 다시 여러 개의 손자 키를 만들어내는 방식으로 여러 개의 주소를 생성합니다.

비결정적 지갑과 결정적 지갑

비결정적 지갑은 비밀 키를 생성할 때, 지갑 파일로부터 비밀 키를 무작위로 추출해 보관하는 방식을 의미합니다. 비결정적 지갑 방식은 지갑 데이터를 분실하는 경우, 해당 비밀 키도 분실하게 되기 때문에 지갑 데이터를 자주 백업해야 하는 불편함이 있습니다.

결정적 지갑은 하나의 시드 키를 가지고 있으며, 이 시드 키를 통해 비밀 키를 만들수 있습니다. 시드 키는 자신으로부터 파생된 모든 비밀 키를 다시 복구할 수 있습니다. 이러한 특징 때문에 모든 비밀 키는 그 값이 미리 정해져 있다고 볼 수 있기 때문에 이를 결정적(Deterministic)이라고 말합니다. 결정적 지갑은 시드 키만 잘 간수하면 모든 비밀 키를 파악할 수 있기 때문에 지갑 데이터를 백업할 필요가 없습니다.

BIP32

BIP32에서는 결정적 지갑을 이진 트리 형식으로 계층화하여 끝없이 비밀 키를 생성할 수 있는 구조를 제안하였습니다. HD 지갑은 BIP32에서 제안한 지갑 구조를 프로그래밍화 한 것입니다.

HD 지갑의 구조

HD 지갑은 시드 키, 마스터 키, 자식 키들로 구성되어 있으며 계층적 트리 구조를 가지고 있습니다.

자식 키의 종류는 일반 자식 키와 단절 자식 키가 있으며, 일반 자식 키는 부모의 공개키를 통해 자신의 공개 키를 구할 수 있습니다. 단절 자식 키는 부모의 비밀 키를 알아야 자신의 공개 키를 구할 수 있습니다.

[암호화 기술과 보안&핵심 요약-그림.3] BIP 32

DRBG

HD 지갑에서는 시드 키를 생성할 때 DRBG를 사용합니다. DRBG는 컴퓨터로 만들어 낸 난수를 해싱한 값을 사용합니다. 공개되지 않은 해시 알고리즘을 사용한 해시값은 완전한 난수이기 때문입니다.

HMAC-SHA512

HD 지갑에서는 부모 키를 통해 자식 키를 확인할 수 있어야 하기 때문에, HMAC 방식을 사용하여 자식 키를 만듭니다. HMAC-SHA512는 부모의 키 값을 패딩하여 XOR 연산을 하고, 그 결과값을 해싱합니다. 마스터 키는 시드 키에 HMAC-SHA512를 연산한 결과값입니다.

BIP 44

BIP 44는 복수 계정에 대한 복수 지갑을 사용할 수 있는 5가지 트리 레벨의 HD 지갑 구조를 제안했습니다.

트리 레벨은 목적, 코인 종류, 계정, 잔돈 계정 여부, 사용 가능한 주소로 나뉩니다.

니모닉 코드 단어

니모닉 코드 단어란?

니모닉은 결정적 지갑에서 난수를 12개의 영단어로 인코딩하는 방식이며, BIP 39에서 제안되었습니다.

결정적 지갑을 사용하는 지갑 어플리케이션에서는 사용자가 지갑을 생성하면, 해당 지갑에서 만든 난수로부터 영단어 시퀀스를 만들어 사용자에게 제공합니다. 그리고 이 단어 시퀀스에서 시드 키를 생성합니다.

16진수의 난수로 구성된 시드 키와 비교했을 때, 니모닉 단어는 사용자에게 익숙한 영단어 목록이기 때문에 사용자가 쉽게 읽을 수 있고, 사용자가 받아적기 쉽다는 장점이 있습니다.

니모닉 단어 생성

[암호화 기술과 보안&핵심 요약-그림.4] 니모닉 단어 생성

  1. 128bit 또는 256bit 길이의 난수를 생성합니다.
  2. 난수를 SHA-256 알고리즘으로 해싱하고, 해시값에서 (시드 키의 길이) / 32 만큼을 떼어냅니다. 가령, 난수의 길이가 128bit라면, 해시값에서 128 / 32 인 4bit를 앞에서부터 떼어내 체크섬으로 만듭니다.

체크섬(Checksum): 어떤 일련의 데이터에 오류가 존재하는 지 확인하기 위한 검사용 데이터

  1. 체크섬을 난수의 뒤에 붙입니다.

  2. 체크섬을 붙인 난수를 11bit 단위로 잘라냅니다.

  3. 각 11bit의 단어를 사전에 정의된 단어로 치환합니다.

  4. 각 11bit의 순서를 유지하여 일련의 니모닉 코드를 만듭니다.

시드 생성

솔팅

원본 데이터에 임의의 문자열인 솔트(Salt)를 추가하여 해싱하는 방식입니다. 솔팅 방식으로 비밀번호를 암호화하여 데이터베이스에 보관하면, 해커가 솔트가 무엇인지 알지 못하는 이상 레인보우 테이블의 해시값과 데이터베이스의 해시값을 비교해도 원본 비밀번호를 알 수는 없습니다.

키 스트레칭(Key Stretching)

솔팅의 결과값을 다시 솔트함수의 입력값으로 하여 다시 솔팅을 하고, 이 과정을 반복합니다. 사용자가 입력한 비밀번호는 예측하기 쉬운 경우가 많은데, 키 스트레칭은 이러한 예측을 더욱 어렵게 해줍니다.

BIP39에서의 시드 생성 방법

PBKDF2 함수에 니모닉 코드를 입력합니다.
PBKDF2에 솔트를 입력합니다. 솔트는 문자열 "Mnemonic"에 임의의 암호문을 붙인 형태입니다.
PBKDF2 함수는 입력받은 니모닉 코드와 솔트로 HMAC-SHA512로 2048번 해싱하여 512 bit의 값을 만들어내며, 이 값이 시드 키가 됩니다.

핫 월렛과 콜드 월렛

핫 월렛

핫 월렛(Hot Wallet)은 온라인에 연결되어 있는 암호화폐 지갑입니다. 핫 월렛은 인터넷 상에 연결되어 있고 개인 키가 서버에 저장되어 있기 때문에 사용자가 쉽게 접근할 수 있으며, 실시간으로 거래를 할 수 있습니다. 암호화폐 거래소 지갑이 대표적인 예입니다.

핫 월렛의 보안적 문제

핫 월렛은 인터넷에 연결되어 있기 때문에 늘 공격 가능성이 있습니다. 핫 월렛의 취약점을 공격한 대표적인 사례로는 2018년 일본 암호화폐 거래소인 코인체크(Coincheck) 탈취 사건이 있습니다.

콜드 월렛

콜드 월렛(Cold Wallet)은 지갑의 개인 키를 오프라인으로 보관하는 지갑을 의미합니다.

콜드 월렛으로 거래를 하기 위해서는 먼저 오프라인 상에서 트랜잭션을 생성하고, 이 트랜잭션을 온라인에 입력해야 합니다. 이 때문에 바로 거래를 할 수 있는 핫 월렛에 비해서는 번거롭다는 단점이 있지만, 트랜잭션을 온라인에 입력할 때를 제외하고는 오프라인 상태이기 때문에, 해킹의 위험이 비교적 적습니다.

하드월렛을 잃어버리더라도 복구 문구를 알고 있으면 해당 지갑의 개인키에 대한 소유권을 증명할 수 있습니다.

다양한 월렛

브레인 월렛

일련의 단어 목록이나 문장을 사용해 비밀키를 만드는 지갑입니다. 비밀 키를 만들 때 사용한 단어 목록이나 문장을 기억하고 있으면 언제든지 비밀 키를 복구할 수 있기 때문에 저장 방식이 간편하다는 장점이 있습니다.

그러나 인간이 만들어내는 문장은 컴퓨터가 만들어내는 난수에 비해 임의성(Randomness)가 부족하기 때문에, 무차별 대입 공격을 통해 비밀 키를 해킹당할 수도 있습니다.

스마트 컨트랙트 월렛

스마트 컨트랙트 월렛은 비밀 키가 아닌 스마트 컨트랙트로 관리하는 이더리움 지갑을 의미합니다. 스마트 컨트랙트 월렛은 CA의 기능을 활용할 수 있기 때문에, 누가 어떤 조건에서 자산에 접근할 수 있는지를 알려주는 프로그래밍화된 규칙을 통해 자산을 관리할 수 있습니다.

대표적인 스마트 컨트랙트 월렛에는 InstaDApp, Zerion, Metamask가 있습니다.

멀티 시그 월렛

멀티 시그 월렛은 하나의 지갑에 N명의 사용자가 지갑에 대한 소유 권한을 가지고, 해당 지갑에서 트랜잭션을 만들기 위해서는 N명 중 k명이 트랜잭션에 서명을 해야 합니다. 이더리움 상에서 구현할 때는, 멀티 시그 월렛을 위한 스마트 컨트랙트를 만들어 N명 중 k명이 서명해야 컨트랙트를 이행한다는 서명 제한 룰을 추가하고, 실제로 k명이 멀티 시그 월렛 컨트랙트에 트랜잭션을 보내야 합니다.

멀티 시그 월렛의 장단점은 다음과 같습니다.

장점

당사자 중 한명이 실수로 송금 트랜잭션에 서명을 하더라도 나머지 당사자들이 서명을 하지 않으면 트랜잭션이 완료되지 않기 때문에, 보안이 우수합니다.

단점

스마트 컨트랙트 상에서 구현되기 때문에 암호화폐 거래소에서는 사용할 수 없습니다.
스마트 컨트랙트 코드 상에 문제가 있는 경우, 해킹이 발생할 수 있습니다.
멀티 시그 월렛에는 ConsenSys, Gnosis, Argent, BitGo 등이 있습니다.

블록체인의 보안적 특징

블록체인의 보안적 특징

  1. 데이터 무결성: 블록체인은 합의 알고리즘을 사용해 데이터의 무결성을 보장합니다. 악의적인 노드가 참여하더라도, 합의를 통해 노드가 블록을 변조하지 못하도록 합니다.
  2. 거래 투명성: 퍼블릭 블록체인에서는 누구나 블록체인 네트워크에 접속하여 트랜잭션 기록을 확인할 수 있습니다.
  3. 감시 가능성: 블록체인은 추가만 가능한(Append-Only) 데이터베이스로, 한번 블록이 체인에 올라가면 블록에 담긴 트랜잭션이나 데이터는 수정할 수 없습니다. 이 특징은 해싱을 통해 구현됩니다.

기존 시스템과의 비교

기존 데이터베이스는 클라이언트-서버 아키텍쳐를 사용합니다. 데이터베이스에 대한 통제권은 데이터베이스 관리자에게 있습니다. 관리자는 데이터베이스의 무결성과 투명성을 보장해야 하기 때문에 관리자에게 문제가 생기지 않도록 노력해야 하기 때문에 보안 유지 비용이 소모됩니다. 반면, 블록체인은 분산 시스템이기 때문에 각 노드들이 블록체인 사본을 가지고 있으며, 일부 노드에 문제가 발생해도 전체 블록체인 네트워크의 무결성은 보장됩니다.

또한 기존 데이터베이스에서는 클라이언트가 권한에 따라 데이터에 대한 CRUD 작업을 수행할 수 있지만, 블록체인에서는 모든 노드는 데이터를 읽거나 추가만 할 수 있습니다. 이전의 모든 데이터는 영구적으로 저장되며, 변경할 수 없습니다.

이중지불 문제

이중 지불 문제란?

이중 지불이란 디지털 현금 시스템 내에 동일한 하나의 자산이 두 명의 수신자에게 동시에 전송되는 문제를 의미합니다. 어떤 시스템에서 이중 지불 문제를 해결하지 못하는 경우, 사용자는 자신이 전달받은 자금이 다른 어딘가에서 이미 사용되지 않았다는 것을 검증할 방법이 없기 때문에 시스템 자체가 파괴되게 됩니다.

이중 지불 문제를 막는 중앙화된 방법

이중 지불 문제를 해결하는 중앙화된 접근법의 대표적인 예로 데이비드 차움의 eCash가 있습니다.

eCash의 동작방식은, 사용자가 은행에 일정 금액을 입금하면, 은행이 이를 일정 갯수의 숫자들로 바꿔줍니다. 이 숫자는 지폐와 같은 역할을 합니다. 사용자가 이 숫자로 상인에게 돈을 지불하면, 상인은 해당 사용자가 이 숫자를 다른 곳에 또 쓰기 전에 은행에 이 숫자에 대한 소유권을 청구합니다. 은행은 숫자에 있는 서명이 유효한지 확인한 후, 상인에게 해당 숫자의 값만큼 현금을 입금시켜줍니다. 사용된 숫자는 소각됩니다.

이중 지불 문제를 막는 탈중앙화된 방법

이중 지불 문제에 대한 가장 혁신적인 해결책은 사토시 나카모토가 비트코인 백서를 통해 제시한 블록체인입니다.

블록체인은 노드라고 불리는 네트워크 참여자들이 서로 동일한 데이터베이스 사본을 가지고 트랜잭션을 기록하고 감시합니다. 공개적으로 블록체인을 볼 수 있기 때문에, 이중 지불을 시도하는 트랜잭션과 같은 부정직한 행동을 쉽게 감지할 수 있습니다.

트랜잭션이 체인에 올라가면 새로운 사용자에게 소유권이 할당되기 때문에, 코인은 이중지불 될 수 없습니다. 트랜잭션이 블록에 올라가고, 블록이 체인에 연결되어야 실제로 송금이 완료된 것입니다. 만약 트랜잭션이 생성된 후 체인에 올라가기 전 상태를 수용하게 되면, 악의적인 사용자에 의해 동일한 자금에 대한 다른 트랜잭션이 생성되어 먼저 체인에 올라가게 될 수 있습니다. 이 경우, 내 송금에 대한 트랜잭션이 체인에 올라가도 합의 알고리즘에 의해 폐기될 것입니다. 따라서 트랜잭션이 체인에 올라가고, 체인 재구성이 불가능하다고 여겨지는 만큼 블록이 추가적으로 생성되어야 해당 트랜잭션이 완료되었다고 볼 수 있습니다.

비트코인 이중 지불

비트코인은 트랜잭션을 되돌리기 위해서는 비현실적인 수준의 연산 능력을 필요로 하기 대문에, 송신자를 포함한 그 누구도 체인에 올라간 트랜잭션을 되돌릴 수 없습니다. 그러나 트랜잭션을 승인하는 노드를 겨냥한 소규모 공격들도 있습니다.

  • 51% 공격: 단일 주체나 조직이 50% 이상의 해시레이트를 가지는 경우, 이 주체는 트랜잭션을 배제하거나 순서를 조작할 수 있습니다.
  • 레이스 공격: 동일한 자금에 대한 트랜잭션을 여러 개 생성하여 이중 지불을 유도합니다. 트랜잭션이 컨펌되기 전에 해당 트랜잭션을 수용해버릴 때 발생합니다.
  • 핀니 공격: 네트워크에 즉각적으로 트랜잭션을 전송하지 않고, 코인을 자신의 다른 지갑으로 전송하는 트랜잭션을 미리 생성해두고, 블록을 미리 채굴해두어 해당 블록에 기록합니다. 동일 코인을 다른 트랜잭션에서 사용하는 대신, 이전에 채굴한 블록만을 전송하며, 결제는 무효화됩니다.

51% 공격

51% 공격은 단일 주체나 조직이 대다수의 해시 파워를 제어하여 네트워크를 중단시킬 수 있는 공격입니다. 악의적인 주체가 충분한 채굴 파워를 소유하여 통제권을 쥐고 있게 되면, 자신이 발생시킨 트랜잭션을 되돌릴 수 있게 됩니다. 이는 이중지불 문제로 이어질 수 있습니다. 만약 악의적인 다수가 51% 공격을 성공하게 되면, 공격자들은 트랜잭션의 일부나 전부가 승인되지 못하도록 하거나, 채굴자들이 채굴을 하지 못하도록 하고 채굴 작업을 독점할 수 있습니다.

51% 공격의 동작방식

공격자는 네트워크 전체 해시 파워의 50% 이상을 확보한 후, 블록을 채굴합니다. 블록을 채굴할 때는 이를 피어들에게 전파하지 않고 혼자 가지고 있습니다. 공격자의 해시파워는 네트워크 전체의 해시파워보다 높기 때문에 더 빠른 속도로 블록을 생성합니다.

이 상태에서, 공격자들은 정상 네트워크에 트랜잭션을 발생 시켜, 다른 거래소 지갑으로 송금을 합니다. 그리고 해당 트랜잭션이 컨펌되고 나면 자신들이 만들어둔 블록을 네트워크에 전파합니다. 이 경우, 정상 네트워크에 있는 블록체인보다 공격자가 만든 블록체인이 더 길기 때문에 정상 네트워크의 블록체인에서 공격자가 만든 블록체인으로 체인 재구성이 일어납니다. 그러면 정상 네트워크에 있는 트랜잭션 기록들은 취소될 것입니다. 공격자들의 입금 트랜잭션도 취소하게 되는데, 이 경우 공격자들은 이미 코인을 다른 곳으로 송금한 뒤익 때문에 취소할 수 없는 상태에서 잔액은 입금 트랜잭션 이전 상태로 돌아가기 때문에 이중 지불 문제가 발생합니다.

51% 공격에서 블록 생성 시간은 큰 의미가 없습니다. 체인 재구성 공격에 대비해 일정 컨펌이 지난 후 입금을 처리해야 하기 때문에, "얼마나 빠르게 기록되느냐"보다는 "얼마나 빠르게 컨펌되느냐"가 더 중요한 문제가 됩니다. 즉, 이 확정 시간은 블록 생성 시간이 아니라 해시 파워의 크기에 영향을 받게 됩니다. 해시 파워가 커서 체인이 안정될 수록 컨펌 시간을 짧게 잡을 수 있습니다.

51% 공격에 대한 대안

컨펌 횟수 증가: 이중 지불 여부를 확인할 때까지 거래 확정을 늦춤으로써 51% 공격을 예방합니다. 다만 거래 처리 속도가 떨어진다는 단점이 있습니다.
지연 기능: 지연 기능은 블록체인 트랜잭션을 공증하는 공증 노드를 따로 둠으로써 전체 불변성을 보장하고 트랜잭션에 보안의 두 번째 계층을 제공합니다.

51% 공격 사례

  • 버지(Verge): 2018년 4월 두번에 걸쳐 25만 버지 코인, 3,500만 버지 코인을 탈취당했습니다.
  • 모나코인(Monacoin): 2018년 5월 블록보류 공격이 발생했으며, 이로 인해 최대 20 블록까지 재구성 되는 등 대규모 체인 재구성이 일어났습니다.
  • 비트코인 골드(Bitcoin Gold): 2018년 5월 38만 8,200 BTG를 탈취당했으며, 비트코인 골드는 더 이상의 피해를 막기 위해 하드 포크를 결정했습니다.
  • 젠 캐시(Zen Cash): 2018년 6월 블록 보류 공격이 발생했으며, 약 2만 3,152개의 젠 코인에 대한 이중지불 피해가 발생했습니다. 개발팀은 공격 인지 후 해시 난이도를 높여 추가 공격을 막았습니다.
    이더리움 클래식(Ethereum Classic): 2019년 1월 사흘간 11회의 이중 지불 공격이 발생했으며, 약 8만 8,500 ETC가 이중 지불 되었습니다. 이더리움 클래식은 컨펌 횟수를 400회까지 늘려 공격을 막았습니다.

리플레이 공격

리플레이 공격이란?

리플레이 공격(Replay Attack)이란 공격자가 보안 네트워크 통신을 가로채고, 해당 통신의 수신자로 하여금 공격자가 원하는 일을 수행하도록 하기 위해 통신을 지연시키거나 재전송하는 방식입니다. 리플레이 공격은 해커가 네트워크에서 메시지를 가로챈 후 메시지를 복호화하기 위한 별도의 과정이 필요하지 않으며, 메시지를 포함한 통신 전체를 다시 전송하는 것으로도 공격을 성공할 수 있습니다.

[암호화 기술과 보안&핵심 요약-그림.5] 리플레이 공격 예시

암호화폐에서 리플레이 공격이 위험한 이유

블록체인에서 리플레이 공격은 하드 포크 시 포크 이전에 생긴 트랜잭션 데이터를 포크 이후 블록체인에 그대로 복사하고 재전송하여 동일한 트랜잭션이 두 번 발생하도록 하는 것입니다. 동일한 트랜잭션이 두 번 발생하기 때문에 이는 이중 지불 문제로 이어집니다.

리플레이 공격 대안

  • 세션 식별자 추가: 통신 당사자 간 일회용 토큰을 해싱한 값을 공유하여 리플레이 어택을 피합니다.
    일회용 비밀번호: 아주 짧은 세션 시간을 가진 비밀번호를 두 통신 당사자가 공유하여, 공격자가 가로채 재사용하지 못하도록 합니다.
  • 타임 스탬프: 네트워크 시간을 MAC와 함께 브로드캐스트하고, 타임 스탬프가 포함된 메시지를 확인하여 예상 시간 범위 내에 있는 메시지만 수락합니다.

이클립스 공격

이클립스 공격(Eclipse Attack)은 공격자가 네트워크 상의 노드를 방해하기 위한 공격으로, 정교한 공격을 준비하기 위해 네트워크에 혼란을 야기시킬 때 주로 사용합니다.

이클립스 공격은 전체 네트워크를 공격하기 보다는 특정 노드를 격리시켜 정직한 다른 노드로부터 정보를 수신받지 못하게 여러 악의적인 공격자 노드가 네트워크를 독점합니다. 이 공격 노드들은 가짜 트랜잭션이 담긴 블록을 격리한 노드들에게 브로드캐스트하여 이중 지불 공격을 가능하도록 만듭니다.

이클립스 공격 동작 방식

  • 엔지니어링 블록 레이스: 이클립스 공격 대상 노드와 공격자의 노드가 동시에 블록을 생성한 경우, 공격 대상 노드가 생성한 블록을 숨김으로써 해당 블록은 고아 블록이 되고, 자신의 블록이 네트워크에 올라갈 수 있도록 합니다.
  • 채굴 파워 분할: 공격자가 51% 공격을 하기 위해 네트워크의 전체 채굴 파워를 쪼갤 수도 있습니다. 이러한 방식으로 공격자의 채굴 파워가 네트워크의 쪼개진 채굴 파워보다 커지게 되면 쉽게 51% 공격을 개시할 수 있습니다.
  • N-컨펌 이중 지불: 이클립스 공격자에 의해 여러 채굴 노드들이 공격 대상이 되어 격리된 경우, 공격자는 자신의 트랜잭션을 이클립스 공격 대상인 채굴 노드에게 제공하여 블록체인에 추가하도록 합니다. 이 노드들은 이후에도 블록을 계속 생성하면서 공격자의 트랜잭션이 든 블록이 컨펌되도록 합니다. 컨펌으로 트랜잭션이 완료되면 해당 블록들을 전체 네트워크에 공유하여 고아 블록이 되도록 합니다.

이클립스 공격 대처 방법

  • 무작위 노드 선택: 노드가 피어를 랜덤으로 선택하게 하여 공격자가 공격 대상 노드를 정하기 어렵도록 만듭니다.
  • 정보 저장: 노드가 다른 노드에 대한 정보를 기억하도록 하면, 해당 노드가 네트워크를 떠났다가 재접속 했을 때 이전에 연결했던 정직한 노드와 연결하여 정직한 피어 관계를 지속할 수 있습니다.
  • 연결 수 늘리기: 하나의 노드에 연결된 피어의 갯수를 늘리면, 노드가 정직한 노드에게 연결될 가능성 역시 높아집니다.

인적 문제로 발생할 수 있는 보안적 이슈

크립토 재킹 공격

크립토재킹(Cryptojacking)은 감염된 피해자의 장치를 사용해 암호화폐를 채굴하는 것을 의미합니다. 공격자는 악성 채굴 프로그램을 사용하도록 유도하여, 해당 프로그램을 실행하면 악성 프로그램에 감염 되어 눈치채지 못할 만큼 시스템 자원을 이용해 채굴을 하게 됩니다. 감염된 피해자는 자신도 모르는 새에 채굴을 시작하고, 공격자는 피해자의 해시 파워를 사용해 채굴 보상을 받습니다.

오늘날 가장 많이 사용되는 방식은 웹 기반 크립토재킹으로, 웹 기반 크립토재킹은 웹 사이트 내에서 실행되는 스크립트를 통해 악성 채굴 프로그램을 실행하며, 사용자가 웹 사이트에 머물러 있는 동안 브라우저를 통해 자동으로 채굴을 하도록 합니다. 웹 기반 크립토재킹의 대표적인 프로그램으로 코인하이브가 있습니다.

더스팅 공격

더스팅 공격(Dusting Attack)은 해커들이 아주 적은 양의 코인을 사용자의 지갑에 전송하여 사용자의 신원을 파악하는 악성 공격입니다.

일반 사용자들의 주소로 아주 적은 양의 금액을 보내 많은 주소를 더스팅(Dusting) 합니다. 그리고 나서 해당 송금 트랜잭션과 더스팅된 지갑들의 트랜잭션을 추적합니다. 일반적으로 대부분의 개인 지갑은 출금을 위해 거래소 지갑과 연결되어 있기 때문에, 트랜잭션을 추적하다보면, 결국 지갑을 소유한 개인이 누구인지 알수 있습니다.

시빌 공격

시빌 공격은 한 개인이 네트워크의 여러 노드를 장악하려는 악성 공격입니다. 공격자는 충분한 수의 가짜 노드를 생성하여, 기존의 신뢰할 수 있는 노드를 네트워크에서 제외시킵니다. 이를 통해 블록을 수신하거나 전송하는 것을 거부하거나, 다른 노드들을 네트워크에서 차단할 수도 있습니다.

합의 알고리즘은 시빌 공격을 원천적으로 봉쇄하기 보다는, 시빌 공격에 대한 비용 대비 수익보다 정상적인 채굴을 통한 비용 대비 수익을 더 크게 만들어, 시빌 공격 자체를 비효율적인 것으로 만듭니다.

구현된 블록체인에서 생길 수 있는 보안적 이슈

The DAO 사건

2016년 6월 17일, 악의적인 공격자가 The DAO로부터 자금을 빼낼 수 있는 허점을 발견했습니다. 공격 개시 후 몇시간 동안 약 30만 이더리움이 도난당했습니다.

The DAO의 코드는 재귀적 호출 가능성을 염두해두지 않은 상태였으며, 송금 시 자신의 자금을 송금하고 잔액을 업데이트하는 방식이었습니다. 공격자는 이 허점을 통해 DAO 스마트 컨트랙트가 잔액을 업데이트하기 전에 이더를 반환하도록 요청을 할 수 있었습니다.

중요한 것은 이 버그는 이더리움 자체의 문제가 아니라, 이더리움에 기반을 둔 어플리케이션의 문제였다는 점입니다. The DAO의 코드는 여러 결함을 가지고 있었으며, 재귀적 호출 문제도 그 중 하나였습니다. The DAO는 DAO를 구축하는 개발자들에게 견고한 블록체인 플랫폼 구현의 중요성을 일깨워주었습니다.

패리티 멀티시그 동결 사건

패리티 사의 주요 소프트웨어인 '패리티'는 이더리움 노드 소프트웨어를 위한 웹 인터페이스를 제공하는 이더리움 클라이언트입니다. 패리티에서 사용자는 일반적인 이더 및 기타 토큰 지갑 기능을 사용할 수도 있으며, 이더리움 블록체인에 구축된 스마트 컨트랙트와도 상호작용 할 수 있습니다.

패리티에는 자금 인출 함수와 같은 스마트 컨트랙트의 필수적인 로직들이 담긴 WalletLibrary라는 라이브러리가 있었습니다. 2017년 11월, 공격자가 WalletLibrary 라이브러리를 지갑화하여 해당 지갑을 파괴하는 공격이 벌어졌습니다. 공격자는 지갑화된 라이브러리를 파괴(Kill)하여, 해당 라이브러리를 사용하던 모든 컨트랙트를 동결시켰습니다.

WalletLibrary가 배포된 이후 생성된 멀티시그 지갑들은 동결되었습니다. 이 지갑들은 총 587개이며, 총 513,774.16 ETH(오늘날 한화 약 2조 7천억 원)가 동결되었습니다.

profile
Blockchain developer
post-custom-banner

0개의 댓글