[BEB] Section3 : 암호화 기술 / 블록체인의 보안적 특징과 공격방식

jsg_ko·2022년 1월 14일
0
post-custom-banner

암호화 기술

🔥해시함수

해싱(Hashing) 은 다양한 크기의 입력값을 고정된 크기의 출력값으로 생성해 내는 과정을 의미한다. 따라서 해시 함수는 어떠한 크기의 입력이 들어와도 동일한 크기의 출력을 뱉는 함수이다.

오늘날에는 여러 종류의 해시 함수가 존재하며, 그 중 암호 해시 함수는 블록체인 및 다양한 분산 시스템에 데이터 무결성과 보안을 보장하는 데 사용된다.

해시 함수의 동작방식

해시 함수는 다양한 크기의 입력값을 사용해 고정된 크기의 출력값을 생성한다. 가령 SHA-256 알고리즘은 어떤 입력값을 넣어도 256 비트 길이의 값을 출력하며, SHA-1은 160 비트 길이의 값을 출력한다.

블록체인에서 해싱의 역할

암호 해시 함수는 메시지 인증, 디지털 서명 등 보안 어플리케이션에서 사용될 수 있다.

특히, 암호화폐 프로토콜에서 가장 중요한 기술 중 하나로, 사용자에게 익명성을 보장하고, 트랜잭션을 하나로 연결 및 압축하며, 블록을 연결하는 동시에 그 무결성을 보장하는 역할을 한다.

  1. 해시값을 사용해 익명성 보장

    공개키를 해싱한 값을 지갑 주소로 사용하여 거래를 익명화할 수 있다. 트랜잭션 기록에는 해시값으로 암호화된 지갑 주소와 송금 및 잔액을 확인할 수 있을 뿐, 해당 지갑의 주인이 누구인지 파악할 수는 없다.

  2. 무결성 검증

    블록체인에서 해시 함수를 사용해 무결성을 검증하는 경우는 두가지가 있다.

    • 이전 블록의 값을 해싱한 값을 사용해 이전 블록을 가르킨다. 만약 이전 블록을 해싱한 값이 달라진 경우 해당 블록 또는 가리키고 있던 이전 블록에 위변조가 일어났음을 알 수 있다.
    • 블록에 저장된 모든 트랜잭션을 머클 트리 알고리즘을 사용해 하나의 해시값으로 저장한다. 만약 트랜잭션이 하나라도 변한 경우, 블록에 저장된 해시값도 변경된다.

    이러한 방식은 모든 데이터를 대조할 필요 없이, 고정된 크기의 해시값을 비교하면 되기 때문에 많은 양의 데이터를 저장하거나 기억할 필요 없이 무결성을 검증할 수 있다.

  3. 해시값을 사용해 채굴 노드를 정함

    최초의 블록체인 암호화폐인 비트코인에서는 PoW(작업 증명) 방식을 사용해 어떤 노드가 블록을 만들지 정한다. 작업 증명 방식에서는 특정 조건을 만족하는 해시값을 만족하는 입력값인 논스(nonce)를 가장 먼저 찾는 노드에게 블록을 채굴할 권한을 주고, 채굴에 대한 보상으로 비트코인을 제공한다.

해싱의 특성

일반적으로 암호 해시 함수를 복호화하기 위해서는 수많은 무차별 대입을 시도해야 한다. 해시 함수의 출력값은 입력값이 조금만 달라져도 아예 다른 형태로 변하기 때문에, 출력값을 통해 입력값을 유추하는 것은 불가능에 가깝다

한편으로, 서로 다른 입력값을 해시 함수에 넣었는데 동일한 출력값을 내뱉는 경우도 있다. 이를 "충돌"이라 한다. 충돌은 시스템에 심각한 위협이 될 수 있기 해시 함수를 만들 때 가장 중요한 요소 중 하나로 작용한다.

