기타 Lobsters · 2026-10-07

"비밀번호 지우려다 복사본만 늘어난다?"… 메모리 제로화의 역효과 분석

핵심 요약
  • 암호키나 비밀 데이터를 메모리에서 지우려는 '제로화' 코드가 컴파일러 최적화 과정에서 의도치 않은 문제를 일으킬 수 있습니다.
  • 컴파일러가 메모리 쓰기를 최적화해 지우기 함수를 무시하거나, 주소 전달을 위해 오히려 스택에 새로운 복사본을 생성해 버리기 때문입니다.
  • 결과적으로 비밀 데이터를 지우려던 시도가 CPU 사이클만 낭비하거나 메모리에 더 많은 흔적을 남길 수 있다는 분석입니다.
요약 비밀번호나 암호화 키 같은 민감 데이터를 메모리에서 안전하게 지우려는 '제로화(Zeroization)' 작업이 오히려 메모리에 복사본을 남겨 보안을 악화시킬 수 있다는 개발자 분석이 주목받고 있습니다. 오픈소스 프로젝트에는 LLM(인공지능) 등이 제안한 민감 데이터 제로화 PR(풀 리퀘스트)이 자주 들어오지만, 컴파일러의 최적화 메커니즘을 제대로 고려하지 않으면 엉뚱한 결과가 발생합니다. 가장 흔한 memset() 호출의 경우, 함수 종료 후 해당 변수를 다시 참조하지 않는다는 점을 컴파일러가 인식해 호출 자체를 완전히 삭제해 버립니다. 심지어 최적화 과정에서 해당 변수는 실제 스택 메모리에 쓰이지 않고 레지스터에만 남아있는 경우도 많습니다. 이를 우회하기 위해 volatile을 사용해 바이트 단위로 0을 쓰는 기법을 적용하면, 컴파일러는 메모리에 0을 기록하는 명령어를 생성하지만 정작 그 메모리 위치에 원래의 비밀 데이터가 쓰인 적이 없어서 빈 메모리에 0만 채우고 레지스터 속 원본은 그대로 남는 현상이 발생합니다. 또한 별도 파일에 opaque_wipe() 함수를 두고 호출해 컴파일러 최적화를 피하려 할 경우, 호출부는 함수에 메모리 주소를 전달하기 위해 레지스터에 있던 비밀 데이터를 일부러 스택 메모리에 복사해 기록하게 됩니다. 결국 원래대로라면 메모리에 남지 않았을 비밀 데이터가 스택에 생성되고, 정작 레지스터 복사본은 그대로 유지되는 등 데이터를 지우려던 시도가 오히려 더 많은 복사본을 메모리에 남기는 역효과를 냅니다.
Sponsored · 광고