8 분 소요

블록체인 보안


블록체인의 보안적 특징

  1. 데이터 무결성
    • 무결성 : 데이터베이스가 데이터의 정확성과 일관성을 유지하는 것이다.
    • 블록체인에서는 합의 알고리즘을 사용해 데이터의 무결성을 보장한다.
  2. 거래 투명성
    • 퍼블릭 블록체인의 경우, 누구나 블록체인 네트워크에 접속해 트랜잭션 기록을 확인한다.
      • 프라이빗 블록체인도 허가된 사용자라면 누구나 트랜잭션 기록을 볼 수 있다.
    • 거래 기록에 누구나 공개적 접근이 가능하기 때문에 송금 과정을 투명하게 하기 위한 규제 비용 절감이 가능하다.
  3. 감시 가능성
    • 블록체인은 데이터 추가만 가능한 데이터베이스로, 한 번 블록체인에 올라가면 블록에 담겨있는 트랜잭션이나 데이터는 수정할 수 없다.
      • 해시 알고리즘으로 연결된 모든 블록의 무결성 검증에 사용한다.(e.g., merkle tree)

이중지불 문제

이중 지불이란, 디지털 현금 시스템 내에 동일한 하나의 자산이 두 명의 수신자에게 동시에 전송되는 문제를 의미한다.

이중지불 문제를 막는 방법


중앙화된 접근법(데이비드 차움의 eCash)

  1. 사용자가 은행에 일정 금액을 입금하면, 은행은 이를 일정 개수의 숫자(서명포함)들로 교환한다.
    • 여기서 숫자는 지폐와 같은 역할, 사용자는 자신의 숫자를 추적할 수 없도록 각 숫자에 은닉요소를 추가한다.
  2. 사용자가 은닉 요소를 해제하고 숫자로 상인에게 돈을 지불하면, 해당 사용자가 이 숫자를 다른 곳에 또 쓰기 전에 은행에 이 숫자에 대한 소유권 청구한다.
  3. 은행은 숫자에 있는 서명이 유효한지 확인한 후, 상인에게 해당 숫자의 값만큼 현금을 입금한다.
  4. 사용한 숫자를 소각한다.

-> 이러한 과정은 은행 자체가 단일 장애 지점이기 때문에 은행에 문제가 생길 경우 결제 시스템 전체에 문제가 발생한다.

탈중앙화된 접근법

  • 블록체인은 노드라고 불리는 네트워크 참여자들이 서로 동일한 데이터베이스 사본을 가지고 트랜잭션을 기록하고 감시함으로써 이중 지불을 시도하는 트랜잭션과 같은 부정직한 행동을 쉽게 감지한다.
  • 트랜잭션이 체인에 올라가면 새로운 사용자에게 소유권이 할당되기 때문에 코인은 이중지불 될 수 없다.
    • 이 때, 트랜잭션이 블록에 담기고 블록이 체인에 연결되어야 실제 송금이 완료된다.
      • 그러나 실제로 블록에 있는 트랜잭션이 수정이 불가능하다고 판단되어 온전히 완료하는 시점은 블록이 체인에 올라가고 자신의 뒤에 블록이 일정 개수 이상 연결된 시점으로, 컨펌 횟수라고 한다.
      • 비트코인의 경우 컨펌 횟수는 6으로, 블록 생성 주기가 10분이기 때문에 트랜잭션이 완료되는 시점은 블록이 체인에 올라간 후 1시간이 지난 시점이다.

비트코인 이중 지불


그러나 트랜잭션을 승인하는 노드를 겨냥한 소규모 이중 지불 공격도 존재한다.

51% 공격

  • 단일 주체나 조직이 50% 이상의 해시 레이트를 가지게 될 경우, 이들은 원치 않는 트랜잭션을 배제하거나 트랜잭션 순서를 조작할 수 있다. 네트워크 규모가 작은 네트워크에서 발생할 수 있다.

레이스 공격

  • 동일한 자금을 사용하는 두 개의 충돌하는 트랜잭션이 연속으로 전송되지만, 자신에게 이익이 되는 트랜잭션만 승인되는 것이다.
  • 수신자가 체인에 올라가지 않은 트랜잭션을 결제로 수용할 때 가능하다.