이를 종합해보면 암호 해시 함수의 안전성을 평가하는 요소를 세가지로 볼 수 있다.

  • 충돌 저항성
    어떤 해시 함수가 충돌하는 서로 다른 두 입력값을 가지고 있지 않는다면 충돌 저항성이 있다고 한다. 그러나 해시 함수의 충돌을 발견할 가능성은 매우 적다. 가령 SHA-256의 출력값의 각 자리에는 0~9, a~f 사이의 16진수가 하나 들어가며, 총 길이는 64자리로, 비트로 환산하면 256가 비트가 되며, 경우의 수는 2^256가 된다. 2^256은 10^78 정도 된다. 우주의 모든 원자의 갯수가 10^80개라는 것을 감안하면 사실상 SHA-256의 충돌을 찾는 것은 불가능에 가깝다. 따라서 충돌이 없는 해시 함수는 존재하지 않지만, 충돌 저항성이 있다고 간주되는 해시 함수는 존재한다.

  • 역상 저항성
    역상 저항성은 어떤 해시 함수가 특정한 값을 출력하는 입력값을 찾을 확률이 매우 낮을 경우를 의미한다. 이는 단방향 함수의 성질과 연관된다. 단방향 함수는 입력값을 통해 출력값을 얻을 수는 있지만, 출력값을 통해 입력값을 얻을 수는 없는 함수이다.
    역상 저항성은 데이터를 보호하는 데 매우 유리하다. 메시지의 해시값을 사용하면 해당 메시지의 원본을 공개하지 않고도 진위성을 검증할 수 있기 때문이다.
    실제로 패스워드에 대한 진위성을 검증할 때도 패스워드 원문을 비교하지 않고, 패스워드를 해싱한 값을 사용해 이를 비교하여 패스워드 원문이 노출되는 것을 방지한다.

  • 제2 역상 저항성
    제2 역상 저항성은 충돌 저항성과 역상 저항성이 복합적으로 작용한 경우로, A라는 입력값의 해시값과 동일한 해시값을 내는 B 입력값을 누군가가 알고 있지 않은 경우이다. 반대로 이 B 입력값을 누군가가 발견한 경우 제2 역상 공격이 가능하다.
    충돌 가능성은 동일한 해시값을 가진 서로 다른 두 입력값을 찾는 것이지만, 제2 역상 공격은 A 입력값을 통해 A' 라는 해시값이 나왔을 때, A' 해시값을 출력하게 만드는 B 입력값을 찾는 것이다. 따라서 제2 역상 저항성은 충돌 저항성이 전제되어야 한다.

채굴(mining)

비트코인 채굴은 블록을 생성할 노드를 정하기 위해 퍼즐을 푸는 과정을 의미한다. 여기서 말하는 퍼즐은 각 노드들이 수많은 해싱을 반복하며 특정 조건을 만족하는 정답을 찾는 것을 의미한다.

채굴은 이전 블록의 해시값과 트랜잭션 머클 트리의 루트 해시, 그리고 임의의 숫자 논스값을 해싱했을 때 특정 조건을 만족하는 값이 되어야 한다. 이전 블록의 해시값과 트랜잭션 머클 트리의 루트 해시는 이미 정해져 있기 때문에, 노드들은 논스에 무차별 대입을 하면서 조건을 만족하는 논스값을 찾아야 한다. 일반적으로 이 조건은 특정 숫자이며, 특정 숫자보다 낮은 논스값을 가장 먼저 찾는 노드가 블록을 생성할 수 있다.

이 특정 숫자에 따라 채굴 난이도가 결정되기 때문에, 만약 난이도가 너무 높아 블록 생성 시간이 10분보다 오래 걸리면 난이도를 낮추며, 블록 생성 속도가 10분 이하가 되면 난이도를 높여 블록이 10분에 하나씩 생성될 수 있도록 난이도를 조절한다.

