Quyền tập tin trong Linux

Chào mọi người. Chúng tôi đang tích cực bắt tay vào công việc và chuẩn bị nhiều đợt ra mắt mạnh mẽ vào tháng Giêng. Trong số những sự kiện khác, việc tuyển sinh đã được công bố cho một dòng khóa học yêu thích mới của mọi người. "Quản trị viên Linux". Để chuẩn bị cho buổi ra mắt, chúng tôi thường chia sẻ các bản dịch của tài liệu hữu ích.

Quyền tập tin trong Linux

Quyền truy cập tệp cung cấp một giải pháp thay thế an toàn cho các tệp thực thi SUID, nhưng lúc đầu có vẻ hơi khó hiểu.


Tất cả chúng ta đều biết rằng nhị phân SUIDquyết định tồi từ quan điểm bảo mật. May mắn thay, nếu ứng dụng của bạn yêu cầu một số đặc quyền hạn chế thì có một cách hiệu quả hơn được gọi là quyền tập tin.

Tôi sẽ giúp bạn tiết kiệm thời gian nếu bạn muốn tránh đọc chi tiết bài viết trên: Về cơ bản, quyền truy cập tệp cho phép các tiến trình chạy dưới quyền root và do đó được phép thực hiện điều gì đó để duy trì một số khả năng nhất định, có giới hạn danh sách nàykhi chúng mất đặc quyền và được điều hành bởi người dùng không có đặc quyền. Điều này có nghĩa là nếu kẻ tấn công tìm cách xâm phạm một quy trình bằng cách sử dụng lỗi tràn bộ đệm hoặc cách khai thác khác, chúng sẽ không thể tận dụng bất kỳ lợi ích nào ngoài những đặc quyền tối thiểu nhất định mà quy trình đó thực sự cần.

Quyền rất tốt cho các dịch vụ thường luôn chạy dưới quyền root, nhưng còn các tiện ích dòng lệnh thì sao? May mắn thay, điều này cũng được hỗ trợ miễn là bạn cài đặt đúng tiện ích. Nếu bạn đang sử dụng Ubuntu, ví dụ bạn sẽ cần gói libcap2-bin. Bạn cũng sẽ cần chạy kernel không cổ xưa (từ phiên bản 2.6.24).

Các chức năng này cho phép liên kết các quyền với các tệp thực thi, tương tự như việc đặt bit SUID, nhưng chỉ dành cho một nhóm quyền cụ thể. Tính thiết thực setcap được sử dụng để thêm và xóa quyền khỏi một tập tin.

Bước đầu tiên là chọn các quyền bạn cần. Vì lợi ích của bài viết này, tôi giả sử rằng có một công cụ chẩn đoán mạng tên là tracewalk, có thể sử dụng ổ cắm thô. Điều này thường yêu cầu ứng dụng phải chạy dưới quyền root, nhưng khi xem danh sách hóa ra chỉ cần có sự cho phép CAP_NET_RAW.

Giả sử bạn đang ở trong thư mục chứa tệp nhị phân tracewalk, bạn có thể thêm quyền này như thế này:

sudo setcap cap_net_raw=eip tracewalk

Bỏ qua hậu tố bây giờ =eip để giải quyết, tôi sẽ nói về điều đó sau vài giây. Lưu ý rằng tên quyền được viết thường. Bây giờ bạn có thể kiểm tra xem bạn đã định cấu hình quyền chính xác chưa bằng:

setcap -v cap_new_raw=eip tracewalk

Hoặc bạn có thể liệt kê tất cả các quyền được đặt cho một tệp thực thi nhất định:

getcap tracewalk

Để tham khảo, bạn cũng có thể xóa tất cả các quyền khỏi tệp thực thi bằng:

setcap -r tracewalk

Tại thời điểm này, bạn sẽ có thể chạy tệp thực thi với tư cách là người dùng không có đặc quyền và nó có thể hoạt động với các ổ cắm thô nhưng không có bất kỳ đặc quyền nào khác mà người dùng root có.

Vậy hậu tố kỳ lạ này có ý nghĩa gì? =eip? Điều này đòi hỏi một số hiểu biết về bản chất của quyền. Mỗi tiến trình có ba bộ quyền - có hiệu lực, có thể kế thừa và được phép:

  • Hiệu quả Quyền là những quyền xác định những gì một quy trình thực sự có thể làm. Ví dụ: nó không thể xử lý các ổ cắm thô nếu CAP_NET_RAW không nằm trong tập hiệu dụng.
  • Có sẵn quyền là những quyền mà một tiến trình được phép có nếu nó yêu cầu chúng bằng cách sử dụng lệnh gọi thích hợp. Chúng ngăn chặn một quá trình thực sự làm bất cứ điều gì trừ khi nó được viết cụ thể để yêu cầu sự cho phép nói trên. Điều này cho phép các quy trình được viết để thêm các quyền quan trọng vào tập hợp hiệu quả chỉ trong khoảng thời gian khi chúng thực sự được yêu cầu.
  • kế thừa quyền là những quyền có thể được kế thừa trong tập hợp có thể truy cập được của tiến trình con được sinh ra. Trong quá trình phẫu thuật fork() hoặc clone() tiến trình con luôn được cấp một bản sao các quyền của tiến trình cha vì nó vẫn đang chạy cùng một tệp thực thi tại thời điểm đó. Một tập hợp kế thừa được sử dụng khi exec() (hoặc tương đương) được gọi để thay thế tệp thực thi bằng tệp khác. Tại thời điểm này, tập có sẵn của quy trình được che dấu bởi tập có thể kế thừa để có được tập có thể truy cập sẽ được sử dụng cho quy trình mới.

