쉘쇼크(CVE-2014-6271) 라는 취약점에 대해 최근들어 알게된 몇가지 내용들이 있다.
원래 알고있던 내용은, bash쉘을 사용하는 유닉스 기반 운영체제에서 발생하는 취약점으로써,
환경변수에 함수 형태로 명령어가 삽입되어 공격자가 원하는 쉘 명령어가 실행된다는 정도로 요약이 된다.
() { :; } ; ls
위와같은 기본형을 가지고 있는데, 이것이 환경변수에 들어가면 ;(세미콜론) 이전은 함수로, 이후부터는 완전히 새로운 부분이라고 인식이 되고, 세미콜론 이후에 들어오는 쉘 명령어를 실행하게 된다는 것.
아, 환경변수에 들어간 문자열이 명령어가 되어 실행되는구나, 그런데 이게 왜 문제가 되지??? 라는 생각을 할 수 있다. 나도 쉘쇼크를 개념적으로만 알 뿐, 실제로 어떻게 동작하는지는 몰랐었고.
그러나 "환경변수를 사용하는" 응용프로그램 환경들에서는 이게 문제가 될 수 있다는걸 최근에 알게 되었다.
단적인 예를 들어보자면, CGI 웹서버의 경우, !#/bin/bash 로 선언되어 쓰이는 쉘 스크립트를 페이지 내에 함수나 기타 형태로 인클루드 해서 사용하는 경우가 있는데
쉘 스크립트 페이지를 불러오는 시점에, HTTP 헤더 중 user-agent 값을 서버의 환경변수로 저장하여 사용하게 된다.
즉, user-agent에 쉘 쇼크를 유발하는 명령문을 삽입하여 공격자가 원하는 쉘 명령어를 실행 가능하다는 이야기. 이는 burpsuite를 비롯한 웹 프록시 도구나 간단한 스크립트 만으로도 얼마든지 터트릴 수 있는 취약점이라는 소리다.
물론 이제 누가 CGI 웹서버를 쓰겠냐만은.. (쓰더라도 쉘 스크립트를 쓰나? 그건 모르겠다. ) 그 당시에는 openssh 서버, dhcp 클라이언트 등의 시스템 환경변수를 이용하는 환경들에서 이러한 문제점들이 뻥뻥 터져나갔었다고 한다. (이게 2014년, 불과 7년전 이야기. 내가 신입생때다..)
즉, CVE로 유발된 취약점 하나가 수많은 환경들에 영향을 끼쳤고, 이 취약점이 개발자/사용자가 상상도 못하는 부분에서 동작할 수 있다는 것.
솔직히 누가 저런 HTTP헤더가 환경변수로 전달되어 공격에 사용될거라 생각이나 하겠는가.
쉘쇼크를 처음 안게 2016년이었는데, 그땐 그냥 아 이런게 있구나~ 하고 넘어갔었지만
좀 자세하게 알고 나니까 간단한 내용으로 엄청난 파급을 끼치는 취약점이었다는 걸 뒤늦게 깨달았다.
이제와서는 bash 쉘 버전 패치로 간단하게 해결되겠지만, 그 당시엔 진짜 혼란스러웠을것 같다. 공격코드를 그렇게 어렵게 짜는것도 아니고, 터질만한 벡터들도 무진장 많았으니..
그냥 오늘 일하다가 느낀점들을 적어봤다. 빨리 자야지.