소스 코드가 깨끗한데 왜 감염될까? (컴파일러 백도어 해킹의 비밀)
- 켄 톰슨의 '신뢰를 신뢰하기에 대하여' 강연은 우리가 직접 작성하지 않은 코드는 신뢰할 수 없다는 근본적인 보안 개념을 제시합니다. 🛡️
- 악성 코드는 애플리케이션 소스 코드뿐만 아니라, 코드를 만드는 컴파일러나 개발 도구 자체에 숨겨질 수 있습니다. 🛠️
- 톰슨은 자기 소스 코드를 출력하는 '퀸 프로그램'을 통해 프로그램이 스스로를 복제하고 불필요한 부분까지 함께 복제될 수 있음을 보여주었습니다. 🔄
- 컴파일러가 새로운 기능을 '학습'하고 그 지식을 자기 복제를 통해 다음 버전으로 전파하는 과정을 시연하여, 눈에 보이지 않는 컴파일러의 '기억'이 보안에 미치는 영향을 강조했습니다. 🧠
- 가장 중요한 단계로, 톰슨은 컴파일러의 제어 구조를 조작하여 특정 코드 패턴을 의도적으로 잘못 컴파일하도록 만들 수 있음을 증명했습니다. 👻
- 이 백도어는 유닉스 로그인 명령을 표적으로 삼아, 정상 비밀번호 외에 톰슨이 숨겨둔 비밀 암호로도 로그인할 수 있게 했습니다. 🔑
- 공격 코드를 소스에 직접 두지 않고, 컴파일러 자체를 감염시켜 컴파일 과정에서 자동으로 악성 코드를 삽입하고, 심지어 컴파일러 자신도 재감염시키는 자기 복제 기법을 사용했습니다. 🦠
- 결과적으로 소스 코드는 깨끗해 보이지만, 감염된 컴파일러로 컴파일하면 백도어가 자동으로 다시 삽입되는 '깨끗한 소스, 감염된 바이너리' 역설이 발생합니다. 🎭
- 이 교훈은 소스 파일 검토만으로는 모든 위험을 막을 수 없으며, 컴파일러 바이너리와 그 제작 과정까지 신뢰할 수 있는지 확인해야 함을 시사합니다. 🔍
- 신뢰의 사슬은 매우 중요하며, 한 번 끊어진 신뢰는 소스 코드에 흔적을 남기지 않아 겉으로는 깨끗해 보여도 내부의 위험을 알 수 없게 만듭니다. ⛓️
- 컴파일러뿐만 아니라 어셈블러, 로더, 심지어 하드웨어 마이크로코드 같은 낮은 레벨의 개발 도구에도 백도어가 숨겨질 수 있으며, 레벨이 낮아질수록 발견이 극도로 어려워집니다. 📉
- 이 섬뜩한 교훈은 오늘날에도 유효하며, 우리가 사용하는 모든 소프트웨어 스택의 근본적인 신뢰 문제를 제기합니다. 💡