본문 바로가기

참가 후기

Ubuntu Fest in Daejeon 참가 후기

https://festa.io/events/291

지난 5월 26일에 열렸던 Ubuntu Fest에 참가한 후기를 적어보고자 한다.

행사는 크게 4가지 세션(2개의 메인, 2개의 미니 세션)으로 진행되었다. 원래 메인 세션이 하나 더 있었는데 참가자가 갑작스럽게 불참하게 되어서 2개로 진행되었다.

 

장소는 충남대학교 공과대학에서 진행되었는데 나 역시 같은 충남에 있는 대학교에 다니지만 대전과 천안은 거리가 좀 있어서 처음 가본 곳이라 새로운 기분이었다. 확실히 지리적으로 더 잘 되어있기에 부럽기도 했고... 학교는 국립대학이라 그런지 넓은 편이었는데 교내까지 시내버스가 다녀서 편하게 들어올 수 있었다.

 

상대적으로 우리학교보다 학생들의 수가 많아서인지는 모르겠지만 교내 학생들이 많이 참가했다는 인상을 받았다. 다들 이런저런 얘기를 하면서 장래에 대해서 얘기하고 의견을 나누는 모습을 보니 같은 정보보안동아리에서 활동하고 있음에도 우리 동아리에는 없던 무언가를 본 기분이었다.

4차 산업혁명과 모바일 포렌식

이 부분은 내가 늦게 도착하는 바람에 절반정도는 듣지 못했던 세션이라 아쉬웠다. 디지털 포렌식의 기초적인 개념에 대해서 얘기하고 현재 어떤 분야에 포렌식이 사용되는지, 포렌식이 법적으로 어떻게 활용되는지에 대해서 이야기하였다. 아쉽게도 발표자료를 공개하지 않았기 때문에 많은 내용을 얻지 못했다.

모든 정규 세션이 다 끝난 후 동일 발표자가 라이트닝 세션으로 자사(한글과컴퓨터)에서 생산하고 있는 디지털 포렌식 솔루션 자료를 소개하였는데 한글과컴퓨터에서도 디지털 포렌식을 다루는 지 처음 알았기 때문에 의외였다.

메모리 공격의 흥망성쇠

이 세션에서는 발표자가 16학번임에도 보안 동아리 회장을 맡고 시스템/네트워크 보안, 모바일 앱 리버스 엔지니어링, macOS/iOS 커널 보안에 대해서 연구하고 있다고 자신을 소개하는 것을 보고 인상깊었던 세션이었다. 헬로 월드를 찍은 지 3년밖에 되지 않았다고 하는데 이런저런 핑계만 대면서 공부를 미루던 내 모습과 비교되어서 그런지 복잡한 기분으로 들었던 것 같다.

 

메모리 공격이 무엇이냐? 그는 간단하게 이렇게 얘기했다. "내가 원하는 메모리 영역 위치에 내가 원하는 값을 쓰는 것." 이를 이용하여 취약점을 Exploit하면 그것이 공격이 되는 것이다. 이는 시스템 해킹의 기초가 되는 부분이지만 그렇다고 메모리 버그, 에러가 메모리 공격과 동일한 의미를 가지진 않는다. 모든 취약점은 버그에 속하지만 모든 버그가 취약점은 아닌 것처럼.

https://bnzn2426.tistory.com/19

이런 메모리 버그는 어떻게 발생하게 되는 것일까? 이는 대부분 메모리를 직접 조작하는 C언어, C++같은 안전하지 않은 언어(Unsafe Language)에서 발생한다. 프로그래머가 로우레벨을 조작할 수 있고 메모리 관리를 프로그래머가 직접 수행해야 하는 그런 언어 말이다. 이로 인해 발생하는 대표적인 예로 'Segmentation Fault'를 들 수 있다.

 

Segmentation Fault는 간단히 말하자면 '운영체제가 소프트웨어 혹은 사용자에게 제한된 메모리 영역을 참조하려 했다는 것을 알려주는 것'이라 할 수 있다. 당장 C언어로 다음과 같은 코드를 작성해서 실행해보면 어떻게 될까?

#include <stdio.h>

int main()
{
	int *p = 0x12345678;
 	printf("%p, %p", p, *p);
	return 0;
}

OnlineGDB에서의 실행결과

