2016-09-14 15 views
10

Tôi có một thư viện librandom.somain 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$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ó?

Trả lời

2

Tôi dự kiến ​​sẽ không thành công vì $ ORIGIN không được mở rộng trong các ứng dụng setuid. Đáng ngạc nhiên, nó hoạt động.

Glibc có lịch sử lâu dài mở rộng $ORIGIN ngay cả đối với các tệp nhị phân suid (xem ví dụ: CVE-2010-3847). Động lực đằng sau điều này là các tập tin nhị phân suid sử dụng $ORIGIN cho đường rạch bị hỏng do thiết kế sao cho các nhà phát triển Glibc chưa bao giờ rất phiền lòng khi sửa lỗi này. Một số bản phân phối hạ lưu cung cấp các bản vá lỗi trên đầu trang của Glibc mà vô hiệu hóa mở rộng ORIGIN để tình hình chính xác phụ thuộc vào bản phân phối của bạn.

Vui đủ, chỉ đứng tự do $ORIGIN sẽ được mở rộng - nếu bạn thay thế bằng ví dụ: $ORIGIN/libs nó sẽ bắt đầu thất bại.

Tại sao nó hoạt động khi tôi chạy chính từ thư mục chứa?

Khi bạn di chuyển tệp của mình, $ ORIGIN sẽ mở rộng sang thư mục khác không còn chứa thư viện bắt buộc.

+0

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. –

+0

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

Các vấn đề liên quan