Post

[주간 이슈] - 10월 2주차 IT이슈 및 분석(C언어의 몰락)

0. 금주의 IT이슈


이번주의 IT이슈입니다만…이번주는 IT 이슈가 흥미로운 소재가 없어서 기회가 되면 소개드리고 싶었던 C언어에대한 이야기를 하고자합니다. C언어가 왜 지금은 미 국방부와 여러 기관에서 사용을 지양하는 언어가 되었는지에 대해서 설명해드리도록 하겠습니다. 그러면 C언어 이야기 지금 시작하겠습니다!


1. C언어 이야기


C언어는 1969년에서 73년 사이에 B언어를 기반으로 만들어진 언어입니다.
그렇게 70~80년대 유닉스 운영체제의 확산과 함께 컴퓨터 시스템의 표준으로 자리잡았으며
언어 통일성을 높이고 여러 프로그램의 안정적인 개발 환경 제공을 위해 1989년 ANSI에서 C언어를 통해 표준화를 추진하면서 더욱 널리 사용되었습니다.
그렇게 80년대 후반 객체지향 프로그래밍의 등장과 함께 대규모 소프트웨어 개발에 유리하고 C언어 보다 유연하고 객체지향 개념을 도입한 C++이 등장하면서 C언어의 위상이 흔들리기 시작하였습니다.
21세기에 들어오서면서부터 더욱더 강력하고 간결한 문법을 제공하는 JAVA, C#과 같은 언어가 등장하면서 C언어의 사용은 줄어들었습니다.
이에 2024년 미 국가 사이버국(ONCD)에서 C와 C++언어의 메모리 안전성 문제를 지적하며 해당 언어 사용을 지양할것을 권고하였습니다.
이외에도 다양한 기관(미국 국방부, 미국 국가 안보국, 미국 국가 표준 기술 연구소, 등등)에서 해당언어의 사용을 지양하고 있습니다.


2. C언어의 특징


C언어는 매우 강력한 프로그래밍언어이며 아래와 같은 특성을 가지고 있습니다.

2.1 ) 저수준 언어와 고수준 언어의 혼합

C언어는 저수준 언어의 특성과 고수준 언어의 특성을 모두 갖추고 있습니다.
이는 C언어가 하드웨어 제어 및 메모리 관리와 같은 저수준 작업을 지원하면서 동시에 고수준 언어에서 사용하는 제어 구조와 함수등을 제공한다는것을 의미합니다.

2.2 ) 이식성

C언어로 작성된 프로그램은 하드웨어 의존성이 적고, 다양한 플랫폼에서 쉽게 포팅이 가능합니다.
이는 유닉스 운영체제가 다양한 시스템에서 동작될 수 있었던 이유중 하나입니다.

2.3 ) 포인터

메모리 주소를 직접 참조하여 값을 수정하거나 읽을 수 있게하는 기능을 제공합니다. 이를 통해 효율적인 메모리 관리와 직접적인 하드웨어 제어가 가능합니다. 하지만 이러한 특징은 프로그램 오류, 메모리 누수, 버퍼 오버플로우 같은 취약점을 야기합니다.

2.4 ) 메모리

C언어에서는 메모리 관리를 개발자가 직접 수행해야 합니다.
동적 메모리 할당을 위해 malloc()와 같은 다양한 함수를 통해 할단된 메모리는 free()를 통해 메모리를 해제해주어야 합니다.
이는 메모리를 매우 효율적으로 사용가능하다는 장점도 있으나, 잘못된 메모리 관리는 메모리 누수 혹은 잘못된 메모리 접근같은 문제를 야기합니다.

2.5 ) 가벼운 언어

C언어는 가볍고 실행 속도가 매우 빠르기 때문에 성능이 중요한 시스템 프로그래밍에 사용될 수 있습니다.

2.6 ) 유연성

포인터, 직접적인 메모리 제어, 비트 조작 등을 통해 원하는 방식으로 프로그램을 작성 할 수 있는 유연성이 높습니다.
하지만 이는 프로그래밍 능력에 따라서 오류 발생 가능성이 커질 수 있습니다.


3. C언어의 위험성


C언어의 특징에서 보았듯이 C언어는 개발자의 능력에따라서 매우 효율적이고 강력한 언어가 될 수 도 있으며 매우 비효율적이고 불안정한 프로그램이 될 수 있습니다.
특히 메모리 취약점 문제는 매우 심각한 문제중 한개입니다.
대표적인 문제는 아래와 같습니다.