위와 같이 오류를 나타내게 된다. 이렇게 직접 메모리의 특정 영역을 참조하려 하거나 대표적인 실수인 문자열 상수에 다른 문자열을 새로 대입하려는 시도, 널포인터 참조, Out-of-Bound 참조, 할당 해제된 메모리 접근 등 부적절한 메모리 접근이 이루어졌을 시 이를 알리는 것이다. 이는 해커들에게 좋은 먹잇감이 될 수 있는데 위에서 언급했듯이 메모리 버그는 취약점이 될 수 있기 때문이다.

 

메모리 공격에는 크게 Code corruption, Control-flow hijack, Data-only, Information leak 이 있다. 이 중 Control-flow hijack, Information leak을 발표자가 소개하였는데 다음과 같다.

 

Control-flow hijack은 메모리를 조작하여 프로그램의 Control-flow를 내 마음대로 바꾸는 것을 의미한다. 프로그램이 함수들을 호출하면서 복귀 주소를 남기고 작업을 수행한 후 이를 마쳤으면 Ret을 통해 복귀하는데 이때 복귀주소를 다른곳으로 바꿔버리거나 그곳에 내가 원하는 값을 씀으로써 원래 의도된 프로그램의 실행 흐름과 다르게 흘러가도록 유도하는 것이다.

 

Information leak은 말 그대로 정보 유출인데 프로그램의 중요한 정보, 사용자가 알아서는 안 되는 canary value 같은 정보를 유출시켜 차후 공격에 활용하는 것을 의미한다. Canary value란?

 

https://www.geeksforgeeks.org/memory-layout-of-c-program/

그렇다면 이런 메모리는 어떤 구조로 이루어져 있을까? 낮은 주소(0x00000000)부터 높은 주소(0xFFFFFFFF)까지 살펴볼 때 크게 텍스트 영역, 데이터 영역, BSS 영역, Heap 영역, Stack 영역으로 나눌 수 있다.

  • 텍스트 영역은 코드 영역으로 프로그램 실행코드 및 기계어가 저장되어 있다.
  • 데이터, BSS 영역은 둘다 데이터를 저장하는 영역이지만 전자의 경우 초기화된 값, 후자는 초기화되지 않은 값을 저장한다. 이곳에는 전역 변수, 정적 변수들이 저장된다.
  • Heap 영역에는 동적할당된 데이터들이 저장된다. malloc 등을 통해 생성되는 그런 종류.
  • Stack 영역에는 지역 변수나 함수, 임시 값(파라미터 등)이 저장되는 영역이다.

이 중에서 Stack 영역에 대해서 살펴보자.

메모리 구조를 보면 알겠지만 Stack과 Heap은 서로를 향해 다가가는 구조이다. 대신 Stack은 높은 주소부터 낮은 주소로, Heap은 그 반대의 순서로 값들을 저장한다. 우리가 어떤 함수 내에서 변수를 선언한다면 그 함수의 스택 프레임에는 지역변수 값들이 저장된다. gdb 등 디버거를 이용해서 디버깅(혹은 단순히 아래처럼 출력)해보면 낮은 주소부터 높은 주소로 지역 변수들이 생성되어 있는 것을 볼 수 있다.

#include <stdio.h>

void func(){
    char txt[16]="AAAABBBBCCCCDDD\x00";
    int i;
    for(i=0;i<4;i++) printf("%p %c%c%c%c\n", &(txt[4*i]), txt[4*i], txt[4*i + 1], txt[4*i + 2], txt[4*i + 3]);
    return;
}

int main()
{
    func();
    return 0;
}

64bit라서인지 메모리 주소가 좀 길다

그런데 이전에 Stack은 높은 주소에서 낮은 주소로 쌓인다고 했는데 왜 지역 변수는 d0~dc 처럼 낮은 주소부터 쌓일까? 이는 아래의 그림을 참고하면 편하다.

http://tcpschool.com/c/c_memory_stackframe

함수를 호출할 때마다 프로그램은 그 함수를 실행하고 돌아올 곳을 남기기 위해 스택프레임을 쌓게 된다. 이때 스택프레임 자체는 높은 주소에서 낮은 주소로 쌓이지만 그 프레임 내부에서는 낮은 주소부터 높은 주소로 저장되기 때문에 지역 변수는 위와 같이 저장되는 것이다.

 

