CAN버스 리버스엔지니어링

KIM DO YOON·2025년 3월 27일
0
post-thumbnail

자동차 해킹: CAN버스 분석과 패킷 제어 방법

이 글에서는 가상 CAN 환경 구성부터 CAN 패킷 분석, 자동차 기능 제어까지 자동차 해킹의 기초를 다루겠습니다.

CAN 버스의 이해

CAN 패킷은 제조사와 모델에 따라 크게 달라지며, 일반적인 패킷 분석 방법으로는 분석이 어렵다. 왜냐하면 CAN 네트워크에 많은 노이즈가 발생하기 때문이다. 차량의 디바이스들은 설정된 일정 간격으로 신호를 보내거나, 특정 동작 (예를들면 문 열림, 가속) 이 발생했을 때 특정 패턴의 신호를 발생시킨다.

CAN 버스의 특성

  • 자동차 내부 통신에 최적화된 프로토콜
  • 메시지 ID에 따른 우선순위 결정
  • 최대 데이터 전송 속도 : 1Mbps
  • 메시지 프레임은 ID와 최대 8바이트의 데이터로 구성
  • 다중 마스터 방식의 통신 구조

가상 CAN 환경 구성

자동차 해킹 실습을 실제 차로 할 수 없기 때문에 가상 CAN 환경을 구성해야 한다. 휴...다행

가상 CAN 인터페이스 설정

# 가상 CAN 커널 모듈 로드
modprobe vcan

# 가상 CAN 인터페이스 생성
ip link add dev vcan0 type vcan
ip link set up vcan0
sudo ip link set vcan0 mtu 72

# socketcan 데몬 실행
socketcand -i vcan0

가상 can 인터페이스가 성공적으로 생성되었다.

두 개의 가상 CAN 인터페이스 연결

테스트를 위해 두 개의 가상 인터페이스를 생성하고 연결하여 양방향 통신이 가능하도록 설정할 수 있다.

# 추가 가상 CAN 인터페이스 생성
ip link add dev vcan1 type vcan
ip link set up vcan1

# CAN 게이트웨이 모듈 로드
sudo modprobe can-gw

# 양방향 연결 설정
sudo cangw -A -s vcan0 -d vcan1 -e
sudo cangw -A -s vcan1 -d vcan0 -e

이렇게 설정하면 vcan0에서 보낸 메시지는 vcan1로, vcan1에서 보낸 메시지는 vcan0로 전달된다.

ICSim을 이용한 자동차 시뮬레이션

ICSim은 자동차 계시판을 시뮬레이션하고 CAN 버스 해킹 실습을 할 수 있는 도구이다.

#ICSim 다운로드, 설치
git clone https://github.com/zombieCraig/ICSim.git
cd ICSim

make

ICSim 실행

# 계기판 시뮬레이터 실행
./icsim vcan0

# 컨트롤러 실행 (별도 터미널)
./controls vcan0


시뮬이 이렇게 만들어진다. 키보드를 이용해서 문을 열거나 가속 이런 이미지에 있는 기능들을 할 수 있다.

옵션 l 을 이용하면 난이도 조절도 할 수 있다(0~3). 어렵게 하면 노이즈,ID, 바이트 위치 이런것들이 더 어렵게 설정돼서 분석이 어렵다고 한다.

CAN 패킷 분석 기법

CAN 패킷 분석에는 여러 도구와 기법이 사용된다.

can-utils를 이용한 CAN 트래픽 모니터링

can-utils는 리눅스에서 CAN 버스 분석을 위한 도구 모음이다.
=>>> candump, cansend, cansniffer 등등

실습

그럼 실습을 해보자~
일단 CAN 버스를 통한 도에 제어 기능을 분석하는 과정을 단계별로 살펴보자

기본 분석 방법론

  1. 기록 시작
  2. 차량 문 열기
  3. 기록 중지
  4. 로그 파일 재생
  5. 패킷 재생 시 문이 열리는지 확인

재생 시 동작이 발생하지 않는다면 이런 원인이 있을 수 있다. 해결책도 같이 알아봅시다.

  • 기록 타이밍 오류 : 더 긴 시간 동안 기록
  • 내장 메시지 문제 : 다른 버튼 사용 시도
  • 다른 문 이용
  • 패킷 충돌 : 여러 번 재생 시도
  • 다른 CAN 버스 이용
    등등

이진 분할 방식을 통한 패킷 식별

패킷을 식별하는 가장 효과적인 방법은 이진 분할 방법이다.
1. 로그 파일을 절반으로 나눔
2. 첫 번째 절반 재생 → 동작 확인
3. 동작이 발생하면 해당 절반을 다시 절반으로 나눔
4. 동작이 발생하지 않으면 나머지 절반을 사용
5. 하나의 패킷만 남을 때까지 반복

직접 해보자

분석 편의를 위해

cansniffer -c vcan0
#를 입력하여 변화를 쉽게 감지해보았다.


시뮬레이션이 동작 중이라 이렇게 계속해서 CAN 버스 변화가 있다.

문을 열고 닫을 때 이미지 처럼 특정 ID의 패킷이 바뀐다. (노란색 박스)
원래 글자 색이 빨간색인데 손이 느려 빨간색 일때 캡쳐하는게 어렵다

그럼 이제 cansend 를 이용해서 시뮬 버튼 조작 없이 패킷 전송으로 문을 조작해보면

cansend can ID#패킷

열림

오늘은 가상 환경에서 패킷을 이용하여 자동차의 상태를 조작해 보았다.
실제 환경에서는 이렇게 쉽지 않다고 한다.
노이즈, ID 등등..
제조사 마다 CAN패킷 형태가 다르기도 하고..

profile
안녕하세요 김도윤 입니다.

0개의 댓글