Rust and Linux Kernel History, 2023-11

2022년 9월에 발행된 기사에 따르면, Rust 언어가 Linux 커널에 추가될 예정입니다. 이를 위해 Rust 언어를 지원하는 코드가 Linux 커널에 추가될 예정이며, 현재 NVMe 드라이버와 Plan 9 운영 체제의 9P 네트워크 프로토콜을 위한 인-커널 서버와 같은 Rust 언어 모듈이 이미 구현되어 있습니다.

2021년 12월에 업데이트된 리눅스 커널 패치에 대한 Rust 코드가 발표되었습니다. 이 코드는 이전 베타 컴파일러 상태 대신 안정적인 Rust 릴리스에 의존하며, 새로운 모듈화 옵션, 더 엄격한 코드 집행, 추가 Rust 컴파일러 진단, 커널 내 사용을 위한 새로운 추상화 등을 포함한 개선 사항이 있습니다. Red Hat을 포함한 여러 회사들이 리눅스 커널 내의 Rust 코드 지원을 공개적으로 지지하고 있으며, 이 업데이트된 형태의 Rust 지원은 새로운 코드 약 32k 라인을 포함하고 있습니다.

리눅스 커널에서 Rust 프로그래밍 언어가 곧 지원될 예정입니다. 이는 Rust가 C와 상호 운용성을 가지고 있기 때문에 가능합니다. Rust를 지원하면 Linux 커널에 약 12,500 줄의 코드가 추가됩니다. 이는 Rust가 메모리 안전성과 빠른 성능을 제공하는 것으로 알려진 프로그래밍 언어임을 감안할 때, 다양한 아키텍처에서 Rust가 사용 가능해질 것으로 예상됩니다1

Rust in the Linux Kernel, Oct 5th, 2022

  • 메모리 안전성으로 잘 알려진 프로그래밍 언어인 Rust가 컴퓨팅 인프라의 핵심인 리눅스 커널에 통합될 가능성을 탐구하며 시작합니다.
  • 리눅스 커뮤니티의 협력적인 노력과 구글 같은 대형 기술 기업의 지원을 강조하면서 Rust 통합을 향한 점진적이지만 의미 있는 발걸음을 언급합니다.
  • 이러한 통합이 커널 개발과 보안에 미칠 수 있는 영향에 대해 언급하며, 더 깊은 논의를 위한 무대를 마련합니다.

출처 : https://thenewstack.io/rust-in-the-linux-kernel/

  • 리눅스 커널에 Rust를 도입하기 위한 초기 논의와 제안부터 시작하여, Miguel Ojeda와 같은 주요 인물들의 기여와 ISRG 및 Google과 같은 조직의 지원을 강조합니다​1​.
  • Kbuild 통합과 커널 크레이트의 생성과 같은 기술적인 측면과 초기 구현에 대해 자세히 설명하며, Rust의 통합을 위한 기반을 마련했습니다​2​.
  • 리눅스의 베테랑인 Linus Torvalds와 Greg Kroah-Hartman의 신중한 낙관주의와 Rust의 메모리 안전 기능으로부터 상당한 이점을 기대하는 다른 개발자들의 열정을 대조합니다​3​.
  • Rust가 리눅스 커널 6.1의 일부가 될 것으로 예상되었다는 진행 상황을 업데이트하고, 이러한 통합이 향후 커널 개발에 미칠 의미에 대해 논의합니다​4​.
  • 리눅스 생태계 내에서 Rust의 더 넓은 비전을 논의하며, 커널의 전체 리라이트는 즉시 일어나지 않겠지만, Rust의 도입은 커널의 안전성과 견고함을 향상시키는 큰 발걸음임을 언급합니다

RCU (Read-Copy-Update)

RCU (Read-Copy-Update)는 커널 동시성 제어 메커니즘 중 하나로, 특히 리더스와 업데이트 쓰레드 간의 동시성 문제를 해결하기 위해 사용됩니다. RCU의 기본 아이디어는 읽기가 매우 빈번하고 업데이트가 상대적으로 드문 경우에 최적화된 데이터 구조에 대한 안전한 동시 접근을 제공하는 것입니다.

