2015-04-16 18 views
13

Tôi đã nhận thấy rằng một số người dùng của tôi đã không nhận được một coredump ở tất cả sau khi bị rơi, ngay cả khi mọi thứ khác trong cấu hình của họ có vẻ chính xác.Giảm quyền ưu tiên root và vẫn tạo ra coredumps

Sau khi đọc các trang core(5) người đàn ông một loạt các lần tôi nhận thấy điểm đặc biệt này:

[A tập tin dump lõi không được tạo ra nếu] Quá trình này được thực hiện một set-user-ID (set -group-ID) chương trình được sở hữu bởi một người dùng (nhóm) khác với ID người dùng thực (nhóm) ID của quá trình.

daemon của tôi không phải là setuid root, nhưng trong rất nhiều cấu hình nó bắt đầu như là người chủ, và nếu file conf xác định tên người dùng, nó giảm đặc quyền, với sự kết hợp thông thường:

setgid(gid); 
setuid(uid); 

Khi nó thực hiện điều này, coredumps không được tạo ra nữa. Mọi thứ khác trong môi trường dường như là chính xác, loại bỏ những cuộc gọi đó (và ở lại như là người chủ) khiến tôi coredumps như bình thường.

tôi đã cố gắng để thay đổi "thực" uid/gid như trang người đàn ông dường như đề nghị, bằng cách gọi setresgid ít di động/uid mà dường như được gợi ý thường xuyên để thả đặc quyền vĩnh viễn:

setresgid(gid, gid, gid); 
setresuid(uid, uid, uid); 

Tôi mong rằng để giải quyết vấn đề nhưng ... nó không cải thiện chút nào. Vẫn không có coredumps.

Sooo ... bây giờ cái gì?


mã kiểm tra:

#include <stdlib.h> 

int main(int argc, char **argv) { 
     if (argc > 1) { 
       setgid(atoi(argv[2])); 
       setuid(atoi(argv[1])); 
     } 
     abort(); 
} 

Cách sử dụng:

  • ./a.out như bất kỳ người sử dụng chỉ cần hủy bỏ mà không setgid/setuid
  • ./a.out 1000 100 (nơi 1000 là uid và 100 là gid) như là root để thả các đặc quyền và xem coredumps không xảy ra.
  • Tính năng vô ý thưởng: chuyển một tham số, không phải hai, để nhận SIGSEGV thay vì SIGABRT.

Tôi đã thử nghiệm điều này trong vòm linux, centos 6.5 và OpenBSD 5.3

+0

Và người dùng/nhóm không có đặc quyền không vô hiệu hóa các vùng lõi ('ulimit -c' không báo cáo' 0')? –

+0

Vâng, không giới hạn ở cả hai bên. Và chạy nó như một trong hai uid (0 và 1000) mà không có các cuộc gọi setuid/gid kết quả trong coredumps. – dequis

+0

Bạn thực sự phải cụ thể hơn cho loại công cụ này, bản phân phối Linux làm những việc khác nhau ở đây. Đặc biệt, có các module PAM ở ngoài đó, hãy nhớ ubuntu, tương tác với việc tạo ra các bãi lõi. –

Trả lời

2

Để buộc một quá trình luôn đổ lõi sử dụng lệnh gọi hệ thống prctl.

prctl(PR_SET_DUMPABLE, 1, 0, 0, 0); 
+0

Thú vị! Tôi sẽ kiểm tra điều này sau. Dường như là Linux cụ thể mặc dù, và BSD cũng có hành vi này – dequis

+0

Trên openbsd unset bit KERN_NOSUIDCOREDUMP với sysctl() http://nixdoc.net/man-pages/OpenBSD/sysctl.3.html – clockley1

0

Bạn phải kích hoạt lõi bãi cho các ứng dụng đã đặc quyền của họ đã thay đổi:

echo 2 > /proc/sys/fs/suid_dumpable 

tôi lời khuyên bạn đặt nó trong /etc/rc.local.


Ví dụ, đây là những gì tôi có ở đó:

# This is to enable debugging as a normal user, rather than root 
sysctl kernel.yama.ptrace_scope=0 

# This is a convenient core file pattern 
# '%e' is the name of the process 
# '%p' is the pid of process 
sysctl kernel.core_pattern="/tmp/core.%e.%p" 

# Enable dump for processes with lowered privileges 
echo 2 > /proc/sys/fs/suid_dumpable 

# Remove limit for the size of core files 
ulimit -c unlimited 

Edit:

Bạn có thể có một cái nhìn tại thư viện gọn gàng này, cho phép bạn tự viết các vùng lõi tới tệp tùy chỉnh: https://code.google.com/p/google-coredumper/

Tôi tin rằng đó là chính xác những gì bạn cần.

+0

Cảm ơn! Nhưng tôi chỉ là nhà phát triển của daemon, tôi không có quyền kiểm soát các hệ thống nó sẽ được cài đặt. Tôi đang cố gắng sửa lỗi này để tôi có thể nhận được coredumps từ những người dùng không mong đợi sự cố, vì vậy .. nếu tôi phải nói với họ điều này, tôi cũng có thể bảo họ chạy gdb. Tìm kiếm thứ gì đó tôi có thể sửa trong mã của tôi. – dequis

+1

@dequis, thật không may, tôi không biết cách nào để làm điều đó * từ phía bạn *. Đó là loại lỗ hổng bảo mật, và đó là lý do tại sao việc bán phá giá lõi bị vô hiệu hóa, trừ khi bạn kích hoạt nó theo cách thủ công (như là một 'root'). Trong trường hợp của bạn, bạn thả đặc quyền như vậy, đối với tôi, nó có vẻ an toàn. Nhưng có những ứng dụng quảng bá đặc quyền ('passwd'), và cho phép chúng đổ lõi là một nguy cơ rất lớn. – GreenScape

+0

@dequis, vui lòng đọc các chỉnh sửa mới nhất của tôi, hy vọng đó là những gì bạn cần. – GreenScape

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