/bin/sh가 Apache chroot에서 "권한 거부"를 받기 때문에 php exec가 127을 반환합니다.

/bin/sh가 Apache chroot에서 "권한 거부"를 받기 때문에 php exec가 127을 반환합니다.

시스템에서 바이너리를 실행하기 위해 exec(또는 shell_exec)를 사용하려는 PHP 스크립트가 있습니다. 반환 코드 127로 인해 exec가 실패합니다.

반환 코드 127은 일반적으로 명령을 찾을 수 없음을 의미합니다. 그래서 바이너리에 대한 절대 경로를 사용했습니다. 변경 없음.

Apache는 Apache의 ChrootDir을 사용하여 chroot에서 실행되도록 구성됩니다.

나는 바이너리를 chroot, /bin/sh 및 두 가지 모두에 필요한 모든 링크된 라이브러리의 적절한 경로에 복사했는지 확인했습니다.

Apache(따라서 PHP)는 www-data로 실행됩니다. www-data가 바이너리(/bin/sh 포함)와 모든 상위 폴더에 대한 읽기 및 실행 권한을 갖고 있음을 확인했습니다. 파일 권한 문제가 아닌지 확인하기 위해 sudo를 사용하여 /bin/sh -c를 사용하여 명령을 실행했습니다.

sudo -u www-data /chrootdir/bin/sh -c /chrootdir/path/to/binary

그리고 그것은 문제 없이 작동합니다.

strace를 사용하면 다음과 같은 결과를 얻습니다.

execve("/bin/sh", ["sh", "-c", "/path/to/binary"], 0x7ffe436b3618 /* 11 vars */) = -1 EACCES (Permission denied)

권한 문제가 sh 바이너리(및 chrootdir에 있는 바이너리)에 대한 것인지 확인하기 위해 /chrootdir/bin/sh의 이름을 다른 것으로 바꾸고 strace를 다시 수행했는데 이제 파일을 찾을 수 없다고 불평했습니다.

그래서 이제 문제는 Apache를 통해 PHP를 통해 실행할 때 /chrootdir/bin/sh에 대한 액세스에 있지만 www-data 사용자의 권한이 아니라는 것을 알고 있습니다.

다음에 무엇을 시도해야할지 모르겠습니다.

이것은 Debian 10, Apache 2.4.38 및 PHP 7.3.11에서 실행됩니다.

open_basedir을 지웠고, 비활성화_기능도 지웠습니다.

나는 아파치가 의류에 의해 제한되지 않는다는 것을 확인했지만 어쨌든 비활성화했습니다.

마지막으로 Apache chroot를 비활성화하면 작동합니다.

그래서 내 질문은 아파치가 이 작업을 수행하는 것을 막을 수 있는 다른 제한 사항이 있습니까?

답변1

위의 @Michael Hampton의 의견 덕분에 chroot 명령을 사용하여 간단히 루트로 /chrootdir을 chroot해 보았습니다. 나는 할 수 없었다. 나는 얻을 것이다:

chroot: failed to run command ‘/bin/bash’: Permission denied

나는 또한 그가 /bin/sh -c /path/to/binary를 실행하라고 제안한 대로 시도했습니다(그러나 www-data는 chroot 명령을 사용할 수 없기 때문에 루트로). 그리고 그것은 동일한 권한 거부 오류를 발생시켰습니다.

방금 sudo -u www-data /bin/sh ...를 사용했지만 chroot 명령을 사용하지 않았을 때 제대로 실행된다는 사실은 문제가 연결된 라이브러리에 있어야 함을 의미합니다.

추가 조사 결과 /chrootdir/lib64/ld-linux-x86-64.so.2 라이브러리는 실행 가능하지 않았습니다. 실행 가능하게 만들면 문제가 해결되었습니다.

관련 정보