사용자의 cwd를 루트로 강제 변경

사용자의 cwd를 루트로 강제 변경

cwd를 설정할 수 있도록 사용자 프로세스를 변경하려고 합니다.

관련 및중고등 학년질문에 따르면, 마운트 해제하고 싶은 파일 시스템이 있는데 사용자가 bash 프로세스를 사용하여 그 위에 앉아 있습니다. 해당 사용자의 프로세스를 종료하고 싶지는 않지만 디스크를 마운트 해제하는 동안 ... /tmp라고 말하도록 부드럽게 리디렉션하고 싶습니다.

나는 분명히 루트입니다.

답변1

루트이든 아니든 외부에서 프로세스의 작업 디렉터리를 변경할 수 있는 방법은 없습니다. 이는 피해자 프로세스에 극도로 방해가 되며 이를 위한 API가 없습니다.

이제 더러운 속임수를 사용할 수 있습니다. 그 중 하나는 대상 프로세스에 디버거를 연결하고 강제로 실행하는 것입니다 chdir.스택 오버플로에 대한 이 질문. 일부 운영 체제에서는 이러한 작업(의심하지 않는 프로세스에 syscall 삽입)을 수행하기 위해 다른 API를 제공할 수도 있습니다.

누군가의 파일 시스템을 다시 마운트하려는 목표는 기술적으로 해킹하더라도 본질적으로 절망적입니다. 프로세스가 "기존" 마운트에 열린 파일 설명자를 갖게 될 가능성이 높으며 올바르게 다시 마운트할 수 있는 이식 가능한 방법이 없습니다. -해당 파일이 아직 남아 있더라도 "새" 마운트의 파일에 첨부합니다.
이론적으로 작동하는 것처럼 보이는 접근 방식은 유지 관리를 위해 원하는 프로세스를 동면시키는 것입니다. 그러나 특히 일반 파일뿐만 아니라 네트워크 소켓을 고려하면 많은 문제가 있습니다. (보다이 다른 질문몇 가지 흥미로운 점에 대해.)

간단히 말해서, 정중한(유예 기간 포함)을 사용하는 것이 더 낫습니다. 무작위 프로세스로 kill게임을 플레이하면 어떤 예상치 못한 결과가 발생할 수 있는지 알 수 없습니다 .cwd

답변2

프로세스는 자신의 현재 디렉터리를 관리하는 역할을 담당합니다. 외부에서 변경할 수 있는 방법은 없습니다.

프로세스가 자체 디렉터리를 변경하도록 하여 속일 수 있습니다. 루트 또는 프로세스와 동일한 사용자로 실행 중인 경우 다음을 사용할 수 있습니다.ptrace메모리를 변경하고 시스템 호출을 수행하는 등 프로세스에 침입하는 모든 방식의 작업을 수행하는 시스템 호출입니다. 이것이 디버거가 사용하는 것입니다.

이것을 실험적인 수술처럼 다루십시오. 환자는 상처 없이 깨어나거나 사망할 수도 있습니다. 프로세스가 현재 디렉토리가 무엇인지 실제로 신경 쓰지 않는 경우 작동합니다. 쉘과 같이 현재 디렉토리와 긴밀한 관계를 갖고 있는 프로그램은 생존할 가능성이 없습니다.

다음은 정지된 NFS 마운트에서 프로세스를 이동하기 위해 과거에 사용한 스크립트입니다. 자신의 책임하에 사용하십시오.

#!/bin/sh
if [ $# -ne 2 ]; then
  echo 1>&2 "Usage: $0 PID DIR"
  exit 120
fi
case "$1" in
  *[!0-9]*) echo 1>&2 "Invalid pid \`$1'"; exit 3;;
esac
case "$2" in
  *[\\\"]*)
    echo 1>&2 "Unsupported character in directory name, sorry."
    exit 3;;
esac

gdb -n -pid "$1" -batch -x /dev/stdin <<EOF
call chdir("$2")
detach
quit
EOF

관련 정보