리패키징이 얼마나 쉬운지 10분만에 안드로이드 리패키징을 직접 해보겠습니다.

앵그리버드 앱에 SMS를 탈취하는 코드를 삽입 후 리패키징하는 작업을 할 건데요,

프로그래밍적인 지식은 딱하나만 들어갑니다. SMS를 후킹하여 탈취하는 코드 하나 짜야합니다. 이건 미리 짜놓은 것으로 사용하여 10분안에 마칠 겁니다. 관련 코드는 인터넷만 검색해도 아주 쉽게 만들 수 있거든요.

앵그리버드앱 설치부터 리패키징까지의 전 과정인 10분짜리 동영상을 참고해주시고 아래 내용은 요약입니다.


리패키징 시나리오

- 앵그리버드 앱에 SMS를 탈취하는 코드 삽입하는 리패키징


1. 구글플레이에서 앵그리버드 설치

2. 앵그리버드 설치파일 추출

3. APKTOOL을 사용하여 리버싱(smali 코드추출)

4. 삽입할 코드(SMS탈취목적)를 작성 후 빌드(SMS Hooker)

5. SMS Hooker 설치파일을 APKTOOL로 리버싱하여 SMS를

    탈취하는 smali코드 준비

6. 앵그리버드 코드에 준비한 SMS 후킹 코드 추가

7. 앵그리버드 리패키징(재빌드)하여 설치

8. SMS 탈취 기능 테스트



환경구축

  • 테스트 폰 2대 : 한 대는 리패키징 앱을 설치, 한 대는 SMS를 탈취하여 수신할 테스트 폰(해커입장의 폰)
  • 안드로드 개발환경(스튜디오) : SMS 리시버에 SMS 수신시 테스트폰으로 수신SMS를 전송하는 앱 빌드
  • APKTOOL : 공개용 안드로이드 리버싱 툴


리패키징 따라하기

제가 직접 만들어 본 동영상입니다. 글로도 설명을 자세히 하고 싶지만, 다음 기회에...^^;




결론

동영상과 같이 특별히 전문적인 기술이 없더라도 안드로이드 리패키징은 매우 간단합니다. 물론 목적에 따라 복잡해질 수도 있지만요. 

안드로이드 악성코드의 대부분이 이 리패키징을 전제로 하는 경우가 많습니다. 리패키징은 남이 만든 앱을 자신이 만든것처럼 하여 저작권을 침해하기도하고, 악성코드 삽입을 목적으로 하기도 합니다.

이러한 리패키징앱이 많이 유통되는 원인 중 하나는 구글의 앱스토어 개방 정책입니다. 애플과 달리 안드로이드의 앱스토어는 전세계에 엄청나게 많습니다. 우리나라만 해도 통신사별로, 포탈별로, 폰 제조사별로 앱스토어가 존재하기 때문에 리패키징 앱을 다른 스토어에 올려 마치 원래 앱인 것처럼 위장하기 참 좋은 환경이죠.

오늘은 안드로이드를 중심으로, 모바일 보안 취약점 점검 기준에 대한 이야기를 하고자 합니다. 예를 들어, 신규 서비스를 위해 모바일 앱을 배포할 경우 보안담당자라면 취약점 분석평가를 기업 자체적으로 하거나 보안컨설팅 전문업체에 의뢰해서 모바일 보안 취약점을 평가하겠죠. 이 때 점검기준에 의해 결과보고서가 나올 텐데, 보안 담당자는 각 점검기준에 대한 최소한의 이해가 필요합니다. 그래야 취약점분석 결과보고서에 있는 각 이슈에 대해 정확한 이해를 바탕으로 그에 적절한 수준의 대응책을 마련할 수 있을 것입니다. 


모바일 보안의 중요성

스마트폰을 이용해서 인터넷뱅킹, 주식투자, 게임 등 못하는 것이 없죠. 어느새 PC보다도 더 많이 사용하는 것 같습니다. 게다가 핀테크 활성화가 시작되면서 간편결제 등 PC로 못하는 것까지 스마트폰으로 하고 있죠. 이렇듯 스마트폰에서 금융거래와 같은 중요정보를 처리하려다보니 NFC기반의 IC태깅기술, FIDO기반의 생체인증, 하드웨어기반의 TEE 등 다양한 보안기술을 도입하여 편의성을 증대하면서도 보안성을 확보하려고 노력하고 있죠. 꼭 이처럼 별도의 하드웨어까지 활용하지 않고 순수 소프트웨어만으로 구현한 간편송금앱 TOSS나 뱅크월렛카카오와 같은 서비스도 점점 많아지고 있습니다. 이렇게 스마트폰의 역할이 중요해질수록 공격대상으로서의 가치는 올라가고, 실제 모바일 악성코드 및 해킹사례들이 늘고 있는 추세입니다. 최근에는 이상거래탐지시스템(FDS)과 같이 백엔드에서도 열심히 보안을 강화하고 있지만 그래도 클라이언트(스마트폰)에서의 보안이 여전히 중요한 건 변함없을 것입니다.


모바일 보안 취약점 점검 기준 파헤치기

전자신문 기사에 의하면, 2013년 금융감독원에서 '스마트폰 금융 안전대책 이행실태 체크리스트'를 배포하면서 금융 모바일앱을 점검하도록 하였습니다.


[기사 일부 발췌]

