Linux 소스 코드, 특히 시스템 호출 코드를 읽을 때 sys_reboot
구현 내용을 발견했습니다.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 }
중간에 특정 코드 조각이 있습니다.
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;
실제로 어떤 종류의 "보안"을 제공하는지 궁금합니다. 내 말은, 이것이 학대를 방지하기 위한 것입니까? 이 경우 매개변수가 공개되어 있으므로 모든 라이브러리나 애플리케이션이 매개변수를 전달해야 하는 경우에도 시스템 호출을 남용할 수 있습니다. 내가 놓친 게 무엇입니까?
답변1
이 질문은 이 슈퍼유저 질문에서 답변되었습니다.
기본적으로 주소를 약간 바꾸면 프로그램이 실제로 호출할 때 시스템 호출을 호출한다고 생각할 수 있습니다 reboot()
. 이는 매우 파괴적인 비동기 작업 이므로 reboot()
시스템 상태를 삭제하여 프로그램 버그나 패닉으로 노출될 수 있는 비트플립 문제의 증거를 삭제합니다. Linux에서는 이를 성공적으로 추가 보호 기능을 제공합니다.
흥미롭게도 두 번째 마법 숫자 세트는 Linus와 그의 세 딸의 생일에 해당합니다.