CAN DoS Attack - Bus Off - FESCARO

CAN DoS Attack – Bus Off

1. 개요

2016년 미국 미시건 주립대학에서 CAN 프로토콜의 오류 처리방식을 악용한 DoS 공격을 공개하였습니다.
CAN Dos Attack이란 일반 TCP/IP기반의 DoS(Denial of Service) 공격과는 메커니즘이 다르지만, 대상 디바이스가 제 기능을 하지 못하는 만들어 버리는 공격의 목표는 동일합니다. 해당 공격은 CAN 프로토콜의 설계상의 취약점을 이용한 공격입니다. CAN은 ISO에서 국제표준규격으로 제정하였으며, 현재는 차량에서 CAN을 사용하지 않는 차는 드물 정도로 차량에서는 표준으로 자리잡고 있습니다. 즉, 거의 모든 차량에 해당 공격이 적용됩니다.

2. CAN 통신 프로토콜 특성

CAN Bus Off 공격이 가능한 이유이자, CAN 통신 프로토콜의 특성은 다음과 같습니다.

2.1 버스형 구조 CSMA/CD + AMP(Arbitration Message Priority)

%ea%b7%b8%eb%a6%bc1

[그림 1] Bus형 토폴로지

CAN네트워크는 BUS형 구조로 통신합니다. BUS형은 단일 케이블에 의해 각 노드들이 연결되어 있어 만약 서로 다른 두 노드가 동시에 데이터를 보내게 되면 충돌이 발생하게 됩니다. 이 때, CAN은 Arbitration(중재)를 해주게 되는데 메시지 우선순위를 기반으로 중재를 해줍니다. 아래 [그림 2]과 같이 CAN Message Format을 살펴보면 Arbitration Field에 Identifier(ID)가 있습니다. 바로 이 ID값이 낮을수록 메시지의 우선순위가 높아지고 먼저 전송하게 됩니다.

%ea%b7%b8%eb%a6%bc2

[그림 2] CAN Data Frame Message Format

요약하자면 다음과 같습니다.
① 각 노드는 데이터 송신 전 버스가 사용 중인지 파악한다.
② 만약 버스가 사용 중이라면 전송하지 않는다.
③ 동시에 두 개 이상의 노드에서 메시지를 보내게 되어 충돌하게 될 경우, 두 메시지 중 우선순위가 높은, 즉 CAN ID 값이 더 낮은 메시지만 전송된다.

%ea%b7%b8%eb%a6%bc3

[그림 3] 메시지 중재 과정

실제로 Node A, Node B, Node C가 비트단위로 데이터를 전송하고 있고 각 노드들은 CAN bus상에 흘러 다니는 비트(출력 비트)를 감지합니다. 이 때, 비트 단위로 비교하면 0 과 1 두 수를 비교하게 되는데 값이 더 낮을수록 우선순위가 높아지게 되어 첫번째로 Node C가 우선순위에서 밀려 전송을 중단하고 두번째로 Node B가 우선순위에서 밀려 데이터를 중단합니다.

2.2. 브로드캐스트 통신 + 인증 필드 부재

CAN네트워크에서 데이터 전송은 우리가 기존에 알고 있는 TCP/IP와 차이점이 있습니다.

%ea%b7%b8%eb%a6%bc4

[그림 4] IP Header

위 그림에서 IP header에서는 Source IP와 Destination IP가 있지만 CAN메시지에서는 Source IP와 Destination IP 대신에 Identifier(ID)로 판단하게 됩니다. 즉, IP 대신에 identifier(ID)기반으로 메시지를 전송합니다. 그렇다면 수신은 어떻게 할까요?

수신도 동일하게 ID기반으로 메시지를 수신하며, 이 때 수신 시에는 미리 Filter라는 구성하여 자신이 받을 ID값의 범위 또는 특정 ID값만을 지정하여 수신합니다. 즉 송신자가 메시지 송신 시, 해당 메시지의 수신자를 정하는 것이 아니라, CAN 버스에 연결된 통신에 참여하는 노드에서 본인이 설정한 ID Filter에 따라 메시지를 수신합니다. 위와 같은 구조로 보았을 때 애니캐스트 방식으로는 전송할 수 없고 브로드캐스트 방식으로만 전송할 수 밖에 없는 구조가 됩니다.

