Việc sử dụng các đối số ma thuật của người dùng trong cuộc gọi hệ thống khởi động lại Linux là gì?


10

Khi tôi đang đọc mã nguồn Linux, và cụ thể hơn là mã gọi hệ thống, tôi đã bắt gặp sys_reboottriển khai: http://lxr.free-electrons.com/source/kernel/reboot.c#L199 .

199 SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd,
200                 void __user *, arg)
201 {
202        ...
...    
286 }

Ở giữa, có đoạn mã cụ thể này:

209 
210         /* For safety, we require "magic" arguments. */
211         if (magic1 != LINUX_REBOOT_MAGIC1 ||
212                         (magic2 != LINUX_REBOOT_MAGIC2 &&
213                         magic2 != LINUX_REBOOT_MAGIC2A &&
214                         magic2 != LINUX_REBOOT_MAGIC2B &&
215                         magic2 != LINUX_REBOOT_MAGIC2C))
216                 return -EINVAL;

Tôi tự hỏi loại "an toàn" mà nó thực sự cung cấp. Ý tôi là, nó là để ngăn chặn việc sử dụng sai? Trong trường hợp này, vì các tham số là công khai, bất kỳ thư viện hoặc ứng dụng nào cũng có thể sử dụng sai cuộc gọi hệ thống mặc dù chúng được yêu cầu chuyển các tham số. Tôi đã bỏ lỡ cái gì?


Nó có thể là các cuộc gọi vô tình từ, ví dụ, hỏng bộ nhớ hoặc mắc lỗi đánh máy trong một số tòa nhà. Cho dù đó thực sự là điều đáng lo ngại, đừng biết.
derobert

@derobert Có ý nghĩa nhưng ... tất cả các cuộc gọi hệ thống sẽ cần một sự bảo vệ như thế này? Ngoại trừ getpidvà tương tự tất nhiên, tất cả chúng đều có thể có những hậu quả khó lường nếu sử dụng sai. Hoặc có thể, tất cả các tòa nhà cao tầng khác đã có đủ thông số cần kiểm tra để làm cho chúng vô hại nếu chúng được gọi sai. Nó cảm thấy giống như một ý tưởng kỳ lạ về "sự an toàn" đối với tôi, mặc dù ...
lgeorget

Thật. Tôi không chắc chắn tại một thời điểm, Linus đã tìm ra một lỗi giữ # $ & #! khởi động lại máy của anh ta hoặc nếu ai đó chỉ thêm nó vì họ bị hoang tưởng, v.v ... Những gì được cho là để bảo vệ chống lại là khá rõ ràng; Tại sao bảo vệ khỏi đó là cần thiết là một câu hỏi hay.
derobert

@derobert Có thể là sự nắm giữ từ ai đó được sử dụng cho các mạch tích hợp, trong đó nhiều chip thực hiện một số loại bảo vệ để kích hoạt chức năng tắt máy (ví dụ: bạn phải ghi các bit XYZ vào một thanh ghi đặc biệt trước khi lệnh tắt máy hoạt động). Không chắc chắn nếu các mốc thời gian cho điều đó có ý nghĩa hay không,
mbrig

Câu trả lời:


10

Câu hỏi này đã được trả lời trong câu hỏi Siêu người dùng này:

Về cơ bản, một chút lật trong một địa chỉ có thể khiến một chương trình nghĩ rằng nó đang gọi một cuộc gọi hệ thống khi trên thực tế, nó đang gọi cuộc gọi reboot()hệ thống. Bởi vì reboot()hoạt động không đồng bộ hóa rất phá hủy sẽ xóa trạng thái của hệ thống - do đó xóa bằng chứng về sự cố lật bit có thể bị phơi bày là lỗi chương trình hoặc hoảng loạn - Linux bao gồm các biện pháp bảo vệ bổ sung xung quanh việc sử dụng thành công. .

Thật thú vị, bộ số ma thuật thứ hai tương ứng với ngày sinh của Linus và ba cô con gái của anh:


1
Ah, tôi đã không nghĩ về việc xác minh các trang web khác. Tôi chưa bao giờ nghĩ câu hỏi này có thể thuộc về nơi khác. Dù sao, cảm ơn bạn đã trả lời. :-)
lgeorget
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.