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

주요 시사점

  • 백악관은 코드의 보안 취약성을 줄이기 위해 Rust와 같은 메모리 안전 언어를 사용할 것을 권장합니다.
  • C와 같은 오래된 하위 수준 언어는 버그가 있는 코드로 인해 보안 사고가 발생할 위험이 있습니다.
  • Rust와 같은 메모리 안전 언어는 자동 메모리 관리 및 오류 방지 기능을 제공합니다.

미국 정부 기관은 프로그래머가 Rust 및 Java와 같은 메모리 안전 언어를 선호해야 한다고 선언했습니다. 그런데 왜 더 나은가? 그리고 이것이 정말로 중요한가?

백악관은 무엇을 말하고 있는가?

2월 26일 성명에서 백악관 국가사이버국장실(ONCD)은 소프트웨어 개발자들에게 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에서는 다음을 허용합니다.

  모든 데이터 과학자가 알아야 할 18가지 필수 소프트웨어

arr의 값[3] 다른 것과 마찬가지로 유효한 메모리 주소이지만 배열에 속하지 않습니다. 여기에는 모든 값이 저장될 수 있으며, 여기에 액세스하거나 쓰는 결과는 프로그램 충돌부터 치명적인 보안 사고까지 다양할 수 있습니다. 역사상 많은 해커들이 이러한 버그를 악용해 왔습니다.

C 컴파일러는 여전히 경고를 생성하지만 실행 파일도 생성합니다. 프로그래머는 경고를 자유롭게 무시할 수 있으며 심지어 컴파일러 플래그를 사용하여 경고를 숨길 수도 있습니다. C에서는 여전히 발에 총을 쏠 수 있지만 Rust와 같은 언어에서는 총을 전혀 제공하지 않습니다.

메모리 안전 코드는 어떤 모습인가요?

Rust와 같은 메모리 안전 언어에서는 동일한 문제가 전혀 존재하지 않습니다. Rust로 작성된 동일한 프로그램은 다음과 같습니다.

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

이 코드는 구문론적으로 유효하지만 Rust는 이를 컴파일하지 못할 것입니다:

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

Rust에는 이 외에도 여러분을 보호하는 데 도움이 되는 더 많은 기능이 있습니다. 여기에는 메모리 관리를 자동으로 처리하고 널 포인터 역참조를 방지하는 스마트 포인터와 같은 기능이 포함되어 있습니다.

언어를 바꿔야 하나요?

모든 프로그래밍 언어에는 목적이 있으므로 대통령의 조언이라 할지라도 절대 피하라는 조언을 조심해야 합니다. 특정 언어를 전문적으로 공부할 수도 있지만 다양한 언어를 배우고 선택의 폭을 넓히는 것은 항상 유용합니다.

메모리 안전은 수많은 현대 언어의 특징이므로 적어도 하나는 익숙할 것입니다. C에는 그 용도가 있지만 사고를 줄이는 더 안전한 옵션이 있습니다. 특히, 좋은 안전망을 갖춘 효율적인 언어를 찾고 있다면 Rust가 필수입니다.