신기한 Lobsters · 2일 전

컴파일러 최적화 켰더니 일반 유저한테 루트 권한 줘버리는 C++의 공포

핵심 요약
  • C++ 코드에서 기본 빌드 시 정상 거부되던 관리자 권한 비교 로직이 -O2 최적화 옵션을 켜자 참(true)으로 평가되는 버그가 공개되었습니다.
  • Clang과 GCC 컴파일러 및 C++17~23 버전 전반에서 공통으로 재현되며, 원인은 미정의 동작(Undefined Behavior)으로 밝혀졌습니다.
  • 입력 문자열과 관리자 ID의 길이가 같을 때만 발생하는 극히 드문 사례로, 실제 취약점 악용 가능성은 낮으나 오싹한 개발자 괴담으로 화제가 되었습니다.
요약 해외의 한 개발자 블로그에서 할로윈 시즌을 맞아 '오싹한 C++ 이야기'라는 제목으로 흥미로운 버그 사례를 공개했습니다. 공개된 예제 코드는 문자열 앞부분의 공백을 제거하는 `Sanitize` 함수를 거친 일반 사용자 계정명("foobarbazboo")과 관리자 계정 ID("root_1231231")를 비교하여 권한을 부여하는 단순한 구조입니다. 기본 최적화 옵션(-O0)으로 빌드해 실행했을 때는 두 문자열이 다르기 때문에 정상적으로 권한 부여 결과가 `false`로 출력되었습니다. 하지만 컴파일 최적화 옵션을 `-O2`로 변경하자 기이한 현상이 발생했습니다. 완전히 다른 문자열임에도 불구하고 프로그램이 두 값이 같다고 판단해 사용자에게 관리자 권한을 승인(`true`)해 버린 것입니다. 이는 Clang뿐만 아니라 GCC 컴파일러에서도 동일하게 재현되었으며, C++17, C++20, C++23 등 다양한 표준 버전 전반에서 똑같이 발생했습니다. 작성자에 따르면 이 괴현상의 정체는 바로 '정의되지 않은 동작(Undefined Behavior, UB)'으로 인한 결과입니다. `Sanitize` 함수가 임시 객체인 `std::string`의 참조자를 받아 `std::string_view`를 반환하면서 댕글링 참조가 발생했고, 최적화 과정에서 컴파일러가 예측 불가능하게 코드를 다루면서 이러한 오류가 유발되었습니다. 작성자는 이 버그가 입력값("foobarbazboo")과 관리자 ID의 문자열 길이가 정확히 일치하고 인라인 인자로 전달되었을 때만 극히 드물게 발생하는 기현상이라고 설명했습니다. 문자열 길이를 바꾸거나 임시 변수에 저장하는 등 사소한 코드 리팩터링만 거쳐도 현상이 사라지므로 실제 보안 취약점으로 악용되기는 어렵겠지만, C++ 개발자들에게는 등골이 서늘해지는 재미있는 할로윈 괴담으로 화제를 모았습니다.
Sponsored · 광고