Summary

최근 자동차 해킹에 대한 소재가 많이 떠오르고 있다. 때문에 자동차 보안에 대해서도 관심을

가지시는 분들이 많을 것 같다고 생각을 하고 있다.

이번 글에서는 자동차에 들어가는 주요 통신 프로토콜 중 하나인 CAN 프로토콜이 어떤건지, 그리고

자동차의 계기판을 시뮬레이터로 만들어둔 도구를 하나 소개할 것이다.

(이 도구를 통해서 CAN 통신이 어떻게 이루어지는지를 간단하게 공부해볼 수 있다)

CAN Protocol

Controller Area Network 의 약자로,

차량 내에서 Host PC 없이 Controller 또는 Device간 통신을 주고 받기 위해 사용하는 자동차 표준 통신 규격이다.

자동차에 들어가는 ECU 라고 하는 전자제어장치 들은 이 CAN 프로토콜을 통해서 통신을 주고 받게 된다.

이러한 CAN 프로토콜이 사용되기 이전에는 P2P(Point-to-Point) 방식을 사용해왔는데 요즘 자동차들에는

사용자 편의를 위한 기능, 주행 보조 기능 이런것들이 점차 많아지면서 수 많은 ECU 장치들이 들어가게 됨으로써

P2P 방식으로는 유지 보수도 어려울 뿐더러 여러 문제들이 발생하고 문제 해결을 위해서 채택된 것이 CAN 프로토콜이다.

CAN Bus

CAN Bus 메시지 구조의 첫 바이트는 CAN 네트워크 상에서 각각의 노드를 식별할 수 있도록,

각 노드마다 유일한 식별자(CAN Identifier)를 가지고 있다. 이는 CAN Type(2.0A | 2.0B) 에 따라 각각

11bit, 29bit 형태를 가지고 있다.

CAN Bus 네트워크에 연결된 모든 노드는 네트워크 상에 있는 메시지를 수신 받은 뒤 자신이 필요로 하는 식별자의 메시지

경우에만 Receive 하고, 그렇지 않은 경우는 Ignore 한다.

또 식별자가 사용되는 이유에는 우선 순위가 있는데 CAN 통신 특성 상 네트워크 상에 있는 여러 노드 데이터들이

수신되고 있기 때문에 정확히 필요로 하는 데이터만 Receive 하기 위해서 우선 순위를 정해주고 있다.

여기서 식별자라는 것이 사용되는데 이 식별자 값이 낮을 수록 우선 순위가 높고 높을 수록 우선 순위가 낮다고 보면 된다.

(예를 들면, 100번대, 200번대 식별자가 있으면 100번대가 우선적으로 처리된다는 의미이다.)

img

이외에도 CAN 프로토콜에 대해서 메시지 프레임 구조는 어떻게 되어 있는지, High CAN, Low CAN 의 개념은 무엇인지,

CAN, CAN-FD 의 차이점 등 알아가야 할 것이 많지만 이 글의 주제가 아니기 때문에 살짝 생략을 하도록 할 것이다.

CAN 프로토콜에 대해서 공부할 수 있는 자료들은 매우 많기 때문에 몇 개 정도 추려서 아래 #References 에 링크를

작성해둘 것이라 해당 링크에서 간단한 개념을 공부해보는 것을 추천한다.

Simulator

처음 설명 했던 것 처럼 차량의 계기판을 시뮬레이터로 구현해둔 도구가 존재한다.

https://github.com/zombieCraig/ICSim

테스트 해봤을 때 amd64 architecture 환경에서는 ubuntu18, 20 기준으로 잘 동작했었다.

만약 ARM 환경이라면 컴파일 할 때 라이브러리 파일들을 수정해줘야 정상적으로 컴파일이 가능하다.

Installation

repository clone, required package install

$ git clone https://github.com/zombieCraig/ICSim
$ sudo apt install libsdl2-dev libsdl2-image-dev can-utils

vcan0 interface setup

$ ./setup_vcan0.sh

Run

$ ./icsim vcan0
$ ./controls vcan0

img

img

CAN Message Monitoring

$ candump vcan0 # candump <can-interface>
$ cansniffer -c vcan0 # cansniffer <can-interface>

References

  1. https://en.wikipedia.org/wiki/CAN_bus
  2. https://www.kvaser.com/can-protocol-tutorial/