"11일 당국과 업계에 따르면 최근 금융감독원은 시중 금융 전(全) 업권 80여곳에 `스마트폰금융 안전대책 이행 실태점검 체크리스트`를 발송하고, 점검 결과를 4월까지 반송하라고 통보했다."


물론, 이 기준이 모든 앱에 대해 보안측면의 만병통치약이라고 할 수도 없습니다. 특히 최근에는 보안이슈를 클라이언트에서만 해결하려던 과거의 분위기에서 기업 자율보안체계로 패러다임이 변화되고 있는 추세에서 이 기준을 반드시 만족시켜야 한다는 법은 없다고 생각합니다. 그렇다고 스마트폰에서 모바일앱에 대한 보안이 중요하지 않다는 뜻이 아니며 오히려 자율보안체계에서는 상황에 따라 적절히 필요한 기준을 적용해야할 것이고, 보안담당자는 이러한 기준의 의미를 정확히 알고 있어야 합니다.


점검기준 요약은 아래 표와 같습니다.


스마트폰 금융안전대책 이행실태 체크리스트


위 점검기준 외에도 앱 특성에 따라 적절한 점검기준이 적용될 수 있겠지만 오늘은 금감원에서 배포한 기준을 하나씩 살펴보겠습니다.


백신프로그램 적용

앱 실행 시 백신모듈을 탑재하거나 백신앱을 연동하는지에 대한 내용입니다. 요새는 모바일 보안 패키지에 기본적으로 포함되는 것 같더라구요. 앱 내 백신을 라이브러리 형태로 포함하기도 하고, 안랩의 V3Mobile과 같이 독자 앱을 연동하기도 합니다. 백신앱 구동여부 외에도 앱 사용 도중 백신앱을 강제종료시켰을 때 이를 인지하는지도 포함하여 점검하기도 합니다.

그렇다면, 백신앱은 어떤 의미를 가질까요? 백신앱은 PC환경에서와 마찬가지로 잘 알려진 악성코드(앱)를 탐지합니다. 여기서 '잘 알려진' 이란 누군가가 악성앱으로 인해 피해를 입었고 그것이 백신업체에 신고 및 수집되어 알려지게 되는 것입니다. 최초 알려지더라도, '수집->분석->배포' 단계에 이르기까지 시간이 소요될수밖에 없으니 최신 백신엔진이 배포되기 전까지는 백신이 해결해줄수도 없는 노릇이죠. 그나마 최신업데이트라도 열심히 한다면 배포단계 이후에 최신백신이 바로 적용되겠죠.


여기서 잠깐 안드로이드와 iOS환경에서의 백신얘기를 좀 하자면, 애플앱스토어에는 백신앱을 등록할 수 없습니다. 애플은 앱스토어에 등록대기 중인 앱에 대해 전수조사를 철저히 하기 때문에 백신앱이 필요없고 인정하지도 않습니다. 사실 애플은 앱스토어를 개방하지 않고 애플앱스토어 하나만 인정하며 블랙마켓(애플앱스토어가 아닌 앱스토어)으로부터의 앱 설치를 차단하고 있습니다. 블랙마켓앱을 설치하려면 애플의 통제에서 벗어나기위해 JailBreak를 하죠. 반면, 안드로이드는 어떨까요? 구글도 구글플레이(구글앱스토어)에 등록대기중인 앱을 당연히 검사합니다. 하지만 애플만큼 까다롭지 않고 더 중요한 것은 앱스토어를 개방한다는 것이죠. 우리나라만 해도 각 통신사별, 각 제조사별로 앱스토어가 별도로 있으며 포탈업체도 앱스토어를 운영하니 전세계적으로 Third Party 앱스토어가 엄청 많겠죠. 게다가 설정에서 '알수없는 소스' 항목만 체크하면 아무 URL을 통해서도 다운받은 앱도 설치할 수 있습니다. 이로 인해 안드로이드는 스미싱으로 인한 악성앱 설치유도도 상당히 많죠('알수없는 소스' 체크를 못하도록만 막아도 스미싱은 급격하게 줄 것입니다). 그래서 안드로이드는 백신앱이 많이 있습니다. 참고사항이지만, V3Mobile은 국제인증인 AVT에서도 좋은 결과는 내놓고 있구요.


입력정보 보호대책

비밀번호, 주민번호 등 중요정보를 사용자가 입력 시 노출되지 않도록 가상키패드 등을 적용하는 것입니다. 앱내 단순 텍스트창에서 중요정보를 입력하고 마스킹처리를 하더라도 그것은 UI상에서만 안보일 뿐 실제 실행되는 앱의 프로세스에 할당된 메모리 내에는 평문으로 들고 있을 경우 메모리 덤프 등을 통해 중요정보를 해커가 가져갈 수 있기 때문입니다. 물론 뒤에서 설명할 '루팅' 된 환경에서 입니다. 가상키패드의 역할은 사용자가 입력하는 키값을 종단간암호화(E2E)를 하는 것입니다. 키패드에서 키값 하나 하나를 입력할 때마다 그 값을 즉시 암호화하고 입력 종료 시 전송하면 서버에서 값을 복호화합니다. 당연히 가상키패드는 서버모듈이 있을 테고 둘 사이에 매번 변하는 키값을 사용해야 합니다.


가상키패드를 사용하더라도 유의할 점이 있습니다.

- 가상키패드가 실행 시 매번 자판의 배열이 랜덤하게 변하는지

- 혹시 랜덤하게 변하는 규칙에 대한 설정을 앱내 설정파일에 저장하고 있어 이를 수정할 경우 고정자판이 되는건 아닌지

