C를 러스트로 자동 변환하는 새 방식 공개

2025-01-06

C 언어로 작성된 코드를 별도의 하위집합(subset)으로 바꾼 뒤 러스트 코드로 다시 변환하는 컴파일 방법이 새로 소개됐다.

프랑스 인리아의 아이메릭 프롬헤르츠와 마이크로소프트 애저리서치 조나단 프로첸코 등은 최근 발표한 논문에서 기존 C 코드를 러스트로 자동으로 변환할 수 있는 방법을 발표했다.

기존 러스트 자동 변환 방식은 러스트의 ‘언세이프(Unsafe)’ 같은 기능을 사용해 C 코드를 변환한다. 저자들은 ‘언세이프’에 의존하는 코드를 생성하면 러스트에서 제공하는 메모리 안전 보장이 무효화되고, 기존 코드 베이스를 메모리 안전 언어로 이식하는 주요 이점이 사라진다고 연구의 목적을 설명했다.

연구진은 러스트의 유형 시스템을 준수하면서 메모리 안전 코드를 생성하는 방식을 고안했다. 연구진은 Mini-C란 C 하위집합을 정의하고 안전한 러스트로 유형 지정 변환하는 방식, 러스트의 슬라이스와 분할 연산을 사용해 C의 포인터 산술을 표현하는 ‘분할 트리’ 기반의 새로운 정적 분석 기법과 변수의 가변성을 추론하는 알고리즘 등을 개발했다.

이 방식은 공식적으로 검증된 C 코드베이스인 HACL* 암호화 라이브러리와 에버파스(EverParse) 라이브러리를 대상으로 한 실험에서 높은 성능을 유지하면서 안전한 러스트 코드로 변환할 수 있다는 효율성을 입증했다.

C 언어는 1972년에 개발된 컴퓨터 프로그래밍 언어다. C는 전세계의 주요 시스템과 애플리케이션, 라이브러리 구축에 쓰였고, 리눅스 커널도 C언어로 만들어졌다.

C는 수동으로 메모리를 관리하기 때문에 효율적이고 유연하지만, 메모리 오류가 빈번히 발생할 수 있다. 범위를 벗어난 읽기 및 쓰기, 사용 후 해제 등의 메모리 안전 오류가 오늘날 소프트웨어 보안 취약성의 대부분을 차지한다는 게 중론이다. 구글은 2019년 안드로이드 운영체제에서 발견된 취약성의 76%가 메모리 안전 오류와 관련됐다고 밝히기도 했다.

메모리 안전 오류에 기인한 소프트웨어의 취약성 문제는 미국 연방정부가 직접 C나 C++을 사용하지 말라고 권고할 정도로 심각한 문제로 다뤄진다. C와 C++의 메모리 안전 오류 문제를 해결하기 위해 개발된 차세대 언어인 러스트는 신뢰성 덕분에 인기를 끌고 있다.

그러나 세상에 C 코드가 너무 많고 이를 사람의 힘으로 일일이 메모리 오류에 안전한 언어로 변환하는 건 사실상 불가능하다. 이에 여라 C 코드 자동 변환 도구가 나와 활용되고 있지만 한계를 갖고 있다.

개발자는 러스트 언어에서 재량껏 ‘안전(safe)’과 ‘안전하지 않음(unsafe)’을 구분할 수 있다. 대부분의 러스트 변환 도구는 러스트의 규칙을 따르지 않는 플랫폼 의존적 코드나, 메모리에 직접 접근하는 코드를 ‘언세이프’로 지정하고 남겨두면서 러스트로 변환한다. 안전하지 않은 코드를 사용하는 것이므로 러스트 본연의 건전성을 헤치게 된다.

논문 저자들은 C로 작성된 산업 등급의 코드를 메모리 오류에 안전한 러스트로 별다른 수정없이 변환하는 경로를 목표로 한다. C를 사용하면 개발자는 에일리어싱, 저수준 캐스트, 메모리 관리, 데이터 표현 등을 창의적으로 할 수 있는데, 러스트는 이런 패턴을 표현하는데 많은 정적 보장을 해제해 검사되지 않은 에일리어싱, 표현 간 캐스트(러스트의 변환) 등을 허용해야 한다.

미니C란 하위집합은 포인터 산술과 암묵적 가변성 등 안전한 러스트로 직접 변환할 수 없는 일반적인 C 패턴과 기능을 피한다. KaRaMeL 컴파일러 프레임워크를 사용해 미니C를 구현한다.

미니C는 지정된 공식에 따라 러스트로 변환된다. 필요에 따라 약간의 수정이 이뤄져야 한다.

저자들은 “C를 안전하지 않은 러스트로 일반화해 자동 변환하고 결과 코드를 더 안전하게 만드는 대신, 데이터 지향적이고 적용 가능한 C 하위집합을 목표로 한다”며 “따라서 우리의 변환 프로세스는 반활성적이고, 사용자는 지원되는 언어 하위집합에 맞게 원본 C 프로그램을 최소한으로 조정해야 할 수 있다”고 설명했다.

변환 과정은 자동화되고 성능 저하를 최소화하는 데 초점을 맞춘다.

연구자 실험에서 HACL*의 변환은 최소한 코드 변경만으로 러스트 전환을 할 수 있었고, 에버파스 변환은 소스 변경 없이도 가능했다. C언어로 구성된 8만 줄의 HACL*이 러스트 8만줄로 변환돼 검증된 암호화 라이브러리로 바뀌었다. 저자들은 변환 후에도 성능 저하가 없었다고 강조했다.

이 연구는 C 코드를 러스트 코드로 변환하는 작업을 상당부분 자동화하면서도 메모리 안전성을 확보하고, 성능 저하도 최소화할 수 있는 방법을 제안했다는 데 의미가 있다.

연구진은 개발된 모든 내용을 오픈소스 라이선스로 공개할 계획이며 각종 자료를 공유해실험을 재현할 수 있게 제공하겠다고 밝혔다. 또 더 많은 C 코드 패턴을 지원하게 하고, C코드 수정을 줄이며, 사용자 친화적인 변환 도구를 만들 계획이라고 덧붙였다.

글. 바이라인네트워크

<김우용 기자>yong2@byline.network

Menu

Kollo 를 통해 내 지역 속보, 범죄 뉴스, 비즈니스 뉴스, 스포츠 업데이트 및 한국 헤드라인을 휴대폰으로 직접 확인할 수 있습니다.