2P by neo 19일전 | favorite | 댓글 1개

Linux의 새로운 mseal 시스템 호출에 대한 심층 분석

  • mseal은 Linux 커널 6.10 버전에 도입된 새로운 시스템 호출로, 메모리 보호를 위한 "메모리 봉인" 기능을 제공함.
  • 이 시스템 호출은 프로그램 실행 중 메모리 영역을 불법적인 수정으로부터 불변하게 만들어 공격자가 메모리 권한을 변경하거나 메모리 레이아웃을 조작하지 못하게 함.
  • mseal은 원격 공격자의 코드 실행을 방지하기 위한 것으로, 민감한 데이터를 메모리에 저장하는 로컬 공격자를 방어하는 기존의 memfd_creatememfd_secret과는 다름.

mseal의 작동 방식

  • mseal의 함수 서명은 간단하며, 시작 주소와 길이를 받아 해당 메모리 영역을 봉인함.
  • do_mseal 함수는 메모리 영역을 잠그고, check_mm_sealapply_mm_seal을 통해 메모리 영역의 유효성을 검사하고 봉인함.
  • 봉인된 메모리 영역은 mprotect, munmap, mremap 등의 시스템 호출을 통해 권한 변경, 맵핑 해제, 크기 조정 등이 불가능함.

mseal이 방어하는 공격 기법

  • NX 강화: mseal은 VMA의 실행 권한을 변경하지 못하게 하여 셸코드 기반 공격을 방지함.
  • 맵핑 해제 기반 데이터 전용 공격 완화: mseal은 메모리 영역의 임의 해제 및 재맵핑을 방지하여 데이터 전용 공격을 막음.

mseal을 활용한 소프트웨어 강화

  • mseal은 소프트웨어의 특정 메모리 영역을 봉인하여 보안을 강화할 수 있음.
  • 개발자는 mseal을 사용하여 신뢰할 수 없는 데이터가 존재할 수 있는 메모리 영역을 선택적으로 봉인할 수 있음.
  • glibc와의 통합이 진행됨에 따라 자동 봉인 기능이 추가될 가능성이 있음.

GN⁺의 정리

  • mseal은 Linux 커널에 새롭게 도입된 보안 기능으로, 메모리 영역을 봉인하여 원격 공격자의 코드 실행을 방지함.
  • 이 시스템 호출은 기존의 메모리 보호 방식과 달리, 메모리 권한 변경 및 맵핑 해제를 방지하여 데이터 전용 공격을 막음.
  • mseal의 도입은 소프트웨어 보안을 강화하는 데 중요한 역할을 하며, glibc와의 통합을 통해 더 많은 사용 사례가 기대됨.
  • 유사한 기능을 가진 다른 프로젝트로는 메모리 보호를 위한 memfd_creatememfd_secret이 있음.
Hacker News 의견
  • 커널 메일링 리스트에서 "매운 토론"이 언급되었음. 내부자가 이의와 우려를 요약해줄 수 있는지 궁금해하는 의견이 있음. 메일링 리스트는 너무 강렬해서 피하는 경향이 있음

    • 메커니즘 자체는 합리적으로 보이지만, 커널에 이미 존재하지 않는 것이 놀라움
  • Chrome이 이 호출을 원하지만, 공격자가 다른 플래그로 다시 매핑할 수 있으므로 봉인된 페이지를 해제할 수 없음

    • 이는 런타임에 할당된 페이지에 사용할 수 없음을 의미하며, 전체 프로세스 수명 동안 보유할 의도가 없는 한 사용 불가
    • JS 샌드박스와 같은 메모리에는 사용할 수 없음을 의미하는지에 대한 질문이 제기됨
    • Chrome의 메모리/프로세스 관리 방식에 익숙하지 않아 왜 문제가 되지 않는지 확신할 수 없음
  • mseal() 및 그 이후의 기사 링크가 제공됨

  • 현대의 (x86_64) 아키텍처가 안전한 프로그래밍을 촉진하는 많은 기능을 가지고 있음에도 불구하고, 운영 체제가 이러한 호출을 구현해야 한다는 점에 슬픔을 느낌

    • 구식 시스템을 패치하려는 시도가 컴퓨팅의 진보를 저해하고 수십억 명을 위험에 빠뜨림
    • 아키텍처 버그가 존재하지만, 소프트웨어가 현재 기능을 제대로 활용하지 못함
  • mseal 시스템 호출을 LD_PRELOAD 트릭으로 무효화할 수 있는지에 대한 질문이 있음

  • 기사에 있는 mseal() 프로토타입이 문법적으로 올바르지 않음. 첫 번째 인수는 unsigned start addr가 아니라 unsigned long start_addr이어야 함

  • OpenBSD는 오래전부터 이 기능을 가지고 있었음. 왜 Linux에 이제서야 도입되는지에 대한 의문이 제기됨