- 가상키패드에서 열심히 E2E를 하지만, 적용을 제대로 못해서 평문으로도 들고 있어 메모리상에 노출되거나 디버깅로그가 남지 않는지

- 입력값 암호화 키를 고정키를 사용하고 있어 재사용공격이 가능하지 않는지 등


금융정보 종단간 암호화

앞에서도 설명한 E2E암호화에 대한 내용입니다. E2E암호화는 네트워크 암호화 전송보다 조금 더 강한 보안요구사항이지요. 네트워크암호화는 클라이언트와 서버 중간의 네트워크 영역에서 스니핑 등을 통해 중요정보가 노출되는 것을 방지하는 것이지만, E2E는 중요정보가 네트워크로 나가기 전부터 스마트폰 내(클라이언트) 다른 프로세스에 의해서도 중요정보가 노출되는 것을 방지하기 위한 것입니다. 비밀번호부터 개인정보까지 굉장히 중요한 정보를 네트워크 암호화와 별도로 E2E암호화를 요구하는 것입니다.


폰 임의개조 탐지 및 차단

안드로이드의 '루팅', iOS의 'JailBreak' 탐지에 해당합니다. 대부분의 스마트폰OS는 Sandbox개념을 도입하여 보안을 유지하는데 루팅이라는 것은 이것을 깨는 행위입니다.

루팅을 살펴보기 전에, 안드로이드의 보안 아키틱처에 해당하는 Sandbox 개념을 살펴보겠습니다.


<Sandbox 개념>



샌드박스 개념 1

<출처: 안랩>


스마트폰에 앱을 설치하면 위 그림처럼 앱마다 UID/GID가 다릅니다. 각 앱마다 다른 ID를 부여하고 각 ID별로 서로의 자원에 접근하지 못하도록 통제하는 것이죠. 아래 그림은 서로 다은 앱에 대한 Sandbox 상세 개념도 입니다.


<출처 : IBM>


위 그림에서 서로 다른 앱의 ID는 12345, 54321 이고 각 앱별로 File, DB, SMS, Sensors 등을 OS(안드로이드 커널은 Linux커널)에서 제공합니다. 예를 들어, 왼쪽 앱(ID:12345)이 생성한 파일을 오른쪽 앱(ID:54321)이 접근할 수 없도록 안드로이드가 통제를 합니다. 쉽게 말해서 자신만 실행되고 있는 박스에서 각각 실행된다고 생각하면 됩니다. 물론, 필요하면 서로 공유하거나 연동할 수 있도록 OS는 다양한 메카니즘을 제공하지만 기본적인 구조는 박스처리해서 서로 접근이 불가하도록 만드는 것입니다.


이러한 Sandbox가 완벽하게 보장된다면, 사실 앱은 중요정보를 파일에 평문으로 저장해도 되겠죠. 아무도 보지 못하고 해당 앱만 접근이 가능하니까 기밀성은 충분히 확보되는 셈이죠. 하지만 Sandbox가 완벽하게 보장되지 않기 때문에 이러한 보안 요구사항들이 나오게 됩니다. Sandbox를 보장하지 않는 대표적인 것이 루팅입니다. 시스템에는 root라는 계정이 있습니다. 모든 권한을 가진 수퍼유저계정이죠. 루팅이라는 것은 root권한을 획득하는 것을 의미합니다. 예를 들어, 처음 스마트폰을 사면 root권한은 오픈되지 않습니다. 하지만, 스마트폰 사용자는 단말의 제약을 풀기위해(특히, iOS) 루팅도구(테그락 등)를 이용해 루팅을 직접하는 경우도 있고, 악성코드에 의해 본인도 모르게 루팅이 되는 경우도 있습니다. 

경우가 어떻든, 루팅이 되면 언제든지 Sandbox의 통제를 벗어나 스마트폰 내 모든 권한을 보유하게 되고 다른 앱들의 저장파일은 물론 디버깅, 메모리덤프 등 원하는 작업을 할 수 있게됩니다. 이처럼 보안 아키텍처가 완벽히 보장되지 않기 때문에 백신도 설치하라고 하고, 가상키패드도 쓰고, 종단간 암호화, 뒤에 나올 앱위변조 등에 대해 대응을 하라는 것이죠.


취약점 점검하는 전문기관에서 진단을 시작하려면 루팅을 가장 먼저 시도할 것입니다. 중요정보를 파일에 저장하는지 점검하려면 점검자부터 root권한이 필요하기 때문이죠. 루팅만 100% 막아도 어느정도 루팅을 전제로 이어지는 공격들을 상당부분 막을 수 있게됩니다. 하지만 루팅을 100% 탐지하는 경우는 드뭅니다. 예를 들어, 최악의 경우 루팅탐지를 아무리 잘하더라도 루팅탐지 모듈을 무력화시키도록 수정 후 동작할 수 있습니다. 이는 앱 위변조에서 막아야 하지만 이것 또한 100% 탐지는 어렵습니다. 창과 방패와 같은 이치라고 보면 됩니다. 그래서 루팅탐지는 진화하는 루팅방법들은 신속하고 지속적으로 대응할 수 있는 체계구성이 중요합니다.