RCU의 핵심 특징은 다음과 같습니다:

  1. 락없는 읽기: RCU로 보호되는 데이터 구조를 읽는 동안 락을 사용할 필요가 없습니다. 따라서 읽기는 빠르고 확장성이 높습니다.
  2. 업데이트 중인 데이터의 유지: 데이터를 업데이트할 때 기존 데이터를 즉시 삭제하지 않고, 아직 해당 데이터를 참조하고 있는 모든 읽기 쓰레드가 완료될 때까지 기다립니다.
  3. Grace Period: 이 기간 동안 모든 CPU는 RCU로 보호되는 데이터 구조에 대한 참조를 시작하거나 완료합니다. Grace Period가 종료되면, 이전에 삭제되거나 변경된 데이터는 안전하게 해제될 수 있습니다.
  4. 쿼리스 (Quiescent State): CPU가 RCU로 보호되는 데이터 구조에 대한 참조를 시작하거나 완료하는 상태를 의미합니다. 쿼리스 상태를 통해 Grace Period가 결정됩니다.

RCU는 다음과 같은 시나리오에서 특히 유용합니다:

  • 읽기 연산이 쓰기 연산보다 훨씬 빈번한 경우.
  • 데이터 구조에 대한 동시 접근이 필요한 경우.
  • 락 경쟁이나 데드락과 같은 문제를 피하고 싶은 경우.

Linux 커널에서 RCU는 다양한 데이터 구조와 알고리즘에 사용되며, 그 활용 사례로는 네트워크 라우팅 테이블, 프로세스 ID 관리, 커널 모듈의 동적 로딩 및 언로딩 등이 있습니다.

call_rcu()

call_rcu()는 Linux 커널에서 RCU (Read-Copy-Update) 메커니즘을 사용하여 데이터 구조의 안전한 해제를 위한 핵심 함수입니다.

call_rcu() 함수는 데이터를 즉시 해제하지 않고, 현재 데이터를 참조하고 있는 모든 RCU 읽기 쓰레드가 완료될 때까지 대기한 다음 데이터를 해제하는 데 사용됩니다. 이렇게 하면 읽기 쓰레드와 업데이트 쓰레드 간의 동시성 문제 없이 데이터 구조에 안전하게 접근할 수 있습니다.

call_rcu()의 기본 동작은 다음과 같습니다:

  1. RCU로 보호된 데이터 구조의 업데이트가 필요한 경우, 업데이트된 새로운 데이터 구조의 복사본을 생성합니다.
  2. 모든 읽기 쓰레드가 현재 참조하고 있는 오래된 데이터 구조에 계속 접근할 수 있도록 합니다.
  3. call_rcu()를 사용하여 오래된 데이터 구조를 안전하게 해제하기 위한 콜백 함수를 스케줄링합니다.
  4. RCU Grace Period가 종료되면, call_rcu()에 전달된 콜백 함수가 실행되어 오래된 데이터 구조가 안전하게 해제됩니다.
void call_rcu(struct rcu_head head, void (func)(struct rcu_head *head));
  • head: RCU로 보호된 데이터 구조의 rcu_head 멤버에 대한 포인터입니다.
  • func: Grace Period 후에 실행될 콜백 함수입니다. 이 함수는 오래된 데이터 구조를 안전하게 해제하는 데 사용됩니다.

call_rcu()를 사용할 때 주의할 점은, 오래된 데이터 구조에 대한 모든 참조가 Grace Period 후에 종료되어야 한다는 것입니다. 이를 보장하기 위해 RCU 읽기 쓰레드는 rcu_read_lock()rcu_read_unlock() 함수를 사용하여 RCU 보호 섹션을 정의해야 합니다.

Linux Kernel Study

