programing

vdso와 vsyscall이 뭐죠?

prostudy 2022. 7. 30. 11:22
반응형

vdso와 vsyscall이 뭐죠?

했다sudo cat /proc/1/maps -vv

출력을 이해하려고 합니다.메모리 매핑 세그먼트에 많은 공유 라이브러리가 매핑되어 있는 것을 알 수 있습니다.

7f3c00137000-7f3c00179000 r-xp 00000000 08:01 21233923                   /lib/x86_64-linux-gnu/libdbus-1.so.3.5.8
7f3c00179000-7f3c00379000 ---p 00042000 08:01 21233923                   /lib/x86_64-linux-gnu/libdbus-1.so.3.5.8
7f3c00379000-7f3c0037a000 r--p 00042000 08:01 21233923                   /lib/x86_64-linux-gnu/libdbus-1.so.3.5.8
7f3c0037a000-7f3c0037b000 rw-p 00043000 08:01 21233923                   /lib/x86_64-linux-gnu/libdbus-1.so.3.5.8
7f3c0037b000-7f3c00383000 r-xp 00000000 08:01 21237216                   /lib/x86_64-linux-gnu/libnih-dbus.so.1.0.0
7f3c00383000-7f3c00583000 ---p 00008000 08:01 21237216                   /lib/x86_64-linux-gnu/libnih-dbus.so.1.0.0
7f3c00583000-7f3c00584000 r--p 00008000 08:01 21237216                   /lib/x86_64-linux-gnu/libnih-dbus.so.1.0.0
7f3c00584000-7f3c00585000 rw-p 00009000 08:01 21237216                   /lib/x86_64-linux-gnu/libnih-dbus.so.1.0.0
7f3c00585000-7f3c0059b000 r-xp 00000000 08:01 21237220                   /lib/x86_64-linux-gnu/libnih.so.1.0.0
7f3c0059b000-7f3c0079b000 ---p 00016000 08:01 21237220                   /lib/x86_64-linux-gnu/libnih.so.1.0.0
7f3c0079b000-7f3c0079c000 r--p 00016000 08:01 21237220                   /lib/x86_64-linux-gnu/libnih.so.1.0.0

마지막에는 이런 게 있어요.

7f3c0165b000-7f3c0177e000 rw-p 00000000 00:00 0                          [heap]
7fff97863000-7fff97884000 rw-p 00000000 00:00 0                          [stack]
7fff97945000-7fff97946000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]

무엇인가.vdso그리고.vsyscallvsyscall이 메모리의 핵심 부분입니까?누구든 그 문제에 대해 좀 밝혀주면 좋을 것 같아요.

vsyscall 세그먼트와 vDSO 세그먼트는 Linux에서 특정 시스템 호출을 가속화하는 데 사용되는 두 가지 메커니즘입니다.예를 들어.gettimeofday는 보통 이 메커니즘을 통해 호출됩니다.첫 번째로 도입된 메커니즘은 vsyscall로, 시스템콜 오버헤드를 줄이기 위해 실제 수준의 특권이 필요하지 않은 특정 시스템콜을 실행하는 방법으로 추가되었습니다.위의 예에 따라 모두gettimeofday커널의 현재 시간을 읽어야 합니다.를 호출하는 어플리케이션이 있습니다.gettimeofday(타임스탬프 생성 등) 약간의 오버헤드가 우려될 정도로 빈번하게 발생합니다.이 문제에 대처하기 위해 커널은 현재 시간과 속도를 포함한 페이지를 사용자 공간에 매핑합니다.gettimeofday구현(, vsyscall에 절약된 시간을 읽어내는 기능)이 가상 시스템 호출을 사용하여 C 라이브러리는 고속을 제공할 수 있습니다.gettimeofday커널 공간과 통상 기존의 시스템콜 모델에 의해 도입된 사용자 공간 사이의 컨텍스트스위치에 의해 발생하는 오버헤드가 없습니다.INT 0x80또는SYSCALL.

단, 이 vsyscall 메커니즘에는 몇 가지 제한이 있습니다.할당된 메모리는 작고 4개의 시스템콜만 허용됩니다.또한 vsyscall 페이지의 위치가 커널 ABI에 고정되어 있기 때문에 각 프로세스에서 vsyscall 페이지는 정적으로 같은 주소에 할당됩니다.이러한 vsyscall의 정적 할당은 Linux에서 일반적으로 사용되는 메모리 영역의 랜덤화에 의해 초래되는 이점을 손상시킵니다.공격자는 스택 오버플로를 이용하여 응용 프로그램을 손상시킨 후 임의의 파라미터를 사용하여 vsyscall 페이지에서 시스템콜을 호출할 수 있습니다.시스템 콜의 주소만 있으면 됩니다.시스템 콜은 정적으로 할당되어 있기 때문에 쉽게 예측할 수 있습니다(다른 어플리케이션에서도 명령어를 다시 실행하려고 하면 vsyscall의 주소는 변경되지 않습니다).이러한 유형의 공격을 방지하기 위해 vsyscall 페이지의 위치를 삭제하거나 최소한 랜덤화하는 것이 좋습니다.유감스럽게도 어플리케이션은 그 페이지의 존재와 정확한 주소에 의존하기 때문에 아무것도 할 수 없습니다.

이 보안 문제는 고정 주소의 모든 시스템콜 명령을 특별한 트랩 명령으로 대체함으로써 해결되었습니다.vsyscall 페이지를 호출하려는 응용 프로그램은 커널에 트랩되어 커널 공간에서 원하는 가상 시스템 호출을 에뮬레이트합니다.그 결과 커널 시스템콜을 회피하기 위해 가상 시스템콜을 에뮬레이트하는 커널 시스템콜이 생성됩니다.그 결과 vsyscall이 실행되는데 시간이 더 걸리지만, 결정적으로 기존 ABI가 중단되지는 않습니다.어떤 경우에도 속도 저하가 발생하는 것은 응용 프로그램이 vDSO가 아닌 vsyscall 페이지를 사용하려고 하는 경우뿐입니다.

vDSO는 vsyscall과 동일한 기능을 제공하면서도 한계를 극복합니다.vDSO(Virtual Dynamically Linked Shared Objects)는 사용자 공간에 할당된 메모리 영역이며, 사용자 공간의 일부 커널 기능을 안전하게 노출합니다.이는 보안 위협의 해결을 위해 도입되었습니다.vsyscallvDSO는 동적으로 할당되므로 보안 문제가 해결되고 4개 이상의 시스템 콜이 발생할 수 있습니다.vDSO 링크는 glibc 라이브러리를 통해 제공됩니다.링커는 glibc vDSO 기능으로 링크됩니다.단, 이러한 루틴에 다음과 같은 vDSO 버전이 포함되어 있는 경우입니다.gettimeofday프로그램이 실행될 때 커널이 vDSO를 지원하지 않으면 기존 시스템 스콜이 생성됩니다.

크레딧 및 유용한 링크:

는 단지 알맹이에 그것을 싶다.vDSO는 "안전한" 시스템에만 사용되는 것이 아니라 시스템 상에서 시스템 상에서 시스템 호출에 적합한 시스템 메커니즘의 결정에 사용됩니다.

언급URL : https://stackoverflow.com/questions/19938324/what-are-vdso-and-vsyscall

반응형