Điều thay đổi là /bin/sh
trở thành bash
hoặc ở lại dash
có thêm một cờ -p
bắt chước hành vi của bash.
Bash yêu cầu -p
cờ không bỏ đặc quyền setuid như được giải thích trong trang man của nó :
Nếu shell được bắt đầu với id người dùng (nhóm) hiệu quả không bằng id người dùng thực (nhóm) và tùy chọn -p không được cung cấp, không có tệp khởi động nào được đọc, các hàm shell không được kế thừa từ môi trường, SHELLOPTS Các biến BASHOPTS, CDPATH và GLOBIGNORE, nếu chúng xuất hiện trong môi trường, sẽ bị bỏ qua và id người dùng hiệu quả được đặt thành id người dùng thực . Nếu tùy chọn -p được cung cấp khi gọi, hành vi khởi động là như nhau, nhưng id người dùng hiệu quả không được đặt lại.
Trước đây, dash
không quan tâm đến điều này và cho phép thực thi setuid (bằng cách không làm gì để ngăn chặn nó). Nhưng Ubuntu 16.04 của dash
manpage 's đã một tùy chọn bổ sung mô tả, tương tự như bash
:
-p private
Đừng cố thiết lập lại uid hiệu quả nếu nó không khớp với uid. Điều này không được đặt theo mặc định để giúp tránh sử dụng không chính xác bởi các chương trình gốc setuid thông qua hệ thống (3) hoặc popen (3).
Tùy chọn này không tồn tại ở thượng nguồn (có thể không phản ứng với bản vá được đề xuất * ) cũng như Debian 9 nhưng hiện diện trong Debian buster có bản vá từ năm 2018.
LƯU Ý: như được giải thích bởi Stéphane Chazelas, đã quá muộn để gọi "/bin/sh -p"
vào system()
vì system()
chạy bất cứ thứ gì được đưa ra /bin/sh
và do đó setuid đã bị loại bỏ. Câu trả lời của derobert giải thích cách xử lý việc này, trong đoạn mã trước system()
.
* thêm chi tiết về lịch sử ở đây và ở đó .
system("bash -p")
chạysh -c "bash -p"
để các đặc quyền đã bị loại bỏ khibash
được thực thi.