루팅탐지는 다양한 요소를 확인함으로써 탐지합니다. 예를 들어, 루팅도구 앱 설치여부, 관련 프로세스 실행 여부, su파일 존재 여부, adbd의 root권한 실행여부 등으로 탐지하는데 루팅탐지를 우회하며 진화하는 루팅도구들을 효과적으로 탐지하기 위한 노력이 지속적일 수 밖에 없습니다. 몇년 전에 이런 경우도 있었습니다. 어떤 제조사의 안드로이드 단말에 출고시부터 su파일이 포함되어 있었고 su파일을 실행해보니 패스워드가 걸려있었습니다. 해당 제조사는 패스워드가 걸려 있으니 su파일이 있어도 괜찮지 않냐며 유지보수용으로 넣어둔 것이고 했습니다. 이것은 루팅을 위한 대표적 백도어라고 할 수 있죠. 제조사가 악의적 목적이 아니라고 하더라도 언제든지 악의적인 목적으로 사용될 수 있는 백도어이기 때문에 출시부터 루팅단말이라고 할 수 있죠. 제조사에서 루팅에 대한 이해가 부족해서 그러지 않았나 하는 상황이였습니다.

루팅 얘기를 너무 많이 했는데요, 루팅관련 내용은 기회되면 한 번 정리해보도록 하고 다음으로 넘어가겠습니다.


앱 무결성 검증

안드로이드의 앱 무결성에 대한 대상을 열거하면 APK파일, DEX파일, so파일, ODEX파일 등이 있습니다. 여기에 리소스파일(이미지파일 등)도 포함하긴 하지만 리소스파일보다 실행파일이 더 중요한 대상입니다. 


  • APK파일

안드로이드 설치파일인 APK파일을 이용해서 앱이 설치되면 APK파일이 그대로 시스템에 저장됩니다. 이 파일에 대한 무결성을 확인해야 합니다.


  • DEX(Dalvik Executable)파일 / ODEX파일

APK파일은 단순히 PKZIP 압축파일일 뿐이고, 압축해제하면 classes.dex파일이 하나 있습니다(경우에 따라 2개 이상일 수도 있습니다만). 이것이 실제 안드로이드 실행파일입니다. JAVA로 구현된 코드가 들어있죠. 앱이 설치되면 실제 단말의 시스템환경에서 빠르게 동작하기 위해 시스템 최적화된 DEX파일인 ODEX파일도 함께 생성됩니다.


  • SO파일

공유라이브러리 파일입니다. DEX파일은 Dalvik이라는 가상머신에서 실행되는데 so파일은 가상머신이 아닌 Native환경에서 실행되는 코드입니다. 보통 가상머신에서 동작하는 DEX파일은 리버싱이 너무 쉽기 때문에 암호모듈이나 인증모듈 등 중요한 모듈은 상대적으로 리버싱이 어려운 SO파일로 구현하는 경우가 많습니다.

 

그리고 가끔 라이브러리를 제공받아 사용하는 경우 JAR파일에 대한 무결성 얘기를 하는 사람도 있는데, JAR파일은 소스레벨에서 의미가 있고 안드로이드 빌드 시 모두 DEX파일에 포함되기 때문에 앱 실행 시 JAR자체에 대한 무결성을 확인하는 것은 불가하고 무의미합니다.


무결성확인도 역시 창과 방패의 이야기입니다. 앱 스스로 자신이 무결한지 확인하는 것 자체가 무리가 있습니다. 무결한지 확인하는 코드 자체가 삭제되거나 무력화될 가능성이 높기 때문에, 앱(클라이언트)뿐만 아니라 서버까지 서로 연결되어 타이트하게 무결성을 확인하는 등 앱 무결성확인을 위해 다양한 기법이 적용되고 있습니다.


<리패키징(Repackaging)>

앱 무결성에서 리패키징 얘기가 빠질순 없죠. 리패키징은 남이 배포한 APK파일을 마치 내가 개발하여 배포하는 것처럼 다시 패키징하는 것을 의미합니다. 안드로이드환경에는 리버싱(역공학) 관련 도구가 상당히 많아(apktool, dex2jar, jd-gui 등) 너무 쉽게 APK파일을 디컴파일하고 원하는 내용 수정 후 다시 컴파일할 수 있습니다. 


리패키징

<출처 : 안랩>

  

리패키징을 하는 목적을 크게 2가지로 분류하면, 악성코드 삽입 및 지적재산권침해(남이 만든 앱을 이용하여 광고수입 가로채기 등)입니다. 리패키징을 하려면 반드시 APK파일에 서명을 해야하는데 서명에 사용되는 개인키는 유출되지 않는다는 전제로, 리패키징하게 되면 반드시 원본앱(원작자의 서명)과 서명(리패키징한 사람의 서명)이 달라질 수 밖에 없습니다. 따라서 APK파일에 대한 무결성을 확인할 때 APK에 대한 서명부터 확인하는 것이 가장 좋겠지요. 리패키징에 대한 얘기는 너무 길어 이정도로하고 넘어가겠습니다.


코드 모듈 보호

대표적인 것이 코드난독화 및 디버깅방지(역분석방지)겠죠. 난독화는 말 그대도 코드를 읽기 어렵게 만드는 기술입니다. 개발자에게 코드의 가독성이란 엄청 중요한 요소인데 난독화는 오히려 반대개념이죠. 코드 가독성을 떨어뜨려 앱을 디컴파일해서 소스를 보더라도 로직분석이 잘 안되게 만드는 기술입니다. 안드로이드에서는 기본적으로 제공하는 proguard라는 난독화 도구가 있습니다. 다른 상용제품보다 난독화 수준은 조금 떨어지긴 합니다. 참고로, 난독화는 소스코드작성 시에 적용하는 것이 아니라 빌드 시에 적용하는 것입니다. 개발할 때는 가독성 및 모듈성을 고려하여 개발하고 빌드 시 가독성을 떨어지게 만드는 것이죠. 코드난독화는 코드암호화가 아니라 난독화이기 때문에 코드를 열심히 쫓아가면 분석이 가능하다는 한계가 있는 것을 분명히 이해해야합니다. 한 마디로 보조수단이죠.

