Google은 보안을 강화하기 위해 Rust에서 Android의 일부를 개발하고 있습니다.

Google은 C 및 C++에 비해 OS 전체의 보안을 향상시키기 위해 Android의 일부를 Rust로 작성하고 다시 작성하고 있습니다. 더 자세히 알아보려면 계속 읽어보세요!

완전한 OS 솔루션인 Android에는 움직이는 부분이 많이 있습니다. 매우 광범위하게 말하면 이러한 부분은 앱 생태계이고 그 다음은 OS 자체입니다. 개발자로서 선택하는 프로그래밍 언어는 Android의 어떤 부분을 작업하고 있는지에 따라 달라집니다. 앱 개발자에게는 Java와 Kotlin이 인기 있는 옵션입니다. OS 및 그 하위 수준에서 작업하는 개발자에게는 지금까지 C와 C++가 인기 있는 선택이었습니다. 이제 Android 오픈 소스 프로젝트가 OS 자체 개발을 위해 Rust 프로그래밍 언어를 지원하므로 Google은 OS 개발자를 위한 세 번째 옵션을 추가하고 있습니다.

C와 C++의 한계

낮은 수준의 Android OS에는 C 및 C++와 같은 시스템 프로그래밍 언어가 필요합니다. 이러한 언어는 개발자에게 제어 및 예측 가능성을 제공하며 이는 하위 수준 시스템 리소스 및 하드웨어에 액세스할 때 중요합니다.

불행하게도 C와 C++는 메모리 안전을 보장하지 못하여 버그와 보안 취약성이 발생하기 쉽습니다. 개발자는 이러한 언어에서 메모리 수명을 관리할 책임이 있지만 복잡하고 다중 스레드 코드베이스에서는 말처럼 쉽지 않습니다.

C와 C++는 Android 플랫폼에서 수천만 줄의 코드를 구성합니다. 이러한 메모리 안전 버그는 Android의 심각도가 높은 보안 취약성의 약 70%를 차지하는 가장 해결하기 어려운 코드 부정확성의 원인이 됩니다. 이러한 버그를 수정하는 것만으로는 문제를 해결할 수 없으며, 애초에 이러한 버그를 방지하는 것이 더 나은 접근 방식이 될 것입니다.

메모리 안전이 보장되지 않기 때문에 개발자는 엄격하게 제한되고 권한이 없는 샌드박스 내에서 Android 프로세스를 실행해야 합니다. 그러나 샌드박스는 리소스 비용이 많이 들고 추가 오버헤드를 소비하며 대기 시간이 발생합니다. 또한 샌드박싱은 코드의 취약점을 완전히 제거하지 않으며 버그 밀도가 높기 때문에 효율성이 감소하여 공격자가 여러 취약점을 연결할 수 있게 됩니다.

C 및 C++에만 국한된 것은 아니지만 모든 메모리 안전 문제에 적용 가능한 또 다른 제한 사항은 오류 상태를 감지하려면 계측된 코드에서 실제로 오류 상태가 트리거되어야 한다는 것입니다. 따라서 코드 테스트가 훌륭하더라도 실제 버그는 발견되지 않은 채로 남아 있을 수 있습니다. 그리고 버그가 발견되면 이를 수정하는 것은 또 다른 작업이며, 항상 올바른 수정으로 이어지지는 않을 수 있는 길고 비용이 많이 드는 프로세스가 필요합니다. 따라서 버그 감지는 신뢰할 수 없게 되며 이러한 제한 사항을 고려하여 버그 예방이 더 나은 접근 방식입니다.

이것이 Rust와 같은 메모리에 안전한 언어로의 전환이 필요한 지점입니다.

Rust와 그 이점

Rust는 객체 수명/소유권을 강화하기 위한 컴파일 타임 검사와 메모리 액세스가 유효한지 확인하기 위한 런타임 검사의 조합을 사용하여 메모리 안전을 보장합니다. 이러한 안전성은 C 및 C++와 동일한 성능을 제공하면서 달성됩니다. Rust는 또한 샌드박싱의 필요성을 줄여 개발자가 리소스에 더 안전하고 가벼운 새로운 기능을 도입할 수 있는 오버헤드 공간을 더 많이 허용합니다.

Rust에는 실제로 이점이 있지만 전체 Android OS를 하룻밤 사이에 Rust로 전환하는 것은 불가능합니다. 그리고 대부분의 Android 메모리 버그는 새 코드나 최근 수정된 코드에서 발생하고 약 50%는 1년 미만의 버그이기 때문에 필요하지 않을 수도 있습니다. Google은 메모리 안전 언어 노력이 성숙한 C 및 C++ 코드를 다시 작성하는 것보다 새로운 개발에 가장 중점을 두고 있다고 믿습니다.

Rust는 또한 버그 탐지에 크게 의존하기보다는 버그 예방에 중점을 두어 코드의 정확성을 향상시킵니다. 메모리 안전성, 데이터 동시성, 보다 표현력이 뛰어난 유형 시스템, 불변성 등 여러 가지 주요 기능을 갖추고 있습니다. 기본적으로 참조 및 변수, 더 안전한 정수 처리, 표준 라이브러리의 더 나은 오류 처리 등 더.

Rust로의 전환이 Android에 어떤 의미가 있나요?

구글은 지난 18개월 동안 안드로이드 오픈소스 프로젝트에 Rust 지원을 추가해 왔다고 밝혔습니다. 하지만 Android 플랫폼에 새로운 언어를 추가하는 것은 엄청난 일입니다. 일부 툴체인과 종속성은 유지 관리되어야 하고, 테스트 인프라와 툴링은 업데이트되어야 하며, 개발자는 교육을 받아야 합니다.

Google에는 앞으로 몇 달 안에 공유할 몇 가지 얼리 어답터 프로젝트가 있습니다. 그러나 그럼에도 불구하고 Rust 지원을 더 많은 OS로 확장하는 것은 다년간의 프로젝트라는 것이 분명해졌습니다.

우리가 볼 수 있듯이 Google은 이미 몇몇 곳에서 Rust를 사용하고 있습니다. Android의 새로운 Bluetooth 스택은 코드명 "가벨도르셰"는 Rust로 작성되고 있습니다. Gabeldorsche에 대한 작업은 Android 11 무렵에 시작되었지만 아직 사용되지는 않습니다. 안드로이드의 키스토어 2.0 모듈은 Rust로 작성되었으며 Android의 IPC 드라이버인 바인더의 사용자 공간 부분도 마찬가지입니다. 안드로이드와는 관련이 없지만, 푹샤새로운 거야 넷스택 Rust로도 작성되고 있습니다.

앱 개발자의 경우 스위치는 앱 개발자로서 앱을 작성하는 방법이나 프레임워크 API가 작동하는 방법에 대해 아무것도 변경하지 않습니다. 이 스위치는 OS 작성 방법에만 영향을 미칩니다. Android 개발자 관계 팀의 일원에 따르면, Google은 현재 Rust NDK를 출시할 계획도 없습니다. 앱 개발에 지원되는 언어는 계속해서 Kotlin, Java, C, C++입니다.