C/C++에 죽음을

역자주: 제목이 자극적이라서 보았는데 핵심은 Rust 사용하자는 글이다. 그런데 아직은 Rust의 개발 환경은 덜 만들어져서 시기 상조라고 생각된다.

프로그래밍 언어 C는 역겹다. 물론 훌륭함 것도 있다. 우리가 사는 세계의 대부분은 C 위에 만들어졌다. 그리고 대부분의 컴퓨터 프로그래밍의 기초를 이루고 있다. 역사적으로나 실질적으로도. Xavier Niel의 혁신적인 “42”학교 커리큘럼이 학생들에게 표준 C 라이브러리 함수를 처음부터 다시 쓰는 것부터 시작하는 것도 이 이유이다. 그러나 C는 C 자신이 만든 이 세계에게 더 이상 어울리지 않는다.

“끔찍하다”라고 한 것은 “나쁘다”라는 것은 아니다. “외경을 일으키는 무서움”이란 뜻이다. C는 괴물이 되어 버렸다. 너무 많은 대포를 줬기 때문에 사용자는 자신의 발을 관통한다. 풍부한 체험을 가르치는 곳에 의하면 시큐리티 홀에 잠식되지 않는 대량의 C 코드를 쓰는 것은 매우 어렵다. “사실상 불가능”이 되어 가고 있다. 2년 전 나는 최초의 C에 죽음을-Death To C의 기사에 이렇게 썼다:

원리상 소프트웨어가 성장하고 진화하고 성숙도가 커질수록 보안 취약성은 복잡하게 된다. 그러나 C/C++로 쓰인 소프트웨어에 그것은 들어맞지 않는다. 버퍼 오버 플로, 어중간한 포인터 때문에 괴멸적인 보안 홀이 태어나는 사태는 반복해서 일어나는 것이 예나 지금이나 한결같다.

우리는 더 이상 거대한 입을 벌린 보안의 허점을 내버려둘 수는 없다. 은퇴해서 다른 언어로 바뀌는 시기는 벌써 지났다. 문제는 대부분의 근대 언어는 C를 대체 하겠다는 의욕조차 없는 것이다. 〈중략〉 어떤 언어도 C가 가장 잘하는 것을 잘 하지 못한다 ― 예를 들면, 시스템 속까지 파고들고, 마하 속도로 움직이는 것.

당신이 개발자라면 내 말을 물론 알고 있을 것이다. Rust의 장점을 나열하는 것이다. 실제로 이것은 유망한 C/C++의 후계이다. 2년 전에 나는 신규 하층 레벨 코딩을 C가 아닌 Rust로 쓰는 것을 권했다. 결국 이 구멍에 관해서 무엇보다 중요한 것은 안 파는 것이다.

[C로 프로그래밍 할 때의 보안 팁(2017년판):
1) 타이핑 하지 않는다.
2) 이미 입력한 것을 삭제한다
원본 트윗

지금 나는 엔지니어가 기존의 C 코드를 리팩터링 할 때 특히 파서 등의 입력 핸들러를 다시 쓸 때 ― ― 천천히 조금씩 ― ― Rust로 치환하는 것을 진지하게 권하고 있다.

어떤 행동을 일으킬 필요가 있다. 자신들의 소프트웨어 기반을 공고히 하지 않으면 안 된다. 이것은 오퍼레이팅 시스템, 드라이버, 라이브러리, 명령 라인 툴, 서버 등 모든 것을 수정하겠다는 뜻이다. 당장 내년까지 고칠 수 없을지도 모르지만 아마 10년 후에는 상황이 개선되고 있을 것이다.

안타깝게도 전부를 쓸 수 없다. 〈중략〉 내가 권하는 것은 훨씬 간단한 것: 약한 부분을 수술로 대체하고, 프로젝트의 대부분은 그대로 두는 것이다. 〈중략〉 기존 프로젝트에서 C 코드의 단편을 꺼내어, Rust에서 접근할 수 있도록 C의 구조체와 함수를 import하여 코드를 Rust에서 수정, Rust에서 함수와 구조체를 export하고, 컴파일 하여 프로젝트의 다른 부분과 연결하면 된다.

Rust는 물론 만병 통치 약이 아니고, 소프트웨어의 안정성과 보안을 개선하는 효과적인 방법은 그 밖에도 많이 있다(예를 들면 형식 검증[Formal verification]과 Langsec 구상 등). 그러나 이것은 유망한 가치 있는 반복 접근 방식으로, 우리는 이 거대한 보안 홀에서 스스로의 손으로 기어 나오기 위해서 좋은 코드를 쓰고 좋은 도구를 사용하는 것을 한 삽씩 반복할 수 밖에 없다. 파기 시작하는 것이 빠르면 빠를수록, C는 빨리 풍화한다.

출처: https://techcrunch.com/2017/07/16/death-to-c/


이 글은 2017-07-20에 작성되었습니다.