Tôi có một thư viện librandom.so
và main
exectuable được biên soạn như sau:
$ clang++ -o main main.o -lrandom -L. -Wl,-rpath,"\$ORIGIN"
Cả hai đều trong cùng thư mục. Kể từ main
có $ORIGIN
trong số rpath
, nó hoạt động tốt - ./main
trả về không có lỗi.
Bây giờ, tôi đang thiết main
để chạy với setuid
như root
:
$ sudo chown root main
$ sudo chmod a+s main
$ ./main
tôi mong đợi main
thất bại kể từ $ORIGIN
không mở rộng trong setuid
ứng dụng. Đáng ngạc nhiên, nó hoạt động.
Nếu tôi chạy main
từ thư mục khác, tuy nhiên, nó không không như mong đợi:
$ cd /tmp
$ /path/to/main
/path/to/main: error while loading shared libraries: librandom.so: cannot open shared object file: No such file or directory
Tại sao nó hoạt động khi tôi chạy main
từ thư mục chứa nó?
Về phần thứ hai - Tôi không di chuyển tệp, chỉ thư mục hiện tại. '$ ORIGIN' liên quan đến vị trí của tệp thực thi, không phải là thư mục làm việc hiện tại. –
Phải. Có vẻ như Ubuntu sử dụng biến thể của bản vá Glibc mở rộng '$ ORIGIN' thành chuỗi rỗng (ví dụ: được mô tả trong [bình luận này] (https://sourceware.org/bugzilla/show_bug.cgi?id=12393#c0)). Sau đó, trình liên kết động sẽ coi đây là CWD để giải thích hành vi. Bạn có thể có thể [báo cáo này cho các nhà phát triển] (https://bugs.launchpad.net/ubuntu/) nhưng tôi nghi ngờ họ sẽ được quan tâm. – yugr