핀니 공격

  • 공격자는 네트워크에 즉각적으로 트랜잭션을 전송하지 않고, 코인을 자신의 다른 지갑으로 전송하는 트랜잭션을 미리 생성해두고, 블록을 미리 채굴해두어 해당 블록에 기록한다.
  • 동일 코인을 다른 트랜잭션에 사용하는 대신, 이전에 채굴한 블록만을 전송하며, 결제는 무효화된다.
  • 특정한 순서에 따라 사건이 발생해야 하며, 수신자는 체인에 올라가지 않은 트랜잭션을 수용해야 한다.

51% 공격

51% 공격은 단일 주체나 조직이 대다수의 해시 파워를 제어하여 네트워크를 중단시킬 수 있는 공격이다. 공격이 발생하면, 자신이 발생시킨 트랜잭션을 되돌릴 수 있고, 트랜잭션의 일부나 전부가 승인 못하도록 하거나 채굴자들이 채굴하지 못하도록 하고 채굴 작업을 독점할 수 있다.

51% 공격 동작 방식(e.g., ETC)


  1. 공격자는 이더리움 클래식 네트워크에 접속한다.
  2. 공격자의 노드는 50% 이상의 높은 해시 파워로 채굴을 시작한다. 이 때, 블록체인 네트워크에 노드로 접속하게 해주는 클라이언트 프로그램을 수정해서, 채굴한 블록들을 네트워크에 전파하지 않고 혼자 가지고 있는다.
    • 이 때, 공격자는 높은 해시 파워로 현재 네트워크보다 빠르게 블록을 생성한다.
  3. 이 상태에서, 공격자들은 정상 네트워크에 트랜잭션을 발생시킨다.
  4. 이 경우, 공격자들이 생성한 블록의 길이가 더 길기 때문에, 공격자는 자신의 체인을 블록체인에 전파가능하게 되고, 기존의 블록들은 고아 블록이 되어 취소된다.(체인의 재구성)

-> 이중 지불 문제와 같이 문제가 발생할 수 있게 된다.

51% 공격에 대한 대안


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

51% 공격 사례


  1. 버지(Verge) : 버지 코인 탈취 문제
  2. 모나코인(Monacoin) : 블록 보류 공격 발생, 최대 20 블록까지 재구성되는 등 대규모 체인 재구성 발생
  3. 비트코인 골드(Bitcoin gold) : 비트코인 골드 탈취, 피해를 막기 위해 하드 포크 진행
  4. 젠 캐시(Zen Cash) : 블록 보류 공격 발생, 이중 지불 피해 발생, 해시 난이도를 높여 추가 공격을 막음
  5. 이더리움 클래식(Ethereum Classic) : 이중 지불 공격 발생, 컨펌 횟수를 400회까지 늘려 공격을 막음

리플레이 공격

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

리플레이 공격 동작 방식


1

  1. 앨리스는 밥에게 자신의 계좌와 함께 해당 계좌로 송금 요청을 한다.(이 때, 밥은 앨리스를 신뢰하기 때문에 송금을 진행한다고 가정)
  2. 공격자는 앨리스의 통신 메시지를 스니핑하여 앨리스의 계좌를 공격자의 계좌로 변조 후, 밥에게 전송한다.
  3. 밥은 메시지의 계좌에 송금을 진행한다.
  4. 메시지의 계좌는 공격자의 계좌로 변조되어 있는 상태였기 때문에 공격자가 앨리스 대신 송금을 받는다.

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


하드포크가 진행되면, 원장 데이터는 하드 포크 이전 버전과 이후 버전으로 나뉘게 된다. 하드포크 이후 A체인과 B체인이 생성되었다면, B체인 트랜잭션은 A체인에서도 유효하다.

따라서 A와 B 모두 계정이 있는 사용자는 B에서 트랜잭션 발생 시, A체인에서 누군가가 해당 트랜잭션을 탈취해 브로드캐스팅하면 A체인에서도 해당 트랜잭션이 처리된다.

이러한 점을 악용하면 A와 B 체인에 계정이 있는 사용자는 A 체인에서 송금을 하는 트랜잭션을 탈취당하면, B체인에서도 송금이 이루어져 의도하지 않은 출금이 이루어진다.

