Nix, 스토어 경로 제약 없이 바이너리 재배치 가능할까?

by DD
11시간 전
조회수 0

Nix는 고정된 `/nix/store` 경로에 패키지를 저장하여 경로 재작성이 용이하나, 다른 경로 사용 시 해시 충돌 문제 발생

루트리스 Nix(Rootless Nix) 환경 구축을 위해 상대 경로(Relative Path) 사용 제안, 동적 링커(Dynamic Linker)의 `$ORIGIN` 활용 논의

커뮤니티에서는 Linux 커널의 `PT_INTERP` 지원 부족이 핵심 난관으로 지적됨

정적 래퍼 바이너리(Static Wrapper Binary), 파일 시스템 마운트 등 다양한 우회책 제시되었으나 보안적 측면에서 논쟁 중

Nix 스토어 경로와 해시 충돌 문제

Nix는 고유한 해시를 기반으로 패키지를 `/nix/store`에 저장하지만, 다른 경로(`--store` 옵션)를 지정하면 경로 자체가 해시에 포함되어 의존성 그래프 전체가 무효화되는 문제가 발생한다고 지적함. 이는 캐시 활용 불가로 이어져 빌드 시간이 급증하는 심각한 단점을 야기함. 따라서 릴로케이터블 바이너리(Relocatable Binaries) 도입이 시급하다는 의견이 제시됨.

동적 링커의 `$ORIGIN` 활용 가능성

제안자는 실행 파일의 `RUNPATH`에 `$ORIGIN`을 사용하여 상대 경로 기반 라이브러리 탐색을 제안함. `$ORIGIN`은 실행 파일이 위치한 디렉토리를 의미하므로, 스토어 경로 변경 시에도 의존성 해시가 유지될 수 있음. 이는 빌드 시간 단축재컴파일 불필요라는 큰 이점을 제공할 수 있다고 설명함.

Linux 커널의 `PT_INTERP` 제약

커뮤니티에서는 `$ORIGIN`을 동적 링커(`PT_INTERP`) 경로에 사용하는 것이 Linux 커널의 현재 지원 부족으로 불가능하다는 점을 핵심 난관으로 지적함. 또한 스크립트의 shebang 라인 역시 절대 경로만 지원하여 동일한 제약이 발생한다고 언급함. Solaris 등 일부 OS는 이를 지원하므로 기술적으로 불가능한 것은 아니라는 의견도 있음.

보안적 측면에서의 논쟁

상대 경로 사용 시 보안 취약점에 대한 우려가 제기됨. 특히 `PT_INTERP`나 shebang 라인에 `$ORIGIN`을 사용할 경우, 악의적인 사용자가 임의의 로더를 실행시키거나 보안이 강화된 환경(Secure Execution Mode)에서 예상치 못한 동작을 유발할 수 있다는 지적이 있음. 반면, 환경 변수 기반 라이브러리 탐색과의 유사성을 들어 안전하다는 반론도 존재함.

대안적 해결책 및 향후 과제

논의에서는 정적 래퍼 바이너리(Static Wrapper Binary)를 사용하거나, `/origin`과 같은 가상 파일 시스템 마운트를 통해 커널 제약을 우회하는 방안이 제시됨. 하지만 이러한 방법들은 추가적인 복잡성이나 호환성 문제를 야기할 수 있다는 의견이 있음. 궁극적으로는 Linux 커널 패치가 가장 이상적인 해결책으로 언급되나, 실현 가능성에 대한 논쟁이 이어짐.

Nix needs relocatable binaries