Security Tech

임베디드 & 펌웨어

작성자 - 이토란

들어가며

요즘 차량 보안 관련 업무를 진행하면서, 임베디드 환경과 펌웨어 구조에 대한 이해가 부족하다는 점을 느끼게 되었다.
이를 보완하기 위해 임베디드 시스템과 펌웨어의 기본 구조부터 정리해보고자 한다.


임베디드 시스템과 펌웨어 개요

임베디드란?

  • 임베디드 시스템(Embedded System)
    특정 기기에 내장되어, 정해진 목적을 수행하도록 설계된 시스템을 의미한다.
  • 임베디드 기기(Embedded Device)
    임베디드 시스템이 실제로 동작하고 있는 하드웨어 장치를 말한다.
  • 일반적으로 ‘임베디드’라는 용어는 임베디드 시스템과 임베디드 기기를 모두 포괄하는 의미로 사용된다.

컴퓨터가 범용 목적을 위해 설계된 장치라면,
임베디드 기기는 특정 기능 수행을 목적으로 제작된 장치라는 점에서 차이가 있다.


펌웨어(Firmware)

과거 임베디드 기기에서는 EPROM과 같은 비휘발성 메모리가 사용되었으나,
현재는 대부분 Flash Memory가 사용된다.

  • 펌웨어란
    임베디드 기기의 비휘발성 메모리(주로 Flash Memory)에 저장된 소프트웨어를 의미한다.
  • Flash Memory는 전기적으로 읽기·쓰기가 가능한 비휘발성 메모리로,
    기기의 동작 로직과 운영체제, 설정 정보 등을 포함한다.

컴퓨터와 임베디드 시스템의 구조 비교

컴퓨터 구조

일반적인 컴퓨터는 다음과 같은 구성 요소로 이루어진다.

  • CPU
  • 그래픽 카드(GPU)
  • RAM
  • HDD / SSD
  • 메인보드

컴퓨터는 업그레이드와 유지보수를 고려하여 부품들이 개별적으로 구성된다.
이러한 구조 덕분에 특정 부품에 문제가 발생하더라도 해당 부품만 교체할 수 있다는 장점이 있다.


임베디드 구조

임베디드 시스템은 일반적으로 다음과 같은 형태를 가진다.

  • SoC(System on Chip) 또는 MCU(Micro Controller Unit)
  • RAM
  • Flash Memory

이는 컴퓨터의 주요 부품들을 하나의 보드 혹은 하나의 칩에 통합한 구조라고 볼 수 있다.

SoC와 MCU는 컴퓨터의 CPU와 유사하게 명령어를 처리하는 연산 장치를 포함하지만,
CPU가 주로 연산과 제어 기능에 집중하는 반면,
SoC와 MCU는 메모리 컨트롤러, 통신 인터페이스, 주변장치(GPIO, UART, SPI 등)를 함께 제공한다.

제공되는 기능은 칩마다 다르기 때문에,
제품 개발 시 요구 기능에 맞춰 적절한 SoC 또는 MCU를 선택하게 된다.


아키텍처 관점

일반적으로 SoC와 MCU는 RISC(Reduced Instruction Set Computer) 아키텍처를 기반으로 한다.

  • 대표적인 예: ARM, MIPS
  • RISC 아키텍처는 CISC에 비해 명령어 수가 적고 구조가 단순하다.
  • 명령어 길이가 고정되어 있어 처리 효율이 높으며,
  • ARM 프로세서의 경우 저전력 환경에서도 높은 성능을 낼 수 있도록 설계되어 있다.

저장 장치 비교

임베디드 시스템에서 사용되는 Flash Memory
컴퓨터에서의 HDD나 SSD와 유사한 역할을 수행한다.

실제로 SSD는 여러 개의 플래시 메모리를 결합하여 만든 대용량 저장 장치이다.


보안 관점에서 보는 컴퓨터와 임베디드의 차이점

  • 임베디드 시스템은 그래픽 카드를 제외하면,
    컴퓨터에 필요한 대부분의 요소를 포함하고 있다.
    이는 임베디드 기기 또한 운영체제와 소프트웨어를 실행하기 때문이다.
  • 다만 대부분의 임베디드 기기는 그래픽 처리가 필요 없기 때문에
    고성능 GPU를 포함하지 않는다.
  • 표면적으로 보면 컴퓨터와 임베디드의 가장 큰 차이는 그래픽 카드의 유무처럼 보이지만,
    임베디드 해킹 관점에서는 더 넓은 시야로 접근할 필요가 있다.

임베디드 기기는 본질적으로 하나의 기능을 수행하는 단일 제품이며, 제품 개발 과정에서 가격과 출시 속도가 가장 중요한 요소로 고려되는 경우가 많기 때문에  최소한의 비용으로 빠르게 제품을 출시하는 구조가 일반적이다.

 

