Linux 커널의 null 참조 악용
최근 구글 프로젝트 제로 팀의 연구원들이 NULL 포인터 역참조로 인해 발생하는 리눅스 커널의 취약점을 악용하는 방법을 개발 했다고 발표했습니다 .
지금까지 NULL 포인터 역참조와 관련된 커널 문제는 제대로 된 관심을 받지 못했는데 , 이는 이러한 문제를 권한 상승이나 자기 코드 실행으로 이어지는 공격으로 발전시키는 것이 비현실적이라고 여겨졌기 때문입니다(권한이 없는 프로세스를 주소 공간의 하위 영역에 매핑하는 것은 금지되어 있습니다).
일반적으로 이러한 오류는 커널에서 oops 경고를 발생시키고 , 그 후 문제가 발생한 작업이 완료되어 시스템을 중지할 필요 없이 상태가 복원됩니다.
새로운 공격 방식은 "오류(oops)" 상태 처리를 기반으로 하며 , 이로 인해 참조 카운터(refcount) 값이 증가하고, 결국 카운터 오버플로가 발생하여 해당 refcount와 연결된 메모리가 해제될 수 있습니다.
이 경우 악용은 use-after-free 공격의 전형적인 조작으로 축소됩니다(객체의 참조 횟수가 XNUMX이 되고 메모리가 해제되지만 실제로 해제된 메모리를 가리키는 작업 링크가 있는 상황이 발생함).
현재 리눅스 커널은 프로세스 컨텍스트 내에서 널 역참조가 발생하면 커널 패닉과는 다른 'oops' 오류를 발생시킵니다 . 패닉은 커널이 실행을 계속할 안전한 방법이 없다고 판단하여 모든 실행을 중단해야 할 때 발생합니다. 하지만 'oops' 오류 발생 시 커널은 모든 실행을 중단 하지 않고 최대한 복구를 시도하며 실행을 계속합니다.
여기서 NULL 포인터 역참조는 제어된 방식으로 "oops" 상태를 생성하는 방법으로 사용됩니다. 문제는 232비트 refcount 오버플로에 도달하는 데 약 32개의 "oops" 상태 호출이 필요하다는 것입니다.
실질적인 관점에서 볼 때, 제안된 익스플로잇을 사용하여 공격을 수행하려면 비정상적인(OOP) 상태를 지속적으로 생성하는 데 약 8일이 소요됩니다 . 공격이 성공하면 커널 수준에서 코드를 실행할 수 있습니다.
익스플로잇에 사용된 NULL 포인터 역참조는 XNUMX월에 수정되었지만 유사한 문제가 드물지 않고 이전에는 취약점이 아닌 버그로 취급되었으므로 개발자는 "oops" 생성을 조작하는 공격을 방지하기 위해 Linux 커널에 일반 보호 기능을 추가할 것입니다. ."
작업의 경우 기존 커널 스택을 버리고 do_exit를 호출하는 make_task_dead로 직접 이동하는 것을 의미합니다. 커널은 또한 "충돌" 로그와 오류가 발생했을 때 커널이 어떤 상태였는지 보여주는 커널 추적을 dmesg에 게시합니다. 메모리 손상이 분명히 발생했을 때 이것은 이상한 선택처럼 보일 수 있습니다. 그러나 실행 중인 시스템이 다운된 시스템보다 디버그하기가 훨씬 쉽다는 철학 아래 커널 버그를 더 쉽게 감지하고 기록할 수 있도록 하는 것이 목적입니다.
특히 , 커널 6.2에는 "oops" 오류의 최대 횟수를 제한하는 변경 사항이 포함되어 있습니다 . 기본값으로 10,000회(oops_limit 매개변수를 사용하여 변경할 수 있음)로 설정된 제한에 도달하면 커널은 "패닉" 상태로 전환한 후 재부팅을 시작합니다. 이 과정에서는 참조 카운트를 0으로 재설정하는 데 필요한 반복 횟수를 초과할 수 없습니다.
또한 이전에 출시되었지만 여전히 지원되는 커널 브랜치와 널리 사용되는 배포판의 커널 패키지로 제한이 이전될 예정입니다.
마지막으로, 이 주제에 대해 더 자세히 알고 싶으시다면 다음 링크 에서 자세한 내용을 확인하실 수 있습니다.