Linus Torvalds, Linux 7.4에서 안전하지 않은 __get_user() 및 __put_user() 함수 제거
LINUX KERNEL
Linus Torvalds는 Linux 커널 내부에서 __get_user()와 __put_user() 함수를 제거하는 코드 브랜치를 병합했습니다. 이 함수들은 안전성 검사가 적기 때문에 get_user()와 set_user()의 더 빠르지만 덜 안전한 버전입니다. __get_user() / get_user() 함수는 사용자 공간(user-space)에서 커널 공간(kernel-space)으로 단일 단순 변수를 복사하는 데 사용되며, __put_user() / put_user()는 커널 공간에서 사용자 공간으로 단일 변수를 쓰는 데 사용됩니다. 제거된 버전들은 포인터 유효성 검사(pointer validation checks)가 부족하여 안전하지 않습니다. Linus는 Git 병합에서 이들의 제거 이유를 다음과 같이 설명했습니다:
"이것은 오랫동안 미뤄져 왔습니다: __get_user()와 __put_user() 함수는 완전히 역사적인 것이며, 더 이상 [사용]해서는 안 되는 것입니다. 그리고 잘못 사용될 경우(읽기: 모든 경우) 단순히 올바른 것보다 느릴 뿐만 아니라 사용자 주소 범위(user address range)를 확인하지 않기 때문에 보안에도 취약합니다.
대부분의 사용처는 오래전에 변환되었지만, 다양한 잔여물들이 남아 있었습니다. 그래서 이것은 제가 "사람들에게 __{get,put}_user()를 최신 코드로 변환하는 방법을 보여주기 위해" 작성한 단일 패치로 시작되었습니다.
특히 Thomas가 작년에 매우 훌륭한 새로운 스코프 사용자 접근 영역 헬퍼(scoped user access region helpers)를 구현했습니다 (커밋 e497310b4ffb: "uaccess: Provide scoped user access regions" 참조). 이는 최신 인터페이스 사용을 특히 쉽게 만들고, 구식의 문제점들을 사용할 여지를 완전히 없애줍니다."
Torvalds는 Git 병합에서 __get_user()와 __put_user()의 문제점과 위험성에 대해 더 설명했습니다.
이 함수들은 모든 일반적인 Linux 커널 코드에서 제거되었으며, x86/x86_64에 대한 전체 인터페이스 최종 제거를 완료합니다. ARM64처럼 이미 get_user()와 put_user()로 매핑된 경우나 일부 사소하지 않은(non-trivial) 케이스들 때문에 다른 CPU 아키텍처 포트에는 잔여물이 남아 있습니다.
Linus Torvalds가 AI 코딩을 하는지 궁금해하는 분들을 위해 말씀드리자면, 지난주에 AI를 사용해 버그를 해독하고 Claude Code로 성능 개선 작업을 진행한 것과는 별개로, 이번 __get_user() 및 __put_user() 제거 작업에서도 일부 AI 활동이 있었습니다. Torvalds는 메일링 리스트에서 자신이 Coccinelle 스크립트의 일종인 Claude를 사용했다고 언급했는데, Coccinelle은 정적 분석(static analysis)과 소스-투-소스 변환(source-to-source transformations)에 사용되는 도구입니다.