전체 디렉토리에 실행 권한을 설정하십시오. 이것이 좋은 생각입니까, 나쁜 생각입니까?

전체 디렉토리에 실행 권한을 설정하십시오. 이것이 좋은 생각입니까, 나쁜 생각입니까?

Linux에서 실행해야 하는 특정 응용 프로그램에 대한 여러 파일과 디렉터리가 포함된 zip 파일이 있습니다. 일부 파일은 실행 가능해야 하지만 zip 파일 형식은 분명히 실행 권한을 유지하지 않습니다.

아카이브를 추출한 후 파일의 실행 권한을 수동으로 설정해야 합니다. (작업 중입니다.) 궁금한 점은 다음과 같습니다.

실행 가능해야 하는 파일이 무엇인지 모르는 경우 전체 디렉터리에 실행 권한을 반복적으로 추가할 수 있습니까? 보안 위험이 있습니까? 이로 인해 발생할 수 있는 다른 문제를 아는 사람이 있나요?

답변1

예쁘거나 우아하지는 않지만 운영 체제가 처리하는 방법을 알고 있는 모든 종류의 실행 파일에 실행 비트를 추가해도 해가 되지 않습니다.cannot execute binary file

한 가지 잠재적 위험은 처음 몇 단어가 셸에서 유효한 명령으로 판명되는 경우 텍스트 파일에 있지만 이는 예측하기 어렵습니다(가능성이 낮더라도).

저는 개인적으로 실수를 범하여 모든 것을 실행 불가능하게 만든 다음 명령을 사용하여 모든 파일을 정렬 file하고 스크립트 또는 ELF 바이너리로 인식되면 실행 가능 비트를 뒤집는 빠른 스크립트를 작성합니다. 정확한 코드는 연습 문제로 남겨둡니다. 독자.

답변2

대답은 간단합니다. 예, 보안 위험을 초래할 수 있습니다. 그러나 이는 모두 관련된 파일 및 디렉터리의 특정 액세스 제어 요구 사항에 따라 달라집니다.

가장 좋은 방법은 강제 권한이 필요한 파일이나 디렉터리가 있는지, 그리고 실행 가능하게 만들어야 하는 파일이나 디렉터리가 있는지 응용 프로그램 소유자/개발자 등에 문의하는 것입니다. 그것은 당신이 아닌 그들의 결정이어야 합니다. 따라서 당신이 지원 요건을 몰랐다면 저는 책임을 회피할 것입니다!

아마도 양이 적어서 과정이 간단할 것입니다. 청소년MMV

답변3

setuid 또는 setgid가 아닌 이상 파일을 실행 가능하게 만드는 데 직접적인 보안 위험은 없습니다. 물론, 비활성이라고 예상되는 것(일반적으로 응용 프로그램에서 여는 일부 데이터 파일)이 시스템에서 직접 실행되어 사악한 결과를 초래할 수 있는 간접적인 위험이 있습니다. 예를 들어 실제로 루트킷 프로그램이 포함된 README라는 파일이 있는 경우 텍스트 편집기에서 여는 것이 안전하지만 실행하지 않는 것이 더 좋습니다.

실행 파일을 식별하기 위한 합리적인 경험적 방법은 처음 몇 바이트를 보고 실행 파일 서명을 식별하는 것입니다. 이는 보안 문제라기보다는 편의성 문제이지만 모든 파일을 실행 가능하게 만들려는 경우 보안 문제는 없지만 어쨌든 사용성 문제가 있다는 의미입니다. 가능한 경험적 방법은 다음과 같습니다.

for x in *; do
  case $(file - <"$x") in
    *executable*) chmod +x -- "$x";;
  esac
done

이것은 극단적인 경우에만 달라지는 또 다른 경험적 방법입니다( $'\177'ksh/bash/zsh 구문이며, 다른 쉘에서는 이를 리터럴 문자 0177 = 127 = 0x7f로 대체합니다).

for x in *; do
  case $(head -c 4 <"$x") in
    '#!'*|$'\177'ELF) chmod +x -- "$x";;
  esac
done

두 경우 모두 파일이 실행 파일로 인식된다고 해서 시스템에서 실행할 수 있다는 의미는 아닙니다. 예를 들어 버그 처리기 아키텍처의 바이너리는 실행 가능합니다. 이는 모든 스크립트를 실행 가능하게 만드는 다른 접근 방식이지만 올바른 아키텍처를 위한 것이고 필요한 라이브러리가 있는 경우 동적으로 링크된 바이너리만 만들고 정적으로 링크된 바이너리는 완전히 무시합니다.

for x in *; do
  case $(head -c 2 <"$x") in
    '#!') chmod +x -- "$x";;
    *) if ldd -- "$x" >/dev/null 2>/dev/null; then chmod +x "$x"; fi;;
  esac
done

관련 정보