한가지 중요한 점은 이 특정 조건이 단 하나의 값이 아니라 값의 범위이기 때문에 생성할 수 있는 해시가 여러 개라는 점이다. 이 조건을 만족하는 논스값은 여러개가 있을 수 있기 때문에, 채굴자들은 충돌을 염려할 필요가 없다. 채굴자들은 채굴 난이도에 따라 결정되는 조건에 따라 그 조건을 만족하는 여러 논스값 중 하나를 찾기만 하면 된다.

채굴이 완료되어 채굴 노드가 블록을 전파하면 다른 노드들은 해당 채굴이 올바르게 이루어졌는지 논스값과 이전 블록의 해시값, 트랜잭션 루트 해시를 해싱해 조건을 만족하는 지 확인한다. 주어진 데이터를 사용해 해시값을 만드는 것은 간단하기 때문에 논스값을 검증하는 것은 쉽고 빠르게 이루어진다.

🔥디지털 서명

디지털 서명(Digital Signature)은 메시지나 디지털 문서의 진위성과 무결성을 검증하는 데 사용하는 수학적 메커니즘이다. 디지털 서명은 디지털 통신에서 변조 및 사칭 문제를 해결하기 위한 것으로, 전자 문서, 거래, 메시지의 출처, 신원 및 상태에 대한 보증을 제공할 수 있다.

쉽게 말해, 디지털 서명은 메시지나 문서에 첨부된 코드이다. 이 코드는 생성된 이후부터 수신자에게 전송되기까지의 과정에서 메시지의 내용이 변조되었는지 확인할 수 있도록 해주고, 소유자의 신원 및 상태에 대한 보증을 제공할 수 있다.

암호화를 통해 메시지를 보호하는 개념은 이전부터 존재해왔지만, 1970년대 공개 키 암호화 방식의 발달로 인해 디지털 서명 구현이 가능해졌다.

디지털 서명의 특징

디지털 서명은 두 가지 특징을 가지고 있다.

  • 데이터 무결성
    수신자는 메시지가 전송되는 동안 위변조가 일어나지 않았음을 검증할 수 있다. 만약 송신자의 공개 키로 디지털 서명을 복호화 한 값이 원본 데이터를 해싱한 값과 다른 경우, 해당 송신자의 개인 키로 암호화된 서명이 아니거나, 원본 데이터가 훼손되었을 수 있다.

  • 진위성
    송신자의 개인 키가 안전하게 보관되었다는 전제 하에, 수신자는 디지털 서명이 송신자에 의해 생성되었음을 확인할 수 있다.

공개 키 암호화 방식 (비대칭키)

공개 키 암호화 방식(Public Key Cryptography, PKC)은 공개 키와 비밀 키로 구성된 한 쌍의 키를 사용한 암호화 방식이다. 두 키는 타원곡선 알고리즘(Elliptic Curve Algorithm, ECDSA)를 사용하여 생성된다. 공개 키로 암호화된 데이터는 해당 개인 키로 복호화 할 수 있다. 따라서 공개 키는 외부에 공개하고, 비밀 키는 기밀로 유지해야 한다.

💡 보통 공개 키는 주소에 사용한다.

반대로 비밀 키로 암호화된 데이터를 공개 키로 해독하는 방식도 있다. 이 방법을 사용하면 공개 키는 누구에게나 공개되어 있기 때문에 중요한 데이터를 암호화하는 데에는 적합하지 않다. 그러나 데이터의 내용을 숨기는 것이 아니라, 디지털 서명을 하여 데이터의 무결성과 진위성을 검증해야 할 때는 비밀 키로 암호화하는 방식을 사용한다.

디지털 서명의 동작 방식

