반응형

o UDS 진단 통신은 차량의 ECU와 통신하기 위해 사용되는 프로토콜로 차량의 상태 진단 및 펌웨어 업데이트 등에 사용됨
o UDS 진단 통신을 하기위해선 세션을 수립하여야 함.
o UDS 통신할때 연결 상태는 Default Session과 Any Other Session일 수 있음
o 펌웨어 업데이트 등 차량에 중요한 영향을 줄 수 있는 작업을 하기 위해 Any Other Session으로
  연결 상태를 변경해야하며 이때 Security Access 과정이 선행된 후 변경이 가능

o UDS 진단 통신으로 펌웨어 업데이트 등 차량에 중요한 영향을 줄 수 있는 작업을 하기위해 Security Access 작업이 선행
o Security Access 인증 방식은 Seed & Key 방식으로 되어있음

o Seed & Key 인증 방식은 Challenge & Response 인증과 비슷하게 서버측(ECU)에서 송신한 질문(Challenge)에
   클라이언트(진단도구)가 올바른 응답(Response)를 하여 인증을 받는 방법
o 질문은 항상 변경되기때문에 재전송 공격을 방지할 수 있음



실습은 StaticSeedECU, DynamicSeedECU로 진행

ㅁ CAN BUS 구조
 o 고정 Seed ECU(StaticSeedECU) : Seed와 Key가 고정적인 ECU
 o CAN BUS 스니핑 유틸리티(candump)
 o can BUS 전송 유틸리티(candsend)

ㅁ 고정 Seed ECU(StaticSeedECU)
 o Seed 값이 고정적인 ECU(Seed 값이 매번 같으므로 Key 값도 매번 같음)
 o ./staticSeedECU로 사용


먼저 터미널을 3개를 실행시켜주고
어떻게 키값을 찾을 것인지는 값이 똑같게 들어오니까 결과오는 것에서 계속 반복시키면 된다.


 

그러기위해서는 위의 흐름대로 자동으로 처리해줄만한 코드를 작성해야한다. 아래는 brute.c 코드이다.


위의 코드를 아래와 같이 실행시켜준다.
gcc -c brute.c                             // brute.o 목적파일 생성
 gcc -o example brute.o canlib.o     // eaxmple 실행파일 생성 
터미널 하나에는 candump를 실행시켜주고 하나에는 example파일 실행하면 좌측에 계속 실행된다.
위의 소스코드에는 키값을 찾는 것은 없어서 아래의 내용이 계속 반복된다. 그래서 키값찾는 매커니즘을 넣어야한다.


아래의 코드는 키값을 찾는 소스코드이다. 아래의 내용을 가지고 위의 example 생성하여 실행시키면 된다.



실행시키면 아래와 같이 실행된다. dump파일을 보면 7E0 뒷부분이 00,01,02 점점 증가하는 것을 확인할 수 있다.


계속 반복되다가 키값이 나오고 멈췄다.
키 값 : 0x6C인 것을 확인할 수 있다.



ㅁ 동적 Seed ECU(DynamicSeedECU)
 o 유저가 SEcurity Access Request를 보낼때마다 Seed 값이 바뀌는 ECU
  - Seed 값이 동적으로 바뀌므로 Key 값도 매번 바뀜


먼저 ./dynamicSeedECU를 실행시켜주고 
candump를 실행하고
cansend 7E0#022701보내면 값이 오는 것을 확인할 수 있다.


씨드 값이 포함하여 오는 것을 확인할 수 있고,
이후 임의의 값으로 7E0#02270200을 보내면
왼쪽에 KEY : 92 98 14 A1값이 나오면서 Failed가 뜬다.


다시 7E0#022701을 보내보자.
그럼 뒤에 6F AF C5 1E값이 온다. 이 SEED값에 무언가를 해야 키값이 나온다.
보통이면 키 값을 알려주지않지만, 실습을 위해 키 값을 알려준다는 것을 알아야한다.


6F AF C5 1E 값을 HEX로 넣고 바이너리 값을 확인해보자.


SEED 값에서 XOR 11111111하면 아래의 바이너리 값이 나온다.


XOR한 값을 cansend vcan3 7E0#0227027EBED40F로 넣어서 보낸다.
그러면 왼쪽에서 Access Sucess가 뜨면서 키 값도 7EBE D40F가 뜨는 것을 확인할 수 있다.


SEED 값을 XOR1111111하면 키값이 만들어진다는 것을 확인할 수 있다.
실습을 위해 전체적인 흐름과 키 값을 알고 있어서 키 값을 쉽게 찾을 수 있었는데, 
일반적으로 전체적인 흐름과 키 값을 알 수 없기때문에 키 값을 만들어내는 알고리즘을 유추하는 것은 쉽지않다.
보안적인 측면에서는 static보다는 dynamic형태로 구현되어야 할 것이며, 키 값이 만들어지는 알고리즘은 공개되어선 안된다.
그렇다고 dyncamic이 무조건 안전하다라고는 할 수 없으나, 그나마 보안성이 보장된다고 할 수 있다.


반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기