새로운 Linux에서 시스템 호출 호출 규칙이 변경된 이유는 무엇입니까?

새로운 Linux에서 시스템 호출 호출 규칙이 변경된 이유는 무엇입니까?

에서 인용https://www.kernel.org/doc/Documentation/process/adding-syscalls.rst:

최소한 64비트 x86에서는 v4.17부터 커널에서 시스템 호출을 호출하지 않는 것이 어려운 요구 사항이 됩니다. 시스템 호출에 대해 다른 호출 규칙을 사용하고 struct pt_regs 시스템 호출 래퍼에서 즉시 디코딩한 다음 처리를 실제 시스템 호출 함수로 넘깁니다. 이는 6개의 CPU 레지스터를 항상 임의의 사용자 공간 콘텐츠로 채우는 대신(호출 체인에 심각한 문제를 일으킬 수 있음) 특정 시스템 호출에 실제로 필요한 매개변수만 시스템 호출 입력 중에 전달된다는 의미입니다.

무엇콜체인에 심각한 문제가 있습니다마지막 대괄호 절은 무엇을 참조합니까?

시스템 호출의 일반 부팅에 6개의 레지스터를 로드하지 않는 것은 나에게는 어리석은 일처럼 보입니다. 모든 syscall 래퍼를 강제로 이렇게 하면 syscall 함수가 더 커지고 syscall 함수가 새로운 특수 사례가 되므로 사용되지 않는 인수 레지스터 "무엇입니까?"에서 의도하지 않은 사용자 콘텐츠의 "심각한 문제"에 대해 궁금합니다.

답변1

문제 중 하나는 임의적이지 않습니다.등록하다값이지만 커널 스택에 복사됩니다. 따라서 사용되지 않는 레지스터를 사용하여 검사 없이 임의의 호출자 제어 값을 스택에 쓸 수 있습니다.

스택에 있는 이러한 값은 보다 정교한 공격에 사용될 수 있습니다. 그렇기 때문에 이 가능성을 없애는 것이 좋은 생각인 것 같습니다.

Kees Cook의 4.17 요약이러한 레지스터 값이 추측 실행에 미칠 수 있는 영향도 언급됩니다.

관련 정보