디지털 서명은 크게 해싱, 서명, 검증 세 단계로 나뉜다.

  1. 해싱

    원본 데이터를 해싱한다. 원본 데이터의 크기는 제각기 다를 수 있지만, 해싱되었을 때는 동일한 길이의 해시값을 가지게 된다. 원본 데이터를 해싱하는 것은 필수적인 것은 아닙니다. 해싱하지 않은 원본 데이터에 개인 키로 서명을 할 수도 있기 때문이다. 그러나 해싱을 함으로써 고정된 길이의 값을 비교하는 것이 무결성을 검증하는데 훨씬 간편하기 때문에 일반적으로 원본 데이터를 해싱한다.

  2. 서명

    공개 키 암호화 방식을 사용해 해싱된 데이터에 서명을 한다. 서명을 하는 방식은 다양하지만, 일반적으로 송신자의 개인 키로 해시값을 암호화한다. 이 암호화된 결과값이 바로 디지털 서명이다.

    디지털 서명은 개인 키로 암호화 되었기 때문에 공개 키로 복호화 할 수 있으며, 정상적으로 복호화 될 경우 원본 데이터의 해시값이 나오게 된다.

    서명이 완료되면 송신자는 원본 데이터와 디지털 서명, 송신자의 공개 키를 함께 전송한다.

  3. 검증

    수신자는 송신자의 공개 키를 가지고 디지털 서명을 복호화 한다. 디지털 서명이 송신자의 개인 키에 의해 암호화되었다면, 원본 데이터의 해시값이 나올 것이다. 그리고 수신자는 원본 데이터를 해싱하여 데이터의 해시값을 구한다. 이 두 해시값을 비교하여 만약 해시값이 맞다면, 데이터가 정상적으로 송신자에 의해 서명된 것임을 확인할 수 있다.

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

디지털 서명 시스템을 다음의 세 가지 요소를 필수적으로 갖추어야 한다.

  • 알고리즘
    디지털 서명 체계에서 사용되는 알고리즘은 신뢰할 수 있고, 널리 사용되어 그 안전성이 입증된 해시 함수와 암호화 알고리즘을 사용해야한다.
  • 구현
    디지털 서명 방식은 데이터의 무결성 및 진위성과 직결되기 때문에 결점 없는 시스템을 구현하는 것 역시 중요한다.
  • 개인 키
    개인 키가 유출되거나 손상될 경우, 진위성이 무효화된다. 특히 암호화폐에서 개인 키를 잃어버릴 경우 재정적 손실로 이어지기도 한다.

블록체인에서 디지털 서명은 송금을 위해 트랜잭션을 생성하여 서명하고 승인하는 데에도 사용된다. 특히 월렛 방식을 사용하는 비트코인에서는 개인 키를 소유한 사람만이 코인을 사용할 수 있기 때문에 개인 키를 안전하게 보호하는 것이 중요하다.

🔥다양한 암호화 기술

SHA

SHA는 Secure hash Algorithm의 약자로, 해시 암호화 알고리즘의 모음이다. SHA는 미 국가보안국(NSA)에서 1993년 처음으로 설계하였으며, 미국 국립표준기술연구소(NIST)에서 발전시켜 오늘날 미국의 국가표준으로 자리잡았다.

SHA의 종류로는 SHA-0, SHA-1, SHA-2, SHA-3 등이 있으며, SHA-0과 SHA-1에는 충돌이 감지되어 더이상 사용되지 않으며, 오늘날 가장 많이 사용되는 함수군은 SHA-2이다. SHA-2에는 SHA-224, SHA-256, SHA-384, SHA-512가 있다.

일반적인 암호화 알고리즘은 데이터를 숨기고 안전하게 전달하는 기밀성이 그 목적이지만, SHA의 목적은 데이터의 위변조가 불가능함을 보장하는 무결성이다. 실제 비트코인이나 이더리움에서 블록헤더, 디지털 서명, 공개 키에서는 데이터 무결성을 위해 SHA를 사용한다.

ECDSA

ECDSA(Elliptic Curve Digital Signature Algorithm; 타원곡선 디지털서명 알고리즘)은 공개키 방식 중 하나인 ECC(Elliptic Curve Cryptography; 타원곡선암호)에 디지털 서명 방식을 접목한 알고리즘이다.

