빠른 링크

백악관은 무엇을 말하나요?

왜 중요한가?

안전하지 않은 언어는 어떤 모습일까요?

메모리 안전 코드는 어떻게 생겼나요?

언어를 바꿔야 하나요?

주요 내용

백악관은 소프트웨어 개발과 관련된 잠재적인 보안 위험을 완화하기 위한 수단으로 메모리 안전을 우선시하는 Rust와 같은 프로그래밍 언어의 사용을 지지해 왔습니다.

C와 같이 더 오래되고 초보적인 프로그래밍 언어를 사용하면 코드 내 버그가 널리 퍼져 소프트웨어 취약성과 잠재적인 보안 침해가 발생할 수 있습니다.

메모리 안전은 데이터 저장, 할당, 할당 해제, 가비지 수집을 안정적으로 처리하는 프로그래밍 언어의 중요한 기능입니다. Rust와 같은 언어는 이를 염두에 두고 설계되어 개발자에게 자동 메모리 관리와 메모리 사용과 관련된 오류를 방지하는 내장 메커니즘을 제공합니다. 이를 통해 부적절한 리소스 사용으로 인한 런타임 충돌이나 기타 문제의 위험을 줄이면서 보다 안전하고 효율적으로 코드를 실행할 수 있습니다.

미국 정부는 프로그래밍 전문가에게 메모리 안전을 증진하는 Rust 및 Java와 같은 언어 시스템을 우선적으로 사용하도록 의무화하는 지침을 제정했습니다. 하지만 이 결정의 근거는 무엇이며 실제로 중요한 영향을 미칠까요?

백악관은 무엇을 말하고 있나요?

백악관 국가사이버책임자실은 최근 소프트웨어 개발자들이 개발 과정에서 Rust와 같은 메모리 안전 프로그래밍 언어의 사용을 고려할 것을 권장하는 성명을 발표했습니다.

ONCD는 :

다양한 유형의 보안 침해를 제거하고 디지털 환경에 대한 침입을 방지함으로써 사이버 공간의 취약성을 최소화하는 것은 우리 사회의 능력과 의무라고 말했습니다. 하지만 이를 위해서는 메모리 안전 기능을 갖춘 프로그래밍 언어로 전환해야 하는 어려운 문제를 해결해야 합니다.

왜 중요한가?

2021년에 설립된 국가 사이버 보안 및 디지털 혁신 사무소(ONCD)는 대통령 직속으로 운영되며 사이버 보안 및 관련 우려 사항에 관한 전문가 자문을 제공합니다. 이러한 문제에 대한 미국의 접근 방식은 글로벌 기술 발전에 영향을 미칠 수 있습니다.

심각한 보안 결함의 만연은 프로그래밍 언어의 불충분한 메모리 안전성에 기인하는 경우가 많습니다. 상위 수준의 언어는 개발자에게 상당한 권한을 부여하는 반면, 오류로 인해 심각한 결과를 초래할 가능성도 높습니다.

이 글도 확인해 보세요:  AES-128 암호화와 AES-256 암호화: 차이점은 무엇인가요?

그럼에도 불구하고 Rust, Python, JavaScript와 같은 메모리 안전 프로그래밍 언어를 사용하는 경향이 증가하고 있습니다. 오픈 신경망 교환(ONCE) 이니셔티브는 C와 같은 더 위험한 언어가 기술 인프라에 깊숙이 자리 잡고 일상적인 애플리케이션에서 자주 사용된다는 사실에서 촉발된 것으로 추측됩니다.

안전하지 않은 언어는 어떤 모습일까요?

물론 어떤 코드가 잠재적으로 위험할 수 있는지 식별하는 것이 항상 쉬운 것은 아닙니다.

#include <stdio.h>

int main (void) {
    int arr[3] = { 0, 0, 0 };
    printf("%d\n", arr[3]);
    return 0;
}

버퍼 오버플로 공격을 촉발할 수 있는 취약점의 예시적인 사례로 다음과 같은 간결한 C 프로그램을 예로 들어 보겠습니다. 개발자는 C(및 다른 많은 프로그래밍 언어)의 배열이 0부터 인덱싱되어 초기 구성 요소가 배열[0] 내에 위치한다는 사실을 간과합니다. 따라서, 배열[3]에 접근하려는 시도는 감독 위반에 해당하지만, C의 사양에 따르면 이 위반은 허용됩니다.

