
저는 학교에서 Dirty CoW에 대한 연구를 하고 있습니다(그것이 무엇인지 모르고 구현이 내 문제와 관련이 있을 수 있다고 생각한다면 아래 PS를 참조하십시오.).
몇 가지 해결책을 찾았습니다(예:https://github.com/scumjr/dirtycow-vdso) Dirty CoW를 사용하여 일부 쉘코드를 vDSO에 주입합니다. 링크의 솔루션은 데스크톱 Linux용이지만 Android용 솔루션도 있습니다(몇 가지 변경 사항을 제외하면 기본적으로 동일함).
기존 솔루션을 분석하려고 하는데 질문이 생겼습니다. vDSO는 Android에 어디에 저장되어 있나요?
매뉴얼 페이지(http://man7.org/linux/man-pages/man7/vdso.7.html)는 다음을 사용하여 파일을 찾을 수 있다고 말합니다.
find arch/$ARCH/ -name '*vdso*.so*' -o -name '*gate*.so*'
Ubuntu 64비트( )에서 유사한 명령을 실행하면 find / -name '*vdso*' -o -name '*gate*.*so'
출력에 다음 줄이 나타납니다.
/lib/modules/4.13.0-32-generic/vdso
/lib/modules/4.13.0-32-generic/vdso/vdsox32.so
/lib/modules/4.13.0-32-generic/vdso/vdso32.so
/lib/modules/4.13.0-32-generic/vdso/vdso64.so
/lib/modules/4.13.0-21-generic/vdso
/lib/modules/4.13.0-21-generic/vdso/vdsox32.so
/lib/modules/4.13.0-21-generic/vdso/vdso32.so
/lib/modules/4.13.0-21-generic/vdso/vdso64.so
objdump
이들 중 하나를 사용함으로써 hexdump
나는 그것이 메모리에 매핑된 것임을 알 수 있습니다(나는 그것을 찾아 파일에 덤프하는 프로그램을 작성했습니다).
그러나 내가 달릴 때
adb root
adb shell find -name '*vdso*' -o -name '*gate*.so*'
내 Android 4.4-r4 x86에서 유일한 출력은 /proc/sys/vm/vdso_enabled
이고 파일 내용은 입니다 1
.
나는 프로세스 메모리에 vDSO가 있다는 것을 알고 있으며 이를 위해 ADB에서 실행되는 덤프 프로그램을 작성했습니다. 또한 내 쉘코드를 vDSO에 삽입하기 위해 Dirty CoW 취약점을 조정했습니다. 내가 작성한 애플리케이션과 앞서 언급한 쓰레기 수거통에서 쉘코드가 vDSO에 있음을 알 수 있습니다. 내 쉘코드는 장치를 재부팅할 때까지 vDSO에만 존재합니다.
vDSO는 Android에서 어떻게 작동하나요? 저장할 파일이 있나요? 그렇지 않은 것 같습니다. 왜냐하면 거기에 있었다면 재부팅 후에도 삽입된 코드가 거기에 있었을 것이기 때문입니다. 하지만 쉘코드는 어떻게 다른 프로세스로 전파됩니까?
귀하의 답변에 진심으로 감사드립니다.
첨부된:Dirty CoW는 두 스레드 사이에 경쟁 조건을 발생시켜 읽기 전용 파일(또는 메모리에 매핑될 수 있는 모든 파일)에 쓸 수 있게 하는 Linux 커널의 취약점입니다. 첫 번째 스레드에는 텍스트 쓰기를 수행하는 루프가 있습니다. 메모리에( 올바른 위치를 찾기 위해 사용 proc/self/mem
하거나 사용하여 ) 다른 하나는 메모리의 동일한 부분이 더 이상 필요하지 않음을 시스템(루프에서도)에 알리는 것입니다( 사용 ).ptrace
mmap
madvise(MADV_DONTNEED)
답변1
이것가상 DSO디스크의 별도 파일에 저장되지 않고 커널의 일부이며 커널에 의해 각 프로세스의 주소 공간에 매핑됩니다. 찾은 파일은 .so
디버깅 목적으로만 사용됩니다. 문서의 명령은 예제로 커널을 빌드할 때 생성된 vDSO를 커널 빌드 트리에서 찾습니다. 별도의 s가 표시되거나 해당 문제에 대한 다른 위치가 find
필요하지 않습니다 ..so
/lib/modules
당신이 다루고 있는 익스플로잇은 메모리에 vDSO의 복사본이 하나만 있기 때문에 전파되는 쉘코드를 주입하므로 이에 대한 성공적인 쓰기는 vDSO의 현재 및 미래의 모든 프로세스 맵에 표시됩니다.