ECC라는 공개키 암호 방식 알고리즘은 타원곡선으로 수학적으로 연결된 비대칭키(비밀키와 공개키)를 생성한다.

디지털 서명에서는 수신자가 송신자의 공개 키를 사용해 메시지를 검증하기 위해서는 디지털 서명을 필요로 한다. 디지털 서명은 비밀 키로만 생성 가능해야 하며, 수신자가 트랜잭션에 작성된 디지털 서명과 송신자의 공개키를 통해 송신자의 디지털 서명인지 판별할 수 있어야 한다.

HMAC

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

HMAC의 디지털 서명 공식은 다음과 같다.

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

공개 키 암호 방식에서는 개인 키로 원본데이터의 해시값을 서명하고, 공개 키로 이를 복호화하여 원본 데이터와 비교했지만, HMAC에서는 단일 키와 원본데이터로 만든 해시값이 서명의 역할을 한다.

PKI

PKI(Public Key Infrastructure, 공개 키 인프라)는 공개 키 암호 방식을 사용하여 디지털 인증서를 생성, 관리, 배포, 사용, 저장 및 해지하는 데 필요한 일련의 하드웨어, 소프트웨어, 정책, 프로세스와 절차의 집합이다. 즉, 비대칭키 이용해 송수신 데이터를 암호화하고 디지털 인증서를 사용하는 시스템을 총괄한다.

PKI는 대규모 사용자 집단에서 디지털 서명 및 암호화와 같은 기술을 사용할 수 있는 기반이다. PKI의 목적은 데이터를 안전하게 전송하는 것이며, 이를 위해 시스템 및 리소스 접근 권한, 데이터 보호, 트랜잭션 무결성 및 진위성, 기밀성을 보장한다.

💡 비밀키 암호 시스템이 송수신자 양측에서 똑같은 비밀키를 공유하는데 반해 공개키 암호시스템은 암호화와 복호화키가 다르다.
비밀키 암호시스템이 대칭키를 사용하고, 공개키 암호시스템이 비대칭키를 사용한다고 보면됨.

슈노르 서명

일반적인 디지털 서명에서는 공개 키, 서명할 메시지 및 서명이 포함되어 있으며 공개 키의 소유자가 주어진 메시지에 서명했음을 보여준다. 가령 여러 이해당사자가 하나의 메시지에 서명을 하기 원하는 경우, 각 이해당사자는 하나의 메시지에 서명과 공개 키를 포함해야 한다. 만약 3명의 당사자가 동일한 메시지에 서명하기 원하는 경우, 3개의 공개키와 3개의 서명이 포함될 것이다. 각 노드는 서명을 검증하는 과정을 3번 수행해야 하고, 블록은 3개의 공개키와 3개의 서명을 저장해야 하기 때문에 무거워진다.

슈노르 서명에서는 키 집합(key aggregation)을 사용한다. 슈노르 서명은 서명을 하는 당사자의 공개 키들을 결합하여 단일한 하나의 공개 키를 구성한다. 그리고 각 당사자의 개인 키를 사용하여 해당 메시지에 서명을 할 수 있다. 또한 당사자들의 서명을 결합하여 합쳐진 단일 공개 키로 풀수있는 단일 서명을 구성할 수 있다. 검증 노드가 당사자들이 모두 메시지에 서명했는지 확인할 때는 단일 서명과 단일 공개키로 확인할 수 있다.

슈노르 서명은 당사자들의 정보를 하나로 통합하기 때문에 개인 정보 보호에 유리하며, 블록 공간을 매우 절약하고, 검증의 속도를 빠르게 할 수 있다.

블록체인의 보안적 특징과 공격방식

