산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial Internet of Things >> 임베디드

임베디드 소프트웨어의 숨겨진 취약점: 텍스트 문자열

오랜 기간 동안 데스크톱 컴퓨터의 보안은 주요 관심사였습니다. 시스템이 인터넷에 연결되면 본질적으로 어떤 형태의 공격 가능성도 존재합니다. 이러한 침투는 데이터 탈취, 시스템 손상, 또는 동작 변경을 목적으로 할 수 있습니다. 보호 수단은 잘 알려져 있고 널리 적용되고 있습니다. 반면 임베디드 시스템은 네트워크에 연결되는 경우가 드물고 코드가 보통 ROM에 저장되어 있어 이러한 문제로부터 면역인 것처럼 보였습니다. 하지만 상황은 변했습니다. 현대의 많은 시스템이 인터넷에 연결되어 있고, 코드를 RAM으로 복사하여 실행하는 것이 일반적인 관행이 되었습니다. 이는 보안이 이제 임베디드 소프트웨어 설계의 중요한 고려 사항이 되었음을 의미합니다.

안전(Safety)과 보안(Security)의 차이

영어는 훌륭한 의사소통 도구입니다. 매우 표현력이 풍부하여 정교하고 미묘한 의사소통이 가능합니다. 하지만 일상 회화에서는 우리 대부분이 게을러서 단어를 100% 정확하게 사용하지 않습니다. 여기서 예로 드는 것이 safety와 security를 거의 동의어처럼 서로 바꿔 쓰는 방식입니다. 제가 들은 가장 좋은 정의는 대략 다음과 같습니다: 안전은 장치로부터 세상을 보호하는 과정이고, 보안은 세상으로부터 장치를 보호하는 것입니다. 오늘 주제는 보안입니다.

암호화와 난독화

시스템이 정말로 완전 방탄이어야 한다면 산업용 등급의 암호화가 필요합니다. 이는 일반적으로 특정 하드웨어 지원을 요구하는데, 쉽게 구할 수 있지만 그만한 높은 보안이 필요하지 않은 애플리케이션에서는 오버킬로 간주될 수 있습니다. 그런 경우 다른 옵션들이 있으며, 이것이 제가 탐구하고자 하는 내용입니다.

해커가 장치의 메모리 내용에 접근할 수 있다면, 장치가 무엇을 하고 어떻게 하는지 파악하기 시작할 수 있습니다. 이는 동작을 변경하는 첫 단계입니다. 코드는 역어셈블될 수 있고, 따라서 로직이 드러날 수 있습니다. 암호화 없이는 이를 방지할 수 있는 방법이 거의 없습니다. 해커가 다음으로 할 수 있는 일은 데이터의 헥사/ASCII 덤프를 보고 거기서 의미 있는 것을 찾는 것입니다. 그들은 패턴과 인식 가능한 구조를 찾습니다. 여기서 몇 가지 예방 조치를 취할 수 있습니다. 암호화가 옵션이 아니라면, 난독화가 가능합니다.

데이터 난독화의 목표

데이터 난독화의 목적은 데이터를 그 본연의 모습으로 덜 알아볼 수 있게 만들어 해커를 지연시키거나 단념시키는 것입니다. 메모리 덤프를 스캔할 때 쉽게 발견할 수 있는 것 중 하나가 텍스트 문자열입니다. 그래서 여기에 초점을 맞추겠습니다.

C/C++에서 텍스트 문자열 처리

C/C++ 코드에서 텍스트 문자열은 보통 ASCII 코드를 포함하는 바이트 시퀀스로, 널 바이트로 종료됩니다. 이는 매우 쉽게 발견되므로 변경하겠습니다. 첫째, 널 종료자 대신 각 문자열의 첫 바이트를 길이 지정자로 사용합니다. 문자열의 문자들은 약간 데이터를 섞어서 덜 익숙하게 보이게 만듭니다. 할 일은 각 바이트의 두 니블을 교환하는 것뿐입니다. 일반 텍스트 문자열을 입력받아 적절한 초기화로 배열 선언을 생성하는 유틸리티 프로그램이 필요합니다. 이 유틸리티의 핵심 함수는 다음과 같습니다:

void scramble(int index, unsigned char *input) { unsigned char *charpointer, character; printf("unsigned char string%d[%d] = {0x%02x,", index, strlen(input)+1, strlen(input)); charpointer = input; while(*charpointer) { character = *charpointer++; character = ((character & 0x0f) << 4) | ((character & 0xf0) >> 4); printf("0x%02x", character); if (*charpointer) printf(","); } printf("}; // \"%s\"\n", input); } 

이 함수에 인덱스 4와 문자열 "Hello world"를 전달하면 출력은 다음과 같습니다:

unsigned char string4[12] = {0x0b, 0x84, 0x56, 0xc6, 0xc6, 0xf6, 0x02, 0x77, 0xf6, 0x27, 0xc6, 0x46}; // "Hello world" 

이 코드를 복사하여 내 코드에 붙여넣고, 텍스트를 표시해야 할 때 난독화를 풀어주는 함수를 작성하면 됩니다. 각 문자열에 인덱스 번호를 부여하는 대신, index 매개변수를 문자열로 바꿔 임의의 이름을 줄 수 있습니다. 생성된 코드는 주석에 읽기 쉬운 형태로 문자열이 표시되어 어느 정도 자기 문서화되어 있지만, 이는 소스 코드에만 나타납니다. 해커가 소스 코드에 접근할 수 있다면, 저는 더 이상 도와드릴 수 없을 만큼 심각한 상황입니다!

난독화 해제 코드

난독화 해제 과정을 보여주는 코드는 다음과 같습니다:

void main() { unsigned char temp, buffer[50]; int count = string4[0], index=0; while(count--) { temp = string4[index+1]; temp = ((temp & 0x0f) << 4) | ((temp & 0xf0) >> 4); buffer[index] = temp; index++; } buffer[index] = 0; printf("-%s-\n", buffer); }

각 바이트의 니블을 교환하는 것은 난독화를 수행하는 여러 방법 중 하나입니다. 또 다른 가능성은 각 문자를 3비트 왼쪽으로 회전시키는 것입니다. 이를 수행하는 코드는 다음과 같습니다:

unsigned char leftrotate3(unsigned char c) { c = (c << 3) | (c >> 5); return c; }

제가 설명한 난독화 기법들은 문자 단위로 문자열을 섞습니다. 문자열 전체에 대해 작업을 수행하는 것도 가능합니다. 예를 들어, 문자열을 긴 비트 시퀀스로 취급하고 임의의 수만큼 왼쪽으로 회전시킬 수 있습니다. 이 알고리즘의 코딩은 열정적인 독자에게 맡기겠습니다.

모든 텍스트 문자열을 지역화하는 것의 부수 효과로, 다른 언어를 위한 소프트웨어의 다양한 버전을 만드는 것이 상당히 간단해집니다.

데이터 난독화는 방탄과는 거리가 멀고, 기껏해야 진지한 해커를 늦출 뿐임을 다시 한번 강조합니다. 무엇보다도 난독화 해제 코드가 역어셈블될 수 있습니다. 이 기법의 요령은 난독화 흔적을 따라가기 어렵게 만드는 것입니다. 정말 더 높은 보안이 필요하다면 완전한 암호화를 고려해야 합니다.

임베디드

  1. 피아노: 고대 뿌리에서 현대적 완성까지
  2. 임베디드 시스템이 이끄는 현대 자동차 혁신
  3. 임베디드 시스템 기초 및 실전 응용 분야
  4. 3D 프린팅 워크플로 소프트웨어가 갖춰야 할 10가지 필수 기능
  5. SOAFEE: 소프트웨어 정의 자동차 플랫폼을 강화하는 클라우드 네이티브 아키텍처
  6. DevOps로 임베디드 소프트웨어 과제 극복하기
  7. 로봇이 바꾸는 공장: 제조업체가 알아야 할 핵심 사항
  8. 임베디드 소프트웨어, 하드웨어 공급망을 민첩하게 재편하다
  9. 스마트 팩토리의 핵심, 소프트웨어 상호 연동의 이점
  10. 종교 시설 운영 혁신: 시설 관리 소프트웨어의 숨은 가치