또한, CAN Message Format에서 보다시피 인증해주는 필드가 없습니다. 즉, 이 메시지를 누가 보냈는지 알 수가 없으며, 메시지를 누가 보내던지 의심 없이 수신하게 됩니다.

그렇다면 여기서 취약한 부분을 생각할 수 있게 됩니다.

모든 ID값을 수신하는 필터를 구성한 디바이스를 CAN bus에 연결하면 CAN 네트워크상에서 돌아다니는 모든 메시지를 볼 수 있습니다. 즉, 스니핑이 가능하게 됩니다.

CAN bus에 연결하는 방법은 간단합니다. 자동차 내부에는 OBD Port를 장착하도록 의무화 되어있습니다. 즉, 이 OBD-Port에 연결하기만 한다면 CAN bus에 연결이 되는 것입니다.

참고 : 보안 게이트웨이가 장착된 최신 차량에서는 OBD Port에 연결을 한다고 해서 CAN 메시지들을 스니핑할 수 없습니다.

2.3 에러 처리

CAN 프로토콜의 에러 처리 메커니즘을 통해 디바이스들이 Bus off 상태가 될 수 있습니다. CAN 표준에서는 5가지의 에러 유형이 있지만 Bus off 공격에 필요한 에러 유형만 살펴보도록 하겠습니다.

%ea%b7%b8%eb%a6%bc5

[그림 5] Error Handling

Bit Error : 전송한 데이터와 CAN Bus상의 데이터가 다른 경우 발생하는 에러

Stuff Erorr : 연속된 동일한 극성의 5비트가 전송되면 에러로 판단

CAN bus에 연결되어 있는 디바이스들은 각각 자신들이 전송한 메시지에 CAN bus상의 출력된 메시지를 비교하여 다르면 Bit Error가 발생하게 됩니다. 이 때, 디바이스가 해당 메시지가 Bit Error가 발생한 것을 알게 되면 해당 메시지는 에러라는 것을 다른 디바이스들에게 알리기 위해 아래 [그림 6]과 같이 Error Frame Message를 전송하게 됩니다. Error Frame Message를 전송하면 해당 디바이스는 TEC(Transmit Error Count)가 증가하게 되며 TEC가 255 이상이 되면 Bus off 상태가 됩니다.

%ea%b7%b8%eb%a6%bc6

[그림 6] Error Frame Message Format

%ea%b7%b8%eb%a6%bc7

[그림 7] Error Active

위 [그림 7]과 같이 Node A와 B가 동일한 CAN ID를 구성하고 Node B가 DLC 비트 하나를 0으로 바꿔 전송하면 Node A는 자신이 보낸 데이터와 CAN Bus상의 데이터를 비교하여 다르다는 것을 알아채고 즉시 Error Frame Message를 전송하여 TEC 값이 8이 증가하게 됩니다.

그럼 TEC가 255까지 되는 과정을 좀 더 자세히 파악해 보겠습니다.

[그림 5]와 같이 모든 디바이스의 초기상태는 Error Active 상태입니다.

%ea%b7%b8%eb%a6%bc8

[그림 8] Error Passive

먼저 Node A에서 Bit Error가 발생하여 Error Frame Message를 보내는데 Error Active 상태에서는 연속적인 0(dominant bit)이 채워진 Error Flag가 포함된 Error Frame Message를 전송합니다. 그럼 Node B는 동일한 극성으로 5개의 비트가 연속으로 보내져 Stuff Error인 것을 감지하게 되고 마찬가지로 Error Frame Message를 보냅니다. 이 과정이 계속 반복되어 Node A,B 모두 TEC가 128까지 증가합니다. 왜냐하면 CAN 네트워크에서는 에러 발생시 재전송하게 끔 설계되어 있기 때문입니다. 그렇기 때문에 단 한번의 조작된 CAN 데이터 전송으로 TEC가 128까지 올라가게 됩니다.