그리고, 앱을 분석하기 위해 디버깅모드로 실행 후 디버깅을 시도할 수 있습니다. 중요트랜잭션이 발생하는 곳에서부터 디버깅을 시도하여 중요정보를 알아내거나 중요로직을 파악할 수 있죠. 디버깅방지 기능은 디거깅 행위를 방지하기 위해 디버깅이 시도되면 이를 감지하고 앱을 종료시켜 코드를 보호할 수 있습니다. 


기타

앱 취약점 점검, 앱 위변조 로그 기록은 별 내용 없네요. 멀티로그인 차단은 동시 로그인을 방지하여 사용자폰에서 알아낸 정보를 즉시 이용하여 해킹할 수 없도록 하기 위한 목적일 수 있겠네요. 스마트폰에 중요정보 저장금지는 역시 루팅 시 또는 백업 시 중요정보가 유출되지 않기 위한 것이고, 금융거리기록 정보보관은 관리적인 절차에 해당한다고 볼 수 있습니다.


결론

지금까지 금감원에서 제시한 모바일 보안 취약점 점검기준에 대해서 기술적인 개념분석을 해보았습니다. 본 기준은 스마트폰에서 실행되는 모바일앱(클라이언트)에 대한 점검기준이며, 이 기준이 항상 정답은 아니라는 것을 다시 한 번 강조합니다. 클라이언트 보안에서 모든 것을 해결하려는 기존 분위기에서 최근에는 서버단에서 함께 보안을 적절히 나누면서(FDS등) 클라이언트의 사용성을 강조하는 경우도 많이 있습니다. 다만, 보안 담당자로서 본 내용을 정확하게 이해한다면, 효율적으로 적절한 대응책을 마련하는데 도움이 될 것입니다. 참고로, 모든 리스크를 완전히 제거하는 것만이 좋은 것은 아닙니다. 위험수준과 발생확률을 감안해서 적절한 수준(때론 리스크 수용)의 대응을 함으로써 효율성을 고려할 수 있을 것입니다. 



몇 년 전 비트코인이 무엇인지 한창 화제였죠. 조금 잠잠해지나 싶더니 요새는 블록체인 기술을 활용해서 다양한 서비스에 활용하려는 움직임이 활발해지고 있습니다.

자... 기업에서 블록체인 기술을 이용해 새로운 서비스를 창출하거나, 블록체인 기반의 특정 솔루션 또는 서비스를 도입하고자 할 경우 보안 담당자로서 무엇을 이해하고 있어야 할까요? 

오늘은 비트코인을 기반으로 그 안의 핵심기술인 블록체인을 이해해보고자 합니다. 그리고 블록체인을 활용한다면 어떤 장단점이 있는지, 어떤 부분이 보안측면에서 체크포인트인지 정리해보고자 합니다.



비트코인에 대해서...


트코인(Bitcoin)은 2009년 사토시 나카모토(Satoshi Nakamoto)가 만든 디지털 통화입니다. 비트코인은 블록체인을 기반기술로 하면서 통화거래내역을 P2P기반의 분산네트워크에 의해 공유되는 블록에 담아 다수에 의해 공유 및 검증되는 시스템이라 할 수 있습니다. 예를 들어, 자신이 보유한 비트코인으로 물건을 구매하기 위해, 상대방에게 비트코인을 지불하는 거래내용을 만들고(단순 텍스트에 불과) 자신만이 가진 개인키로 서명을 하여, 블록체인을 관리하는 P2P분산네트워크에 전송하면 다수의 노드에 의해 검증되어 블록체인에 거래내용이 추가되어 영구적으로 보관됩니다. 비트코인은 비트코인거래소에서 구매하거나 환전할 수 있는데 우리나라는 코빗(KORBIT) 등이 있습니다. 꼭 거래소가 아니더라도 비트코인을 가진 사람한테 돈을 주고 자신의 지갑으로 송금해달라고 해도 됩니다.


비트코인주소, 공개키

우리가 일반적으로 뱅킹을 이용해서 돈을 보내거나 받으려면 계좌번호를 알아야 하지요, 마찬가지로 비트코인도 계좌를 대신할 만한게 있는데 그것이 비트코인주소입니다. 비트코인거래를 위해 할일은 먼저 개인키/공개키 쌍을 생성합니다. 그리고 공개키를 해시한 값을 비트코인주소로 사용합니다. 이 비트코인주소는 계좌번호처럼 사용할 수 있고 그 주소로 보내지는 비트코인에 대한 거래권한은 비트코인주소(공개키)에 대한 개인키를 소유한 사람이 주인이 됩니다. 개인키관리가 얼마나 중요한지 알 수 있겠죠(개인키를 잃어버리거나 유출되면 모든 비트코인을 잃어버리는 것과 같습니다). 비트코인주소는 개인이 얼마든지 생성할 수 있고 제한이 없습니다. 비트코인주소는 임의의 문자열(1 또는 3으로 시작)이다보니 사람이 외우기 어려워 QR코드로 표현하여 사용하기도 합니다.




비트코인 거래 승인, 블록체인

비트코인 모바일 지갑을 사용한다면, 비트코인을 송금할 비트코인주소와 금액을 입력하면됩니다. 이 때 거래내용이 작성되면 실제 승인을 받기 위해서는 P2P네트워크에 전송되어 마이너(Miner)들에 의해 블록체인에 기록되어야 합니다. 마이너들은 거래내용을 검증하고 문제가 없으면 모든 노드들이 가지고 있는 블록에 추가를 합니다. 그러면 모든 노드들이 해당블록을 공유함으로써 소위 공개장부에 기록되어 거래가 승인되는 것입니다.


마이닝

거래승인을 위해 블록체인에 신규 블록이 추가되기 위해서는 네트워크에 존재하는 노드들이 신규 블록의 내용을 검증하고 공유해야하는데 이를 마이닝이라고 합니다. 마이닝을 하는데는 하드웨어도 필요하고 전기도 필요한데 왜 자발적으로 참여해서 블록체인을 형성해줄까요? 바로 비트코인을 얻기 위해서 입니다. 마이너는 블록마다 생성되는 비트코인(코인베이스)과 각 거래마다 존재하는 수수료를 얻게 됩니다. 새 블록으로부터 나오는 비트코인은 가장먼저 블록을 형성시키는 마이너에게 돌아가기 때문에 전문적인 마이너들은 해시연산(해싱파워가 중요)을 잘 하도록 하드웨어를 제작(ASIC)하고 어레이로 엮어 수입을 창출합니다.


마이닝 수입 = 블록 당 발생 비트코인(코인베이스) + 거래 수수료(거래자가 지불)



비트코인발행


블록이 새로 생성될때마다 비트코인이 거래와 상관없이 새로 생성됩니다. 블록의 첫번째 거래는 위에서 설명한 마이너의 수입에 해당되는 코인베이스라는 것인데요 이것은 비트코인의 화폐발행정책이기도 합니다. 블록은 계속 누적될텐데 함께 발행되는 비트코인이 무한대로 생기면 안되기 때문에 약 4년주기로 발행코인은 반감됩니다. 구체적으로 설명하자면, 처음 0번 블록체인이 생성되고 약 10분마다 한 개씩 블록이 추가되는데(이후에 설명), 4년이면  2,102,400분(60분×24시간×365일×4년)이고 10분에 1블록이 생성되니까 약 21만개의 블록이 생성됩니다.

그렇게, 처음 4년(2009년~2013년) 동안 약21만개의 블럭 생성 시 블록당 50비트코인이 발행되고 그 다음 4년(2013년~2017년) 동안 21만개의 블럭 생성 시에는 발행코인이 반감되어 블록당 25비트코인 생성됩니다. 그러다 64회까지 반감되다가 그 뒤에는 더 이상 새로운 비트코인은 발행되지 않도록 설계되어 있습니다(비트코인의 체계라고 할 수 있죠). 마이너들은 발행된 비트코인과 수수료를 얻기 위해 열심히 블록체인 생성에 참여하고 있는 것이죠. 만약 점점 코인베이스 수익이 줄어 64회까지 반감된 뒤 수수료만 얻어야 한다고 할지라도 마이너들이 자원투자를 열심히 할지 잘 모르겠네요. 참고로 위 그래프는 비트코인의 발행이 기하급수적으로 줄어드는 것을 표현한 것입니다.



블록체인 기술에 대해 조금 더 자세히...

비트코인에 대해 개념을 알아보았지만 그 핵심은 블록체인입니다. 블록체인이 어떻게 생겼길래 분산구조로 안전하다고 하고, 한번 승인되면 위변조하기 어려워 무결성이 확보된다고 할까요. 


블록구조

블록체인이라는 것은 블록들이 체인형태로 연결되어 있는 것을 말합니다. 우선 블록의 구조를 살펴보겠습니다.


크게 블록크기/블록헤더/트랜젝션데이터로 구성됩니다.




  • 블록크기 : 바이트 단위의 블록크기입니다.

다음 블록헤더입니다.

  • 버전 : 데이터구조의 버전입니다. 구조변경 시 필요하겠죠.
  • 이전 블록해시 : 블록의 체인구조에서, 이전블록(부모블록)에 대한 해시 참조값입니다. 이렇게 이전 블록에 대한 해시를 참조함으로써 각 블록이 강하게 연결되고 중간에 블록이 훼손되기 어렵게 합니다.
  • 머클루트 : 해당 블록에 포함된 거래로부터 생성된 머클 트리의 루트에 대한 해시이며, 블록에 들어있는 모든 거래의 요약본이라 할 수 있습니다. 비교적 큰 데이터 집합을 효율적으로 요약하고 검증할 수 있습니다.
  • 타임스탬프 : 블록의 생성시간, 1970.1.1 이후 초단위 시간입니다.
  • 난이도 목표 : bit값으로 블록의 작업증명 알고리즘에 대한 난이도 목표입니다. 이는 해싱을 어렵게 만드는 척도로서 블록 한개를 생성하는데 10분정도 걸리도록 유도합니다. 만약, 컴퓨팅 파워가 좋아지고 해싱파워(해시를 계산하는 능력)가 증가하여 10분이 걸리지 않으면 난이도를 높여 10분을 유지하도록 조정가능합니다.
  • 난스 : 작업증명 알고리즘에 사용되는 카운터입니다.

헤더 다음 트랜잭션데이터가 이어집니다.

  • 트랜잭션 카운트 : 포함한 거래 개수입니다.
  • 코인베이스 트랜잭션 : 블록 생성 시 발생되는 비트코인이며, 본 블록을 마이닝한 마이너의 수입이 됩니다.
  • 트랜잭션 : 10분동안 수집한 거래정보입니다.


블록체인구조

위와 같은 블록들이 체인처럼 연결되면 오른쪽 그림과 같이 블록체인이 됩니다. 블록체인은 이전 블록의 해시를 참조하여 연결되기 때문에 중간에 데이터가 변경되거나 위조되기가 어렵습니다. 어렵다는 뜻은, 각 블록이 해시값으로 연결되어 있기 때문에 만약 중간의 값을 변경하려면 그 위에 있는 모든 데이터를 함께 변경해야합니다. 


  • 블록높이 : 블록높이는 현재 블록 중 가장 최신의 블록을 뜻합니다. 블록체인의 각 노드들은 블록체인을 서로 공유하는데, 이 때 블록높이만 봐도 내가 최신인지 남이 최신인지 알 수 있습니다.

  • 블록깊이 : 그림에서 1011번째 블록을 기준으로 본다면, 위에 몇 개의 블록이 있는지에 대한 값입니다. 즉, 위에 블록이 쌓일때마다 자신의 블록도 함께 승인이 됩니다. 만약 내용을 변경하고자할 경우 위의 블록까지 함께 변경해야 하기 때문에 보통 거래가 발생되어 블록에 저장되면, 6번의 승인이 이루어져야 취소가 불가능하다고 봅니다. 체인이 길어질 수록 수학적 계산의 양이 급격하게 늘어나기 때문이죠.

여기서 생각해 볼 것은, 6번의 블록(승인)이 생기려면 평균적으로 10분에 1개 블록이 생성되므로 60분이 걸린다는 뜻이죠. 거래하고 안심하려면 60분이 걸린다는 뜻이니 좋은 것만은 아니겠죠. 중앙집중식이라면 중앙에서 승인 한 번만 해주면 되겠지만 분산구조이니 어쩔 수 없겠네요. 왜 10분이라는 간격이 생겼는지는 뒤에서 설명하겠습니다.

거래승인, 블록체인 확장
거래 승인을 얻기 위해서는 거래내용을 블록에 담고 P2P네트워크를 통해 블록체인에 블록을 추가해야 합니다. 앞에서 설명한 것 처럼 블록을 검증하고 추가하고 공유하는 것은 마이너의 역할입니다. 마이너는 풀노드로서 2009년 처음 생성된 0번 블록부터 최신의 블록까지 모든 블록데이터의 복사본을 유지합니다. 만약, 풀노드 클라이언트를 설치한다면 블록을 다운받는데도 며칠 걸릴 것입니다. P2P네트워크에는 수많은 마이너들이 있고 이들은 서로 경쟁하며(수입을 위해) 블록을 생성하여 블록체인을 확장합니다.
블록체인은 분산화된 구조이기 때문에 수많은 노드들이 가진 블록체인 복사본들이 항상 일치하지는 않습니다. 이러한 불일치를 동기화하기 위해 각 노드들은 보통 3종류의 블록을 보관합니다.

  • 메인블록체인
  • 2차블록체인 : 메인블록체인에서 브랜치 형성
  • 고아(orphan)블록 : 수신된 블록의 이전(parent) 블록이 현 체인에 발견되지 않는 경우로, 대개 두 개의 블록이 각자 짧은 시간 내에 마이닝되어 반대의 순서(부모블록 전에 자식블록이 도착)로 도착한 경우 발생합니다. 고아블록풀에 저장되어 있다가 부모블록이 도착하고 기존 체인에 연결되면 고아풀에서 부모블록에 연결됩니다.

노드입장에서는 수신된 새 블록을 연결하여 확장하는데, 분산네트워크이기 때문에 동시에 서로다른 블록이 수신된 경우 어느 것이 맞는 것인지 알 수 없습니다. 이럴 때 브랜치(분기)가 형성되다가 다수에 의해 더 많이 연결되는 쪽으로 메인블록체인이 선택되는 것입니다. 브랜치가 발생하는 것은 사실 분산구조이기 때문에 발생하는 충돌이라고 생각할 수도 있습니다. 




위 그림처럼, 일시적으로 분기가 일어나다가 결국 수렴하면서 다수의 데이터가 수렴하는 쪽으로 정리가 되는 것입니다.


난이도 조절(블록 생성 간격, 10분)

블록체인에서 왜 난이도라는 것을 조절하고 그에 따라 블록 1개가 생성되는데 평균 10분이 걸리도록 만들었을까요. 물론 난이도조절에 따라 블록이 생성되는 간격을 조정하는 것은 블록체인의 성질이지만, 이것을 10분으로 정한것은 비트코인의 설계라고 할 수 있습니다. 난이도 조절에 대해서 한 번 생각해봅시다.

마이너의 대부분의 작업은 해싱계산입니다. 해싱을 잘하도록 하드웨어도 주문제작(ASIC)하지요. 결국, 난이도를 어렵게 하는 것은 해싱작업이 어렵도록 하는 것입니다. 난이도에 대한 설명을 자세히 하자면 좀 복잡하지만, 적절한 난스를 찾기 위해 많은 해시 계산을 하도록 만드는 것입니다. 이 난이도를 이용하여 블록 1개가 생성되는데 평균 10분이 소요되도록 조절합니다. 난이도 조절이 가변인 것은 하드웨어 속도가 증가할 것이기 때문에 평균 10분을 유지하려면 난이도를 점점 어렵게 해야할 것이기 때문입니다.

