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에 이제서야 도입되는지에 대한 의문이 제기됨