Life style

백악관에서 C, C++ 언어를 쓰지 말라고 했다고? 왜??

jaewpark 2024. 3. 12. 15:37

현재 Swift를 사용한 iOS 개발을 하면서 관련이 없을 수도 있겠지만, 워낙 이슈가 되는 만큼 궁금해서 내용을 정리하고자 합니다.

우선 관련 내용은 백악관 내 ONCD(Office of the National Cyber Director)에서 작성된 문서를 기반으로 합니다.

 

ONCD 문서

Final-ONCD-Technical-Report.pdf
0.58MB

 

# A PATH TOWARD SECURE AND MEASURABLE SOFTWARE

`President Biden’s National Cybersecurity Strategy` 에서는 두 가지 기본적인 변화를 제시합니다. 하나는 사이버 공간을 방어하는 책임을 균형있게 재조정하는 것이며, 다른 하나는 장기적인 사이버 보안 투자를 선호하는 `인센티브`를 재조정하는 것입니다. 여기서 나오는 `인센티브`는 세금이나 보조금 혜택 등 재정적 지원 혹은 보안에 대한 긍정적인 평가를 받은 기업이나 개인에게 시장에서 경쟁 우위나 평판 혜택을 제공하여 부안 투자를 장려하도록 하는 분위기 등을 이야기 합니다.

소프트웨어 취약점을 완화하는 것이 복잡한 시스템 문제이며, 현재의 생태계는 사이버 공간의 기초를 보호하기 위해 필요한 투자를 충분히 인센티브화하지 않는다는 사실에서 비롯됩니다. 이러한 위험을 방치하면 비용이 많이 들고 미국의 적들이 상황을 이용하려 시도할 수 있다고 합니다. 사이버 보안에는 silver bullets이 없지만, 오늘의 자원을 내일의 포부와 조화시킴으로써 힘을 얻을 수 있다고 합니다.

## SECURING THE BUILDING BLOCKS OF CYBERSPACE
소프트웨어 제조업체는 시기적절하고 완전하며 일관된 `CVE 데이터`를 발표하는 것이 좋습니다.

> CVE 데이터는 "Common Vulnerabilities and Exposures"의 약자로, 컴퓨터 시스템 및 소프트웨어에서 발견된 보안 취약점에 대한 표준 식별자입니다. 이는 보안 커뮤니티에서 보안 문제를 쉽게 식별하고 추적할 수 있도록 돕는 중요한 시스템입니다.

과거의 CVE 데이터 분석은 메모리 안전 버그를 여러 해 동안 괴롭혀온 가장 보편적인 취약점 클래스 중 하나로 확인했습니다. 메모리 안전 취약점은 메모리가 어떻게 액세스되고 쓰여지며 할당되거나 할당 해제되는지에 영향을 주는 취약점 클래스입니다. 이러한 언어들이 C 와 C++ 가 사용된 언어입니다.

메모리 안전 취약점에는 공간 및 시간적 측면이라는 두 가지 넓은 범주가 존재합니다.
1. 공간 메모리 안전 문제는 메모리 액세스가 변수와 객체의 "올바른" 경계를 벗어나 수행될 때 발생
2. 시간적 메모리 안전 문제는 객체가 해제된 후에 객체 데이터에 액세스하거나 메모리 액세스가 예상치 못하게 교차되었을 때 발생

메모리 안전 프로그래밍 언어를 사용하면 대부분의 메모리 안전 오류를 제거할 수 있기 때문에, 소프트웨어 보안을 현저히 개선하는 가장 효율적인 방법입니다.

### 메모리 안전 프로그래밍 언어를 채택

1. 첫날 부터 메모리 안전 프로그래밍 언어를 사용하여 새 제품을 설계하고 개발
2. 메모리 안전 프로그래밍 언어로의 전환 업계 분석에 따르면 엄격한 코드 검토와 기타 예방 및 탐지 제어에도 불구하고 패치되고 CVE 지정이 부여된 메모리 안전하지 않은 언어의 보안 취약점 중 최대 70%가 메모리 안전 문제로 인한 것으로 나타났다. 대규모 코드 기반을 메모리 안전 언어로 마이그레이션하면 메모리 안전 취약점이 거의 제거된다는 증거가 있습니다.

> 2019년 Microsoft 보안 팀에서는 보안 취약성의 약 70%가 메모리 안전 문제로 인해 발생했다고 보고

### 메모리 안전 하드웨어
오늘날에는 적극적으로 우주 시스템을 파괴하려는 적이 있다.
우주 생태계도 메모리 안전 취약점에 면역이 아니지만, 언어 사용과 관련하여 몇 가지 제약이 있습니다.

1. 코드가 커널에 가까워지도록 하여 소프트웨어 및 하드웨어와 밀접하게 상호 작용 가능
2. 출력의 시간이 일관되도록 결정론을 지원
3. "가비지 컬렉터"라는 컴퓨터 프로그램에 의해 할당된 메모리를 자동으로 회수하는 기능이 없거나 재정의 불가

이러한 세 가지 속성을 모두 갖춘 가장 널리 사용되는 언어는 C와 C++입니다. 메모리 안전 프로그래밍 언어의 한 예인 Rust는 이러한 요구 사항을 갖추고 아직 우주 시스템에서의 유효성이 증명되지 않았습니다. 우주와 유사한 제약을 갖는 임베디드 시스템에서 보완적인 접근이 필요하다고 합니다.