리플레이 공격 대안


세션 식별자 추가

  • 통신 당사자 간 일회용 토큰을 해싱한 값을 공유하여 리플레이 공격을 방지한다.

일회용 비밀번호

  • 아주 짧은 세션 기간을 가진 비밀번호를 두 통신 당사자가 공유하여, 공격자가 가로채 재사용하지 못하도록 한다.

타임 스탬프

  • 송신자는 네트워크에 시간을 MAC과 함꼐 브로드캐스트하고, 수신자는 통신을 요청할 때, 자신의 통신 메시지에 송신자가 브로드캐스트한 시간을 기준으로 예상 시간을 포함해 인증을 진행한다.

이클립스 공격

이클립스 공격은 공격자가 네트워크 상의 노드를 방해하기 위한 공격으로, 정교한 공격을 준비하기 위해 네트워크에 혼란을 야기시킬 때 주로 사용한다. 이 때, 전체 네트워크를 공격하기보다 특정 노드를 격리해 정직한 다른 노드로부터 정보를 수신받지 못하게 하여 여러 악의적인 공격자 노드가 네트워크를 독점한다.

이클립스 공격 동작 방식


블록체인에서 노드는 다른 노드들과 동시적으로 연결될 수 없으며, 대신 제한된 인접 노드들과 연결되어 있다. 노드들이 데이터를 공유할 때는 모두가 동시에 공유하는 것이 아니라, 하나의 노드에서 주변 노드로 점점 퍼져나가는 브로드캐스트 방식을 사용한다. 이를 악용하여 공격자는 공격 대상의 이웃 노드들을 자신의 노드로 구성하여 공격 대상 노드가 가짜 트랜잭션이 담기 블록을 받도록 한다.

엔지니어링 블록 레이스

  • 블록 레이스는 채굴 노드들이 가장 먼저 유효한 논스 값을 찾아 블록을 생성하는 경쟁을 의미한다.
  • 이클립스 공격에서 이클립스 공격 대상 노드와 공격자의 노드가 동시에 블록을 생성한 경우, 공격 대상 노드가 생성한 블록을 숨김으로써, 공격자의 블록이 네트워크에 올라갈 수 있도록 한다.

채굴 파워 분할

  • 공격자가 51% 공격을 위해 네트워크의 전체 채굴 파워를 쪼갠다.
  • 이러한 방식으로 공격자의 채굴 파워가 네트워크의 쪼개진 채굴 파워보다 커지게 되면 쉽게 51% 공격을 개시할 수 있다.

N - 컨펌 이중 지불

  • 이클립스 공격자에 의해 여러 채굴 노드들이 공격 대상이 되어 격리된 경우, 공격자는 자신의 트랜잭션을 이클립스 공격 대상인 채굴 노드에게 제공하여 블록체인에 추가하도록 한다.
  • 이 노드들은 이후에도 블록을 계속 생성하면서 공격자의 트랜잭션이 든 블록이 컨펌되도록 한다.
  • 컨펌으로 트랜잭션이 완료되면 해당 블록들을 전체 네트워크에 공유하여 고아 블록이 되도록 한다.

이클립스 공격 대체 방법


무작위 노드 선택

  • 노드가 피어를 선택할 때 무작위가 아닌 경우, 공격자가 자신 주변의 노드를 공격 대상으로 선택할 수 있게 된다.
  • 이를 방지하기 위해 노드가 피어를 랜덤하게 선택하게 하여 공격자가 공격 대상 노드를 정하기 어렵게 한다.

정보 저장

  • 노드가 다른 노드에 대한 정보를 기억하도록 하면, 해당 노드가 네트워크를 떠났다가 재접속했을 때, 이전에 연결했던 정직한 노드와 연결하여 정직한 피어 관계를 지속할 수 있다.

연결 수 늘리기

  • 하나의 노드에 연결된 피어 개수를 늘리면, 노드가 정직한 노드에게 연결될 가능성이 커진다.

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

크립토재킹


크립토재킹이란 감염된 피해자의 장치를 사용해 암호화폐를 채굴하는 것을 말한다. 감염된 피해자는 자신도 모르는 새에 채굴을 시작하고, 공격자는 피해자의 해시 파워를 사용해 채굴 보상을 받는다. 암호화폐 채굴에는 많은 해시 파워가 필요하기 때문에 공격자들은 최대한 많은 피해자를 감염시켜 저위험, 저비용으로 채굴을 위한 컴퓨터 자원을 모은다.

웹 기반 크립토재킹

  • 웹 기반 크립토재킹은 웹 사이트 내에서 실행되는 스크립트를 통해 악성 채굴 프로그램을 실행하며, 사용자가 웹 사이트에 머물러 있는 동안 브라우저를 통해 자동으로 채굴하도록 한다.
  • 웹 기반 크립토재킹은 채굴을 위해 많은 해시 파워가 필요하지 않고, 프라이버시와 익명성 수준이 높아 거래를 추적하는 것이 어려운 모네로를 많이 채굴한다.
    • Ex. 코인하이브

더스팅 공격


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

동작 방식

  • 일반 사용자들의 주소로 아주 적은 양의 금액을 보내 많은 주소를 더스팅한다.
  • 이후 해당 송금 트랜잭션과 더스팅된 지갑들의 트랜잭션을 추적한다.
    • 일반적으로 개인 지갑은 출금을 위해 거래소 지갑과 연결되어 있기 때문에, 트랜잭션을 추적하다보면, 결국 지갑을 소유한 개인이 누구인지 알 수 있다.
    • 비트코인 사무라이 지갑 개발자들은 더스팅 추적을 실시간으로 알려주는 등, 더스팅 공격 방지를 지원했다.

시빌 공격


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

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

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

The DAO 해킹


The DAO는 DAO 거버넌스의 초기 구현체이며, DAO는 블록체인 기반의 협동 조직으로, 코드로 규칙을 설정하고 실행한다.

이더리움 프로토콜 개발자인 크리스토프 젠츠는 집단화된 이더리움 투자 조직을 위한 코드를 오픈 소스로 공개하였으며, 이에 기반하여 The DAO는 이더리움으로 교환하는 방식으로 DAO토큰을 판매하여 자금을 조달했다.

그러나

  1. DAO 스마트 컨트랙트를 만든 개발자들이 재귀적 호출 가능성을 고려하지 않고 코드를 작성
  2. 스마트 컨트랙트가 송금할 때, 자신이 가지고 있는 자금을 송금한 후에, 컨트랙트 내 잔액을 갱신하는 순서로 구성

의 코드 문제로 스마트 컨트랙트 자금을 송금한 후, 잔액을 갱신하기 전에 재귀적 호출을 하게 될 경우, 컨트랙트는 계속 자금을 송금만 하고 잔액을 갱신하지 않게 될 수 있었다.

이러한 점을 악용하여 공격자는 자금을 빼돌리려고 했으나, 자금은 28일간 계좌에 홀딩되어야 하므로 공격자가 해당 자금을 빼돌릴 수 없었다.

이는 이더리움의 하드 포크 계기가 된다.

패리티 멀티시그 지갑 동결 사건


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

멀티시그는 스마트 컨트랙트 소스 코드의 형태로 사용자에게 배포된다. 누군가가 이 스마트 컨트랙트를 가지고 싶을 때는 레포지토리에서 최신 코드를 가져와 이더리움 블록체인에 해당 컨트랙트를 배포하고, 다음 소유자를 설정하고, 자금을 배치하는 방식이다. 이 때, 각 지갑은 이 소스 코드의 개별 인스턴스가 된다.

패리티의 경우, 자금을 인출할 수 있는 인출 함수 등과 같은 스마트 컨트랙트의 필수적인 로직들은 WalletLibrary에 있었는데, 라이브러리를 사용한 코드 분리는 가스 수수료를 절감하는 등의 장점이 있지만, 라이브러리에 결함이 있다면, 해당 라이브러리를 사용하는 모든 컨트랙트에 영향을 미치게 된다.

이를 악용하여 한 공격자는 라이브러리를 지갑화하여 해당 지갑을 파괴하는 공격이 이루어졌으며, 해당 라이브러리를 사용하는 모든 컨트랙트가 무용지물이 되어, 멀티시그 지갑들이 동결되는 사건이 일어났다.

본 포스팅은 코드스테이츠 BEB 과정을 수강하며 작성한 글입니다.