/dev/fd sudo에서 쉘 스크립트를 안전하게 실행하는 방법은 무엇입니까?

/dev/fd sudo에서 쉘 스크립트를 안전하게 실행하는 방법은 무엇입니까?

매뉴얼 페이지 끝에 sudo다음 참고 사항이 있습니다.

   Running shell scripts via sudo can expose the same kernel bugs that
   make setuid shell scripts unsafe on some operating systems (if your OS
   has a /dev/fd/ directory, setuid shell scripts are generally safe).

그 구절의 거의 모든 것이 나에게는 모호합니다. 특히 이 암시가 /dev/fd무엇 인지 알고 싶습니다. 나는 이 정보를 찾을 수 있는 몇 가지 매뉴얼 페이지를 추측하려고 노력했지만 빈손으로 나왔습니다.

어떤 제안이 있으십니까?

(궁극적으로 가능하다면 cron을 통해 sudo에서 일부 스크립트를 실행하고 싶지만 물론 이러한 감독되지 않은 배열에서 발생할 수 있는 보안 취약점이 걱정됩니다.)

답변1

이것이 어떻게 적용되는지 모르겠습니다 sudo.

setuid 스크립트의 경우 아이디어는 다음과 같습니다.

/usr/local/bin/myscriptsetuid 루트 가 있다고 가정하고 #! /bin/sh. 누구도 /usr/local/bin쓰기 권한을 갖고 있지 않지만 myscript누구나 다음 작업을 수행할 수 있습니다.

ln -s /usr/local/bin/myscript /tmp/-i

또한 /tmp/-i아직 쓰기 액세스 권한이 없지만 /tmp.

setuid 스크립트가 setuid 를 통해 실행되지 않는 시스템에서 setuid 비트는 /dev/fd다음을 실행할 때 루트로 실행 된다는 것을 의미합니다.cd /tmp && -i/bin/sh -i

  1. 프로세스는 euid를 파일 소유자로 변경합니다.
  2. 시스템 구문 분석 shebang
  3. 시스템 실행(계속 루트로),/bin/sh -i

이제 이 특별한 경우에 대한 간단한 수정은 shebang을 권장 사항대로 작성하는 것입니다. #! /bin/sh -그러나 그럼에도 불구하고 여전히 경쟁 조건이 있습니다. 이제 다음과 같이 됩니다:

  1. 프로세스는 euid를 파일 소유자로 변경합니다.
  2. 시스템 구문 분석 shebang
  3. 시스템 실행(계속 루트로),/bin/sh - -i
  4. "sh"는 현재 디렉터리에 있는 "-i" 파일을 엽니다(괜찮다고 생각할 것입니다).

그러나 위의 3과 4 사이에는 "-i" 또는 (여기서는 다른 공격 벡터이므로 "모든 파일")을 무언가로 변경할 시간이 충분합니다.사악한예를 들어, "-i" 파일에는 "sh"만 포함되어 있으며 루트 쉘(setuid 루트 스크립트용)을 얻게 됩니다.

이전 버전의 경우 ksh이 작업을 수행할 필요조차 없습니다. 4에서는 ksh가 "-i"를 먼저 찾기 $PATH때문에 변경하기에 충분합니다.사악한"-i" $PATH( ksh대신 해당 파일을 엽니다 /tmp).

이러한 모든 공격 벡터는 다음을 수행하는 경우 고정됩니다. cd /tmp; -i시스템은 다음을 수행합니다(여전히 execve 시스템 호출 중).

  1. 원자적으로: 파일이 setuid인지 확인하고 x프로세스의 파일 설명자 중 하나에서 파일을 엽니다.
  2. 파일 소유자 euid 변경 사항을 처리합니다.
  3. 달리기/bin/sh /dev/fd/x
  4. sh/dev/fd/xd 를 참조하는 파일 만 열 수 있습니다 execve.

핵심은 파일이 execve의 일부로 열렸다는 것입니다. 따라서 변경된 권한으로 해석될 신뢰할 수 있는 콘텐츠가 포함된 코드라는 것을 알 수 있습니다.

이제는 sudo전략 sudopath.

sudo규칙에 따르면 /usr/local/bin/myscript를 루트로 실행할 수 있다고 하면 다음을 수행할 수 있습니다 .

sudo /usr/local/bin/myscript

하지만 다음과 같은 경우에는 다음을 수행할 수 없습니다.

sudo /tmp/any-file

"모든 파일"은 AFAICT 로 사용되지 않습니다 /usr/local/bin/myscript.sudo/dev/fd

관련 정보