백악관이 C, C++ 언어 사용을 중단할 것을 발표했습니다.
이 언어가 보안상 안전하지 않기 때문에 현재까지 사이버 공격을 받아왔으며
Rust와 같은 다른 언어로 대체해야 된다는게 이들의 의견이에요.
이번 포스팅에서는 C와 C++의 어느 점 때문에 보안에 취약한거고 어떻게 해킹을 당하는건지 알아볼게요!
Garbage Collector부터!
그 전에 가비지 컬렉터(Garbage Collector)에 대해 말해보겟습니다.
유저가 프로그램을 실행하면 Hard Disk에 설치되어 있는 프로그램이 메모리에 Load됩니다.
메모리에는 하나의 프로그램만 Load되는 것이 아니죠. 여러 프로그램이 올라가고 메모리를 공유해야 되기 때문에 개발자는 효율적인 메모리 관리를 항상 생각해야합니다.
가비지 컬렉터는 이러한 메모리 관리를 자동으로 도와주는데, 메모리에 저장된 데이터를 추적하고 프로그램이 더 이상 사용하지 않을 때 메모리를 자동으로 정리합니다. 개발자가 직접 메모리를 해제하거나 신경쓰지 않아도 되기 때문에 엄청 편리하죠.
우리가 많이 사용하는 Java, Python, C#, Javascript 등 많은 언어들은 가비지 컬렉터를 내장하고 있어서 이 언어들로 개발할 때 개발자가 따로 메모리 걱정을 하지 않도록 수고를 덜어줍니다.
Garbage Collector는 만병통치약??
그렇다고 가비지 컬렉터가 만능 통치약은 아니에요. 자동으로 해줘서 편하지만 단점도 있어요.
바로 느리다는거에요. 가비지 컬렉터 사용은 프로그램 속도를 느리게 합니다. 이를 GC 일시 중지라고 말해요.
이건 아주 치명적인 단점이 될 수 있는데요.
예를 들어 특정 시간마다 가비지 컬렉터가 동작하여 느려진다면 게임을 하는데 일정 시간마다 렉이 걸릴 수도 있고 금융, 우주 공학과 같은 크리티컬한 분야에서는 심각한 이슈로 발전될 수 있어요.
그냥 C, C++ 쓸래!
이렇게 GC 일시 중지가 용납되지 않는 곳에서 C와 C++에 대한 수요가 폭증합니다.
이러한 이유로 C와 C++는 지난 수십 년 동안 전 세계가 최대한 빠른 프로그램 구축하기 위해 사용해온 언어입니다.
C와 C++는 가비지 컬렉터가 없기 때문에 개발자는 메모리를 수동으로 관리해야 합니다. 필요한만큼 메모리를 사용하고 목적을 달성하면 이를 해제해야 하죠. 메모리 할당을 해제하지 않으면 메모리 누수가 발생합니다. 프로그램이 점점 많은 메모리를 계속 사용하게 되는거죠
가비 컬렉터를 사용하지 않고 수동으로 메모리르 관리하면 개발자는 프로그램을 더 최적화하여 더 빠르고 효율적으로 만들 수 있습니다.
하지만 그 만큼 메모리 관리하는데 많은 노력을 기울이고 그러지 못한만큼 댓가를 치뤄야 하죠.
수동으로 메모리를 관리하게 되면 프로그램에 다양한 메모리 안전 문제가 발생할 수 있어요.
메모리 안전 문제???
메모리 안전 문제란 프로그램이 정상적이지 않은 방식으로 메모리에 액세스하려고 할 때 발생합니다. 이로 인해 프로그램이 충돌하거나 에기치 않게 종료되는 등의 문제가 발생하기도 해요.
그리고 메모리 안전 문제는 보안 측면에서 위험에 노출되기도 합니다. 해커가 프로그램을 해킹하거나 시스템 제어 시 이러한 이슈를 활용하게 됩니다.
Microsoft에 따른 보안 이슈의 70%가 메모리 안전 문제에서 발생한다고 합니다.
즉 이 많은 보안 문제가 개발자가 수동으로 메모리를 관리함으로 인해 발생한다는 거에요. 개발자의 실수나 역량 부족일 수도 있지만 프로그램의 안정성 측면에서 C와 C++에서 이를 제어하지 않기 때문이라는 의견도 많아요.
예를 들어 Typescript의 경우 Javascript의 Type 관련 이슈를 대부분 언어 측면에서 해결주기 때문에 개발자의 실수를 미리 방지할 수 있는 시스템이 구축되어 있는거죠.
이런 측면에서 C와 C++는 '메모리 안전하지 않은' 언어라고 불리게 되었습니다.
그래서 얼마나 위험한건데??
그럼 메모리가 안전하지 않는 이슈로 인해 발생할 수 있는 몇몇 보안사고에 대해 소개드릴게요. 해커는 이 취약점을 이렇게 이 부분을 활용해서 어떻게 공격하는지 알아볼게요.
버퍼 오버플로우는 프로그램이 메모리에 데이터를 저장하려고 할 때 데이터의 크기가 예상보다 커서 메모리의 다른 부분으로 데이터가 유출될 때 발생하는 메모리 안전 문제입니다.
사용자 이름을 저장하고 싶고 그 길이를 최대 5 Character라고 정의했다고 가정할게요.
사용자가 5글자 이하의 이름을 입력하면 아무 문제가 발생하지 않습니다.
그러나 사용자가 5글자 이상의 이름을 입력하고 이를 개발자가 미리 체크하지 않는다면 메모리에 쓸 공간이 넘치게 되어 옆 메모리가지 공간을 침범하게 됩니다.
여분의 5글자는 인전합 메모리 위치로 넘어가 그곳에 저장된 데이터를 덮어쓰게 됩니다. 이 때 메모리가 손상되고 프로그램이 다운될 수 있습니다.
해커가 이를 악용할 수 있는 방법은 해당 버퍼 옆에 어떤 값이 저장되어 있는지 알아내는거에요.
예를 들어 버퍼 옆에 은행 계좌 잔액 같은 데이터가 저장되어 있다고 가정해볼게요.
해커는 '제어된 버퍼 오버플로'를 사용하여 해당 데이터가 저장된 메모리르 덮어쓰는 방식으로 계정 잔액을 늘릴 수 있어요.
또는 버퍼 옆 영역에 프로그램이 나중에 호출할 함수의 주소가 있는 경우, 해커는 해당 주소를 바꾸고 해커가 만든 함수를 실행하도록 프로그램을 지정하여 프로그램이 임의의 코드를 실행하도록 할 수 있습니다.
보고서에 따른 메모리 안전 문제를 없애는 방법은 메모리가 안전하지 않은 C, C++언어를 사용하는 것 자체를 중단하고 '메모리 안전 언어' - 즉 언어가 실수로 안전하지 않은 코드를 작성하는 것을 아예 허용하지 않는 언어로 전환하는 것이라고 합니다.
가비지 컬렉터가 있는 대부분의 프로그래밍 언어인 C#, Java, Python, Javascript 등은 개발자가 메모리를 전혀 다루지 않기 때문에 메모리 안전 언어 라고 볼 수 있습니다.
속도가 중요하여, 가비지 컬렉터를 사용할 여유가 없지만 메모리 안전 코드를 작성하고 싶은 경우에는 Ada, Rust 같은 언어가 권장된다고 해요. 이 언어들도 가비지 컬렉터가 없기 때문에 메모리가 관리가 수동적으로 이루어지지만, 실수로 메모리에 안전하지 않은 코드를 작성하느 것을 막아주는 기능을 내재하고 있어요.
그렇다고 당장 C,C++가 사라지지는 않을거에요. 아직도 우리 산업에서 많은 소프트웨어가 이 언어로 구현, 운영되고 있으며 안전하지 않다는 이유로 하루 아침에 바꾸는 건 어렵습니다.
다만 조금씩 Rust, Ada로 전환하기 시작할거고 새로 시작되는 프로젝트도 이 언어로 진행하는 경우가 많아질 것 같아요. Microsoft는 이미 핵심 Window 라이브러리를 Rust로 재생산하고 있다고 합니다. Linux도 마찬가지구요.
결국 20~30년이 흐르면 시장에서 C,C++은 자연스럽게 사라질 수도 있겠죠.
(컴퓨터공학과 1학년의 필수과목이 C언어가 바뀔지도 모르겠네요)
앞으로 Rust, Ada의 미래가 점점 궁금해지면서
새로운 패러다임과 인공지능이 만나면 생각보다 빨리 변할 수도 있겠다? 라는 생각도 나는 요즘입니다.
다음에도 더 재밌고 유익한 IT소식으로 찾아뵈겠습니다!
읽어주셔서 감사해요 :)
이 영상은 유튜브 노마드코더의 내용과 일부 기사를 정리하여 작성하였습니다
'Computer Science' 카테고리의 다른 글
C언어, C++, C# 어떤 차이가 있을까? (0) | 2024.04.02 |
---|