리눅스 커널을 공부하려는 분들에게 도움이 될 수 있는 몇 가지 웹사이트와 리소스를 소개하겠습니다. 이러한 자료들은 리눅스 커널의 기본 구조와 구현에 대해 배우고, 리눅스 커널 프로그래밍 및 개발에 필요한 기술을 향상시키는 데 도움이 될 것입니다.

  1. 리눅스 재단의 온라인 코스:
    • 리눅스 재단은 리눅스 커널 개발에 대한 입문 가이드 코스(LFD103)를 제공합니다. 이 코스에서는 개발 시스템의 선택 및 구성, 리눅스 커널 저장소 및 릴리스, Git 기초, 커널 빌드 및 설치, 리눅스 커널 시행 표준, 커널 패치 작성 및 테스트 방법 등에 대해 배울 수 있습니다​1​.
  2. Tech Notes 블로그:
    • Tech Notes 블로그에는 리눅스 커널 개발을 배우기 위한 좋은 리소스를 제공하는 글이 있습니다. 특히, Robert Love의 “리눅스 커널 개발”이라는 책을 추천하며, 이 책은 리눅스 커널의 설계와 구현에 대해 다룹니다​2​.
  3. Medium 포스팅:
    • Medium에 게시된 글에서는 리눅스 커널 내부에 대해 배우기 위한 최고의 리소스로 커널 소스를 추천하며, 또한 리눅스 커널에 대해 설명하는 책을 읽는 것을 제안합니다​3​.
  4. DG Micro 리소스:
    • DG Micro 웹사이트에서는 리눅스 커널 개발을 배우기 위한 최고의 리소스를 안내하며, 온라인 코스와 참고 서적, 오픈 소스 프로젝트, 온라인 커뮤니티 등 다양한 리소스를 제공합니다​4​.
  5. Computing For Geeks의 책 추천:
    • Computing For Geeks 웹사이트에서는 2023년에 출시된 최고의 리눅스 커널 프로그래밍 책을 추천하며, 리눅스 커널 문서, 책 및 기타 리소스를 살펴보는 것이 유용하다고 언급합니다​5​.

이러한 웹사이트와 리소스는 리눅스 커널에 대한 이해를 돕고, 실제 커널 프로그래밍 및 개발 기술을 향상시키는 데 도움이 될 것입니다.

Go, Rust 등 비주류 언어 사용하는 랜섬웨어 주의 필요… 향후 확산 예측

SK쉴더스가 발표한 ‘2023년 1분기 KARA 랜섬웨어 동향 보고서’에 따르면, 비주류 프로그래밍 언어를 활용한 랜섬웨어 공격이 눈에 띄게 증가했습니다. 비주류 언어로 개발된 랜섬웨어는 다양한 운영체제를 대상으로 하며, 기존 주류 언어로 제작된 랜섬웨어보다 탐지가 어려워 공격자들에게 선호되는 것으로 분석되었습니다. 특히 이러한 랜섬웨어는 앞으로 탐지를 회피하고 분석을 방해하는 목적으로 꾸준히 발견될 것으로 예상됩니다.

보고서에 따르면, 2023년 1분기에 국내에서는 총 933건의 랜섬웨어 공격이 확인되었으며, 이 중 464건의 공격이 3월에 집중적으로 발생했습니다. 클롭(Clop) 랜섬웨어 그룹은 파일 전송 소프트웨어의 취약점을 이용하여 100여 곳의 기업에 피해를 주었으며, 랜섬웨어 공격자들은 피해자를 협박하고 데이터를 유출하는 방법을 다양화하고 있어, 최신 보안 패치의 적용이 필요하다고 강조되었습니다.

출처 : https://m.boannews.com/html/detail.html?tab_type=1&idx=117370

왜 비주류 언어가 위협이 될까요 ?

  1. 탐지 회피:
    • 주류 언어로 작성된 랜섬웨어에 대한 탐지 메커니즘이나 대응 전략이 더 잘 개발되어 있어, 비주류 언어로 작성된 랜섬웨어는 보안 시스템이나 안티바이러스 소프트웨어에 의해 탐지되기 어려울 수 있습니다.
  2. 다양한 운영체제 타겟팅:
    • 비주류 언어 중 일부는 여러 운영체제에서 실행될 수 있도록 설계되어 있어, 하나의 코드로 다양한 운영체제를 타겟으로 할 수 있습니다. 이는 공격 범위를 확장시키고, 공격자에게 더 많은 피해자를 찾을 기회를 제공합니다.
  3. 빠른 암호화:
    • 일부 비주류 언어는 빠른 실행 속도를 제공하며, 이는 랜섬웨어가 시스템을 더 빨리 암호화하고 피해자에게 빠른 시간 내에 랜섬을 요구할 수 있게 합니다.
  4. 분석의 어려움:
    • 보안 전문가들이 주로 주류 언어에 익숙할 수 있어, 비주류 언어로 작성된 랜섬웨어 분석은 더 어려울 수 있습니다. 이로 인해 공격자들이 비주류 언어를 사용하여 보안 대응을 더 어렵게 만들 수 있습니다.
  5. 분석 데이터 부족:
    • 주류 언어로 제작된 랜섬웨어에 비해 비주류 언어로 제작된 랜섬웨어의 분석 데이터는 상대적으로 부족할 수 있어, 이는 보안 전문가들이 새로운 위협을 식별하고 대응하는 데 어려움을 겪게 만듭니다.