왜 공유 라이브러리를 실행 가능해야 하거나 실행 불가능해야 합니까(예: Red Hat vs Debian)?

왜 공유 라이브러리를 실행 가능해야 하거나 실행 불가능해야 합니까(예: Red Hat vs Debian)?

이것은 "https://unix.stackexchange.com/questions/61646/why-are-so-files-executable"과 거의 중복되지는 않습니다.

Red Hat 기반 시스템에서는 공유 라이브러리에 실행 권한이 있지만 Debian에서는 그렇지 않은 것으로 나타났습니다.

논리적으로 말하면, 샤딩 라이브러리 자체는 (영리한 연결을 통해) 그렇게 하도록 설계되지 않는 한 실행 가능하지 않습니다. 그러나 포함된 코드는 실행됩니다. 그래서 약간 회색지대입니다.

연결된 질문에 따르면 이는 역사적인 이유로 HP-UX와 같은 일부 Unix 계열 운영 체제의 요구 사항입니다.

Debian과 Red Hat이 왜 다른지 자세히 알고 싶습니다.

어떤 시스템이 변경되었으며 그 이유는 무엇입니까?

BSD의 상황은 어떻습니까?

가능한 보안 고려 사항이 있습니까?


업데이트 날짜: 2017년 10월 26일

이 주제에 대해 Red Hat이 말한 내용은 다음과 같습니다(강조).

라이브러리에서 실행 가능 비트를 설정하면 셸에서 실행할 수 있다는 점을 제외하면 아무런 효과가 없습니다. Linux의 공유 라이브러리는 ELF(Executable and Linkable Format)라는 형식으로 되어 있습니다. 이는 실행 파일 및 공유 라이브러리의 형식이므로 라이브러리에 실행 비트가 표시됩니다.GCC가 기본적으로 실행 가능한 비트가 설정된 공유 라이브러리를 생성한다는 점은 주목할 가치가 있습니다.

실행 가능 비트를 제거하면 부작용이 없습니다(libc와 같은 특정 라이브러리를 실행하여 해당 정보를 표시할 수 없는 경우 제외). 동적 로더는 라이브러리의 권한에 신경 쓰지 않기 때문입니다. 대신 라이브러리의 일부를 다음으로 매핑합니다. 실행이 필요한 메모리 부분은 이전에 PROT_EXEC로 표시된 메모리 영역에 매핑됩니다.

언급한 대로 데비안 정책은 라이브러리를 실행 불가능하게 설치합니다. 나는 gcc(또는 오히려 ld)가 플랫폼 독립적이고 조심해서 기본적으로 라이브러리를 실행 가능하게 만들었다고 생각했습니다.

다음은 흥미로운 기사입니다.https://www.technovelty.org/linux/shared-libraries-and-execute-permissions.html

당신은 또한 볼 수 있습니다https://stackoverflow.com/questions/6299395/gcc-generates-shared-object-with-execute-permissions

답변1

데비안은 1997년 정책 버전 2.2에서 이를 변경했습니다(참조:7129화, 비록 이것이 자세한 내용을 전혀 제공하지 않고 다른 논의를 찾지 못했지만) 그 이유는 다음과 같습니다.따라서 현재 버전의 정책에서는:

공유 라이브러리는 실행 파일로 설치하면 안 됩니다. 왜냐하면 이 파일은 동적 링커에 필요하지 않으며 공유 라이브러리를 실행하려고 하면 일반적으로 코어 덤프가 발생하기 때문입니다.

따라서 이는 실제로 기대치를 관리하고 놀라움을 최소화하는 원칙에 관한 것입니다. 작동하지 않으면 실행 가능으로 표시하지 마십시오. 데비안과 그 파생물에서 실행 가능해야 하는 유일한 라이브러리는 실행 시 합리적인 작업을 수행하는 라이브러리입니다(예: C 라이브러리 및 libpthread물론 동적 링커).

적어도 FreeBSD 및 OpenBSD에서는 운영 체제의 공유 라이브러리가 실행 가능하지 않습니다. OpenBSD에서는 /usr/local.FreeBSD에서는 /usr/local일반적으로 패키지의 포트와 공유 라이브러리가 실행 가능합니다. (감사해요제이드 BP~을 위한BSD 관련 정보.)

Linux에서는 런타임에 실행 가능 비트 세트가 필요하지 않기 때문에(적어도 기본 Linux 시스템에서는) 특별한 보안 고려 사항이 없다고 생각합니다(동적 링커를 사용하여 실행할 수 있음).

관련 정보