이때 함수 호출 후 복귀하는 행위를 기계어로 Ret이라 한다. 리퍼런스 이 돌아오는 행위를 하려면 당연히 복귀할 주소를 기억하고 있어야 하며 이를 기억하는 곳이 스택프레임의 Stack Frame Pointer(SFP)이다.

 

아무튼 이런 스택을 이용한 대표적인 메모리 공격은 무엇일까? 이것이 바로 그 유명한 버퍼 오버플로우(bof)다. 이는 대부분 사용자 입력의 크기를 확인하지 않아서 발생하는 취약점으로 입력이 인접 메모리 영역을 침범하여 스택 프레임의 Ret, SFP 등을 덮어쓰게 되는 것이다. 이렇게 변조된 주소로 복귀한 프로그램은 제한된 영역으로 복귀했을 경우 비정상 종료되게 된다.

 

혹은 이를 이용해서 Control-flow hijack을 수행할 수도 있는데 프로그램이 'evil' 함수(악의적인 용도)로 점프하도록 하여 쉘코드를 실행시키는 등 원하는 행동을 수행할 수 있다. 쉘코드?

 

이를 악용한 가장 대표적인 사례로 모리스 웜을 들 수 있다.

 

이를 막기 위해서 Non eXecutable Stack, Canary value 등이 등장하게 되었다.

전자의 경우 Stack이나 Heap의 특정한 코드를 실행하는 것을 방지하는 것으로 코드를 실행할 수 있는 권한을 뺏어 접근 시 프로그램이 종료되는 것이다. 이는 하드웨어와 운영체제가 지원해야 하며 BSD에서는 W^X, 윈도우즈에서는 DEP으로 구현되어 있다. 전자의 경우 XOR연산자(^)에서 볼 수 있듯이 write하거나 execute할 수 있지만 둘 다는 안된다는 것을 뜻한다. 스택프레임의 Text 영역에는 non-writable, Stack 영역에는 non-executable 속성을 적용한다.

 

후자의 경우 Stack canary라고도 하며 위에서 간단하게 설명했지만 'canaries'라 불리는 특정한, 사용자가 유추할 수 없는 패턴을 스택 변수들과 복귀주소 사이에 삽입하는 기법이다. 이는 버퍼 오버플로우를 탐지하기 위해 고안되었는데 만약 버퍼 오버플로우가 일어난다면 다른 부분보다도 이 '카나리아' 값이 먼저 영향을 받게 될 것이므로 이를 바탕으로 버퍼 오버플로우가 일어났는지를 탐지할 수 있는 것이다. 간편하고 좋은 방법이지만 위에서 언급한 Information leak에 의해 이 canary value가 누출된다면 우회될 수 있다.

 

이를 우회하기 위해 RTL(Return-To-Libc)나 ROP등이 연구되었다. 물론 이 둘은 다르지만 기본적인 컨셉은 비슷한다.

전자의 경우 NX Stack을 우회하기 위해 기존에 해커의 코드로 점프하는 것이 아니라 공유 라이브러리 등 원래 있는 코드로 점프하는 것에 착안한 방법으로 ret2plt(PLT를 통하여 동적 라이브러리의 함수를 호출) 등의 방법도 있다.

 

후자의 경우 실행중인 프로그램의 라이브러리에 있는 함수들을 원하는 것만 재사용하는 것으로 gadgets(snippets) 등을 사용한다. 자세한 것은 이 링크를 참고하자(나도 아직 이해하지 못했다...).

 

이런 식으로 계속 되는 창과 방패의 싸움은 ASLR(Address Space Layout Randomization)이 등장하면서 어려워졌다. 이는 프로세스의 Stack, Heap, 공유 라이브러리 등이 메모리에 매핑되는 위치를 항상 다르게(random) 함으로써 위에서 언급한 RTL(libc를 사용) 등을 어렵게 만드는 방법이다. 공격자가 어디로 점프하려고 하든 위치를 알아야 하는데 더이상 위치를 확실하게 알 수 없어졌으므로 이를 알아내기 위해 전사 공격(Brute-Force)도 동원되었으나 32bit 메모리라면 몰라도 64bit에서는 메모리 크기가 너무 커졌기 때문에 거의 불가능하게 되었다. 그렇기 때문에 Information leak을 활용하여 base address, offset 등을 알아내는 등으로 우회하는 방법이 탄생하였다.

 