Vậy tiện ích setcap cho phép chúng tôi thêm các quyền của ba bộ này một cách độc lập cho một tệp thực thi nhất định. Lưu ý rằng ý nghĩa của các nhóm được hiểu hơi khác đối với quyền truy cập tệp:

  • Có sẵn quyền đối với tệp là những quyền luôn có sẵn đối với tệp thực thi, ngay cả khi quy trình mẹ gọi tệp đó không có chúng. Chúng từng được gọi là giấy phép “bắt buộc”.
  • Thừa hưởng quyền của tệp xác định một mặt nạ bổ sung cũng có thể được sử dụng để xóa quyền khỏi bộ quy trình gọi. Chúng áp dụng cùng với tập hợp kế thừa của quy trình gọi, vì vậy quyền chỉ được kế thừa nếu nó tồn tại trong cả hai tập hợp.
  • Có hiệu lực quyền truy cập tệp thực chất chỉ là một bit chứ không phải một tập hợp và nếu được đặt, điều đó có nghĩa là toàn bộ tập hợp có sẵn cũng được sao chép vào tập hợp hiệu quả của quy trình mới. Điều này có thể được sử dụng để thêm quyền vào các quy trình không được viết cụ thể để yêu cầu chúng. Vì nó là một bit nên nếu bạn đặt nó cho bất kỳ quyền nào thì nó phải được đặt cho tất cả các quyền. Bạn có thể coi nó như một bit kế thừa vì nó được sử dụng để cho phép các ứng dụng không hỗ trợ chúng sử dụng các quyền.

Khi chỉ định quyền thông qua setcap ba bức thư e, i и p tham khảo hiệu quả, có thể kế thừa và dễ tiếp cận bộ tương ứng. Vì vậy, đặc điểm kỹ thuật trước đó:

sudo setcap cap_net_raw=eip tracewalk

...chỉ ra rằng độ phân giải CAP_NET_RAW phải được thêm vào các tập có sẵn và có thể kế thừa và bit hiệu dụng cũng phải được đặt. Điều này sẽ ghi đè mọi quyền được đặt trước đó trên tệp. Để đặt nhiều quyền cùng một lúc, hãy sử dụng danh sách được phân tách bằng dấu phẩy:

sudo setcap cap_net_admin,cap_net_raw=eip tracewalk

Hướng dẫn về quyền thảo luận chi tiết hơn về tất cả những điều này, nhưng hy vọng bài đăng này đã làm sáng tỏ một chút điều gì đang diễn ra. Chỉ còn lại một số lưu ý và thủ thuật cần đề cập.

Đầu tiên, các khả năng của tệp không hoạt động với các liên kết tượng trưng - bạn phải áp dụng chúng cho chính tệp nhị phân (tức là mục tiêu của liên kết tượng trưng).

Thứ hai, chúng không hoạt động với các tập lệnh được giải thích. Ví dụ: nếu bạn có một tập lệnh Python mà bạn muốn gán quyền, bạn phải gán nó cho chính trình thông dịch Python. Rõ ràng đây là một vấn đề bảo mật tiềm ẩn vì khi đó tất cả các tập lệnh được thực thi bằng trình thông dịch đó sẽ có quyền được chỉ định, mặc dù điều này vẫn tốt hơn đáng kể so với việc tạo SUID. Cách giải quyết phổ biến nhất có vẻ là viết một tệp thực thi riêng bằng C hoặc tương đương để có thể thực hiện các thao tác cần thiết và gọi nó từ một tập lệnh. Điều này tương tự với cách tiếp cận được Wireshark sử dụng sử dụng hệ nhị phân /usr/bin/dumpcap để thực hiện các hoạt động đặc quyền:

$ getcap /usr/bin/dumpcap 
/usr/bin/dumpcap = cap_net_admin,cap_net_raw+eip

Thứ ba, quyền truy cập tệp sẽ bị vô hiệu hóa nếu bạn sử dụng biến môi trường LD_LIBRARY_PATH vì lý do bảo mật rõ ràng(1). Ứng dụng tương tự LD_PRELOAD, theo như tôi biết.

1. Vì kẻ tấn công rõ ràng có thể thay thế một trong các thư viện tiêu chuẩn và sử dụng LD_LIBRARY_PATHđể buộc thư viện của nó được gọi ưu tiên hơn hệ thống và do đó có mã tùy ý riêng được thực thi với các đặc quyền giống như ứng dụng gọi điện.

Đó là tất cả. Thông tin chi tiết về chương trình khóa học có thể xem tại hội thảo trực tuyến sẽ diễn ra vào ngày 24 tháng XNUMX.

Nguồn: www.habr.com

Thêm một lời nhận xét