학교의 C언어 자동 채점 시스템에서 허용되지 않은 함수를 우회하여 셸을 실행하는 개념 증명(PoC)이 성공했습니다. 이 학생은 `execve`와 같은 특정 함수 이름 사용을 금지하는 채점 환경에서, 해당 심볼을 직접 사용하지 않고도 임의의 셸 명령을 실행할 수 있는 방법을 찾아냈습니다. 이는 자동 채점 시스템의 보안 허점을 드러내며, 원격 코드 실행 환경의 설계에 대한 재고를 요구합니다.
이 우회 기법의 핵심은 주소 공간 배치 무작위화(ASLR)에도 불구하고 같은 메모리 세그먼트 내 함수 간의 상대적 오프셋(offset)은 일정하게 유지된다는 점을 활용한 것입니다. 학생은 허용된 함수의 주소를 기준으로 미리 알아낸 오프셋을 더해 목표 함수의 주소를 계산했습니다. 초기에는 `printf`를 기준으로 `execve`의 주소를 찾으려 했으나, 채점 환경에 적용된 메모리 오류 검사 도구인 ASan(AddressSanitizer)이 `printf`를 대체하면서 오프셋이 일정하지 않다는 사실을 발견했습니다. 대신 ASan이 대체하는 `mmap` 함수를 새로운 호출 대상으로 삼아, 이 함수를 통해 쓰기와 실행이 모두 가능한 메모리 영역을 확보했습니다. 이 확보된 메모리에 직접 작성한 x86-64 리눅스 시스템 호출(syscall) 루틴을 복사하고 실행하여 `execve` 시스템 호출을 수행했습니다.
이러한 방식은 사용자 코드를 비교적 자유롭게 실행할 수 있는 환경에서 발생할 수 있는 보안 문제를 시사합니다. ASLR만으로는 이러한 종류의 공격을 완전히 막을 수 없으며, 채점 시스템과 같은 원격 코드 실행 환경은 금지된 시스템 호출을 차단하기 위해 `seccomp`와 같은 샌드박스(sandbox) 기술을 적용하거나, `libc` 심볼 무작위화와 같은 추가적인 완화책을 고려해야 합니다. 이번 사례는 단순히 함수 이름 검사를 우회하는 것을 넘어, 메모리 배치, 함수 포인터, 시스템 호출의 동작 원리에 대한 깊은 이해를 바탕으로 한 정교한 공격임을 보여줍니다. 학교 측은 문제 신고를 받은 후 추가 조사를 중단하고 완화책을 검토 중입니다.