GN⁺: Linux의 새로운 mseal syscall 심층 분석
(blog.trailofbits.com)Linux의 새로운 mseal 시스템 호출에 대한 심층 분석
-
mseal
은 Linux 커널 6.10 버전에 도입된 새로운 시스템 호출로, 메모리 보호를 위한 "메모리 봉인" 기능을 제공함. - 이 시스템 호출은 프로그램 실행 중 메모리 영역을 불법적인 수정으로부터 불변하게 만들어 공격자가 메모리 권한을 변경하거나 메모리 레이아웃을 조작하지 못하게 함.
-
mseal
은 원격 공격자의 코드 실행을 방지하기 위한 것으로, 민감한 데이터를 메모리에 저장하는 로컬 공격자를 방어하는 기존의memfd_create
및memfd_secret
과는 다름.
mseal의 작동 방식
-
mseal
의 함수 서명은 간단하며, 시작 주소와 길이를 받아 해당 메모리 영역을 봉인함. -
do_mseal
함수는 메모리 영역을 잠그고,check_mm_seal
과apply_mm_seal
을 통해 메모리 영역의 유효성을 검사하고 봉인함. - 봉인된 메모리 영역은
mprotect
,munmap
,mremap
등의 시스템 호출을 통해 권한 변경, 맵핑 해제, 크기 조정 등이 불가능함.
mseal이 방어하는 공격 기법
-
NX 강화:
mseal
은 VMA의 실행 권한을 변경하지 못하게 하여 셸코드 기반 공격을 방지함. -
맵핑 해제 기반 데이터 전용 공격 완화:
mseal
은 메모리 영역의 임의 해제 및 재맵핑을 방지하여 데이터 전용 공격을 막음.
mseal을 활용한 소프트웨어 강화
-
mseal
은 소프트웨어의 특정 메모리 영역을 봉인하여 보안을 강화할 수 있음. - 개발자는
mseal
을 사용하여 신뢰할 수 없는 데이터가 존재할 수 있는 메모리 영역을 선택적으로 봉인할 수 있음. - glibc와의 통합이 진행됨에 따라 자동 봉인 기능이 추가될 가능성이 있음.
GN⁺의 정리
-
mseal
은 Linux 커널에 새롭게 도입된 보안 기능으로, 메모리 영역을 봉인하여 원격 공격자의 코드 실행을 방지함. - 이 시스템 호출은 기존의 메모리 보호 방식과 달리, 메모리 권한 변경 및 맵핑 해제를 방지하여 데이터 전용 공격을 막음.
-
mseal
의 도입은 소프트웨어 보안을 강화하는 데 중요한 역할을 하며, glibc와의 통합을 통해 더 많은 사용 사례가 기대됨. - 유사한 기능을 가진 다른 프로젝트로는 메모리 보호를 위한
memfd_create
및memfd_secret
이 있음.
Hacker News 의견
-
커널 메일링 리스트에서 "매운 토론"이 언급되었음. 내부자가 이의와 우려를 요약해줄 수 있는지 궁금해하는 의견이 있음. 메일링 리스트는 너무 강렬해서 피하는 경향이 있음
- 메커니즘 자체는 합리적으로 보이지만, 커널에 이미 존재하지 않는 것이 놀라움
-
Chrome이 이 호출을 원하지만, 공격자가 다른 플래그로 다시 매핑할 수 있으므로 봉인된 페이지를 해제할 수 없음
- 이는 런타임에 할당된 페이지에 사용할 수 없음을 의미하며, 전체 프로세스 수명 동안 보유할 의도가 없는 한 사용 불가
- JS 샌드박스와 같은 메모리에는 사용할 수 없음을 의미하는지에 대한 질문이 제기됨
- Chrome의 메모리/프로세스 관리 방식에 익숙하지 않아 왜 문제가 되지 않는지 확신할 수 없음
-
mseal() 및 그 이후의 기사 링크가 제공됨
-
현대의 (x86_64) 아키텍처가 안전한 프로그래밍을 촉진하는 많은 기능을 가지고 있음에도 불구하고, 운영 체제가 이러한 호출을 구현해야 한다는 점에 슬픔을 느낌
- 구식 시스템을 패치하려는 시도가 컴퓨팅의 진보를 저해하고 수십억 명을 위험에 빠뜨림
- 아키텍처 버그가 존재하지만, 소프트웨어가 현재 기능을 제대로 활용하지 못함
-
mseal
시스템 호출을 LD_PRELOAD 트릭으로 무효화할 수 있는지에 대한 질문이 있음 -
기사에 있는 mseal() 프로토타입이 문법적으로 올바르지 않음. 첫 번째 인수는
unsigned start addr
가 아니라unsigned long start_addr
이어야 함 -
OpenBSD는 오래전부터 이 기능을 가지고 있었음. 왜 Linux에 이제서야 도입되는지에 대한 의문이 제기됨