본문 바로가기

보안 연구/Side_Channel_Attack

[ChipWhisperer tutorial] Intro Tutorial(2). Instruction Differences

이번 tutorial은 side channel attack의 방법 중 하나인 Instruction Differences에 대해서 소개하고 있다.

 

지원되는 setup은 다음과 같다.

 

[Figure.1]Supported setups

 

This tutorial will introduce you to measuring the power consumption of a device under attack. It will demonstrate how the power consumption of a target changes based on what operations it's doing.

 

이 tutorial은 공격중인 장치의 전력 소비를 측정하는 방법에 대해서 소개한다. 수행중인 operation에 따른 target의 전력 소비가 어떻게 변하는지 보여주는데, 이는 side channel attack에 의해 암호의 key값을 추측하는 핵심이다.

 

tutorial code를 실행하기 앞서, parameter block을 통해서 hardware 정보를 입력한다. 아래는 parameter block의 예를 나타내며, hardware와 target에 따라 해당 입력 값은 달라진다.

[Figure.2]Prameter block

1.1 Setting up Firmware

가장 먼저 해야할것은 Firmware를 setting up 하는 작업이다. 앞선 게시물을 통해서 Firmware를 setting up 하는 방법과 설명을 해놓았다. 링크는 다음과 같다. (https://gbjeong96.tistory.com/3)

 

[ChipWhisperer tutorial] Intro Tutorial(1). Firmware Build Setup

이번 tutorial은 Firmware build setup에 대해서 소개하고 있다. This tutorial will introduce you to the software side of ChipWhisperer, including the tutorials themselves. It will also show you how to..

gbjeong96.tistory.com

In this tutorial, we will once again be working off of the simpleserial-base firmware.

Let's start by creating a new project and building our firmware:

 

새 프로젝트를 만들고 firmware building을 진행한다.

 

[Figure.3] Setting up Firmware

 

block들의 실행 통해 frimware building이 완료 되면, get_pt() function을 살펴보자. 아래는 get_pt에 대한 code이다.

 

[Figure.4] get_pt function

get_pt( ) function에서의 trigger_high( )와 trigger_low( ) function에 설명이 부족하지만, 전력차이에 대한 주제와 함수명을 고려하였을때, trigger가 high가 발생하고 low가 발생함에 따른 operation으로 추측 된다 (필자의 생각). 주석을 살펴보면, trigger_high( ) function이 호출되고, 'pt'라는 곳에 있는 16진수 byte가 전송된다. 그리고 computer에 저장된다. 이는 다시 'pt'로 되돌아 갈 것임을 명시하고있다.

 

정리하면, get_pt( ) function은 trigger 발생시, simpleserial_put( ) function을 호출하고, 16진수의 byte가 return 된다는 것을 알 수 있다..

 

1.2  ChipWhisperer Setup

Setup for this tutorial will be pretty similar to Tutorial B1, so we'll skip most of it by calling some helper scripts. This setup should work for most targets, but if you're using a target other than the XMEGA or STM32F3 (CWLite w/ Arm), you may need to call a different script or do additional setup (like programming the target with an external programmer). See the wiki page for your target for more information.

If you're curious about what's happening in these helper scripts, they're typically located in the Helper_Scripts folder.

 

이 tutorial의 setup은 앞선 tutorial과 유사하므로 사용자는 필요에 따라 skip 해도 된다는 내용이다. target 내용을 확인하고, XMEGA 또는 STM32F3 이외의 target을 사용하는 경우 외부 script 또는 추가적인 setup이 필요할 수 있다. target이 있는 ChipWhisperer와 computer를 usb를 통해 연결 한 뒤, 아래의 해당 코드를 실행시켜주자.

 

[Figure.5] Setting up
[Figure.6]run Helper_Scripts

 

위 [Figure.5] 코드를 실행하면 결과창으로 CW-Lite Flatform의 에 대한 built 성공 창이 출력된다. 다음으로 [Figrue.6]의 코드를 출력하면, Serial baud rate 값이 출력되는데, 필자의 경우 38400이 출력되었다. 이는 직렬 전송 속도를 의미한다.

 

아래 [Figure.7]은 scope 값을 1000으로 지정해주는 코드이다. 이를 지정해주지 않을 시 필요한 data보다 더 많은 data의 결과를 산출하므로 scope의 값을 1000으로 줄여준다. 마지막으로 [Figure.8]의 코드를 실행하면 설정에 대한 정보가 출력됨을 확인할 수 있다.

 

[Figure.7] Scope set

 

[Figure.8] Programming in the last part.

 

위 코드들에 대한 error가 출력된경우, 일반적으로 다음과 같은 문제점을 찾을 수 있었다.

  • 코드 Block들을 순서를 지켜 차례대로 run하지 않은 경우
  • Parameter block에서 SCOPETYPE이나 PLATFORM을 제대로 입력하지 않은 경우
  • ChipWhisperer의 USB 상태가 불량하거나 usb driver에 문제가 있는 경우

이 밖의 특수한 경우는 코드의 error 출력에 따른 조치를 취해주어야 한다.

 

위 코드들이 성공적으로 모두 추력이 되었다면, ChipWhisperer setup을 완료하였다. 이로써 Capturing Traces를 할 준비가 완료되었다.

 

1.3  Capturing Traces

이제 본격적으로 Traces를 capturing해보자. 앞의 과정의 scope에 대한 정보를 출력해주는 아래의 코드를 통해 scope를 출력해주어서 장치의 세부 정보를 알 수있다. 내용은 다음과 같다.

[Figure.9] print about scope

 

 

각각의 대한 세부설명은 생략한다. (자세한 Hardware 정보와 세부적인 작동원리에 대한 내용은 게시물 맨 아래 ChipWhisperer tutorial site를 참고할 수 있다.)

 

Like before, most of this should look familiar from the last tutorial. We'll start by programming the target, then capturing a trace, and finally displaying it using bokeh. We don't really care about what the target responds with this time, so we won't do anything with what we read back.

 

다음에서 설명할 코드는 위의 원문에서 설명하듯이 target을 먼저 programming한 후 trace를 capturing하는 과정을 진행한다. 마지막으로 bokeh를 사용하여 capturing한 trace를 그래프로 나타낸다. (bokeh에 대해서 아래에서 설명하겠다.) 아래는 이에 대한 코드이다.

 

[Figrue.10] Capturing Trace1

 

holoviews, numpy 패키지를 hv와 np로 import한다. (as를 통해 이름을 지정해준다) holoviews는 그래프 plot를 위한, numpy는 행렬이나 다차원 배열 처리를 위한 라이브러리로 사용된다. 여기서 hv.extension( 'bokeh' )를 통해서 holoviews의 bokeh를 사용하는데, 여기서 bokeh란, plots를 그릴 수 있도록 도와주는 좋은 library이다. interactive한 plotting이 가능하다는 특징이 있으며, 이러한 특징 때문에 설명력이 많은 plotting을 그릴 수 있다.  jupyter notebook 튜토리얼 을 이용할 수 있으니 참고하기 바란다.

 

본론으로 돌아와 [Figure.10]의 코드를 실행하게 되면, traces를 capturing한 그래프가 다음과 같이 보여짐을 알 수 있다.

 

[Figrue.11] Capturing Trace2

그래프가 성공적으로 출력이 되었다면, 성공적으로 traces capturing 수행을 완료한 것이다. x축은 앞에서 setting한 scope범위를 나타내며, 세로축은 trace의 전력소모를 나타낸다. 앞으로의 연구에 있어서 이러한 trigger 파형은 암호화 알고리즘을 역추적하여 key값을 구하는 핵심이다. 이번 tutorial에서는 이러한 trigger를 분석하지는 않는다. 앞으로 거의 대부분의 분석에서 이런 trace를 capturing하는 과정은 계속해서 사용하며, 이를 통해 key 값을 분석 해볼 것이다.

 

[추가적인 고찰]

아래 [Figure.12]의 파형은 tutorial trace capture에 대한 예시를 보여주고있다. 이 그래프는 출처1에서 제공하는 문서의 이미지이다. (이미지 출처 : https://chipwhisperer.readthedocs.io/en/latest/tutorials/pa_intro_2-openadc-cwlitearm.html#tutorial-pa-intro-2-openadc-cwlitearm)

 

[Figure.12] https://chipwhisperer.readthedocs.io/en/latest/tutorials/pa_intro_2-openadc-cwlitearm.html#tutorial-pa-intro-2-openadc-cwlitearm

 해당 그래프는 실제로 필자가 ChipWhisperer를 사용하여 trace를 capture한 그래프와는 다른 파형을 보여주고 있다. 여기서 비교할 점을 몇가지를 발견할 수 있었는데, 필자가 발견한 요인은 scope범위, 전력소모, 파형 패턴이 있었다.

 먼저 scope범위는 [Figure.7]의 scope set을 통해서 1000으로 지정해주었기 때문에 실제로 그래프에서도 0 ~ 1000의 범위를 가졌다. [Figure.12]의 예시 또한 0 ~ 1000의 범위를 갖는다는 공통점을 발견할 수 있었다. 하지만 여기서 주목해야할 점은 전력소모와 전력패턴이다. 전력소모 수치를 살펴보면 수치값 자체도 많은 차이가 난다는 것을 발견할 수 있다. 필자가 출력한 그래프는 [Figure.12]의 전력값과 비교하여 아주 작은 전력값을 소비한다는것을 알 수 있다. 이러한 영향 때문인지 파형 패턴이 매우 다른 경향성을 보이고 있다. [Figure.12]의 파형은 trace별로 다양한 전력값을 가지며 이러한 값들은 증가하거나 감소하는 구간을 관찰할 수 있지만, [Figrue.11]의 파형은 trace별로 특정한 값만을 출력하고 증가하거나 감소하는 경향성이 보이지 않는 것을 볼 수 있다. 이러한 값들은 경향성을 나타낸다고 하기 보다는 Nan 값에 가깝다고 할 수 있을것 같다.

 결론적으로 필자가 tutorial에서 출력한 그래프는 잘못된 그래프라고 할 수 있다. 잘못된 그래프를 출력하였다는 것은 전력소모 분석을 잘못했다는 얘기이다. 이번에 단계에서는 key값을 분석하지는 않았지만, 만약 key값을 분석했다면 이러한 error로 인하여 잘못된 key값이 도출되었을 것이라고 예상한다.

 잘못된 출력이 나온 이유를 분석해보자. 먼저 SW에 대한 code문제는 아닐것이라고 생각한다. 그 이유는 [Figure.11], [Figure.12] 두 그래프 모두 API로 제공되는 동일한 source code의 환경에서 실행 되었기 때문이다. 따라서 Hardware의 문제일 확률이 가장 큰데, 이는 필자의 Hardware 사용법의 미숙함으로 인한 실수일 가능성이 크다. 전력값 자체가 다른 값을 보이기 때문에 전력값에 영향을 줄 수 있는 요인에 대해 분석을 한 뒤 이에 대해 다시 리포팅하겠다.

 

이상으로 ChipWhisperer Instruction differences를 마친다.

 

이 게시글은 NewAE technology사에서 제공하는 ChipWhisperer의 tutorial 오픈소스(Open Source) 기반으로 작성하였으며, 
게시물에 해당하는 내용에 관한 정보는 다음과 같은 출처를 통해서 확인할 수 있습니다.
출처1 : https://chipwhisperer.readthedocs.io/en/latest/ 
출처2 : https://wiki.newae.com/Main_Page 
출처3 : https://github.com/newaetech/chipwhisperer