## ADDRESSING THE SOFTWARE MEASURABILITY PROBLEM
생태계 전체적인 행동 변화를 유도하려면 소프트웨어의 사이버 보안 품질을 측정하는 경험적 지표를 개발하는 것이 중요합니다. 개발된 지표를 통해 다양한 이해관계자의 결정을 지원하고 디지털 생태계의 보안을 더욱 향상시키고 안전한 소프트웨어 개발에 작기적인 투자를 유도한다고 합니다.

 

메모리 안전 프로그래밍 언어는 버퍼 오버플로, 범위를 벗어난 읽기, 메모리 누수 등 메모리 액세스와 관련된 소프트웨어 버그 및 취약성으로부터 안전한 프로그래밍 언어를 의미합니다.

 

가비지 컬렉터 GC (Garbage Collector)

GC는 프로그램이 실행되는 동안 메모리 관리를 자동화하는 기능입니다. 프로그램이 실행될 때, 컴퓨터의 메모리에는 여러 프로그램이 동시에 저장됩니다. 이 때, 각 프로그램이 사용하는 메모리를 관리해야 합니다. 메모리 관리는 프로그램이 필요로 하는 메모리를 할당하고, 더 이상 사용되지 않는 메모리를 해제하여 다른 용도로 사용할 수 있도록 하는 것입니다.

GC는 이러한 메모리 관리를 자동화하여 개발자가 메모리 관리에 대해 직접적으로 신경 쓰지 않도록 합니다. 이를 통해 개발자는 프로그램의 핵심 로직에만 집중할 수 있게 됩니다. GC는 메모리에 저장된 데이터를 추적하고, 더 이상 사용되지 않는 데이터를 자동으로 해제하여 메모리를 최적화합니다.

 

데이터를 추적한다는 것에 있어서 프로그램 속도를 느리게 합니다.

메모리와 리소스를 필요로 하는 추가 프로세서인 GC가 프로그램과 병렬로 백그라운드에서 실행되어야 하기 때문입니다.

GC의 역할을 하기 위해서는 프로그램 실행을 중지하여 메모리에서 사용되지 않는 객체를 스캔하고 제거해야 합니다.

 

이러한 이유에서 게임이나 통신, 우주, 방위 등에서는 지연되거나 끊기는 것을 원하지 않기 때문에 C와 C++로 프로그래밍 하게 됩니다.

 

C와 C++

이 언어에는 가비지 컬렉터가 없습니다.

개발자와 메모리 사이에 중개자가 없고, 코드가 기계에 가깝습니다.

가바지 컬렉션이 없는 언어로 개발하는 것은 메모리를 수동으로 관리해야 합니다.

 

- 메모리가 필요할 때에는 메모리 할당

- 메모리를 사용하지 않을 때에는 할당된 메모리를 해제

 

수동으로 관리하는 만큼 정상적이지 않은 방식으로 메모리에 액세스 하려고 할 때 문제가 발생합니다. 

이러한 부분을 해커가 이용하여 정보를 탈취하거나 수정하게 됩니다.

 

"C는 자기 발에 총을 쏘기 쉽지만, C++는 이를 어렵게 했지만, 만약 하면 다리 전체를 날려버린다"
- C++ 창시자 Bjarne Stroustrup

 

해킹

buffer overflow는 메모리에 데이터를 저장하려고 할 때 데이터의 크기가 예상보다 커서 메모리의 다른 부분으로 데이터가 유출될 때 발생하는 메모리 안전 문제입니다.

 

 

인접한 메모리를 넘어서서 저장되게 되며, 이로인해서 메모리가 손상되고 프로그램이 다운될 수도 있습니다.

해커는 이러한 버퍼 옆에 무엇이 저장되어 있는지 알아내는 겁니다.

예를 들어 버퍼 옆에 계정 잔액과 같은 민감한 데이터가 있는 경우, controlled buffer overflow를 사용하여 저장된 메모리를 덮어쓰는 방식으로 계정 잔액을 늘릴 수 있게 됩니다. 또 다른 예를 들어보면, 이후 사용될 함수가 위와 같은 방식으로 있을 때 함수를 변경하여 힘의의 코드를 실행하도록 만들 수도 있게 됩니다.

 

UAF(Use After Free)라는 문제점은 이미 메모리 할당 해제가 된 곳에 다시 접근하게 되는 코드가 있을 때 악성 코드를 삽입하거나 데이터 조작 등으로 문제를 일으킬 수 있습니다.

 

결국엔 장기적으로 봤을 때에는 C, C++로 사용된 부분은 Rust로 변경될 가능성이 높다. 

그렇다면 왜 Rust인가?

Rust의 언어적 특성
- 모질라 리서치에서 개발한 다중 패러다임 범용 프로그래밍 언어
  - 명령형, 순수 함수형, 객체지향형 특징을 다수 포함됨
  - C/C++, Haskell, Erlang(Actor 기반 모델)
- 언어 설계 수준에서 병렬처리 및 메모리 누수 방지에 관한 내용이 포함
  - C는 병렬처리가 고려된 언어는 아님
  - 성능면에서 C++ 수준

▷ 2019년 Microsoft 보안 팀에서 발표한 메모리 안전 문제 자료 [참고]

 유튜브 채널 : 노마드 코더 [참고]

 유튜브 채널 : 널널한 개발 TV [참고]