실제로 배열[3]이 지정한 위치에 저장된 내용은 일반적인 메모리 주소의 모든 특성을 가지고 있지만, 해당 배열의 범위를 벗어난 요소로서의 상태는 독특한 잠재적 위험성을 내포하고 있습니다. 이는 제한 없이 액세스하거나 쓸 수 있는 취약한 진입점을 나타내며, 프로그램의 완전한 종료부터 재앙적인 보안 침해에 이르기까지 다양한 의도하지 않은 결과를 초래할 수 있습니다. 이러한 취약점을 악의적인 목적으로 이용하려는 숙련된 악의적 공격자들이 이러한 결함을 악용하는 사례는 여러 차례 보고된 바 있습니다.

경고가 표시됨에도 불구하고 C 컴파일러가 실행 파일을 계속 생성합니다. 사용자는 특정 컴파일러 옵션을 사용하여 이러한 경고를 무시하거나 숨길 수 있습니다. 잠재적으로 위험한 행동에 제한을 두는 Rust와 같은 일부 안전 지향 언어와 달리 C는 개인이 자신의 의지에 따라 잠재적 위험에 노출될 수 있도록 허용합니다.

메모리 안전 코드는 어떤 모습일까요?

Rust에서 이 프로그램을 구현하면 설계 기능으로 인해 메모리 안전과 관련된 문제를 효과적으로 완화할 수 있습니다.제공된 코드는 메모리 관리 및 동시성과 관련된 잠재적 문제를 제거하는 Rust로 작성된 C++ 프로그램의 동등한 버전을 보여줍니다.

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

이 코드는 Rust의 구문 규칙을 준수하지만 컴파일러가 지정되지 않은 이유로 인해 처리할 수 없습니다.

이 글도 확인해 보세요:  AI 개발이 너무 빠르게 진행되고 있어 일시 중지해야 하는 5가지 징후

안전성과 신뢰성을 강조하는 프로그래밍 언어인 Rust는 결함이 있거나 악성 코드의 실행을 방지하기 위해 엄격한 조치를 취하고 있습니다. 컴파일러가 제공된 소스 코드에서 문제를 감지하는 경우 실행 파일 생성을 거부하여 프로그램 실행을 사실상 금지할 수 있습니다. 이는 사용자가 애플리케이션을 개발할 수 있는 안전한 환경을 보장하는 Rust의 설계 철학의 핵심 기능입니다.

오류 처리 지원 외에도 Rust는 코드의 안전과 보안을 강화하기 위해 설계된 다양한 고급 기능을 제공합니다. 예를 들어 메모리 할당을 자동으로 관리하고 널 포인터 역참조와 같은 문제를 방지할 수 있는 스마트 포인터를 제공합니다.

언어를 전환해야 하나요?

각 프로그래밍 언어는 고유한 기능과 목적을 가지고 있으므로 대통령을 비롯한 고위 당국에서 나온 지침이라 하더라도 특정 언어를 완전히 배제하라는 조언에 귀를 기울일 때는 신중을 기해야 한다는 점을 인식하는 것이 중요합니다. 개인이 특정 언어에 전문성을 집중하는 것은 허용되지만, 여러 언어를 학습하여 지식 기반을 넓히는 것은 다재다능함을 크게 향상시키고 추가적인 기회를 제공할 수 있습니다.

메모리 안전성은 수많은 현대 프로그래밍 언어에서 발견되는 두드러진 특성으로, 적어도 한 가지 언어에 대한 실무 지식은 필수적입니다. C가 어느 정도 유용할 수는 있지만, 잠재적인 실수를 피하기 위해 보안이 강화된 대안을 고려하는 것이 현명합니다. 특히 강력한 안전 메커니즘을 갖춘 효과적인 언어를 찾고 있다면 매력적인 옵션으로 떠오르고 있는 Rust를 살펴봐야 합니다.

By 김민수

안드로이드, 서버 개발을 시작으로 여러 분야를 넘나들고 있는 풀스택(Full-stack) 개발자입니다. 오픈소스 기술과 혁신에 큰 관심을 가지고 있고, 보다 많은 사람이 기술을 통해 꿈꾸던 일을 실현하도록 돕기를 희망하고 있습니다.