기존 데이터베이스는 클라이언트-서버 아키텍쳐를 사용한다. 데이터베이스 관리자는 사용자가 데이터베이스에 대한 권한을 가지고 있는지 확인한 후 접근을 허용한다. 즉, 관리자에게 데이터베이스에 대한 통제권이 있는 것이다. 특정 관리자가 통제하는 데이터베이스에 관리 권한이 뚫리게 되면, 데이터베이스가 해커들의 공격에 의해 변경되거나 삭제될 수도 있다.

따라서 기존 데이터베이스에서는 데이터베이스의 무결성과 투명성을 관리자가 보장해야 하기 때문에, 이 관리자라는 단일 공격 지점이 뚫리게되면 데이터베이스에 큰 보안적 위험이 생긴다. 그러나 블록체인은 분산 시스템이기 때문에 각 노드들이 블록체인 사본을 가지고 있으며, 일부 노드에 문제가 발생해도 전체 블록체인 네트워크의 무결성은 보장된다.

그리고 클라이언트는 자신의 권한에 따라 CRUD라고 불리는 데이터 생성, 읽기, 업데이트, 삭제 작업을 수행할 수 있다. 그러나 블록체인은 오직 데이터를 읽거나 추가할 수만 있다.

이러한 기존 시스템과의 차이로 인해, 블록체인에 대한 공격 방식도 기존의 데이터베이스 공격 방식과는 다르다. 따라서 블록체인 공격 방식을 미리 알아두고 예방하는 것이 중요하다.

🔥블록체인의 보안적 특징

데이터 무결성

무결성은 데이터 베이스가 데이터의 정확성과 일관성을 유지하는 것을 의미한다. 블록체인에서는 합의 알고리즘을 사용해 데이터의 무결성을 보장한다. 합의 알고리즘을 통해 블록에 입력된 데이터에 대해 분산된 각 노드들이 모두 동일한 결과를 가질 수 있도록 한다 만약 네트워크에 악의적인 노드가 참여하더라도, 합의를 통해 노드가 블록을 변조하지 못하도록 하여 전체 네트워크의 신뢰도를 감소시키지 않도록 한다.

거래 투명성

퍼블릭 블록체인의 경우, 누구나 블록체인 네트워크에 접속해 트랜잭션 기록을 확인할 수 있습니다. 프라이빗 블록체인도 허가된 사용자라면 누구나 트랜잭션 기록을 볼 수 있다. 거래 기록을 공개적으로 접근할 수 있기 때문에, 네트워크 내의 모든 트랜잭션은 양성화 되어 있으며, 송금 과정을 투명하게 하기 위한 규제 비용을 절감할 수 있다.

감시 가능성

블록체인은 추가만 가능한(append-only) 데이터베이스로, 한번 블록이 체인에 올라가면 블록에 담겨있는 트랜잭션이나 데이터는 수정할 수 없다. 이 과정에서 핵심적인 기술이 바로 해싱이다. 만약 트랜잭션에 변경이 일어나면 머클 해시 값이 변경되므로, 블록체인에 대한 위변조 시도를 바로 발견할 수 있다.

🔥이중지불 문제

이중 지불 문제란?

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

비트코인과 이더리움이 이중지불문제를 해결하는방법은 이전 포스팅에서 자세히 다뤘다.

🔥51% 공격

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

51% 공격의 동작방식

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

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

51% 공격에 대한 대안

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

51% 공격 사례

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

🔥리플레이 공격

리플레이 공격이란?

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

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

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

리플레이 공격 대안

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

🔥이클립스 공격

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

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

이클립스 공격 동작 방식

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

이클립스 공격 대처 방법

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

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

크립토 재킹 공격

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

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

더스팅 공격

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

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

시빌 공격

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

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

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

  • DAO 사건
  • 채굴 취약점을 이용한 공격 (사례로)
  • 스마트 컨트랙트 해킹

The DAO 사건

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

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

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

패리티 멀티시그 동결 사건

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

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

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

profile
디버깅에서 재미를 추구하면 안되는 걸까
post-custom-banner

0개의 댓글