2011-06-27 22 views
7

Tôi đang sử dụng python với setcap CAP_NET_RAW được bật. Tập lệnh python của tôi nhập khẩu một thư viện được chia sẻ có $ ORIGIN trong RPATH của nó. Kể từ khi python của tôi bây giờ là một ứng dụng suid, $ ORIGIN không được đánh giá và thư viện không tải đúng (điều này là do một security leak found in glibc). Có cách nào để nói cho trình liên kết biết rằng đường dẫn thư viện của tôi có an toàn và tải thư viện không?

Một vài lưu ý hơn:

  1. Tôi chỉ cần tính năng này trong giai đoạn phát triển. Tôi không tìm kiếm giải pháp sản xuất.
  2. Khi làm việc root, mọi thứ đều hoạt động.
  3. Tôi không muốn làm việc như người chủ.

Cảm ơn, Dave

+0

@Amir Rachum, Chạy chương trình sau khi thực hiện 'xuất khẩu LD_LIBRARY_PATH = "$ LD_LIBRARY_PATH:/path/to/yo urlibrary "' – totti

Trả lời

1

Bạn hãy thử sudo?

Thay vì $ ORIGIN, hãy sử dụng đường dẫn cố định trong quá trình phát triển vì chúng sẽ hoạt động trên các chương trình setuid. Không thay đổi quá trình xây dựng chính của bạn, chỉ cần sử dụng bản vá để đặt đường cho những gì bạn cần. Bạn có thể làm cho một kịch bản shell mà làm điều gì đó như:

ln=`readelf -d |grep RPATH` 
IFS=: 
set -- $ln 
newrpath=`echo $2 |sed 's/\$ORIGIN/\/devel\/myprog\/lib/'` 
patchelf --set-rpath newrpath myprogram 

Sau đó nhị phân của bạn sẽ không còn tìm kiếm $ ORIGIN /../ lib nhưng /devel/myprog/lib/../lib

+0

sudo hoạt động, nhưng tôi không muốn chạy dưới dạng root. Tôi đã nghĩ đến việc sử dụng bản vá lỗi trong quá trình xây dựng của mình, nhưng đó là sự khéo léo. không có thứ gì giống như công cụ crom của Solaris? điều đó sẽ hoàn hảo. –

+0

@ DaveyJones, đây có thể là quá ít ... nhưng tôi đã xem các ví dụ trong đó một tệp văn bản được đặt tên như 'libblah.so', nhưng thay vì là một tệp nhị phân, nó có vẻ giống với' ld.config 'kịch bản như bạn thấy trong Solaris. –

2

Bạn có thể hãy thử một trong số này. Hãy xem xét rằng <path-to-mylib> là tên đường dẫn tuyệt đối sau khi giải quyết tham chiếu đường dẫn $ORIGIN.

  1. Re-chạy ldconfig sau khi nói cho nó nơi để tìm thấy thư viện của bạn

    $ echo "<path-to-mylib>" > /etc/ld.so.conf.d/my-new-library.conf 
    $ ldconfig -v 
    
  2. Nếu chạy mọi thứ như là người chủ không phải là một lựa chọn, LD_LIBRARY_PATH xuất khẩu với các thư mục chính xác cho mỗi thực hiện quá trình

    $ echo "export LD_LIBRARY_PATH=<path-to-mylib>" >> ~/.bashrc 
    $ export LD_LIBRARY_PATH=<path-to-mylib> 
    $ # then run your stuff...