백악관은 메모리에 안전한 프로그래밍을 원하지만 그게 무엇일까요?

핵심 요약

  • 백악관은 소프트웨어 보안 강화를 위해 Rust와 같은 메모리 안전 언어의 사용을 장려합니다.
  • C와 같은 오래된 저수준 언어는 코드 오류로 인한 보안 문제 발생 가능성이 높습니다.
  • Rust와 같은 메모리 안전 언어는 자동 메모리 관리 및 오류 방지 기능을 제공합니다.

미국 정부는 프로그래머들에게 Rust나 Java와 같은 메모리 안전 언어를 적극적으로 사용하도록 권고하고 있습니다. 그렇다면 왜 이런 언어들이 더 나은 선택일까요? 그리고 이것이 정말로 중요한 문제일까요?

백악관의 발표 내용

백악관 국가사이버국(ONCD)은 2월 26일 발표에서 소프트웨어 개발자들에게 Rust와 같은 메모리 안전 프로그래밍 언어 사용을 권장했습니다.

ONCD는 다음과 같이 발표했습니다.

국가 차원에서 사이버 공격에 대한 취약성을 줄이고 디지털 생태계에 보안 결함이 유입되는 것을 막을 책임과 능력이 있습니다. 이를 위해서는 메모리 안전 프로그래밍 언어로의 전환이라는 어려운 과제를 해결해야 합니다.

이것이 중요한 이유

2021년에 설립된 ONCD는 대통령 직속 기관으로 사이버 보안 및 관련 문제에 대한 조언을 제공합니다. 미국의 정책은 전 세계 기술 산업에 상당한 영향을 미칠 가능성이 높습니다.

역사적으로 발생한 주요 보안 취약점들은 메모리 안전 문제에서 기인하는 경우가 많았습니다. 오래된 저수준 언어들은 프로그래머에게 많은 자유를 제공하지만, 이로 인해 코드 오류 발생 시 심각한 결과를 초래할 수 있는 위험이 커집니다.

그럼에도 불구하고 Rust, Python, JavaScript와 같은 메모리 안전 언어의 사용은 꾸준히 증가해 왔습니다. ONCD가 이러한 발표를 하는 이유는 C와 같은 덜 안전한 언어가 너무 오랫동안 사용되어 왔으며, 이러한 언어들의 레거시 코드가 인프라 및 우리가 매일 사용하는 다양한 소프트웨어에 깊숙이 자리 잡고 있기 때문일 것입니다.

안전하지 않은 언어의 예시

안전하지 않은 코드가 항상 복잡하거나 위협적으로 보이지는 않습니다. 간단한 C 프로그램 예시를 살펴보겠습니다.

#include <stdio.h>
int main (void) {
  int arr[3] = { 0, 0, 0 };
  printf("%d\n", arr[3]);
  return 0;
}

이 코드는 버퍼 오버플로 공격으로 이어질 수 있는 대표적인 오류 사례입니다. 프로그래머는 C(및 대부분의 다른 언어)에서 배열이 0부터 시작한다는 사실을 잊었습니다. 즉, 첫 번째 요소는 arr[0]에 있으며, arr[3]에 접근하려는 시도는 오류입니다. 하지만 C에서는 이를 허용합니다.

arr[3]의 값은 다른 유효한 메모리 주소와 마찬가지로 배열에 속하지 않습니다. 이 메모리 영역에는 어떤 값이든 저장될 수 있으며, 이 영역에 접근하거나 값을 쓰려고 시도하면 프로그램 충돌부터 심각한 보안 사고까지 다양한 문제가 발생할 수 있습니다. 역사적으로 해커들은 이러한 종류의 버그를 악용해 왔습니다.

C 컴파일러는 여전히 경고를 생성하지만 실행 파일도 생성합니다. 프로그래머는 경고를 무시하거나 컴파일러 플래그를 사용하여 경고를 숨길 수 있습니다. C에서는 여전히 자기 발을 쏠 위험이 있지만, Rust와 같은 언어에서는 애초에 총을 제공하지 않습니다.

메모리 안전 코드의 예시

Rust와 같은 메모리 안전 언어에서는 위에서 설명한 문제가 발생하지 않습니다. Rust로 작성한 동일한 프로그램은 다음과 같습니다.

fn main() {
    let arr: [u32; 5] = [0;3];
    println!("{}", arr[3]);
}

이 코드는 구문상으로는 올바르지만, Rust 컴파일러는 이 코드를 컴파일하지 않을 것입니다.

컴파일러는 문제점을 명확히 설명하고 실행 파일 생성을 거부합니다. Rust는 이러한 코드가 실행되는 것을 허용하지 않습니다.

Rust에는 이 외에도 여러분을 보호하는 데 도움이 되는 다양한 기능이 있습니다. 자동 메모리 관리 및 널 포인터 역참조를 방지하는 스마트 포인터 등이 포함됩니다.

언어를 바꿔야 할까요?

모든 프로그래밍 언어는 고유한 목적을 가지고 있으므로, 대통령의 권고라 할지라도 특정 언어를 무조건 피해야 한다는 조언은 신중하게 받아들여야 합니다. 특정 언어를 전문적으로 공부할 수도 있지만, 다양한 언어를 배우고 선택의 폭을 넓히는 것은 항상 도움이 됩니다.

메모리 안전은 많은 현대 언어의 특징이므로, 적어도 하나 이상의 메모리 안전 언어에 익숙해지는 것이 좋습니다. C 언어에도 여전히 유용하게 사용되는 분야가 있지만, 오류를 줄일 수 있는 더 안전한 대안이 있습니다. 특히, 효율적이면서도 강력한 안전망을 갖춘 언어를 찾고 있다면 Rust는 매우 좋은 선택이 될 것입니다.