후에는 더 발전하여 EMET(Enhanced Mitigation Experience Toolkit), CFG(Control Flow Guard) 등이 등장하면서 악의적인 호출은 대부분 차단되었고 메모리 공격에도 한계가 보이는 듯 했으나 Stack이 아니라 Heap을 공격(Heap Spraying, Heap Feng Shui 등)하거나 Type Confusing, User-After-Free 등의 파훼법이 연구되고 있다. 발표자가 말하길 컨퍼런스에서 발표된 메모리 공격 중 이제 Stack은 거의 없고 대부분 Heap을 공격하는 방식으로 연구되고 있으며 이런 Mitigation들은 완벽한 방어수단(Deus Ex Machina)이 아니므로 아직 기회는 있다고 하였다.

 

https://www.slideshare.net/UbuntuKorea/memory-attack-the-memory-attack-techniques 

 

Memory Attack - The Memory Attack Techniques

2019.05.26 - Ubuntu Fest, Daejeon (우분투 페스트, 대전)

www.slideshare.net

Overview of Flatpak

리눅스 애플리케이션 개발 프레임워크인 Flatpak에 대한 소개를 진행하였다.

 

Flatpak은 애플리케이션 배포를 위한 프레임워크로 모든 리눅스 배포판에서 동일한 실행환경을 제공하고 애플리케이션 레벨에서 가상화를 지원(샌드박스)한다는 특징이 있다고 하였다. 공식 사이트

 

Flatpak—the future of application distribution

An independent project Flatpak is developed by an independent community, with no lock-in to a single vendor.

flatpak.org

그렇기 때문에 의존성 해결이 쉬운데 이는 운영체제가 사용하는 여러 프로세스는 숨겨지고 샌드박스 입장에서 운영체제를 나 혼자 독점하고 있다고 생각하게 된다. 시스템 및 애플리케이션을 모두 가상화하여 의존성 관리 부담을 줄이고 런타임 라이브러리만 교체하여 사용하는 방식을 추구할 수 있으며(트렌드이기도 하고) GNOME, KDE 애플리케이션이 대부분 Flatpak을 지원하기 때문에 유용하다고 하였다. 또한 이렇게 멀티플랫폼을 지원하는 애플리케이션을 개발하는 것이 더 좋지 않겠느냐는 발표자의 의견에 공감하게 되었다.

 

https://www.slideshare.net/UbuntuKorea/overview-of-the-flatpak

 

Overview of the Flatpak

2019.05.26 - Ubuntu Fest, Daejeon (우분투 페스트, 대전)

www.slideshare.net

2학기에 시스템 프로그래밍을 수강할 예정이고 지금도 인프런에서 리눅스 프로그래밍 기초 강의를 듣고 있는데 이를 다 들으면 한번 연습삼아 사용해보고 싶다. Qt를 이용해서도 개발해보고 싶었는데 이는 파이썬이나 C++을 이용해서 만들 수 있기 때문에 조금 미뤄보도록 하자.

Open Source and the License

이 세션은 우분투 커뮤니티 운영자가 발표를 했는데 이전의 기술적인 세션들과는 달리 Open Source Lisence와 Lisence의 중요성에 대해 발표하였다.

 

오픈 소스란 무엇일까? 이는 '소프트웨어 혹은 하드웨어의 제작자의 권리를 지키면서 원시 코드를 누구나 열람할 수 있도록 한 소프트웨어 혹은 오픈 소스 라이선스에 준하는 모든 통칭'을 일컫는다. 원시 코드를 누구나 열람할 수 있다는 게 핵심인데, 그렇다면 라이선스란 무엇일까? 간단히 말해서 면허증과 자격증의 차이를 생각해보면 된다. 어떤 작업을 할 때 후자는 없다고 해도 불법이 아니지만 전자의 경우 없다면 불법이 된다.

 

즉 소프트웨어 라이선스란 '소프트웨어를 사용할 수 있는 권한 또는 사용을 허가한다는 내용을 담은 문서 따위'를 의미하며 이 문서를 받은 자는 문서에 명기된 조항에 따라 소프트웨어를 사용하는 것이 허가된다. 그렇다면 이것이 오픈소스 라이선스일까? 당연히 아니다. 소프트웨어 라이선스 안에 오픈소스 라이선스가 포함되어 있지만 서로 다른 라이선스인 관계를 가진다. 

 

오픈소스 라이선스로 제작된 프로그램이라 하더라도 소프트웨어 라이선스 없이 사용한다면 이는 불법이 된다. 코드 작성시에는 오픈소스 라이선스를, 컴파일 후 Object 생성때는 소프트웨어 라이선스를 적용하여 유료/무료 소프트웨어로 갈리는 것이다. 대표적으로 Redhat에서도 페도라, 센토스로 배포판이 구분되는 것이나 MySQL 등을 예로 들 수 있다.

 

최근의 사례를 들면 Google이 화웨이에 Android 지원을 중단한 사태가 있는데 Android의 라이선스는 소스만 공개되어 있고 이 Android System을 판매하려고 하면 Google에 사용료를 지불하고 소프트웨어 라이선스를 획득하여야 한다. 만약 Google의 허락 없이 판매한다면 라이선스를 위반하게 되는 것.

 

임베디드 시스템의 경우를 살펴보면 GPL v2 라는 라이선스가 있다. 임베디드 시스템 내부에서 임베디드 리눅스를 사용하다가 수정한 부분이 있다면 이는 라이선스에 따라 모두 공개해야 된다. 그렇기 때문에 하드웨어 등이 유출될 수 있는 문제가 있기도 하다. 하지만 BSD Unix는 BSD 라이선스가 적용되어 코드공개를 할 필요가 없기 대문에 임베디드 리눅스에서는 BSD로 점차 건너가는 중이라는 듯(플레이스테이션, 닌텐도 등).

 

이런 라이선스는 때때로 오히려 리눅스 발전의 발목을 잡는 경우가 되기도 한다고 하였다.

 

https://www.slideshare.net/UbuntuKorea/open-source-and-the-license

 

Open Source and the License

2019.05.26 - Ubuntu Fest, Daejeon (우분투 페스트, 대전)

www.slideshare.net

MQTT 사용기

라이트닝 세션에서 충남대학교 재학생이 자신이 사용하였던 프로토콜 MQTT에 대해서 간략히 설명하였다.

이를 알게 된 계기는 IoT 제조 스타트업에서 일을 하면서 센서 데이터를 서버로 전달하고 서버에서 제어신호를 특정하여 기기로 전달하는 작업을 수행하게 되었는데 REST 서버를 사용할지, Socket을 사용할지 고민하던 중 MQTT를 알게되었다고 한다.

 

TCP 기반 프로토콜이며 IBM에서 만든 프로토콜인데 Publish, Subscribe로 구성되어 Topic으로 분류하여 Publish한 Topic을 Subscribe 하는 형식이라고 한다.

 

서버로 스프링 부트를 사용하고 있는데 MQTT를 지원하는 라이브러리를 적용해서 편하게 사용하고 있다고 하면서 추천하였다. 나도 2학기 때부터 공학설계를 수행하면서 IoT 관련 작품을 제작하게 될 것 같은데 이를 적용할 수 있을지 한번 조사해 봐야 할 것이다.

 

https://www.slideshare.net/UbuntuKorea/usage-of-the-mqtt

 

Usage of the MQTT

2019.05.26 - Ubuntu Fest, Daejeon (우분투 페스트, 대전)

www.slideshare.net

이에 관해서 이전 발표자료를 찾아보다 보니 MQTT에 대해 발표한 자료가 더 있었는데 이쪽이 내용이 더 많아서 한번 읽어볼만 한 것 같다.

https://www.slideshare.net/UbuntuKorea/mqtt-102921138

 

기계들의 소셜 미디어, MQTT

2018.06.23 Ubuntu Fest In Daejeon 기계들의 소셜 미디어, MQTT - 신근수 님 발표자료

www.slideshare.net

결론

우분투 관련 세미나는 처음 참석해보았는데 생각외로 준수한 내용들이 발표되어서 만족스러웠다. 특히 메모리 공격에 대한 내용은 발표자의 지식과 내 부족함을 동시에 알 수 있는 내용이었고 Flatpak 프레임워크나 MQTT에 관한 내용도 차후 학습 진행에 도움이 되었다. 라이선스에 관련해서는 언젠가는 개발(혹은 보안)을 하다보면 누구나 마주칠 수 있는 것이기 때문에 지금이라도 관심을 가지게 되어서 다행이라고 생각한다.