3.1 ) 버퍼 오버플로우

프로그램에 할당된 메모리 영역을 초과하여 데이터가 기록되는 현상을 말합니다.
이는 자칫 인접 메모리 영역을 침범하게되어 공격자가 임의의 코드 실행 혹은 시스템 손상을 유도할 수 있습니다.

3.2 ) NULL 포인터 참조

C와 C++은 포인터를 사용하여 메모리 주소를 직접 참조할 수 있습니다. 이는 잘못된 메모리 주소에 접근하면 널포인터 참조가 발생하여 오류를 야기할 수 있습니다.
이는 공격자가 악의적으로 메모리를 조작할 수 있으며 시스템 손상을 야기할 수 있습니다.

3.3 ) 메모리 누수

메모리를 수동으로 관리하다보면 해제하지않은 메모리가 있을 수 있습니다. 이는 메모리 누수를 야기하며 시스템 성능 저하와 시스템 손상을 야기할 수 있습니다.

3.4 ) 피해사례

다양한 피해사례들이 있습니다.

  • 메모리 누수로 인해 시스템이 비정상적으로 종료되었던 Firefox(2006년)
  • NULL포인터 역참조로 인해 공격자가 루트 권한을 탈취하는데 악용될 수 있었던 Android 커널 취약점
  • 버퍼 언더리드(버퍼의 경계를 벗어난 메모리에서 의도하지 않는 데이터를 읽어오는 현상)로 인해서 민감한 데이터가 유출될 수 있었던 Heartbleed 버그(2014년) 이런 다양한 오류들이 C언어의 프로그래밍 오류로 인해 발생 할 수 있습니다.


3. 정부의 대응


2024년 미국백악관은 더이상 C와 C++같은 메모리 비안전 언어의 사용을 지양하고, 메모리 안전 언어로 지양할 것을 권고하였습니다.
이 는 메모리 안전 언어의 도입을 통한 디지털 생태계에서 발생하는 주요 취약점을 최대한 줄이는 방안으로 제시된것입니다.

이와같이 정부에서도 C언어의 취약점을 매우 심각하게 받아들이고 있다는것이 들어나고있으며, 과거에는 이러한 취약점에도 불구하고 대체할 수 있는 언어가 많지않음과 동시에 다양한 이점이 있어서 계속 사용을 해왔지만 앞으로는 대체언어로의 사용을 가속화 할것으로 보입니다.


3. 대안


현재는 메모리 안전을 보장하면서도 C수준의 성능을 제공하는 RUST가 각광 받고 있으며,
특히 보안이 중요한 분야에서는 RUST가 적극적으로 받아들여지고있습니다.


3. 그러면 이제 C언어 안씀?


이것에대한 대답은 NO입니다.
왜냐하면 위에서 말했다싶이 대부분의 취약점은 프로그래머의 실력에 따라서 달라지는 오류들입니다.
또한 C언어는 성능이 중요한 시스템에서 저수준 시스템 프로그래밍을통해 매우 효과적으로 사용될 수 있으며 임베디드 시스템에서 중요한 역할을 하고있기 때문입니다.
그리고 기존에 이미 많은 프로그램들이 C언어로 제작이 되어있어 현실적으로 이를 모두 다시 작성하는것은 현실적으로 불가능에 가깝습니다.


4. 결론


C언어는 앞으로도 꾸준히 수요는 있을것이나 많은 부분에서 그 영역이 축소될것입니다.
이에 앞으로 C언어의 개발을 할때에는 다양한 공부를 깊이있게하고 보다 단단한 프로그램을 만들어야할것이며, 보안이 중요한 프로그램을 개발시에는 다른 언어의 사용을 적극 검토할 필요성이 있을것으로 보입니다.

C언어는 사실 제가 처음 배웠던 언어이기도 하고 배울점이 많아 좋아하던 언어였습니다.
하지만 시대의 흐름과 다양한 문제로 인해 이제는 수요가 많이 떨어지고 있는것이 현실입니다.
이러한 상황과 배경을 여러분에게 꼭 전해드리고 싶어서 이렇게 글로 작성하게 되었습니다.

혹시 글에 잘못된부분 혹은 궁금하신 부분이 있으신 분들께서는 댓글주시면 확인하도록 하겠습니다!

이만 가보도록 하겠습니다!


출처


ONCD 보고서

This post is licensed under CC BY 4.0 by the author.