이러한 개발 환경에서는 상대적으로 보안에 대한 투자와 관심이 낮아지는 경향이 있다.
공격이 발생하더라도 공격자가 수행할 수 있는 행위가 제한적이라고 판단되어

보안 패치의 중요성을 크게 인식하지 못하는 경우도 적지 않다.

더 나아가, 펌웨어 업데이트 기능 자체가 없어 보안 패치가 구조적으로 불가능한 기기 또한 다수 존재한다.

 

반면, 컴퓨터의 운영체제 위에서 실행되는 소프트웨어는 다양한 보호 기법과 신속한 패치를 통해 지속적으로 보안성을 강화하고 있다.
이는 범용 컴퓨터가 다루는 정보의 가치가 높고, 공격자가 수행할 수 있는 행위의 범위 또한 넓기 때문이다.

이처럼 상대적으로 낮은 임베디드 기기의 보안성을 악용한 대표적인 사례가 바로 미라이(Mirai) 봇넷 공격이다.
미라이는 다수의 취약한 임베디드 기기를 감염시켜 대규모 DDoS 공격에 활용되었다.


임베디드 펌웨어 구조

특정 임베디드 기기를 대상으로 취약점 분석을 수행하기 위해서는
가장 먼저 펌웨어를 확보해야 한다.

펌웨어를 얻는 이유와 방법

펌웨어는 비휘발성 메모리에 저장된 데이터이다.
임베디드 기기에서 사용되는 비휘발성 메모리는 대부분 Flash Memory이므로,
결과적으로 Flash Memory의 데이터를 읽으면 펌웨어를 획득할 수 있다.

Flash Memory를 읽는 방법은 여러 가지가 있으며,
그중 하나가 하드웨어에 직접 접근하는 방식이다.

  • Flash Memory는 IC 칩의 패키징 형태에 따라 다양한 구조를 가진다.
  • 해당 칩의 핀에 칩 리더(Flash Programmer) 와 같은 특수 장비를 연결하여
    메모리를 직접 읽을 수 있다.

펌웨어의 구성 요소

펌웨어는 일반적으로 다음 세 가지 구성 요소로 이루어져 있다.

1. 부트로더(Bootloader)

부트로더는 기기가 켜질 때 가장 먼저 실행되는 프로그램이다.

주요 역할은 다음과 같다.

  1. 하드웨어 초기 설정
  2. 압축된 커널 이미지(zImage, bzImage, uImage 등)를 RAM으로 복사
  3. 커널 이미지 앞단에 포함된 압축 해제 코드 실행

부트로더는 컴퓨터와 임베디드 시스템 모두에 필요한 프로그램이며,
임베디드 환경에서는 U-Boot가 가장 널리 사용된다.


2. 커널(Kernel)

커널은 운영체제의 핵심 구성 요소로,
시스템 자원 관리와 사용자 영역과 하드웨어 간의 인터페이스 역할을 수행한다.

  • 메모리 관리
  • 장치 제어
  • 파일 시스템 마운트
  • 프로세스 관리 등

커널이 파일 시스템을 인식하지 못한다면,
운영체제는 저장 장치에 어떤 데이터가 존재하는지 알 수 없다.


3. 파일 시스템(File System)

파일 시스템은 저장 장치에 저장된 데이터와 파일을 체계적으로 관리하기 위한 구조이다.

파일 시스템의 종류

디스크 파일 시스템 : ext3, ext4, FAT, NTFS, HFS 등
플래시 파일 시스템 : JFFS2, YAFFS, UBIFS 등
특수 파일 시스템   : SquashFS, CramFS 등

이처럼 파일 시스템이 다양한 이유는 운영체제와 저장 장치의 특성에 맞는 구조를 사용하기 위함이다.

이 중에서도 기기의 핵심 파일 시스템을
루트 파일 시스템(Root File System) 이라고 한다.

리눅스 기반 시스템에서 루트 파일 시스템은 “/” 경로에 마운트되며,
이를 획득할 경우 “/” 아래의 모든 파일을 분석할 수 있다.


해킹 관점에서의 펌웨어

보안 분석 및 해킹 관점에서 펌웨어와 파일 시스템이 중요한 이유는,
파일 시스템을 추출함으로써 기기의 동작을 담당하는 서비스 바이너리를 획득할 수 있기 때문이다.

이러한 바이너리 분석을 통해 대상 임베디드 기기의 취약점을 발견하고, 공격 가능성을 검증할 수 있다.

Contents

이 글이 도움이 되었다면, 응원의 댓글 부탁드립니다.