그렇다면, 왜 블록생성간격을 10분을 유지하려고 하는 것일까요? 이것은 신속한 승인시간과 분기가 발생할 확률을 절충하기 위한 것입니다. 다시 말해, 거래는 블록이 생성되고 체인에 확장되어야 승인이 되는데 이것이 너무 빨리 생기다보면 분산구조의 노드들에 분기가 많이 발생하겠죠. 즉 동시 다발적으로 수시로 블록이 지구촌 곳곳에서 발생하면 분기가 엄청나게 생기기 때문에 어느 정도 간격을 두고 블록을 생성함으로써 분기발생을 줄이기 위함입니다. 그렇다고 간격을 너무 길게 하면 거래 시 승인이 너무 오래걸리게 되겠죠.   

결론적으로, 분기발생확률과 거래정산속도는 트레이드오프관계이고 그 조절은 블록생성간격이 결정한다고 볼 수 있습니다. 블록생성간격이 길면 분기발생은 적지만 거래정산속도는 느려질 수 밖에 없는 이치입니다.


블록체인 특징 요약 (분산된 공개장부)

  • 분산구조 : 중앙집중식이 아닌 P2P네트워크를 이용한 분산구조입니다. 블록체인 복사본들이 분산된 노드들에게 보관되어 있습니다.
  • 투명성 : 블록체인내 모든 내용이 공유되어 있습니다. 
  • 가용성 : 특정 노드가 서비스 불가하더라도 수 많은 노드들에 의해 블록체인이 유지됩니다. 즉, 중앙집중식인 경우 Single Point of Failure 가 존재하지만 블록체인은 안전하다고 할 수 있습니다.
  • 신뢰성 : 다수에 의해 결정되므로 결과를 신뢰할 수 있습니다. 51%의 노드들이 모두 조작되거나 공격받지 않는 이상 신뢰할 수 있습니다.
  • 무결성 : 블록체인에 기록된(승인된) 기록을 삭제하거나 조작할 수 없습니다.



블록체인 활용 시 고려사항

블록체인을 이용해서 기업의 서비스를 창출하거나, 블록체인기반 솔루션을 도입할 때 보안담당자로서 체크해야할 사항을 고민해보았습니다.(아직 보편적으로 도입된 것이 아니라 저도 상상을...)


데이터관점


- 블록체인은 무결성은 좋지만, 기밀성은 제공하지 않습니다. 이를 고려하여 어떤 내용을 불록체인에 담을 것인가가 중요합니다. 비트코인은 거래내역을 담았을 뿐, 어떤 서비스 또는 기능을 할 것인가에 따라 그 내용이 달라져야겠죠. 블록체인은 공개장부개념으로, 공개가능한 내용을 데이터로 가져가야 할 거라 생각됩니다.


- 블록체인 내 들어가는 데이터 크기를 고려해야 합니다. 블록체인은 영구적인 누적데이터이기 때문에 결국엔 풀노드에겐 스토리지가 지속적으로 증가할 수 밖에 없습니다.


- 승인을 취소하기 어렵다는 사실을 서비스 특성에 맞게 고려해야합니다. 비트코인에서 타인에게 잘 못 보냈을 경우 다시 찾을 수 없다는 것과 같은 이치입니다.


네트워크 관점


-  분산네트워크기반으로 그 규모에 따라 신뢰도가 높아지므로 규모를 고려해야 합니다. 분산네트워크를 크게 가져가면 인프라구성이 쉽지 않고 작게 가져가면 신뢰도가 떨어지겠죠.


- 마이너가 가져갈 이득은 무엇인지 고려해야 합니다. 비트코인의 경우 블록생성 시 발생되는 비트코인(코인베이스 + 수수료)을 수익으로 받기 때문에 마이너가 참여를 경쟁적으로 하고 있어 블록체인이 활성화되는 것입니다.


- 블록체인 생성 주기를 고려해야 합니다. 생성주기는 서로 트레이드오프 관계인 분기발생확률과 블록체인 내용의 확정시간을 조율하게 됩니다. 


보안 관점


개인키관리가 보안의 핵심입니다. 개인키를 잃어버리거나 유출되었을 때 전 재산을 잃어버리게 됩니다. 


- 기본적으로 익명성을 제공하지만 개인정보와 연결되면(가입시, 지갑사용 시 등) 과거 모든 데이터까지 개인정보와 매핑이 가능하므로 이에 대한 고려가 필요합니다.


- 공격가능성에 대해 대책을 마련해야 합니다. 의도적 분기유발, 특정 거래나 주소에 대한 DoS공격이 가능하며 특히 공격자가 소유한 해싱파워가 높을수록 공격가능성은 증대됩니다.

예) 고가의 물건 구매 후, 안전하다고 판단되는 6회의 승인(1시간정도)이 이루어지기 전 물건을 가져간다면 자신이 소유한 고성능 해싱파워를 이용해 종전 거래를 무효화할 수 있도록 공격가능


결국, 기업에서 블록체인 기술을 홀용하고자할 때 단순히 DB를 사용하지 않고 거대한 인프라기반의 블록체인을 쓰는 이유에 대해서 분명히 비교분석한 후 장단점을 고려하여 결정해야 겠습니다.