TEC가 128이상부터는 Error Passive 상태로 변하게 됩니다. Error Passive 상태는 에러 비활성화 상태입니다. CAN네트워크는 특성상 0(dominant bit)을 계속 보내게 되면 가장 먼저 전송할 수 있게 됩니다. 그렇다면 Error Frame Message를 계속 보내게 된다면 CAN 네트워크 전체에 영향을 줄 수 있습니다. 네트워크 부하를 막고자 CAN은 Error Passive상태를 지원하며, 연속적인 0(dominant bit)이 아니라 연속적인 1(recessive bit)로 보냅니다.

%ea%b7%b8%eb%a6%bc9

[그림 9] Error Passive

Error Passive 상태에서는 Error를 감지하면 Passive Error Flag를 전송하게 되는데 해당 Error Flag는 다른 노드에는 전혀 영향을 주지 않으므로 결과적으로 Attacker는 전송에 성공하게 되고 TEC가 1이 감소하고 다시 Error Active 상태로 돌아가게 됩니다. Victim은 공격자가 전송에 성공하여 재전송을 하지 않거나 위의 IFS간격이 달라져 전송에 성공하게 되어 TEC가 1이 감소됩니다. 이런 식으로 Attacker는 계속 Victim이 Error Flag를 보낼 수 있게 조작된 메시지를 전송한다면 136-> 135 -> 143 -> 142 -> 149 … 계속 증가하게 되어 Bus OFF 상태를 유발 시킬 수 있게 됩니다.

3. Bus Off 공격방법

그럼 CAN 네트워크의 동작원리를 알아봤으니 Bus off 공격하는 법을 알아보겠습니다.

각 조건에 대한 방법만 알면 쉽게 공격이 가능합니다.

조건은 다음과 같습니다.

  1. 공격할 디바이스의 CAN ID를 미리 알고 있어야 합니다.
  2. 공격할 디바이스와 동시에 메시지를 전송해야 합니다.
  3. CAN ID까지는 같아야 하며, DLC 와 Data Filed 비트 중 단 한 비트라도 1(recessive)을 0(dominant)으로 바꿔야 합니다.

조금 더 부연설명 하자면 공격하고자 하는 CAN ID를 미리 알아야 해당 디바이스를 Bus off 상태로 유발시킬 수 있으며, 중재에서 살아남은 동일 CAN ID를 가지는 메시지가 동시에 전송되려고 할 때, 서로 다른 비트를 전송해야 Bit Error를 유발시킬 수 있기 때문입니다.

그렇다면 어떻게 동시에 서로 다른 비트를 전송할 수 있을까요?

%ea%b7%b8%eb%a6%bc10

[그림 10] 선행 ID

공격 대상 노드가 CAN 메시지를 전송하기 전에 먼저 전송되는 메시지를 스니핑을 통해 알아냅니다. 예를 들어, 공격 대상 노드가 전송하는 CAN 메시지의 CAN ID는 0x123이고, 해당 메시지가 전송되기 전에는 항상 0x103이라는 ID를 가진 메시지가 전송됩니다. 이 때, 0x123의 선행 ID는 0x103이 됩니다.

선행 ID를 알아낸 후에는, 해당 선행 ID가 수신된 직후에 바로 공격 대상 노드가 전송하는 CAN 메시지를 비트를 다르게 하여 전송하면 됩니다. 즉 공격 대상 노드가 전송하는 CAN 메시지의 DLC가 8이라면, 공격자는 DLC를 0으로 하여 전송을 시도한다면, 0x123이라는 CAN ID를 가진 메시지가 동시에 서로 다른 비트를 전송하려고 하기 때문에 Bit Error가 발생할 것입니다.

4. 결론

이렇게 Bus off 공격하는 방법까지 알아봤습니다.

해당 공격은 CAN의 설계상의 취약점을 이용한 공격이고 이러한 공격에 대한 패치할 수 있는 방법이 없기 때문에 위험도가 높습니다. 또한, CAN bus에 연결되어야 공격이 가능한 로컬 공격이지만, 카풀 또는 렌트 등으로 접근할 수 있는 가능한 많은 상황이 존재합니다.

#CAN #CAN_통신 #CAN_해킹 #CAN_DOS #서비스거부공격 #CAN_BUSOFF #CAN_취약점

Categories

답글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.

error: Content is protected !!
%d bloggers like this: