주의

여기에 남긴 내용은 지극히 개인적인 의견들입니다. 틀릴 가능성이 80% 이상입니다.

소개

CCID (Chip Card Interface Device) 프로토콜은 스마트카드 (USB) 에서 사용하는 프로토콜이다. 이는 스마트카드가 하나의 보안 토큰으로 사용될 수 있게 한다. (주로 Two-factor authentication에 사용된다) QEMU의 경우 스마트카드 사용 옵션을 붙여서 컴파일을 해주면 게스트에서 해당 디바이스를 사용할 수 있고, 이를 공략하기 위해 해당 프로토콜을 분석한다.

프로토콜에 대한 공식적인 문서는 링크에 포함되어 있다. 하지만, 프로토콜에 대한 설명이 너무 장황한 데에다가 하드웨어 부분들도 모두 설명되어 있기 때문에 공식 문서를 통해 프로토콜에 대한 정보를 얻는 것은 많이 어렵다. 따라서 본인은 QEMU에 구현된 에뮬레이터 코드를 보고 프로토콜에 대한 정보를 얻으려 한다.

본문

디바이스 특성

디바이스는 캐릭터 디바이스 형태로 구현되어 있으며 QEMU 게스트 안에서 /dev/bus/usb/001/002 형태로 나타난다. 디바이스 이름은 GemPC433-Swap으로 이를 검색해보면 스마트카드 디바이스임을 확인할 수 있다.

vm@vm:/dev/bus/usb/001$ lsusb
Bus 001 Device 002: ID 08e6:4433 Gemalto (was Gemplus) GemPC433-Swap
Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

위에서 보이듯이 캐릭터 디바이스 형태이기 때문에 해당 디바이스를 접근하는 방법으로는 두가지가 있다. (1) 커널 모듈을 작성해서 캐릭터 디바이스와 통신하면 된다. 하지만 커널 모듈을 작성하고 올려보고 하는 과정이 많이 복잡하기 때문에 이보다는 다른 방법을 사용하는 것이 편하다. (2) 해당 디바이스 /dev/bus/usb/001/002를 통해 파일 읽기 및 쓰기를 하면서 통신할 수 있다. 자세한 내용은 아래 인용에 나와있다.

https://stackoverflow.com/questions/9276345/checking-simple-char-device-read-write-functions-in-linux

Documentation

자세한 내용을 설명하기 전에 참고할만한 자료들을 일부 소개해놓고 시작하려 한다.

  1. libcacard (Smartcard emulation library)
    1. Git page : https://gitlab.freedesktop.org/spice/libcacard
    2. Documentation : https://github.com/cedric-vincent/qemu/blob/master/docs/libcacard.txt
  2. CCID documentation in QEMU : https://github.com/qemu/qemu/blob/master/docs/ccid.txt
  3. APDU : https://en.wikipedia.org/wiki/Smart_card_application_protocol_data_unit#:~:text=In%20the%20context%20of%20smart,security%20and%20commands%20for%20interchange.
  4. VSCard Protocol (QEMU) : https://wiki.qemu.org/Features/Smartcard
  5. CCID 발표자료 : https://pt.slideshare.net/ssuserf27290/what-is-smart-card-on-tam?smtNoRedir=1

디바이스 종류

QEMU에서 구현하는 디바이스는 두가지가 있다.

  1. passthru protocol을 사용하는 스마트카드 디바이스 (-device ccid-card-passthru)
  2. certificate 파일이나 실제 하드웨어를 기반으로 하는 NSS 벡엔드가 존재하는 에뮬레이터 (-device ccid-card-emulated)

위 두가지 경우 이외에도 실제 스마트카드 디바이스와 버스 역할만 해주는 경우도 있다. (-device usb-ccid)

APDU

APDU는 스마트카드와 단말기가 통신하는 메세지 단위다. 크게 Command APDU와 Response APDU로 나누어지며 Command APDU는 단말기가 카드에게 전달하는 메세지인 반면 Response APDU는 카드가 단말기에 전달하는 메세지다. 형식은 아래와 같다.

Mandatory Field는 CLA, INS, P1, P2, SW1, SW2이다. 나머지 바이트는 선택이다.

마지막으로, 통신 모델은 아래와 같다.

Emulated

Emulated의 경우 certificate 파일이나 실제 하드웨어를 기반으로 하는 NSS 백엔드가 존재한다. 실행 옵션에 -device ccid-card-emulated를 넣고 실행하면 게스트에서 접근할 수 있는 스마트카드 디바이스가 생성되고, 해당 디바이스를 통해 유저는 certificate 정보를 획득할 수 있다. NSS 백엔드의 상태에 따라 state machine에 transition이 발생하고 (ex - 카드 삽입, 제거, 읽기, ...) state에 따라 해당하는 액션이 취해진다.

전체적인 코드 구조는 USB와 동일하다. 간단한 state machine과 handler로 구현되어 있다. 복잡도가 그렇게 높지 않아 개발자가 실수할 포인트가 많지 않고 따라서 취약점이 나오기 힘들 것으로 생각된다. 또한, 게스트 입장에서 해당 디바이스를 공략할 수 있는 것은 백엔드와 상호작용하는 부분인데, 게스트 입장에서 가능한 것은 APDU로 요청을 보내서 APDU Response를 받아오는 것밖에 없다. 즉, APDU 패킷들이 하나의 벡터가 되는 것인데, 해당 패킷들을 처리하는 것이 복잡하지 않고 개발자가 실수할 수 있는 포인트가 적어 취약점이 나오기 힘들다.

Passthru

Passthrough의 경우 VSCard 프로토콜을 추가로 구현한다. 해당 프로토콜은 APDU 기반으로 동작하며, 시나리오는 아래와 같다.

https://github.com/qemu/qemu/blob/master/docs/ccid.txt

Passthrough도 마찬가지로 정해진 상태 머신을 따라가며 handler로 구성되어 차례대로 메세지를 처리하니 위와 마찬가지로 개발자가 실수할 수 있는 포인트가 적다. 따라서 마찬가지로 취약점이 나오기 힘들 것으로 사료된다.

결론

  1. CCID의 경우 공략할 부분이 passthru 밖에 없음. 왜냐면 certificate의 경우 호스트에서 파일을 제공하고 실행 옵션에 넣어야 하기 때문.
  2. 이유를 알지 못하지만 char device로 스마트 카드 디바이스가 접근이 불가능함. (Read는 되는데 Write가 안됨) 또한 Spice를 사용하면 스마트 카드에 대해 삽입/제거 시뮬레이션을 할 수 있다고 하는데 (shift-f8, shift-f9) 이를 사용하려면 별도의 컴파일 옵션과 실행 옵션이 필요해서 이게 게스트에서 사용할 수 있는 기능인가 의아함.
  3. CCID의 경우 사람들이 많이 사용하지 않는 기능으로 보임. Two-factor authentication으로 사용하는 이 기능은 개발자가 간략히 개발하고 넘어가는 것으로 생각됨. 하지만 생각보다 보안 관련 기능이다 보니 모듈 자체에 보안을 많이 신경썼다는 느낌이 강함.
  4. 프로토콜 정보의 경우 APDU에 대한 내용은 위키, CCID 자체에 대한 내용은 123쪽짜리 공식 문서가 있음.
  5. passthru에 관한 코드는 굉장히 짧음. State machine / handler 구조가 끝.
  6. libcacard라는 외부 라이브러리를 사용하는데 해당 라이브러리에는 libfuzzer로 구현된 자체 퍼저가 있음. 파싱 부분과 encoding / decoding 부분에 대한 퍼징을 수행함.
  7. 해당 부분이 터진 경우는 딱 한번 있는데, memory corruption 류나 logic bug 류가 아니라 단순하게 메모리가 계속 쌓여서 DoS가 발생하는 경우.

'보안 > Bug Hunting' 카테고리의 다른 글

fetch --nohooks chromium 고치기  (1) 2021.06.19
My Fuzzers  (2) 2021.02.21
QEMU USB Analysis and Fuzzing  (0) 2021.01.19
VirtualBox SVGA  (0) 2021.01.19

+ Recent posts