기타 Lobsters · 2일 전

네트워크 명령어 curl이 9개월 동안 '튜링 완전'했던 사연

핵심 요약
  • curl 8.12~8.16 버전의 설정 파일 변수 슬라이싱과 깊이 제한 없는 파일 포함 기능을 통해 2-카운터 머신을 구현할 수 있었던 것으로 드러났습니다.
  • 이론적으로 curl만으로 어떤 계산이든 수행 가능한 '튜링 완전' 상태였으며, 실제로 2+3을 계산하는 설정 파일 PoC도 공개되었습니다.
  • 이후 curl 8.17.0에서 설정 파일 호출 깊이를 5단계로 제한하면서 해결되었고, 보안상 취약점이나 피해는 없었습니다.
요약 개발자들이 네트워크 데이터 전송용으로 매일같이 쓰는 명령어 도구 'curl'이 약 9개월 동안 자신도 모르게 튜링 완전(Turing-complete) 상태였던 사실이 밝혀져 개발자 커뮤니티에서 소소한 화제가 되고 있습니다. 즉, 이론상 curl만 가지고도 어떤 컴퓨터 프로그램이든 계산하고 실행할 수 있었던 셈입니다. 연구자 니콜라 세리오(Nicolas Seriot)가 공개한 내용에 따르면, curl 8.12 버전부터 8.16 버전까지 제공된 설정 파일(config) 기능 조합이 원인이었습니다. 해당 버전에서는 설정 파일 내 변수의 값을 자르는 슬라이싱(바이트 범위 지정) 기능과 함께, 다른 설정 파일을 재귀적으로 불러올 수 있는 기능에 호출 깊이 제한이 걸려있지 않았습니다. 이를 활용하면 컴퓨터 과학에서 이론적인 계산 모델로 쓰이는 '민스키의 2-카운터 머신(Minsky 2-counter machine)'을 curl 설정 파일만으로 완전히 시뮬레이션할 수 있었습니다. 실제로 그는 설정 파일 4개만을 이용해 '2 + 3 = 5'를 계산해 내는 개념 증명(PoC) 코드를 선보였습니다. 물론 실제 바이너리 실행 환경에서는 물리적인 한계가 존재했습니다. 변수 확장 크기 제한(최대 1,000만 바이트)이 걸려있고, 루프가 돌 때마다 C 언어 스택 프레임이 쌓이면서 8MB 스택 기준 약 922단계 만에 세그멘테이션 오류(segfault)가 발생하는 등의 한계는 있었지만, 무한한 메모리를 가정한 이론적 모델에서는 명백한 튜링 완전성을 만족했습니다. 이 기묘한 상태는 curl 8.17.0 버전에서 설정 파일 포함(include) 제한을 최대 5단계로 제한하는 패치가 적용되면서 끝이 났습니다. 당시 개발진의 풀 리퀘스트(PR) 설명에는 설정 파일이 무한히 스스로를 불러오는 문제를 방지하기 위함이라고만 적혀 있었을 뿐, 튜링 완전성에 대한 언급이나 제한을 왜 하필 5단계로 두었는지에 대한 설명은 없었습니다. 다행히 해당 기능으로 인한 보안상 위험이나 취약점 영향(Security impact)은 전혀 없는 해프닝으로 마무리되었습니다.
Sponsored · 광고